blob: 60efd6c4dc1dd3072fd9a47a3811c3820289b37d [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.server.controller.internal;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.Role;
import org.apache.ambari.server.RoleCommand;
import org.apache.ambari.server.actionmanager.ActionManager;
import org.apache.ambari.server.actionmanager.HostRoleCommand;
import org.apache.ambari.server.actionmanager.HostRoleStatus;
import org.apache.ambari.server.actionmanager.Request;
import org.apache.ambari.server.actionmanager.RequestFactory;
import org.apache.ambari.server.actionmanager.Stage;
import org.apache.ambari.server.controller.RequestStatusResponse;
import org.apache.ambari.server.controller.ShortTaskStatus;
import org.apache.ambari.server.state.State;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* RequestStageContainer unit tests.
*/
public class RequestStageContainerTest {
@Test
public void testGetId() {
RequestStageContainer requestStages = new RequestStageContainer(500L, null, null, null);
assertEquals(500, requestStages.getId().longValue());
}
@Test
public void testGetAddStages() {
RequestStageContainer requestStages = new RequestStageContainer(500L, null, null, null);
assertTrue(requestStages.getStages().isEmpty());
Stage stage = createNiceMock(Stage.class);
requestStages.addStages(Collections.singletonList(stage));
assertEquals(1, requestStages.getStages().size());
assertTrue(requestStages.getStages().contains(stage));
Stage stage2 = createNiceMock(Stage.class);
Stage stage3 = createNiceMock(Stage.class);
List<Stage> listStages = new ArrayList<Stage>();
listStages.add(stage2);
listStages.add(stage3);
requestStages.addStages(listStages);
assertEquals(3, requestStages.getStages().size());
listStages = requestStages.getStages();
assertEquals(stage, listStages.get(0));
assertEquals(stage2, listStages.get(1));
assertEquals(stage3, listStages.get(2));
}
@Test
public void testGetLastStageId() {
RequestStageContainer requestStages = new RequestStageContainer(1L, null, null, null);
assertEquals(-1, requestStages.getLastStageId());
Stage stage1 = createNiceMock(Stage.class);
Stage stage2 = createNiceMock(Stage.class);
List<Stage> listStages = new ArrayList<Stage>();
listStages.add(stage1);
listStages.add(stage2);
expect(stage2.getStageId()).andReturn(22L);
replay(stage1, stage2);
requestStages = new RequestStageContainer(1L, listStages, null, null);
assertEquals(22, requestStages.getLastStageId());
}
@Test
public void testGetProjectedState() {
String hostname = "host";
String componentName = "component";
Stage stage1 = createNiceMock(Stage.class);
Stage stage2 = createNiceMock(Stage.class);
Stage stage3 = createNiceMock(Stage.class);
Stage stage4 = createNiceMock(Stage.class);
HostRoleCommand command1 = createNiceMock(HostRoleCommand.class);
HostRoleCommand command2 = createNiceMock(HostRoleCommand.class);
HostRoleCommand command3 = createNiceMock(HostRoleCommand.class);
List<Stage> stages = new ArrayList<Stage>();
stages.add(stage1);
stages.add(stage2);
stages.add(stage3);
stages.add(stage4);
//expectations
expect(stage1.getHostRoleCommands()).andReturn(Collections.singletonMap(hostname, Collections.singletonMap(componentName, command1))).anyTimes();
expect(stage2.getHostRoleCommands()).andReturn(Collections.singletonMap(hostname, Collections.singletonMap(componentName, command2))).anyTimes();
expect(stage3.getHostRoleCommands()).andReturn(Collections.singletonMap(hostname, Collections.singletonMap(componentName, command3))).anyTimes();
expect(stage4.getHostRoleCommands()).andReturn(Collections.<String, Map<String, HostRoleCommand>>emptyMap()).anyTimes();
expect(command3.getRoleCommand()).andReturn(RoleCommand.SERVICE_CHECK).anyTimes();
expect(command2.getRoleCommand()).andReturn(RoleCommand.INSTALL).anyTimes();
replay(stage1, stage2, stage3, stage4, command1, command2, command3);
RequestStageContainer requestStages = new RequestStageContainer(1L, stages, null, null);
assertEquals(State.INSTALLED, requestStages.getProjectedState(hostname, componentName));
verify(stage1, stage2, stage3, stage4, command1, command2, command3);
}
@Test
public void testPersist() throws AmbariException {
ActionManager actionManager = createStrictMock(ActionManager.class);
RequestFactory requestFactory = createStrictMock(RequestFactory.class);
Request request = createStrictMock(Request.class);
Stage stage1 = createNiceMock(Stage.class);
Stage stage2 = createNiceMock(Stage.class);
List<Stage> stages = new ArrayList<Stage>();
stages.add(stage1);
stages.add(stage2);
//expectations
expect(requestFactory.createNewFromStages(stages)).andReturn(request);
expect(request.getStages()).andReturn(stages).anyTimes();
actionManager.sendActions(request, null);
replay(actionManager, requestFactory, request, stage1, stage2);
RequestStageContainer requestStages = new RequestStageContainer(1L, stages, requestFactory, actionManager);
requestStages.persist();
verify(actionManager, requestFactory, request, stage1, stage2);
}
@Test
public void testPersist_noStages() throws AmbariException {
ActionManager actionManager = createStrictMock(ActionManager.class);
RequestFactory requestFactory = createStrictMock(RequestFactory.class);
// no expectations due to empty stage list
replay(actionManager, requestFactory);
RequestStageContainer requestStages = new RequestStageContainer(1L, null, requestFactory, actionManager);
requestStages.persist();
verify(actionManager, requestFactory);
}
@Test
public void testGetRequestStatusResponse() {
ActionManager actionManager = createStrictMock(ActionManager.class);
Stage stage1 = createNiceMock(Stage.class);
Stage stage2 = createNiceMock(Stage.class);
HostRoleCommand command1 = createNiceMock(HostRoleCommand.class);
Role role = createNiceMock(Role.class);
List<Stage> stages = new ArrayList<Stage>();
RoleCommand roleCommand = RoleCommand.INSTALL;
HostRoleStatus status = HostRoleStatus.IN_PROGRESS;
stages.add(stage1);
stages.add(stage2);
List<HostRoleCommand> hostRoleCommands = new ArrayList<HostRoleCommand>();
hostRoleCommands.add(command1);
expect(actionManager.getRequestTasks(100)).andReturn(hostRoleCommands);
expect(actionManager.getRequestContext(100)).andReturn("test");
expect(command1.getTaskId()).andReturn(1L);
expect(command1.getRoleCommand()).andReturn(roleCommand);
expect(command1.getRole()).andReturn(role);
expect(command1.getStatus()).andReturn(status);
replay(actionManager, stage1, stage2, command1, role);
RequestStageContainer requestStages = new RequestStageContainer(100L, stages, null, actionManager);
RequestStatusResponse response = requestStages.getRequestStatusResponse();
assertEquals(100, response.getRequestId());
List<ShortTaskStatus> tasks = response.getTasks();
assertEquals(1, tasks.size());
ShortTaskStatus task = tasks.get(0);
assertEquals(1, task.getTaskId());
assertEquals(roleCommand.toString(), task.getCommand());
assertEquals(status.toString(), task.getStatus());
assertEquals("test", response.getRequestContext());
verify(actionManager, stage1, stage2, command1, role);
}
}