org.finra.herd.dao.helper.EmrHelperTest.java Source code

Java tutorial

Introduction

Here is the source code for org.finra.herd.dao.helper.EmrHelperTest.java

Source

/*
* Copyright 2015 herd contributors
*
* Licensed 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.finra.herd.dao.helper;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;

import com.amazonaws.services.elasticmapreduce.model.Cluster;
import com.amazonaws.services.elasticmapreduce.model.ClusterState;
import com.amazonaws.services.elasticmapreduce.model.ClusterStatus;
import com.amazonaws.services.elasticmapreduce.model.ClusterSummary;
import com.amazonaws.services.elasticmapreduce.model.Configuration;
import com.amazonaws.services.elasticmapreduce.model.EbsBlockDevice;
import com.amazonaws.services.elasticmapreduce.model.InstanceFleet;
import com.amazonaws.services.elasticmapreduce.model.InstanceFleetProvisioningSpecifications;
import com.amazonaws.services.elasticmapreduce.model.InstanceFleetStateChangeReason;
import com.amazonaws.services.elasticmapreduce.model.InstanceFleetStatus;
import com.amazonaws.services.elasticmapreduce.model.InstanceFleetTimeline;
import com.amazonaws.services.elasticmapreduce.model.InstanceTypeSpecification;
import com.amazonaws.services.elasticmapreduce.model.ListInstanceFleetsResult;
import com.amazonaws.services.elasticmapreduce.model.SpotProvisioningSpecification;
import com.amazonaws.services.elasticmapreduce.model.StepConfig;
import com.amazonaws.services.elasticmapreduce.model.VolumeSpecification;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import org.finra.herd.core.HerdDateUtils;
import org.finra.herd.dao.AbstractDaoTest;
import org.finra.herd.dao.EmrDao;
import org.finra.herd.model.api.xml.EmrClusterEbsBlockDevice;
import org.finra.herd.model.api.xml.EmrClusterInstanceFleet;
import org.finra.herd.model.api.xml.EmrClusterInstanceFleetProvisioningSpecifications;
import org.finra.herd.model.api.xml.EmrClusterInstanceFleetStateChangeReason;
import org.finra.herd.model.api.xml.EmrClusterInstanceFleetStatus;
import org.finra.herd.model.api.xml.EmrClusterInstanceFleetTimeline;
import org.finra.herd.model.api.xml.EmrClusterInstanceTypeConfiguration;
import org.finra.herd.model.api.xml.EmrClusterInstanceTypeSpecification;
import org.finra.herd.model.api.xml.EmrClusterSpotProvisioningSpecification;
import org.finra.herd.model.api.xml.EmrClusterVolumeSpecification;
import org.finra.herd.model.api.xml.InstanceDefinition;
import org.finra.herd.model.api.xml.InstanceDefinitions;
import org.finra.herd.model.api.xml.MasterInstanceDefinition;
import org.finra.herd.model.api.xml.Parameter;

/**
 * This class tests functionality within the AwsHelper class.
 */
public class EmrHelperTest extends AbstractDaoTest {
    @Autowired
    EmrHelper emrHelper;

    @Test
    public void testBuildEmrClusterName() throws Exception {
        String clusterName = emrHelper.buildEmrClusterName(NAMESPACE, EMR_CLUSTER_DEFINITION_NAME,
                EMR_CLUSTER_NAME);

        assertEquals(NAMESPACE + "." + EMR_CLUSTER_DEFINITION_NAME + "." + EMR_CLUSTER_NAME, clusterName);
    }

    @Test
    public void testGetS3StagingLocation() throws Exception {
        String s3StagingLocation = emrHelper.getS3StagingLocation();

        assertNotNull("s3 staging location is null", s3StagingLocation);
    }

    @Test
    public void testIsActiveEmrState() throws Exception {
        boolean isActive = emrHelper.isActiveEmrState("RUNNING");

        assertTrue("not active", isActive);
    }

    @Test
    public void testEmrHadoopJarStepConfig() throws Exception {
        StepConfig stepConfig = emrHelper.getEmrHadoopJarStepConfig("step_name", "jar_location", null, null, false);

        assertNotNull("step not retuned", stepConfig);

        assertEquals("name not found", "step_name", stepConfig.getName());
        assertEquals("jar not found", "jar_location", stepConfig.getHadoopJarStep().getJar());
    }

    @Test
    public void testEmrHadoopJarStepConfigNoContinueOnError() throws Exception {
        StepConfig stepConfig = emrHelper.getEmrHadoopJarStepConfig("step_name", "jar_location", null, null, null);

        assertNotNull("step not retuned", stepConfig);

        assertEquals("name not found", "step_name", stepConfig.getName());
        assertEquals("jar not found", "jar_location", stepConfig.getHadoopJarStep().getJar());
    }

    @Test
    public void testEmrHadoopJarStepConfigContinueOnError() throws Exception {
        StepConfig stepConfig = emrHelper.getEmrHadoopJarStepConfig("step_name", "jar_location", null, null, true);

        assertNotNull("step not retuned", stepConfig);

        assertEquals("name not found", "step_name", stepConfig.getName());
        assertEquals("jar not found", "jar_location", stepConfig.getHadoopJarStep().getJar());
    }

    @Test
    public void testEmrHadoopJarStepConfigWithArguments() throws Exception {
        List<String> arguments = new ArrayList<>();
        arguments.add("arg1");

        StepConfig stepConfig = emrHelper.getEmrHadoopJarStepConfig("step_name", "jar_location", null, arguments,
                false);

        assertNotNull("step not retuned", stepConfig);

        assertEquals("name not found", "step_name", stepConfig.getName());
        assertEquals("jar not found", "jar_location", stepConfig.getHadoopJarStep().getJar());
        assertNotNull("arguments not found", stepConfig.getHadoopJarStep().getArgs());
    }

    @Test
    public void testGetActiveEmrClusterIdAssertReturnActualClusterIdWhenClusterIdSpecifiedAndClusterStateActiveAndNameMatch() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = "emrClusterId";
            String emrClusterName = "emrClusterName";
            String expectedEmrClusterId = "expectedEmrClusterId";

            when(mockEmrDao.getEmrClusterById(any(), any())).thenReturn(new Cluster().withId(expectedEmrClusterId)
                    .withName(emrClusterName).withStatus(new ClusterStatus().withState(ClusterState.RUNNING)));

            assertEquals(expectedEmrClusterId, emrHelper.getActiveEmrClusterId(emrClusterId, emrClusterName, null));

            verify(mockEmrDao).getEmrClusterById(eq(emrClusterId.trim()), any());
            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testGetActiveEmrClusterIdAssertErrorWhenClusterIdSpecifiedAndNameMismatch() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = "emrClusterId";
            String emrClusterName = "emrClusterName";
            String expectedEmrClusterId = "expectedEmrClusterId";
            String actualEmrClusterName = "actualEmrClusterName";

            when(mockEmrDao.getEmrClusterById(any(), any()))
                    .thenReturn(new Cluster().withId(expectedEmrClusterId).withName(actualEmrClusterName)
                            .withStatus(new ClusterStatus().withState(ClusterState.RUNNING)));

            try {
                emrHelper.getActiveEmrClusterId(emrClusterId, emrClusterName, null);
                fail();
            } catch (IllegalArgumentException e) {
                assertEquals(String.format(
                        "The cluster with ID \"%s\" does not match the expected name \"%s\". The actual name is \"%s\".",
                        expectedEmrClusterId, emrClusterName, actualEmrClusterName), e.getMessage());
            }

            verify(mockEmrDao).getEmrClusterById(eq(emrClusterId.trim()), any());
            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testGetActiveEmrClusterIdAssertReturnActualClusterIdWhenClusterStateActiveAndNameNotSpecified() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = "emrClusterId";
            String emrClusterName = null;
            String expectedEmrClusterId = "expectedEmrClusterId";
            String actualEmrClusterName = "actualEmrClusterName";

            when(mockEmrDao.getEmrClusterById(any(), any()))
                    .thenReturn(new Cluster().withId(expectedEmrClusterId).withName(actualEmrClusterName)
                            .withStatus(new ClusterStatus().withState(ClusterState.RUNNING)));

            assertEquals(expectedEmrClusterId, emrHelper.getActiveEmrClusterId(emrClusterId, emrClusterName, null));

            verify(mockEmrDao).getEmrClusterById(eq(emrClusterId), any());
            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testGetActiveEmrClusterIdAssertErrorWhenClusterIdSpecifiedAndClusterStateNotActive() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = "emrClusterId";
            String emrClusterName = "emrClusterName";
            String expectedEmrClusterId = "expectedEmrClusterId";

            ClusterState actualClusterState = ClusterState.TERMINATED;
            when(mockEmrDao.getEmrClusterById(any(), any())).thenReturn(new Cluster().withId(expectedEmrClusterId)
                    .withName(emrClusterName).withStatus(new ClusterStatus().withState(actualClusterState)));

            try {
                emrHelper.getActiveEmrClusterId(emrClusterId, emrClusterName, null);
                fail();
            } catch (IllegalArgumentException e) {
                assertEquals(String.format(
                        "The cluster with ID \"%s\" is not active. The cluster state must be in one of [STARTING, BOOTSTRAPPING, RUNNING, "
                                + "WAITING]. Current state is \"%s\"",
                        emrClusterId, actualClusterState), e.getMessage());
            }

            verify(mockEmrDao).getEmrClusterById(eq(emrClusterId), any());
            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testGetActiveEmrClusterIdAssertErrorWhenClusterIdSpecifiedAndClusterDoesNotExist() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = "emrClusterId";
            String emrClusterName = "emrClusterName";

            when(mockEmrDao.getEmrClusterById(any(), any())).thenReturn(null);

            try {
                emrHelper.getActiveEmrClusterId(emrClusterId, emrClusterName, null);
                fail();
            } catch (IllegalArgumentException e) {
                assertEquals(String.format("The cluster with ID \"%s\" does not exist.", emrClusterId),
                        e.getMessage());
            }

            verify(mockEmrDao).getEmrClusterById(eq(emrClusterId), any());
            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testGetActiveEmrClusterIdAssertParametersTrimmed() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = "emrClusterId";
            String emrClusterName = "emrClusterName";
            String expectedEmrClusterId = "expectedEmrClusterId";

            when(mockEmrDao.getEmrClusterById(any(), any())).thenReturn(new Cluster().withId(expectedEmrClusterId)
                    .withName(emrClusterName).withStatus(new ClusterStatus().withState(ClusterState.RUNNING)));

            assertEquals(expectedEmrClusterId,
                    emrHelper.getActiveEmrClusterId(StringUtils.wrap(emrClusterId, BLANK_TEXT),
                            StringUtils.wrap(emrClusterName, BLANK_TEXT), null));

            verify(mockEmrDao).getEmrClusterById(eq(emrClusterId.trim()), any());
            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testGetActiveEmrClusterIdAssertParametersCaseIgnored() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = "emrClusterId";
            String emrClusterName = "emrClusterName";
            String expectedEmrClusterId = "expectedEmrClusterId";

            when(mockEmrDao.getEmrClusterById(any(), any())).thenReturn(new Cluster().withId(expectedEmrClusterId)
                    .withName(emrClusterName).withStatus(new ClusterStatus().withState(ClusterState.RUNNING)));

            assertEquals(expectedEmrClusterId, emrHelper.getActiveEmrClusterId(StringUtils.upperCase(emrClusterId),
                    StringUtils.upperCase(emrClusterName), null));

            verify(mockEmrDao).getEmrClusterById(eq(StringUtils.upperCase(emrClusterId)), any());
            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testGetActiveEmrClusterIdNoIdSpecifiedAssertReturnActualClusterId() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = null;
            String emrClusterName = "emrClusterName";
            String expectedEmrClusterId = "expectedEmrClusterId";

            when(mockEmrDao.getActiveEmrClusterByName(any(), any()))
                    .thenReturn(new ClusterSummary().withId(expectedEmrClusterId).withName(emrClusterName));

            assertEquals(expectedEmrClusterId, emrHelper.getActiveEmrClusterId(emrClusterId, emrClusterName, null));

            verify(mockEmrDao).getActiveEmrClusterByName(eq(emrClusterName), any());
            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testGetActiveEmrClusterIdNoIdSpecifiedAssertErrorWhenClusterDoesNotExist() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = null;
            String emrClusterName = "emrClusterName";

            when(mockEmrDao.getActiveEmrClusterByName(any(), any())).thenReturn(null);

            try {
                emrHelper.getActiveEmrClusterId(emrClusterId, emrClusterName, null);
                fail();
            } catch (IllegalArgumentException e) {
                assertEquals(String.format("The cluster with name \"%s\" does not exist.", emrClusterName),
                        e.getMessage());
            }

            verify(mockEmrDao).getActiveEmrClusterByName(eq(emrClusterName), any());
            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testGetActiveEmrClusterIdAssertErrorWhenBothIdAndNameNotSpecified() {
        EmrDao originalEmrDao = emrHelper.getEmrDao();
        EmrDao mockEmrDao = mock(EmrDao.class);
        emrHelper.setEmrDao(mockEmrDao);

        try {
            String emrClusterId = null;
            String emrClusterName = null;

            try {
                emrHelper.getActiveEmrClusterId(emrClusterId, emrClusterName, null);
                fail();
            } catch (IllegalArgumentException e) {
                assertEquals("One of EMR cluster ID or EMR cluster name must be specified.", e.getMessage());
            }

            verifyNoMoreInteractions(mockEmrDao);
        } finally {
            emrHelper.setEmrDao(originalEmrDao);
        }
    }

    @Test
    public void testIsInstanceDefinitionsEmpty() {
        assertTrue(emrHelper.isInstanceDefinitionsEmpty(null));
        assertTrue(emrHelper.isInstanceDefinitionsEmpty(new InstanceDefinitions(null, null, null)));

        assertFalse(emrHelper
                .isInstanceDefinitionsEmpty(new InstanceDefinitions(new MasterInstanceDefinition(), null, null)));
        assertFalse(emrHelper
                .isInstanceDefinitionsEmpty(new InstanceDefinitions(null, new InstanceDefinition(), null)));
        assertFalse(emrHelper
                .isInstanceDefinitionsEmpty(new InstanceDefinitions(null, null, new InstanceDefinition())));
    }

    @Test
    public void testBuildEmrClusterInstanceFleetFromAwsResult() {
        ListInstanceFleetsResult listInstanceFleetsResult = null;
        assertNull(emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        listInstanceFleetsResult = new ListInstanceFleetsResult();
        assertNull(emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        String instanceId = "instance id";
        String instanceName = "instance name";
        String instanceFleetType = "instance fleet type";
        int targetOnDemandCapacity = 1;
        int targetSpotCapacity = 2;
        int provisionedOnDemandCapacity = 3;
        int provisionedSpotCapacity = 4;

        EmrClusterInstanceFleet expectedEmrInstanceFleet = new EmrClusterInstanceFleet();
        expectedEmrInstanceFleet.setId(instanceId);
        expectedEmrInstanceFleet.setName(instanceName);
        expectedEmrInstanceFleet.setInstanceFleetType(instanceFleetType);
        expectedEmrInstanceFleet.setTargetOnDemandCapacity(targetOnDemandCapacity);
        expectedEmrInstanceFleet.setTargetSpotCapacity(targetSpotCapacity);
        expectedEmrInstanceFleet.setProvisionedOnDemandCapacity(provisionedOnDemandCapacity);
        expectedEmrInstanceFleet.setProvisionedSpotCapacity(provisionedSpotCapacity);

        InstanceFleet instanceFleet = new InstanceFleet();
        instanceFleet.setId(instanceId);
        instanceFleet.setName(instanceName);
        instanceFleet.setInstanceFleetType(instanceFleetType);
        instanceFleet.setTargetOnDemandCapacity(targetOnDemandCapacity);
        instanceFleet.setTargetSpotCapacity(targetSpotCapacity);
        instanceFleet.setProvisionedSpotCapacity(provisionedSpotCapacity);
        instanceFleet.setProvisionedOnDemandCapacity(provisionedOnDemandCapacity);

        List<InstanceFleet> instanceFleets = new ArrayList<>();
        instanceFleets.add(null);
        instanceFleets.add(instanceFleet);
        listInstanceFleetsResult.setInstanceFleets(instanceFleets);

        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        EmrClusterInstanceFleetStatus emrClusterInstanceFleetStatus = new EmrClusterInstanceFleetStatus();
        String emrClusterInstanceFleetStatus_State = "state 1";
        emrClusterInstanceFleetStatus.setState(emrClusterInstanceFleetStatus_State);
        expectedEmrInstanceFleet.setInstanceFleetStatus(emrClusterInstanceFleetStatus);

        InstanceFleetStatus instanceFleetStatus = new InstanceFleetStatus();
        instanceFleetStatus.setState(emrClusterInstanceFleetStatus_State);
        instanceFleet.setStatus(instanceFleetStatus);

        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        String emrClusterInstanceFleetStatus_StateChangeCode = "change code 1";
        String emrClusterInstanceFleetStatus_StateChangeMsg = "change msg 1";
        InstanceFleetStateChangeReason instanceFleetStateChangeReason = new InstanceFleetStateChangeReason();
        instanceFleetStateChangeReason.setCode(emrClusterInstanceFleetStatus_StateChangeCode);
        instanceFleetStateChangeReason.setMessage(emrClusterInstanceFleetStatus_StateChangeMsg);
        instanceFleetStatus.setStateChangeReason(instanceFleetStateChangeReason);
        InstanceFleetTimeline instanceFleetTimeline = new InstanceFleetTimeline();
        java.util.Date now = Calendar.getInstance().getTime();
        instanceFleetTimeline.setCreationDateTime(now);
        instanceFleetTimeline.setReadyDateTime(now);
        instanceFleetTimeline.setEndDateTime(now);
        instanceFleetStatus.setTimeline(instanceFleetTimeline);

        EmrClusterInstanceFleetStateChangeReason emrClusterInstanceFleetStateChangeReason = new EmrClusterInstanceFleetStateChangeReason();
        emrClusterInstanceFleetStateChangeReason.setCode(emrClusterInstanceFleetStatus_StateChangeCode);
        emrClusterInstanceFleetStateChangeReason.setMessage(emrClusterInstanceFleetStatus_StateChangeMsg);
        emrClusterInstanceFleetStatus.setStateChangeReason(emrClusterInstanceFleetStateChangeReason);
        EmrClusterInstanceFleetTimeline emrClusterInstanceFleetTimeline = new EmrClusterInstanceFleetTimeline();
        emrClusterInstanceFleetTimeline.setCreationDateTime(HerdDateUtils.getXMLGregorianCalendarValue(now));
        emrClusterInstanceFleetTimeline.setReadyDateTime(HerdDateUtils.getXMLGregorianCalendarValue(now));
        emrClusterInstanceFleetTimeline.setEndDateTime(HerdDateUtils.getXMLGregorianCalendarValue(now));
        emrClusterInstanceFleetStatus.setTimeline(emrClusterInstanceFleetTimeline);

        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        String instanceType = "instance type 1";
        int weightedCapacity = 1;
        String bidPrice = "1.0";
        double bidPricePercent = 0.8;
        boolean ebsOptimized = true;
        InstanceTypeSpecification instanceTypeSpecification = new InstanceTypeSpecification();
        instanceTypeSpecification.setInstanceType(instanceType);
        instanceTypeSpecification.setWeightedCapacity(weightedCapacity);
        instanceTypeSpecification.setBidPrice(bidPrice);
        instanceTypeSpecification.setBidPriceAsPercentageOfOnDemandPrice(bidPricePercent);
        instanceTypeSpecification.setEbsOptimized(ebsOptimized);

        List<InstanceTypeSpecification> instanceTypeSpecifications = new ArrayList<>();
        instanceTypeSpecifications.add(null);
        instanceTypeSpecifications.add(instanceTypeSpecification);
        instanceFleet.setInstanceTypeSpecifications(instanceTypeSpecifications);

        EmrClusterInstanceTypeSpecification emrClusterInstanceTypeSpecification = new EmrClusterInstanceTypeSpecification();
        emrClusterInstanceTypeSpecification.setInstanceType(instanceType);
        emrClusterInstanceTypeSpecification.setWeightedCapacity(weightedCapacity);
        emrClusterInstanceTypeSpecification.setBidPrice(bidPrice);
        emrClusterInstanceTypeSpecification.setBidPriceAsPercentageOfOnDemandPrice(bidPricePercent);
        emrClusterInstanceTypeSpecification.setEbsOptimized(ebsOptimized);
        expectedEmrInstanceFleet.setInstanceTypeSpecifications(Arrays.asList(emrClusterInstanceTypeSpecification));

        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        EbsBlockDevice ebsBlockDevice = new EbsBlockDevice();
        String device = "device 1";
        ebsBlockDevice.setDevice(device);
        List<EbsBlockDevice> ebsBlockDevices = new ArrayList<>();
        ebsBlockDevices.add(ebsBlockDevice);
        ebsBlockDevices.add(null);
        instanceTypeSpecification.setEbsBlockDevices(ebsBlockDevices);
        EmrClusterEbsBlockDevice emrClusterEbsBlockDevice = new EmrClusterEbsBlockDevice();
        emrClusterEbsBlockDevice.setDevice(device);
        emrClusterInstanceTypeSpecification.setEbsBlockDevices(Arrays.asList(emrClusterEbsBlockDevice));
        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        int iops = 100;
        int sizeInGB = 20;
        String volumeType = "volume type 1";
        VolumeSpecification volumeSpecification = new VolumeSpecification();
        volumeSpecification.setIops(iops);
        volumeSpecification.setSizeInGB(sizeInGB);
        volumeSpecification.setVolumeType(volumeType);
        ebsBlockDevice.setVolumeSpecification(volumeSpecification);
        EmrClusterVolumeSpecification emrClusterVolumeSpecification = new EmrClusterVolumeSpecification();
        emrClusterVolumeSpecification.setIops(iops);
        emrClusterVolumeSpecification.setSizeInGB(sizeInGB);
        emrClusterVolumeSpecification.setVolumeType(volumeType);
        emrClusterEbsBlockDevice.setVolumeSpecification(emrClusterVolumeSpecification);
        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        InstanceFleetProvisioningSpecifications instanceFleetProvisioningSpecifications = new InstanceFleetProvisioningSpecifications();
        instanceFleet.setLaunchSpecifications(instanceFleetProvisioningSpecifications);
        EmrClusterInstanceFleetProvisioningSpecifications emrClusterInstanceFleetProvisioningSpecifications = new EmrClusterInstanceFleetProvisioningSpecifications();
        expectedEmrInstanceFleet.setLaunchSpecifications(emrClusterInstanceFleetProvisioningSpecifications);

        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        List<Configuration> configurations = new ArrayList<>();
        Configuration configuration = new Configuration();
        String classification = "classification 1";
        configuration.setClassification(classification);
        configurations.add(null);
        configurations.add(configuration);
        instanceTypeSpecification.setConfigurations(configurations);
        EmrClusterInstanceTypeConfiguration emrClusterInstanceTypeConfiguration = new EmrClusterInstanceTypeConfiguration();
        emrClusterInstanceTypeConfiguration.setClassification(classification);
        emrClusterInstanceTypeSpecification.setConfigurations(Arrays.asList(emrClusterInstanceTypeConfiguration));

        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        String paramKey = "param 1";
        String paramVal = "param val 1";
        java.util.Map<String, String> map = new HashMap<>();
        map.put(paramKey, paramVal);
        configuration.setProperties(map);
        Parameter parameter = new Parameter(paramKey, paramVal);
        emrClusterInstanceTypeConfiguration.setProperties(Arrays.asList(parameter));

        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

        int blockDurationMin = 30;
        String timeoutAction = "action 1";
        int timeoutDurationMin = 60;

        //to do time out action
        SpotProvisioningSpecification spotProvisioningSpecification = new SpotProvisioningSpecification();
        spotProvisioningSpecification.setBlockDurationMinutes(blockDurationMin);
        spotProvisioningSpecification.setTimeoutAction(timeoutAction);
        spotProvisioningSpecification.setTimeoutDurationMinutes(timeoutDurationMin);
        instanceFleetProvisioningSpecifications.setSpotSpecification(spotProvisioningSpecification);

        EmrClusterSpotProvisioningSpecification emrClusterSpotProvisioningSpecification = new EmrClusterSpotProvisioningSpecification();
        emrClusterSpotProvisioningSpecification.setBlockDurationMinutes(blockDurationMin);
        emrClusterSpotProvisioningSpecification.setTimeoutAction(timeoutAction);
        emrClusterSpotProvisioningSpecification.setTimeoutDurationMinutes(timeoutDurationMin);
        emrClusterInstanceFleetProvisioningSpecifications
                .setSpotSpecification(emrClusterSpotProvisioningSpecification);

        assertEquals(Arrays.asList(expectedEmrInstanceFleet),
                emrHelper.buildEmrClusterInstanceFleetFromAwsResult(listInstanceFleetsResult));

    }
}