package com.faforever.client.update; import com.faforever.client.i18n.I18n; import com.faforever.client.test.AbstractPlainJavaFxTest; import com.google.common.io.CharStreams; import org.apache.commons.compress.utils.IOUtils; import org.apache.maven.artifact.versioning.ComparableVersion; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.mockito.Mock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.env.Environment; import org.testfx.util.WaitForAsyncUtils; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Reader; import java.lang.invoke.MethodHandles; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import static org.mockito.Mockito.when; public class CheckForUpdateTaskTest extends AbstractPlainJavaFxTest { private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private static final InetAddress LOOPBACK_ADDRESS = InetAddress.getLoopbackAddress(); private ServerSocket fakeGithubServerSocket; private CheckForUpdateTask instance; @Mock private Environment environment; @Mock private I18n i18n; @Before public void setUp() throws Exception { instance = new CheckForUpdateTask(); instance.i18n = i18n; instance.environment = environment; } @After public void tearDown() throws Exception { IOUtils.closeQuietly(fakeGithubServerSocket); } /** * Never version is available on server. */ @Test @Ignore("For some reason, this keeps failing on travis") public void testIsNewer() throws Exception { instance.setCurrentVersion(new ComparableVersion("0.4.8-alpha")); startFakeGitHubApiServer(); int port = fakeGithubServerSocket.getLocalPort(); when(environment.getProperty("github.releases.url")).thenReturn("http://" + LOOPBACK_ADDRESS.getHostAddress() + ":" + port); when(environment.getProperty("github.releases.timeout", int.class)).thenReturn(3000); instance.call(); } private void startFakeGitHubApiServer() throws Exception { fakeGithubServerSocket = new ServerSocket(0); WaitForAsyncUtils.async(() -> { try (Socket socket = fakeGithubServerSocket.accept(); Reader sampleReader = new InputStreamReader(getClass().getResourceAsStream("/sample-github-releases-response.txt")); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(socket.getOutputStream())) { logger.debug("Accepted connection from {}", socket.getInetAddress()); String response = CharStreams.toString(sampleReader); outputStreamWriter.write(response); } catch (IOException e) { logger.error("Exception in fake HTTP server", e); throw new RuntimeException(e); } }); } /** * There is no newer version on the server. */ @Test @Ignore("For some reason, this keeps failing on travis") public void testGetUpdateIsCurrent() throws Exception { instance.setCurrentVersion(new ComparableVersion("0.4.8.1-alpha")); startFakeGitHubApiServer(); int port = fakeGithubServerSocket.getLocalPort(); when(environment.getProperty("github.releases.url")).thenReturn("http://" + LOOPBACK_ADDRESS.getHostAddress() + ":" + port); when(environment.getProperty("github.releases.timeout", int.class)).thenReturn(3000); instance.call(); } }