@Test
@SuppressWarnings("unchecked")
public void testComponentUpgradeFailReport() throws Exception {

  Cluster cluster = heartbeatTestHelper.getDummyCluster();
  Service hdfs = cluster.addService(HDFS);
  hdfs.addServiceComponent(DATANODE);
  hdfs.getServiceComponent(DATANODE).addServiceComponentHost(DummyHostname1);
  hdfs.addServiceComponent(NAMENODE);
  hdfs.getServiceComponent(NAMENODE).addServiceComponentHost(DummyHostname1);
  hdfs.addServiceComponent(HDFS_CLIENT);
  hdfs.getServiceComponent(HDFS_CLIENT).addServiceComponentHost(DummyHostname1);
  ServiceComponentHost serviceComponentHost1 = clusters.getCluster(DummyCluster).getService(HDFS).
      getServiceComponent(DATANODE).getServiceComponentHost(DummyHostname1);
  ServiceComponentHost serviceComponentHost2 = clusters.getCluster(DummyCluster).getService(HDFS).
      getServiceComponent(NAMENODE).getServiceComponentHost(DummyHostname1);
  StackId stack130 = new StackId("HDP-1.3.0");
  StackId stack120 = new StackId("HDP-1.2.0");
  serviceComponentHost1.setState(State.UPGRADING);
  serviceComponentHost2.setState(State.INSTALLING);
  serviceComponentHost1.setStackVersion(stack120);
  serviceComponentHost1.setDesiredStackVersion(stack130);
  serviceComponentHost2.setStackVersion(stack120);
  Stage s = stageFactory.createNew(requestId, "/a/b", "cluster1", 1L, "action manager test",
      "clusterHostInfo", "commandParamsStage", "hostParamsStage");
  s.setStageId(stageId);
  s.addHostRoleExecutionCommand(DummyHostname1, Role.DATANODE, RoleCommand.UPGRADE,
      new ServiceComponentHostUpgradeEvent(Role.DATANODE.toString(),
          DummyHostname1, System.currentTimeMillis(), "HDP-1.3.0"),
      DummyCluster, "HDFS", false, false);
  s.addHostRoleExecutionCommand(DummyHostname1, Role.NAMENODE, RoleCommand.INSTALL,
      new ServiceComponentHostInstallEvent(Role.NAMENODE.toString(),
          DummyHostname1, System.currentTimeMillis(), "HDP-1.3.0"),
      DummyCluster, "HDFS", false, false);
  List<Stage> stages = new ArrayList<Stage>();
  stages.add(s);
  Request request = new Request(stages, clusters);
  actionDBAccessor.persistActions(request);
  CommandReport cr = new CommandReport();
  cr.setActionId(StageUtils.getActionId(requestId, stageId));
  cr.setTaskId(1);
  cr.setClusterName(DummyCluster);
  cr.setServiceName(HDFS);
  cr.setRole(DATANODE);
  cr.setStatus(HostRoleStatus.IN_PROGRESS.toString());
  cr.setStdErr("none");
  cr.setStdOut("dummy output");
  actionDBAccessor.updateHostRoleState(DummyHostname1, requestId, stageId,
      Role.DATANODE.name(), cr);
  cr.setRole(NAMENODE);
  cr.setTaskId(2);
  actionDBAccessor.updateHostRoleState(DummyHostname1, requestId, stageId,
      Role.NAMENODE.name(), cr);
  HeartBeat hb = new HeartBeat();
  hb.setTimestamp(System.currentTimeMillis());
  hb.setResponseId(0);
  hb.setHostname(DummyHostname1);
  hb.setNodeStatus(new HostStatus(HostStatus.Status.HEALTHY, DummyHostStatus));
  CommandReport cr1 = new CommandReport();
  cr1.setActionId(StageUtils.getActionId(requestId, stageId));
  cr1.setTaskId(1);
  cr1.setClusterName(DummyCluster);
  cr1.setServiceName(HDFS);
  cr1.setRole(DATANODE);
  cr1.setRoleCommand("INSTALL");
  cr1.setStatus(HostRoleStatus.FAILED.toString());
  cr1.setStdErr("none");
  cr1.setStdOut("dummy output");
  cr1.setExitCode(0);
  CommandReport cr2 = new CommandReport();
  cr2.setActionId(StageUtils.getActionId(requestId, stageId));
  cr2.setTaskId(2);
  cr2.setClusterName(DummyCluster);
  cr2.setServiceName(HDFS);
  cr2.setRole(NAMENODE);
  cr2.setRoleCommand("INSTALL");
  cr2.setStatus(HostRoleStatus.FAILED.toString());
  cr2.setStdErr("none");
  cr2.setStdOut("dummy output");
  cr2.setExitCode(0);
  ArrayList<CommandReport> reports = new ArrayList<CommandReport>();
  reports.add(cr1);
  reports.add(cr2);
  hb.setReports(reports);
  ActionQueue aq = new ActionQueue();
  final HostRoleCommand command = hostRoleCommandFactory.create(DummyHostname1,
      Role.DATANODE, null, null);
  ActionManager am = actionManagerTestHelper.getMockActionManager();
  expect(am.getTasks(EasyMock.<List<Long>>anyObject())).andReturn(
      new ArrayList<HostRoleCommand>() {{
        add(command);
        add(command);
      }});
  replay(am);
  HeartBeatHandler handler = heartbeatTestHelper.getHeartBeatHandler(am, aq);
  HeartbeatProcessor heartbeatProcessor = handler.getHeartbeatProcessor();
  heartbeatProcessor.processHeartbeat(hb);
  assertEquals("State of SCH should change after fail report",
      State.UPGRADING, serviceComponentHost1.getState());
  assertEquals("State of SCH should change after fail report",
      State.INSTALL_FAILED, serviceComponentHost2.getState());
  assertEquals("Stack version of SCH should not change after fail report",
      stack120, serviceComponentHost1.getStackVersion());
  assertEquals("Stack version of SCH should not change after fail report",
      stack130, serviceComponentHost1.getDesiredStackVersion());
  assertEquals("Stack version of SCH should not change after fail report",
      State.INSTALL_FAILED, serviceComponentHost2.getState());
}