/** * Copyright 2012-2013 Maciej Jaworski, Mariusz Kapcia, Paweł Kędzia, Mateusz Kubuszok * * <p>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</p> * * <p>http://www.apache.org/licenses/LICENSE-2.0</p> * * <p>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.</p> */ package com.autoupdater.client.download.services; import static com.autoupdater.client.download.EDownloadStatus.*; import static org.fest.assertions.api.Assertions.assertThat; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import org.dom4j.Document; import org.junit.Test; import com.autoupdater.client.Paths; import com.autoupdater.client.download.DownloadResultException; import com.autoupdater.client.download.runnables.AbstractDownloadRunnable; import com.autoupdater.client.download.runnables.AbstractDownloadRunnableFileTester; import com.autoupdater.client.download.runnables.AbstractDownloadRunnableXmlTester; import com.autoupdater.client.download.runnables.HttpURLConnectionMock; import com.autoupdater.client.xml.parsers.CorrectXMLExamples; public class TestAbstractDownloadService { @Test public void testDownloadForXml() throws MalformedURLException, InterruptedException, DownloadResultException { // given AbstractDownloadService<Document> service = new AbstractDownloadServiceXmlTester( getConnection()); Document result = null; // when service.start(); service.joinThread(); result = service.getResult(); // then assertThat(service.getStatus()).as( "When no error occured thread should finish with PROCESSED status").isEqualTo( PROCESSED); assertThat(result).as("Service should return correct result").isNotNull(); } @Test(expected = DownloadResultException.class) public void testCancelForXml() throws MalformedURLException, InterruptedException, DownloadResultException { // given AbstractDownloadService<Document> service = new AbstractDownloadServiceXmlTester( getCancellableConnection()); // when service.start(); service.cancel(); service.joinThread(); // then assertThat(service.getStatus()).as( "Cancelled download thread should finish with CANCELLED status").isEqualTo( CANCELLED); service.getResult(); // exception } @Test public void testDownloadForFile() throws MalformedURLException, InterruptedException, DownloadResultException { // given String filePath = Paths.Library.testDir + File.separator + "testAbstractService.xml"; AbstractDownloadService<File> service = new AbstractDownloadServiceFileTester( getConnection(), filePath); File result = null; // when service.start(); service.joinThread(); result = service.getResult(); result.deleteOnExit(); // then assertThat(service.getStatus()).as( "When no error occured thread should finish with PROCESSED status").isEqualTo( PROCESSED); assertThat(result).as("Service should return correct result").isNotNull(); } @Test(expected = DownloadResultException.class) public void testCancellationForFile() throws MalformedURLException, InterruptedException, DownloadResultException { // given AbstractDownloadService<File> service = new AbstractDownloadServiceFileTester( getCancellableConnection(), ""); // when service.start(); service.cancel(); service.joinThread(); // then assertThat(service.getStatus()).as( "Cancelled download thread should finish with CANCELLED status").isEqualTo( CANCELLED); service.getResult(); // exception } private HttpURLConnection getConnection() throws MalformedURLException { return new HttpURLConnectionMock(new URL("http://127.0.0.1/"), CorrectXMLExamples.genericXml); } private HttpURLConnection getCancellableConnection() throws MalformedURLException { return new HttpURLConnectionCancelMock(); } private class AbstractDownloadServiceXmlTester extends AbstractDownloadService<Document> { public AbstractDownloadServiceXmlTester(HttpURLConnection connection) { super(connection); } @Override protected AbstractDownloadRunnable<Document> getRunnable() { return new AbstractDownloadRunnableXmlTester(getConnection()); } } private class AbstractDownloadServiceFileTester extends AbstractDownloadService<File> { public AbstractDownloadServiceFileTester(HttpURLConnection connection, String fileDestinationPath) { super(connection, fileDestinationPath); } @Override protected AbstractDownloadRunnable<File> getRunnable() { return new AbstractDownloadRunnableFileTester(getConnection(), getFileDestinationPath()); } } public class HttpURLConnectionCancelMock extends HttpURLConnectionMock { public HttpURLConnectionCancelMock() throws MalformedURLException { super(new URL("http://127.0.0.1/"), CorrectXMLExamples.genericXml); } @Override public InputStream getInputStream() { return new InputStreamCancelMock(); } } public class InputStreamCancelMock extends InputStream { @Override public int read() throws IOException { try { Thread.sleep(1000); } catch (InterruptedException e) { } return 0; } } }