/* * Copyright (c) 2016 EMC Corporation * All Rights Reserved */ package com.emc.storageos.systemservices.impl.resource; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import java.io.File; import java.net.URI; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.apache.curator.framework.recipes.locks.InterProcessLock; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; import com.emc.storageos.coordinator.client.model.StorageDriverMetaData; import com.emc.storageos.coordinator.client.model.StorageDriversInfo; import com.emc.storageos.coordinator.client.service.impl.CoordinatorClientImpl; import com.emc.storageos.coordinator.common.Configuration; import com.emc.storageos.db.client.impl.DbClientImpl; import com.emc.storageos.db.client.model.StorageSystemType; import com.emc.storageos.model.storagedriver.StorageDriverList; import com.emc.storageos.model.storagedriver.StorageDriverRestRep; import com.emc.storageos.services.OperationTypeEnum; import com.emc.storageos.systemservices.impl.upgrade.CoordinatorClientExt; import com.sun.jersey.core.header.FormDataContentDisposition; public class StorageDriverServiceTest extends StorageDriverService { private DbClientImpl dbClient; private CoordinatorClientImpl coordinator; private CoordinatorClientExt coordinatorExt; private StorageDriverService service; private StorageSystemType type1; private StorageSystemType type2; private StorageSystemType type3; @Before public void setUp() throws Exception { // mock dependent members of StorageDriverService instance and wire into // them dbClient = mock(DbClientImpl.class); doNothing().when(dbClient).createObject(any(StorageSystemType.class)); doNothing().when(dbClient).updateObject(any(StorageSystemType.class)); coordinator = mock(CoordinatorClientImpl.class); coordinatorExt = mock(CoordinatorClientExt.class); doReturn(coordinator).when(coordinatorExt).getCoordinatorClient(); doNothing().when(coordinator).persistServiceConfiguration(any(Configuration.class)); service = spy(new StorageDriverService()); service.setDbClient(dbClient); service.setCoordinatorExt(coordinatorExt); // mock 3 storage system types in db type1 = new StorageSystemType(); type1.setStorageTypeDispName("systemtype1"); type1.setStorageTypeName("systemtype1"); type1.setIsNative(false); type1.setDriverStatus(StorageSystemType.STATUS.ACTIVE.toString()); type1.setDriverName("driver1"); type1.setDriverFileName("driverFileName1"); type1.setDriverVersion("1.2.3.4"); type2 = new StorageSystemType(); type2.setStorageTypeDispName("providertype1"); type2.setStorageTypeName("providertype1"); type2.setIsNative(false); type2.setDriverStatus(StorageSystemType.STATUS.ACTIVE.toString()); type2.setDriverName("driver1"); type2.setDriverFileName("driverFileName1"); type2.setDriverVersion("1.2.3.4"); type3 = new StorageSystemType(); type3.setStorageTypeDispName("systemtype2"); type3.setStorageTypeName("systemtype2"); type3.setIsNative(false); type3.setDriverStatus(StorageSystemType.STATUS.ACTIVE.toString()); type3.setDriverName("driver2"); List<StorageSystemType> types = new ArrayList<StorageSystemType>(); types.add(type1); types.add(type2); types.add(type3); doReturn(types.iterator()).when(dbClient).queryIterativeObjects(eq(StorageSystemType.class), anyCollectionOf(URI.class)); // mock that systemtype1 is in use Set<String> inUseTypes = new HashSet<String>(); inUseTypes.add("systemtype1"); doReturn(inUseTypes).when(service).getUsedStorageProviderTypes(); // mock that no systemtype is used doReturn(new HashSet<String>()).when(service).getUsedStorageSystemTypes(); // bypass pre-check for environment doNothing().when(service).precheckForEnv(); // mock lock acquire and release InterProcessLock lock = mock(InterProcessLock.class); doNothing().when(lock).release(); doReturn(lock).when(service).getStorageDriverOperationLock(); // mock target list of installed drivers StorageDriversInfo drivers = new StorageDriversInfo(); Set<String> installedDrivers = new HashSet<String>(); installedDrivers.add("driverFileName1"); installedDrivers.add("driverFileName2"); drivers.setInstalledDrivers(installedDrivers); doReturn(drivers).when(coordinator).getTargetInfo(anyObject()); // mock audit operation doNothing().when(service).auditOperation(any(OperationTypeEnum.class), anyString(), anyString(), anyObject()); // mock file moving from tmp dir to data dir doNothing().when(service).moveDriverToDataDir(any(File.class)); // mock updating target innfo doNothing().when(coordinator).setTargetInfo(anyObject()); // mock progess updating doNothing().when(coordinatorExt).setNodeSessionScopeInfo(anyObject()); // mock moving driver file to tmp dir doReturn(null).when(service).saveToTmpDir(anyString(), anyObject()); } private StorageDriverMetaData createMetaData() { StorageDriverMetaData metaData = new StorageDriverMetaData(); metaData = new StorageDriverMetaData(); metaData.setDriverName("driverName"); metaData.setDriverVersion("1.2.3.4"); metaData.setStorageName("storage name"); metaData.setStorageDisplayName("storage display name"); metaData.setProviderName("provider name"); metaData.setProviderDisplayName("provider display name"); metaData.setMetaType("BLOCK"); metaData.setEnableSsl(true); metaData.setSslPort(1234); metaData.setNonSslPort(4321); metaData.setDriverClassName("driverClassName"); metaData.setDriverFileName("driverFileName"); metaData.setSupportAutoTierPolicy(true); return metaData; } @Test public void testGetStorageDrivers() { StorageDriverList driverList = service.getStorageDrivers(); assertEquals(driverList.getDrivers().size(), 2); for (StorageDriverRestRep driver : driverList.getDrivers()) { if ("driver1".equals(driver.getDriverName())) { assertEquals(driver.getSupportedTypes().size(), 2); assertTrue(driver.getSupportedTypes().contains("systemtype1")); assertTrue(driver.getSupportedTypes().contains("providertype1")); assertEquals(driver.getDriverStatus(), "IN_USE"); } if ("driver2".equals(driver.getDriverName())) { assertEquals(driver.getSupportedTypes().size(), 1); assertTrue(driver.getSupportedTypes().contains("systemtype2")); assertEquals(driver.getDriverStatus(), "READY"); } } } @Test public void testGetSingleDriver() { StorageDriverRestRep driver = service.getSingleStorageDriver("driver1"); assertEquals(driver.getDriverName(), "driver1"); assertEquals(driver.getSupportedTypes().size(), 2); assertTrue(driver.getSupportedTypes().contains("systemtype1")); assertTrue(driver.getSupportedTypes().contains("providertype1")); assertEquals(driver.getDriverStatus(), "IN_USE"); } @Test public void testInstall() throws Exception { FormDataContentDisposition details = mock(FormDataContentDisposition.class); doReturn(0L).when(details).getSize(); // mock parsing meta data doReturn(createMetaData()).when(service).parseDriverMetaData(anyObject()); try { service.install(null, details); } catch (Exception e) { fail("driver install failed"); } } @Test public void testUninstall() { String driverName = "driver1"; try { service.uninstall(driverName); } catch (Exception e) { fail("driver uninstall failed"); } } @Test public void testUpgrade() { String driverName = "driver1"; FormDataContentDisposition details = mock(FormDataContentDisposition.class); doReturn(0L).when(details).getSize(); boolean force = false; StorageDriverMetaData metaData = createMetaData(); metaData.setDriverName("driver1"); metaData.setDriverVersion("1.2.3.5"); // mock parsing meta data doReturn(metaData).when(service).parseDriverMetaData(anyObject()); try { service.upgrade(driverName, null, details, force); } catch (Exception e) { fail("driver upgrade failed"); } } }