package tw.com.unit; import org.easymock.EasyMock; import org.easymock.EasyMockRunner; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import tw.com.*; import tw.com.entity.DeletionsPending; import tw.com.entity.StackNameAndId; import tw.com.exceptions.CannotFindVpcException; import tw.com.exceptions.CfnAssistException; import tw.com.providers.IdentityProvider; import tw.com.providers.NotificationSender; import tw.com.repository.*; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.util.LinkedList; import java.util.List; import static org.junit.Assert.*; @RunWith(EasyMockRunner.class) public class TestAwsFacadeDeltaApplicationAndRollbacksLegacy extends UpdateStackExpectations { private AwsFacade aws; private NotificationSender notificationSender; private IdentityProvider identityProvider; private static final String THIRD_FILE = "03createRoutes.json"; @Before public void beforeEachTestRuns() throws IOException { monitor = createMock(MonitorStackEvents.class); cfnRepository = createMock(CloudFormRepository.class); vpcRepository = createStrictMock(VpcRepository.class); ELBRepository elbRepository = createMock(ELBRepository.class); cloudRepository = createStrictMock(CloudRepository.class); notificationSender = createStrictMock(NotificationSender.class); identityProvider = createStrictMock(IdentityProvider.class); String regionName = EnvironmentSetupForTests.getRegion().getName(); aws = new AwsFacade(monitor, cfnRepository, vpcRepository, elbRepository, cloudRepository, notificationSender, identityProvider, regionName); deleteFile(THIRD_FILE); } @Test public void shouldRollbackFilesInAFolder() throws CfnAssistException { String stackA = "CfnAssistTest01createSubnet"; StackNameAndId stackANameAndId = new StackNameAndId(stackA, "id1"); String stackB = "CfnAssistTest02createAcls"; StackNameAndId stackBNameAndId = new StackNameAndId(stackB, "id2"); SetDeltaIndexForProjectAndEnv setDeltaIndexForProjectAndEnv = new SetDeltaIndexForProjectAndEnv(projectAndEnv,vpcRepository); EasyMock.expect(vpcRepository.getVpcIndexTag(projectAndEnv)).andReturn("2"); EasyMock.expect(cfnRepository.getStackNameAndId(stackB)).andReturn(stackBNameAndId); cfnRepository.deleteStack(stackB); EasyMock.expectLastCall(); EasyMock.expect(cfnRepository.getStackNameAndId(stackA)).andReturn(stackANameAndId); cfnRepository.deleteStack(stackA); EasyMock.expectLastCall(); EasyMock.expect(vpcRepository.getSetsDeltaIndexFor(projectAndEnv)). andReturn(setDeltaIndexForProjectAndEnv); DeletionsPending pending = new DeletionsPending(); pending.add(2, stackBNameAndId); pending.add(1, stackANameAndId); List<String> deletedStacks = new LinkedList<>(); deletedStacks.add(stackB); deletedStacks.add(stackA); EasyMock.expect(monitor.waitForDeleteFinished(pending, setDeltaIndexForProjectAndEnv)).andReturn(deletedStacks); replayAll(); List<String> result = aws.rollbackTemplatesInFolder(FilesForTesting.ORDERED_SCRIPTS_FOLDER, projectAndEnv); verifyAll(); assertEquals(2, result.size()); assertTrue(result.contains(stackA)); assertTrue(result.contains(stackB)); } @Test public void shouldRollbackFilesInAFolderWithUpdate() throws CfnAssistException { String stackA = "CfnAssistTest01createSubnet"; StackNameAndId stackANameAndId = new StackNameAndId(stackA, "id1"); SetDeltaIndexForProjectAndEnv setDeltaIndexForProjectAndEnv = new SetDeltaIndexForProjectAndEnv(projectAndEnv,vpcRepository); EasyMock.expect(vpcRepository.getVpcIndexTag(projectAndEnv)).andReturn("2"); EasyMock.expect(cfnRepository.getStackNameAndId(stackA)).andReturn(stackANameAndId); cfnRepository.deleteStack(stackA); EasyMock.expectLastCall(); EasyMock.expect(vpcRepository.getSetsDeltaIndexFor(projectAndEnv)).andReturn(setDeltaIndexForProjectAndEnv); DeletionsPending pending = new DeletionsPending(); pending.add(1, stackANameAndId); List<String> deletedStacks = new LinkedList<>(); deletedStacks.add(stackA); EasyMock.expect(monitor.waitForDeleteFinished(pending, setDeltaIndexForProjectAndEnv)).andReturn(deletedStacks); replayAll(); List<String> result = aws.rollbackTemplatesInFolder(FilesForTesting.ORDERED_SCRIPTS_WITH_UPDATES_FOLDER.toString(), projectAndEnv); verifyAll(); assertEquals(1, result.size()); assertTrue(result.contains(stackA)); } @Test public void shouldStepBackLastChangeInFolderOnAVpc() throws CfnAssistException { String stackB = "CfnAssistTest02createAcls"; StackNameAndId stackBNameAndId = new StackNameAndId(stackB, "id2"); SetDeltaIndexForProjectAndEnv setDeltaIndexForProjectAndEnv = new SetDeltaIndexForProjectAndEnv(projectAndEnv,vpcRepository); EasyMock.expect(vpcRepository.getVpcIndexTag(projectAndEnv)).andReturn("2"); EasyMock.expect(cfnRepository.getStackNameAndId(stackB)).andReturn(stackBNameAndId); cfnRepository.deleteStack(stackB); EasyMock.expectLastCall(); EasyMock.expect(vpcRepository.getSetsDeltaIndexFor(projectAndEnv)).andReturn(setDeltaIndexForProjectAndEnv); DeletionsPending pending = new DeletionsPending(); pending.add(2, stackBNameAndId); List<String> deletedStacks = new LinkedList<>(); deletedStacks.add(stackB); EasyMock.expect(monitor.waitForDeleteFinished(pending, setDeltaIndexForProjectAndEnv)).andReturn(deletedStacks); replayAll(); List<String> result = aws.stepbackLastChangeFromFolder(FilesForTesting.ORDERED_SCRIPTS_FOLDER, projectAndEnv); verifyAll(); assertEquals(1, result.size()); assertTrue(result.contains(stackB)); } @Test public void shouldStepBackLastChangeOnAVpcWhenFileIsADelta() throws CfnAssistException { SetDeltaIndexForProjectAndEnv setDeltaIndexForProjectAndEnv = new SetDeltaIndexForProjectAndEnv(projectAndEnv,vpcRepository); EasyMock.expect(vpcRepository.getVpcIndexTag(projectAndEnv)).andReturn("2"); EasyMock.expect(vpcRepository.getSetsDeltaIndexFor(projectAndEnv)).andReturn(setDeltaIndexForProjectAndEnv); vpcRepository.setVpcIndexTag(projectAndEnv, "1"); EasyMock.expectLastCall(); replayAll(); List<String> result = aws.stepbackLastChangeFromFolder(FilesForTesting.ORDERED_SCRIPTS_WITH_UPDATES_FOLDER.toString(), projectAndEnv); verifyAll(); assertEquals(0, result.size()); } @Test public void shouldHandleStepBackWhenNotFileAvailable() throws CfnAssistException { EasyMock.expect(vpcRepository.getVpcIndexTag(projectAndEnv)).andReturn("3"); // higher than file available replayAll(); List<String> result = aws.stepbackLastChangeFromFolder(FilesForTesting.ORDERED_SCRIPTS_WITH_UPDATES_FOLDER.toString(), projectAndEnv); verifyAll(); assertEquals(0, result.size()); } @Test public void shouldHandleRollBackWhenNotFileAvailable() throws CannotFindVpcException { EasyMock.expect(vpcRepository.getVpcIndexTag(projectAndEnv)).andReturn("3"); // higher than file available replayAll(); try { aws.rollbackTemplatesInFolder(FilesForTesting.ORDERED_SCRIPTS_WITH_UPDATES_FOLDER.toString(), projectAndEnv); fail("should have thrown"); } catch(CfnAssistException expectedException) { // no op } verifyAll(); } private void deleteFile(String filename) throws IOException { Path destFile = FileSystems.getDefault().getPath(FilesForTesting.ORDERED_SCRIPTS_FOLDER, filename); Files.deleteIfExists(destFile); } }