/*************************GO-LICENSE-START********************************* * Copyright 2014 ThoughtWorks, Inc. * * 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. *************************GO-LICENSE-END***********************************/ package com.thoughtworks.go.server.initializers; import java.io.File; import java.io.IOException; import java.util.zip.ZipInputStream; import com.thoughtworks.go.server.domain.Version; import com.thoughtworks.go.serverhealth.HealthStateLevel; import com.thoughtworks.go.serverhealth.ServerHealthService; import com.thoughtworks.go.serverhealth.ServerHealthState; import com.thoughtworks.go.util.SystemEnvironment; import com.thoughtworks.go.util.TempFiles; import com.thoughtworks.go.util.ZipUtil; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.junit.After; import org.junit.Before; import org.junit.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.mockito.Matchers.argThat; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class CommandRepositoryInitializerTest { private SystemEnvironment systemEnvironment; private ZipInputStream zipInputStream; private CommandRepositoryInitializer spy; private TempFiles tempFiles; private ZipUtil zipUtil; private ServerHealthService serverHealthService; private String VERSION_FILE = "version.txt"; @Before public void setUp() { serverHealthService = mock(ServerHealthService.class); systemEnvironment = mock(SystemEnvironment.class); zipUtil = mock(ZipUtil.class); zipInputStream = mock(ZipInputStream.class); when(systemEnvironment.get(SystemEnvironment.VERSION_FILE_IN_DEFAULT_COMMAND_REPOSITORY)).thenReturn("version.txt"); CommandRepositoryInitializer initializer = new CommandRepositoryInitializer(systemEnvironment, zipUtil, serverHealthService); spy = spy(initializer); tempFiles = new TempFiles(); } @After public void tearDown() { tempFiles.cleanUp(); } @Test public void shouldReplaceCommandRepositoryIfExistingVersionIsLessThanPackagedVersion() throws Exception { File defaultDirectory = getAFile(true); when(systemEnvironment.getDefaultCommandRepository()).thenReturn(defaultDirectory); doReturn(zipInputStream).when(spy).getPackagedRepositoryZipStream(); doReturn("13.1= 50 ").when(zipUtil).getFileContentInsideZip(zipInputStream, VERSION_FILE); doReturn(new Version("13.1=9")).when(spy).getExistingVersion(defaultDirectory); doNothing().when(spy).usePackagedCommandRepository(zipInputStream, defaultDirectory); spy.initialize(); verify(spy).usePackagedCommandRepository(zipInputStream, defaultDirectory); verify(spy, times(2)).getPackagedRepositoryZipStream(); } @Test public void shouldReplaceCommandRepositoryIfExistingVersionIsLessThanPackagedVersionIrrespectiveOfGoVersion() throws Exception { File defaultDirectory = getAFile(true); when(systemEnvironment.getDefaultCommandRepository()).thenReturn(defaultDirectory); doReturn(zipInputStream).when(spy).getPackagedRepositoryZipStream(); doReturn("13.1= 50 ").when(zipUtil).getFileContentInsideZip(zipInputStream, VERSION_FILE); doReturn(new Version(" textHereDoesNotMatter = 9 ")).when(spy).getExistingVersion(defaultDirectory); doNothing().when(spy).usePackagedCommandRepository(zipInputStream, defaultDirectory); spy.initialize(); verify(spy).usePackagedCommandRepository(zipInputStream, defaultDirectory); verify(spy, times(2)).getPackagedRepositoryZipStream(); } @Test public void shouldRetainCommandRepositoryIfExistingVersionIsEqualToPackagedVersion() throws Exception { File defaultDirectory = getAFile(true); when(systemEnvironment.getDefaultCommandRepository()).thenReturn(defaultDirectory); doReturn(zipInputStream).when(spy).getPackagedRepositoryZipStream(); doReturn("13.1=50").when(zipUtil).getFileContentInsideZip(zipInputStream, VERSION_FILE); doReturn(new Version("13.1=50")).when(spy).getExistingVersion(defaultDirectory); spy.initialize(); verify(spy, never()).usePackagedCommandRepository(zipInputStream, defaultDirectory); verify(spy, times(1)).getPackagedRepositoryZipStream(); } @Test public void shouldRetainCommandRepositoryIfExistingVersionIsGreaterThanPackagedVersion() throws Exception { File defaultDirectory = getAFile(true); when(systemEnvironment.getDefaultCommandRepository()).thenReturn(defaultDirectory); doReturn(zipInputStream).when(spy).getPackagedRepositoryZipStream(); doReturn("13.1=45").when(zipUtil).getFileContentInsideZip(zipInputStream, VERSION_FILE); doReturn(new Version("13.1=50")).when(spy).getExistingVersion(defaultDirectory); spy.initialize(); verify(spy, never()).usePackagedCommandRepository(zipInputStream, defaultDirectory); verify(spy, times(1)).getPackagedRepositoryZipStream(); } @Test public void shouldExpandPackagedCommandRepositoryWhenNoneExists() throws IOException { File defaultDirectory = getAFile(false); when(systemEnvironment.getDefaultCommandRepository()).thenReturn(defaultDirectory); doReturn(zipInputStream).when(spy).getPackagedRepositoryZipStream(); spy.initialize(); verify(spy, times(1)).usePackagedCommandRepository(zipInputStream, defaultDirectory); verify(spy, times(1)).getPackagedRepositoryZipStream(); verify(zipUtil, never()).getFileContentInsideZip(zipInputStream, VERSION_FILE); verify(spy, never()).getExistingVersion(defaultDirectory); } @Test public void shouldAddToServerHealthMessageWhen_CheckingIfRepoShouldBeReplacedThrowsAnException() throws IOException { File defaultDirectory = getAFile(true); when(systemEnvironment.getDefaultCommandRepository()).thenReturn(defaultDirectory); doReturn(zipInputStream).when(spy).getPackagedRepositoryZipStream(); doThrow(new IOException("Something went wrong")).when(zipUtil).getFileContentInsideZip(zipInputStream, VERSION_FILE); spy.initialize(); String errorMessage = "Unable to upgrade command repository located at " + defaultDirectory.getAbsolutePath() + ". Message: Something went wrong"; verify(serverHealthService).update(serverHealthErrorMessageWhichContains(errorMessage)); verify(spy, never()).usePackagedCommandRepository(zipInputStream, defaultDirectory); } @Test public void shouldAddToServerHealthMessageWhenUsingOfPackagedVersionThrowsException() throws IOException { File defaultDirectory = getAFile(false); when(systemEnvironment.getDefaultCommandRepository()).thenReturn(defaultDirectory); doReturn(zipInputStream).when(spy).getPackagedRepositoryZipStream(); doThrow(new IOException("Something went wrong")).when(spy).usePackagedCommandRepository(zipInputStream, defaultDirectory); spy.initialize(); String errorMessage = "Unable to upgrade command repository located at " + defaultDirectory.getAbsolutePath() + ". Message: Something went wrong"; verify(serverHealthService).update(serverHealthErrorMessageWhichContains(errorMessage)); verify(spy, times(1)).usePackagedCommandRepository(zipInputStream, defaultDirectory); } @Test public void shouldUsePackagedRepositoryIfNoVersionFileIsFoundInInstalledDirectory() throws IOException { File defaultDirectory = tempFiles.createUniqueFolder("default"); when(systemEnvironment.getDefaultCommandRepository()).thenReturn(defaultDirectory); doReturn(zipInputStream).when(spy).getPackagedRepositoryZipStream(); doReturn("13.1=50").when(zipUtil).getFileContentInsideZip(zipInputStream, VERSION_FILE); doNothing().when(spy).usePackagedCommandRepository(zipInputStream, defaultDirectory); spy.initialize(); verify(spy).usePackagedCommandRepository(zipInputStream, defaultDirectory); } private File getAFile(final boolean exists) { File file = mock(File.class); when(file.exists()).thenReturn(exists); return file; } private ServerHealthState serverHealthErrorMessageWhichContains(final String expectedPartOfMessage) { return argThat(new BaseMatcher<ServerHealthState>() { @Override public boolean matches(Object o) { ServerHealthState serverHealthState = (ServerHealthState) o; String description = serverHealthState.getDescription(); boolean isTheMessageWeHaveBeenWaitingFor = description.contains(expectedPartOfMessage); if (isTheMessageWeHaveBeenWaitingFor) { assertThat(serverHealthState.getLogLevel(), is(HealthStateLevel.ERROR)); } return isTheMessageWeHaveBeenWaitingFor; } @Override public void describeTo(Description description) { description.appendText("Expected message to contain: " + expectedPartOfMessage); } }); } }