package com.faforever.client.patch; import com.faforever.client.i18n.I18n; import com.faforever.client.preferences.ForgedAlliancePrefs; import com.faforever.client.preferences.Preferences; import com.faforever.client.preferences.PreferencesService; import com.faforever.client.task.TaskService; import com.faforever.client.test.AbstractPlainJavaFxTest; import com.faforever.client.util.TestResources; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.mockito.Mock; import org.springframework.core.env.Environment; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import static com.faforever.client.patch.GitRepositoryGameUpdateService.InstallType.RETAIL; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.*; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class GitGameUpdateTaskTest extends AbstractPlainJavaFxTest { private static final String GIT_PATCH_URL = "git://dummy/repo.git"; @Rule public final TemporaryFolder faDirectory = new TemporaryFolder(); @Rule public final TemporaryFolder fafBinDirectory = new TemporaryFolder(); @Mock private GitWrapper gitWrapper; @Mock private TaskService taskService; @Mock private PreferencesService preferencesService; @Mock private Environment environment; @Mock private I18n i18n; @Mock private Preferences preferences; @Mock private ForgedAlliancePrefs forgedAlliancePrefs; /** * The directory containing the cloned patch repository */ private Path binaryPatchRepoDirectory; private GitGameUpdateTask instance; @Before public void setUp() throws Exception { instance = new GitGameUpdateTask(); instance.preferencesService = preferencesService; instance.gitWrapper = gitWrapper; instance.environment = environment; instance.i18n = i18n; Path reposDirectory = faDirectory.getRoot().toPath().resolve("repos"); binaryPatchRepoDirectory = reposDirectory.resolve(GitRepositoryGameUpdateService.REPO_NAME); instance.setBinaryPatchRepoDirectory(binaryPatchRepoDirectory); instance.setMigrationDataFile(binaryPatchRepoDirectory.resolve(RETAIL.migrationDataFileName)); when(preferencesService.getFafReposDirectory()).thenReturn(reposDirectory); when(preferencesService.getFafBinDirectory()).thenReturn(fafBinDirectory.getRoot().toPath()); when(environment.getProperty("patch.git.url")).thenReturn(GIT_PATCH_URL); when(preferencesService.getPreferences()).thenReturn(preferences); when(preferences.getForgedAlliance()).thenReturn(forgedAlliancePrefs); when(forgedAlliancePrefs.getPath()).thenReturn(faDirectory.getRoot().toPath()); instance.postConstruct(); } @Test public void testUpdateInBackgroundRepoDirectoryDoesNotExist() throws Exception { assertTrue("Repo directory was expected to be inexistent, but it existed", Files.notExists(binaryPatchRepoDirectory)); prepareFaBinaries(); doAnswer(invocation -> { prepareLocalPatchRepo(); return null; }).when(gitWrapper).clone(GIT_PATCH_URL, binaryPatchRepoDirectory); assertThat(instance.call(), is(nullValue())); verify(gitWrapper).clone(GIT_PATCH_URL, binaryPatchRepoDirectory); } private void prepareFaBinaries() throws IOException { Path faBinDirectory = faDirectory.getRoot().toPath().resolve("bin"); Files.createDirectories(faBinDirectory); TestResources.copyResource("/patch/GDFBinary.dll", faBinDirectory.resolve("GDFBinary.dll")); TestResources.copyResource("/patch/testFile1.txt", faBinDirectory.resolve("testFile1.txt")); TestResources.copyResource("/patch/testFile2.txt", faBinDirectory.resolve("testFile2.txt")); } private void prepareLocalPatchRepo() throws IOException { TestResources.copyResource("/patch/retail.json", binaryPatchRepoDirectory.resolve(RETAIL.migrationDataFileName)); TestResources.copyResource("/patch/bsdiff4/040943c20d9e1f7de7f496b1202a600d", binaryPatchRepoDirectory.resolve("bsdiff4/040943c20d9e1f7de7f496b1202a600d")); } }