NewPipe/app/src/test/java/us/shandian/giga/get/DownloadManagerImplTest.java

186 lines
6.5 KiB
Java

package us.shandian.giga.get;
import org.junit.Ignore;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import us.shandian.giga.get.DownloadDataSource;
import us.shandian.giga.get.DownloadManagerImpl;
import us.shandian.giga.get.DownloadMission;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
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;
/**
* Test for {@link DownloadManagerImpl}
*
* TODO: test loading from .giga files, startMission and improve tests
*/
public class DownloadManagerImplTest {
private DownloadManagerImpl downloadManager;
private DownloadDataSource downloadDataSource;
private ArrayList<DownloadMission> missions;
@org.junit.Before
public void setUp() throws Exception {
downloadDataSource = mock(DownloadDataSource.class);
missions = new ArrayList<>();
for(int i = 0; i < 50; ++i){
missions.add(generateFinishedDownloadMission());
}
when(downloadDataSource.loadMissions()).thenReturn(new ArrayList<>(missions));
downloadManager = new DownloadManagerImpl(new ArrayList<>(), downloadDataSource);
}
@Test(expected = NullPointerException.class)
public void testConstructorWithNullAsDownloadDataSource() {
new DownloadManagerImpl(new ArrayList<>(), null);
}
private static DownloadMission generateFinishedDownloadMission() throws IOException {
File file = File.createTempFile("newpipetest", ".mp4");
file.deleteOnExit();
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
randomAccessFile.setLength(1000);
randomAccessFile.close();
DownloadMission downloadMission = new DownloadMission(file.getName(),
"http://google.com/?q=how+to+google", file.getParent());
downloadMission.blocks = 1000;
downloadMission.done = 1000;
downloadMission.finished = true;
return spy(downloadMission);
}
private static void assertMissionEquals(String message, DownloadMission expected, DownloadMission actual) {
if(expected == actual) return;
assertEquals(message + ": Name", expected.name, actual.name);
assertEquals(message + ": Location", expected.location, actual.location);
assertEquals(message + ": Url", expected.url, actual.url);
}
@Test
public void testThatMissionsAreLoaded() throws IOException {
ArrayList<DownloadMission> missions = new ArrayList<>();
long millis = System.currentTimeMillis();
for(int i = 0; i < 50; ++i){
DownloadMission mission = generateFinishedDownloadMission();
mission.timestamp = millis - i; // reverse order by timestamp
missions.add(mission);
}
downloadDataSource = mock(DownloadDataSource.class);
when(downloadDataSource.loadMissions()).thenReturn(new ArrayList<>(missions));
downloadManager = new DownloadManagerImpl(new ArrayList<>(), downloadDataSource);
verify(downloadDataSource, times(1)).loadMissions();
assertEquals(50, downloadManager.getCount());
for(int i = 0; i < 50; ++i) {
assertMissionEquals("mission " + i, missions.get(50 - 1 - i), downloadManager.getMission(i));
}
}
@Ignore
@Test
public void startMission() throws Exception {
DownloadMission mission = missions.get(0);
mission = spy(mission);
missions.set(0, mission);
String url = "https://github.com/favicon.ico";
// create a temp file and delete it so we have a temp directory
File tempFile = File.createTempFile("favicon",".ico");
String name = tempFile.getName();
String location = tempFile.getParent();
assertTrue(tempFile.delete());
int id = downloadManager.startMission(url, location, name, true, 10);
}
@Test
public void resumeMission() {
DownloadMission mission = missions.get(0);
mission.running = true;
verify(mission, never()).start();
downloadManager.resumeMission(0);
verify(mission, never()).start();
mission.running = false;
downloadManager.resumeMission(0);
verify(mission, times(1)).start();
}
@Test
public void pauseMission() {
DownloadMission mission = missions.get(0);
mission.running = false;
downloadManager.pauseMission(0);
verify(mission, never()).pause();
mission.running = true;
downloadManager.pauseMission(0);
verify(mission, times(1)).pause();
}
@Test
public void deleteMission() {
DownloadMission mission = missions.get(0);
assertEquals(mission, downloadManager.getMission(0));
downloadManager.deleteMission(0);
verify(mission, times(1)).delete();
assertNotEquals(mission, downloadManager.getMission(0));
assertEquals(49, downloadManager.getCount());
}
@Test(expected = RuntimeException.class)
public void getMissionWithNegativeIndex() {
downloadManager.getMission(-1);
}
@Test
public void getMission() {
assertSame(missions.get(0), downloadManager.getMission(0));
assertSame(missions.get(1), downloadManager.getMission(1));
}
@Test
public void sortByTimestamp() {
ArrayList<DownloadMission> downloadMissions = new ArrayList<>();
DownloadMission mission = new DownloadMission();
mission.timestamp = 0;
DownloadMission mission1 = new DownloadMission();
mission1.timestamp = Integer.MAX_VALUE + 1L;
DownloadMission mission2 = new DownloadMission();
mission2.timestamp = 2L * Integer.MAX_VALUE ;
DownloadMission mission3 = new DownloadMission();
mission3.timestamp = 2L * Integer.MAX_VALUE + 5L;
downloadMissions.add(mission3);
downloadMissions.add(mission1);
downloadMissions.add(mission2);
downloadMissions.add(mission);
DownloadManagerImpl.sortByTimestamp(downloadMissions);
assertEquals(mission, downloadMissions.get(0));
assertEquals(mission1, downloadMissions.get(1));
assertEquals(mission2, downloadMissions.get(2));
assertEquals(mission3, downloadMissions.get(3));
}
}