@Test
public void testDirectionUpgrade() throws Exception {

  Cluster cluster = clusters.getCluster("c1");
  StackEntity stackEntity = stackDAO.find("HDP", "2.1.1");
  RepositoryVersionEntity repoVersionEntity = new RepositoryVersionEntity();
  repoVersionEntity.setDisplayName("My New Version 3");
  repoVersionEntity.setOperatingSystems("");
  repoVersionEntity.setStack(stackEntity);
  repoVersionEntity.setVersion("2.2.2.3");
  repoVersionDao.create(repoVersionEntity);
  Map<String, Object> requestProps = new HashMap<>();
  requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
  requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2.2.3");
  requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_direction");
  requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true");
  requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.UPGRADE.name());
  ResourceProvider upgradeResourceProvider = createProvider(amc);
  Request request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
  upgradeResourceProvider.createResources(request);
  List<UpgradeEntity> upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
  assertEquals(1, upgrades.size());
  UpgradeEntity upgrade = upgrades.get(0);
  Long id = upgrade.getRequestId();
  assertEquals(3, upgrade.getUpgradeGroups().size());
  // Ensure that there are no items related to downgrade in the upgrade direction
  UpgradeGroupEntity group = upgrade.getUpgradeGroups().get(2);
  Assert.assertEquals("POST_CLUSTER", group.getName());
  Assert.assertTrue(!group.getItems().isEmpty());
  for (UpgradeItemEntity item : group.getItems()) {
    Assert.assertFalse(item.getText().toLowerCase().contains("downgrade"));
  }
  // now abort the upgrade so another can be created
  abortUpgrade(upgrade.getRequestId());
  requestProps.clear();
  // Now perform a downgrade
  requestProps.put(UpgradeResourceProvider.UPGRADE_CLUSTER_NAME, "c1");
  requestProps.put(UpgradeResourceProvider.UPGRADE_VERSION, "2.2");
  requestProps.put(UpgradeResourceProvider.UPGRADE_PACK, "upgrade_direction");
  requestProps.put(UpgradeResourceProvider.UPGRADE_SKIP_PREREQUISITE_CHECKS, "true");
  requestProps.put(UpgradeResourceProvider.UPGRADE_FROM_VERSION, "2.2.2.3");
  requestProps.put(UpgradeResourceProvider.UPGRADE_DIRECTION, Direction.DOWNGRADE.name());
  request = PropertyHelper.getCreateRequest(Collections.singleton(requestProps), null);
  upgradeResourceProvider.createResources(request);
  upgrades = upgradeDao.findUpgrades(cluster.getClusterId());
  assertEquals(2, upgrades.size());
  upgrade = null;
  for (UpgradeEntity u : upgrades) {
    if (!u.getRequestId().equals(id)) {
      upgrade = u;
    }
  }
  assertNotNull(upgrade);
  assertEquals("Downgrade groups reduced from 3 to 2", 2, upgrade.getUpgradeGroups().size());
  group = upgrade.getUpgradeGroups().get(1);
  assertEquals("Execution items increased from 1 to 2", 2, group.getItems().size());
}