package org.sugr.gearshift.unit.datasource;
import android.app.Activity;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteOpenHelper;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowPreferenceManager;
import org.sugr.gearshift.BuildConfig;
import org.sugr.gearshift.G;
import org.sugr.gearshift.core.Torrent;
import org.sugr.gearshift.core.TransmissionSession;
import org.sugr.gearshift.datasource.Constants;
import org.sugr.gearshift.datasource.DataSource;
import org.sugr.gearshift.datasource.SQLiteHelper;
import org.sugr.gearshift.datasource.TorrentDetails;
import org.sugr.gearshift.datasource.TorrentStatus;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class DataSourceTest {
private DataSource ds;
private SQLiteOpenHelper helper;
private SharedPreferences defaultPrefs;
@Before public void setUp() throws Exception {
Activity activity = Robolectric.buildActivity(Activity.class).create().get();
helper = new SQLiteHelper(activity.getApplicationContext());
assertNotNull(helper);
ds = new DataSource(activity, helper);
assertNotNull(ds);
defaultPrefs = ShadowPreferenceManager.getDefaultSharedPreferences(
RuntimeEnvironment.application.getApplicationContext());
defaultPrefs.edit().putString(G.PREF_LIST_SORT_BY, G.SortBy.QUEUE.name()).commit();
}
@Test public void openAndClose() throws Exception {
ds.open();
assertTrue(helper.getWritableDatabase().isOpen());
assertTrue(ds.isOpen());
Cursor cursor = helper.getWritableDatabase().query("sqlite_master", new String[] { "name" },
"type = 'table'", null, null, null, "name");
assertNotNull(cursor);
Set<String> tables = new HashSet<>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
tables.add(cursor.getString(0));
cursor.moveToNext();
}
assertTrue(cursor.getCount() > 5);
String[] expected = new String[] {
Constants.T_FILE, Constants.T_PEER, Constants.T_SESSION, Constants.T_TORRENT,
Constants.T_TORRENT_PROFILE, Constants.T_TRACKER
};
for (String expect : expected) {
assertTrue(tables.contains(expect));
}
cursor.close();
}
@Test public void session() {
String profile = "existing";
URL url = getClass().getResource("/json/session.json");
assertNotNull(url);
InputStream is = null;
try {
is = url.openStream();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonFactory factory = mapper.getFactory();
JsonParser parser = factory.createParser(is);
assertEquals(JsonToken.START_OBJECT, parser.nextToken());
ds.open();
assertTrue(ds.updateSession(profile, parser));
TransmissionSession session = ds.getSession(profile);
assertNotNull(session);
assertEquals(1000, session.getAltDownloadSpeedLimit());
assertFalse(session.isAltSpeedLimitEnabled());
assertEquals(1110, session.getAltSpeedTimeBegin());
assertEquals(127, session.getAltSpeedTimeDay());
assertTrue(session.isAltSpeedLimitTimeEnabled());
assertEquals(150, session.getAltSpeedTimeEnd());
assertEquals(150, session.getAltUploadSpeedLimit());
assertTrue(session.isBlocklistEnabled());
assertEquals(227574, session.getBlocklistSize());
assertEquals("http://list.iblocklist.com/?list=bt_level1&fileformat=p2p&archiveformat=gz", session.getBlocklistURL());
assertEquals(20, session.getCacheSize());
assertEquals("/var/lib/transmission-daemon/info", session.getConfigDir());
assertTrue(session.isDhtEnabled());
assertEquals("/test/Example", session.getDownloadDir());
assertEquals(46269779968l, session.getDownloadDirFreeSpace());
assertTrue(session.isDownloadQueueEnabled());
assertEquals(2, session.getDownloadQueueSize());
assertEquals("preferred", session.getEncryption());
assertEquals(1000, session.getIdleSeedingLimig());
assertTrue(session.isIdleSeedingLimitEnabled());
assertEquals("/test/Incomplete", session.getIncompleteDir());
assertTrue(session.isIncompleteDirEnabled());
assertTrue(session.isLocalDiscoveryEnabled());
assertEquals(220, session.getGlobalPeerLimit());
assertEquals(60, session.getTorrentPeerLimit());
assertEquals(51015, session.getPeerPort());
assertFalse(session.isPeerPortRandomOnStart());
assertTrue(session.isPeerExchangeEnabled());
assertTrue(session.isPortForwardingEnabled());
assertTrue(session.isStalledQueueEnabled());
assertEquals(20, session.getStalledQueueSize());
assertTrue(session.isRenamePartialFilesEnabled());
assertEquals(14, session.getRPCVersion());
assertEquals(1, session.getRPCVersionMin());
assertFalse(session.isDoneScriptEnabled());
assertEquals("some-script", session.getDoneScript());
assertFalse(session.isSeedQueueEnabled());
assertEquals(10, session.getSeedQueueSize());
assertEquals(2, session.getSeedRatioLimit(), 0);
assertTrue(session.isSeedRatioLimitEnabled());
assertEquals(1600, session.getDownloadSpeedLimit());
assertTrue(session.isDownloadSpeedLimitEnabled());
assertEquals(600, session.getUploadSpeedLimit());
assertTrue(session.isUploadSpeedLimitEnabled());
assertTrue(session.isStartAddedTorrentsEnabled());
assertFalse(session.isTrashOriginalTorrentFilesEnabled());
assertTrue(session.isUtpEnabled());
assertEquals("2.52 (13304)", session.getVersion());
} catch (IOException e) {
assertTrue(e.toString(), false);
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@Test public void torrent() {
String profile = "existing";
Cursor cursor = null;
ds.open();
try {
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(0, cursor.getCount());
cursor.close();
TorrentStatus status = updateTorrents();
assertNotNull(status);
assertTrue(status.hasAdded);
assertTrue(status.hasRemoved);
assertTrue(status.hasStatusChanged);
assertTrue(status.hasIncompleteMetadata);
updateTorrents("/json/torrents2.json", "existing2");
/* defaults:
* base - age:descending, status:ascending
*/
defaultPrefs.edit().putString(G.PREF_LIST_SORT_BY, G.SortBy.STATUS.name()).commit();
String[] expectedNames = new String[] {
"block", "startup.sh", "alpha...-test ", "1 Complete ", "Monster.Test.....-",
"clock.oiuwer...-aaa", "foo Bar.abc...- ", "grass", "texts..g.sh",
"", "gamma rotk (foo) []", "who.Who.foo.S06...-testtest", "ray of light 4", "access",
"Summer ", "preserve.sh", "Somewhere script", "Bla test-exa!",
"gc14.01.12.test....baba", "8516-.sh", "apache.sh", "water test (abc - fao)",
"water fao - today test fire", "tele.sh.21.calen", "fox", "view.sh",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.moveToFirst();
int index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.moveToPosition(11);
assertEquals(1d, Torrent.getMetadataPercentDone(cursor), 0);
assertEquals(1d, Torrent.getPercentDone(cursor), 0);
assertEquals(Torrent.SeedRatioMode.GLOBAL_LIMIT, Torrent.getSeedRatioMode(cursor));
assertEquals(2d, Torrent.getUploadRatio(cursor), 0);
assertEquals("28.42 GB, uploaded 56.89 GB (Ratio: 2)", Torrent.getTrafficText(cursor));
assertEquals("<b>Finished</b>", Torrent.getStatusText(cursor));
assertEquals(Torrent.Status.STOPPED, Torrent.getStatus(cursor));
assertFalse(Torrent.isActive(Torrent.getStatus(cursor)));
assertEquals(Torrent.Error.OK, Torrent.getError(cursor));
assertEquals("", Torrent.getErrorString(cursor));
cursor.moveToPosition(17);
assertEquals(Torrent.Error.LOCAL_ERROR, Torrent.getError(cursor));
assertTrue(Torrent.getErrorString(cursor).contains("No data found!"));
assertEquals(Torrent.Status.STOPPED, Torrent.getStatus(cursor));
cursor.moveToPosition(1);
assertEquals(Torrent.Status.DOWNLOADING, Torrent.getStatus(cursor));
assertTrue(Torrent.isActive(Torrent.getStatus(cursor)));
assertEquals("1.12 GB of 1.18 GB (95%) - Remaining time unknown", Torrent.getTrafficText(cursor));
assertEquals("<b>Downloading</b> from 0 of 0 connected peers - <i>↓ 346.7 KB/s, ↑ 53.71 KB/s</i>", Torrent.getStatusText(cursor));
cursor.moveToPosition(6);
assertEquals(Torrent.Status.SEEDING, Torrent.getStatus(cursor));
assertTrue(Torrent.isActive(Torrent.getStatus(cursor)));
assertEquals("10.96 GB, uploaded 243.6 GB (Ratio: 22.2)", Torrent.getTrafficText(cursor));
assertEquals("<b>Seeding</b> to 2 of 2 connected peers - <i>↑ 0 B/s</i>", Torrent.getStatusText(cursor));
cursor.moveToPosition(0);
assertEquals(Torrent.Status.CHECKING, Torrent.getStatus(cursor));
assertTrue(Torrent.isActive(Torrent.getStatus(cursor)));
assertEquals("", Torrent.getTrafficText(cursor));
assertEquals("<b>Checking</b> (53% tested)", Torrent.getStatusText(cursor));
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_SORT_BY, G.SortBy.NAME.name()).commit();
expectedNames = new String[] {
"", "1 Complete ", "8516-.sh", "access", "alpha...-test ", "apache.sh", "Bla test-exa!",
"block", "clock.oiuwer...-aaa", "foo Bar.abc...- ", "fox", "gamma rotk (foo) []",
"gc14.01.12.test....baba", "grass", "Monster.Test.....-", "preserve.sh",
"ray of light 4", "Somewhere script", "startup.sh", "Summer ",
"tele.sh.21.calen", "texts..g.sh", "view.sh", "water fao - today test fire",
"water test (abc - fao)", "who.Who.foo.S06...-testtest",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
cursor.moveToFirst();
assertEquals(26, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_SORT_BY, G.SortBy.RATE_DOWNLOAD.name()).commit();
expectedNames = new String[] {
"startup.sh", "alpha...-test ", "1 Complete ", "gamma rotk (foo) []",
"who.Who.foo.S06...-testtest", "ray of light 4", "Monster.Test.....-", "access",
"Summer ", "block", "clock.oiuwer...-aaa", "preserve.sh", "Somewhere script",
"Bla test-exa!", "gc14.01.12.test....baba", "8516-.sh", "apache.sh", "water test (abc - fao)",
"water fao - today test fire", "tele.sh.21.calen", "foo Bar.abc...- ", "fox",
"view.sh", "grass", "texts..g.sh", ""
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
cursor.moveToFirst();
assertEquals(26, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_BASE_SORT, G.SortBy.QUEUE.name()).commit();
expectedNames = new String[] {
"startup.sh", "alpha...-test ", "1 Complete ", "apache.sh", "foo Bar.abc...- ",
"Monster.Test.....-", "view.sh", "water fao - today test fire", "gamma rotk (foo) []",
"water test (abc - fao)", "block", "tele.sh.21.calen", "8516-.sh", "preserve.sh",
"access", "gc14.01.12.test....baba", "texts..g.sh", "clock.oiuwer...-aaa",
"Somewhere script", "who.Who.foo.S06...-testtest", "grass", "ray of light 4", "fox",
"Bla test-exa!", "Summer ", "",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
cursor.moveToFirst();
assertEquals(26, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_SORT_BY, G.SortBy.LOCATION.name()).commit();
expectedNames = new String[] {
"", "water fao - today test fire", "water test (abc - fao)", "foo Bar.abc...- ",
"Monster.Test.....-", "alpha...-test ", "clock.oiuwer...-aaa", "1 Complete ",
"gamma rotk (foo) []", "Bla test-exa!", "apache.sh", "view.sh", "block", "tele.sh.21.calen",
"8516-.sh", "startup.sh", "preserve.sh", "access", "gc14.01.12.test....baba",
"texts..g.sh", "Somewhere script", "grass", "fox", "Summer ",
"who.Who.foo.S06...-testtest", "ray of light 4",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
cursor.moveToFirst();
assertEquals(26, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_SORT_BY, G.SortBy.QUEUE.name()).commit();
defaultPrefs.edit().putString(G.PREF_LIST_FILTER, G.FilterBy.ACTIVE.name()).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_ACTIVE, true).commit();
expectedNames = new String[] {
"clock.oiuwer...-aaa", "startup.sh", "1 Complete ", "alpha...-test ",
"Monster.Test.....-",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
cursor.moveToFirst();
assertEquals(5, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_FILTER, G.FilterBy.CHECKING.name()).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_CHECKING, true).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("block", Torrent.getName(cursor));
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_FILTER, G.FilterBy.DOWNLOADING.name()).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_DOWNLOADING, true).commit();
expectedNames = new String[] {
"startup.sh", "1 Complete ", "alpha...-test ",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(3, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_FILTER, G.FilterBy.COMPLETE.name()).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_COMPLETE, true).commit();
expectedNames = new String[] {
"Summer ", "Bla test-exa!", "fox", "ray of light 4", "grass",
"who.Who.foo.S06...-testtest", "Somewhere script", "clock.oiuwer...-aaa",
"texts..g.sh", "gc14.01.12.test....baba", "access", "preserve.sh", "8516-.sh",
"tele.sh.21.calen", "block", "water test (abc - fao)", "gamma rotk (foo) []",
"water fao - today test fire", "view.sh", "Monster.Test.....-", "foo Bar.abc...- ",
"apache.sh",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(22, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_FILTER, G.FilterBy.INCOMPLETE.name()).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_INCOMPLETE, true).commit();
expectedNames = new String[] {
"", "startup.sh", "1 Complete ", "alpha...-test ",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(4, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_FILTER, G.FilterBy.PAUSED.name()).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_PAUSED, true).commit();
expectedNames = new String[] {
"", "Summer ", "Bla test-exa!", "fox", "ray of light 4", "grass",
"who.Who.foo.S06...-testtest", "Somewhere script", "texts..g.sh",
"gc14.01.12.test....baba", "access", "preserve.sh", "8516-.sh", "tele.sh.21.calen",
"water test (abc - fao)", "gamma rotk (foo) []",
"water fao - today test fire", "view.sh", "apache.sh"
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(19, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_FILTER, G.FilterBy.ERRORS.name()).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_ERRORS, true).commit();
expectedNames = new String[] {
"Bla test-exa!", "gamma rotk (foo) []", "water fao - today test fire",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(3, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_FILTER, G.FilterBy.SEEDING.name()).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_SEEDING, true).commit();
expectedNames = new String[] {
"clock.oiuwer...-aaa", "Monster.Test.....-", "foo Bar.abc...- ",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(3, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_SEARCH, "a").commit();
expectedNames = new String[] {
"clock.oiuwer...-<font", "foo B<font",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(2, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertTrue(Torrent.getName(cursor).contains(expectedNames[++index]));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_FILTER, G.FilterBy.ALL.name()).commit();
defaultPrefs.edit().putString(G.PREF_LIST_SEARCH, "es").commit();
expectedNames = new String[] {
"Bla t<font", "who.Who.foo.S06...-t<font", "Somewher<font", "t<font",
"gc14.01.12.t<font", "acc<font", "pr<font", "tel<font", "water t<font",
"water fao - today t<font", "vi<font", "alpha...-t<font", "Monster.T<font",
"apach<font",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(14, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertTrue(Torrent.getName(cursor).contains(expectedNames[++index]));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_SEARCH, null).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_DIRECTORIES, true).commit();
defaultPrefs.edit().putString(G.PREF_LIST_DIRECTORY, "/test/foo/gamma Ray").commit();
expectedNames = new String[] {
"ray of light 4", "who.Who.foo.S06...-testtest",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(2, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertTrue(Torrent.getName(cursor).contains(expectedNames[++index]));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_DIRECTORIES, false).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_DIRECTORIES, true).commit();
defaultPrefs.edit().remove(G.PREF_LIST_DIRECTORY).commit();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_TRACKERS, true).commit();
defaultPrefs.edit().putString(G.PREF_LIST_TRACKER, "udp://tracker.nsa.gov:80").commit();
expectedNames = new String[] {
"Summer ", "Bla test-exa!", "fox", "access", "preserve.sh", "startup.sh", "8516-.sh",
"water test (abc - fao)", "gamma rotk (foo) []", "water fao - today test fire",
"view.sh", "1 Complete ", "alpha...-test ", "Monster.Test.....-",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(14, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_TRACKER, "udp://tracker.example.com:80").commit();
expectedNames = new String[] {
"Summer ", "Bla test-exa!", "fox", "ray of light 4", "grass",
"who.Who.foo.S06...-testtest", "Somewhere script", "clock.oiuwer...-aaa",
"texts..g.sh", "gc14.01.12.test....baba", "access", "preserve.sh", "startup.sh",
"8516-.sh", "tele.sh.21.calen", "block", "water test (abc - fao)",
"gamma rotk (foo) []", "water fao - today test fire", "view.sh", "1 Complete ",
"alpha...-test ", "Monster.Test.....-", "foo Bar.abc...- ",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(24, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_TRACKER, "http://tracker.example.com:80").commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("apache.sh", Torrent.getName(cursor));
cursor.close();
defaultPrefs.edit().putString(G.PREF_LIST_TRACKER, "tracker.example.com:80").commit();
expectedNames = new String[] {
"Summer ", "Bla test-exa!", "fox", "ray of light 4", "grass",
"who.Who.foo.S06...-testtest", "Somewhere script", "clock.oiuwer...-aaa",
"texts..g.sh", "gc14.01.12.test....baba", "access", "preserve.sh", "startup.sh",
"8516-.sh", "tele.sh.21.calen", "block", "water test (abc - fao)",
"gamma rotk (foo) []", "water fao - today test fire", "view.sh", "1 Complete ",
"alpha...-test ", "Monster.Test.....-", "foo Bar.abc...- ", "apache.sh",
};
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(25, cursor.getCount());
cursor.moveToFirst();
index = -1;
while (!cursor.isAfterLast()) {
assertEquals(expectedNames[++index], Torrent.getName(cursor));
cursor.moveToNext();
}
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_TRACKERS, false).commit();
defaultPrefs.edit().putString(G.PREF_LIST_TRACKER, "http://tracker.example.com:80").commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_TRACKERS, true).commit();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_UNTRACKED, true).commit();
defaultPrefs.edit().putString(G.PREF_LIST_TRACKER, G.FILTER_UNTRACKED).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(1, cursor.getCount());
cursor.moveToFirst();
assertEquals("", Torrent.getName(cursor));
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_UNTRACKED, false).commit();
defaultPrefs.edit().putString(G.PREF_LIST_TRACKER, G.FILTER_UNTRACKED).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_TRACKERS, false).commit();
defaultPrefs.edit().putBoolean(G.PREF_FILTER_UNTRACKED, true).commit();
defaultPrefs.edit().putString(G.PREF_LIST_TRACKER, G.FILTER_UNTRACKED).commit();
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
cursor = ds.getTorrentCursor("existing2", defaultPrefs);
assertEquals(2, cursor.getCount());
cursor.close();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
@Test public void torrentDetails() {
String profile = "existing";
TorrentDetails details = null;
updateTorrents();
try {
// Summer
details = ds.getTorrentDetails(profile, "d4fdfe1cf9549035c7fb1cac28ff722c7bf5e808");
assertEquals(1, details.torrentCursor.getCount());
assertEquals(1, details.filesCursor.getCount());
assertEquals(6, details.trackersCursor.getCount());
details.torrentCursor.moveToFirst();
assertEquals("Summer ", Torrent.getName(details.torrentCursor));
assertEquals(924425644, Torrent.getSizeWhenDone(details.torrentCursor));
Object[][] expected = {
{"Summer "},
{924425644l},
{921425644l},
{0},
{true},
};
int index = -1;
details.filesCursor.moveToFirst();
while (!details.filesCursor.isAfterLast()) {
assertEquals(expected[0][++index], Torrent.File.getName(details.filesCursor));
assertEquals(expected[1][index], Torrent.File.getLength(details.filesCursor));
assertEquals(expected[2][index], Torrent.File.getBytesCompleted(details.filesCursor));
assertEquals(expected[3][index], Torrent.File.getPriority(details.filesCursor));
assertEquals(expected[4][index], Torrent.File.isWanted(details.filesCursor));
details.filesCursor.moveToNext();
}
expected = new Object[][] {
{
"udp://tracker.example.com:80",
"udp://tracker.yahoo:80",
"udp://tracker.example.biz:6969",
"udp://tracker.nsa.gov:80",
"udp://open.org.net:1337",
"https://server.domain/announce.php?passkey=mypasskey",
}, //announce
{0, 1, 2, 3, 4, 5}, //id
{
"", "", "", "", "",
"https://server.domain/scrape.php?passkey=mypasskey",
}, //scrape
{0, 1, 2, 3, 4, 5}, //tier
{-1, -1, -1, -1, -1, 91}, //seedercount
{-1, -1, -1, -1, -1, 2}, //leechercount
{false, false, false, false, false, true}, //hasannounced
{0l, 0l, 0l, 0l, 0l, 1395713150l}, //lastannouncetime
{false, false, false, false, false, true}, //lastannouncesucceeded
{0, 0, 0, 0, 0, 2}, //lastannouncepeercount
{
"", "", "", "", "", "Success"
}, //lastannounceresult
{false, false, false, false, false, true}, //hasscraped
{0l, 0l, 0l, 0l, 0l, 1395713950l}, //lastscrapetime
{false, false, false, false, false, true}, //lastscrapesucceeded
{
"", "", "", "", "", ""
}, //lastscraperesult
};
index = -1;
details.trackersCursor.moveToFirst();
while (!details.trackersCursor.isAfterLast()) {
assertEquals(expected[0][++index], Torrent.Tracker.getAnnounce(details.trackersCursor));
assertEquals(expected[1][index], Torrent.Tracker.getId(details.trackersCursor));
assertEquals(expected[2][index], Torrent.Tracker.getScrape(details.trackersCursor));
assertEquals(expected[3][index], Torrent.Tracker.getTier(details.trackersCursor));
assertEquals(expected[4][index], Torrent.Tracker.getSeederCount(details.trackersCursor));
assertEquals(expected[5][index], Torrent.Tracker.getLeecherCount(details.trackersCursor));
assertEquals(expected[6][index], Torrent.Tracker.hasAnnounced(details.trackersCursor));
assertEquals(expected[7][index], Torrent.Tracker.getLastAnnounceTime(details.trackersCursor));
assertEquals(expected[8][index], Torrent.Tracker.hasLastAnnounceSucceeded(details.trackersCursor));
assertEquals(expected[9][index], Torrent.Tracker.getLastAnnouncePeerCount(details.trackersCursor));
assertEquals(expected[10][index], Torrent.Tracker.getLastAnnounceResult(details.trackersCursor));
assertEquals(expected[11][index], Torrent.Tracker.hasScraped(details.trackersCursor));
assertEquals(expected[12][index], Torrent.Tracker.getLastScrapeTime(details.trackersCursor));
assertEquals(expected[13][index], Torrent.Tracker.hasLastScrapeSucceeded(details.trackersCursor));
assertEquals(expected[14][index], Torrent.Tracker.getLastScrapeResult(details.trackersCursor));
details.trackersCursor.moveToNext();
}
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
// gc14....
details = ds.getTorrentDetails(profile, "f0034cc5deafdfb589d0f48c2dd29a62ff52e120");
assertEquals(1, details.torrentCursor.getCount());
assertEquals(4, details.filesCursor.getCount());
assertEquals(4, details.trackersCursor.getCount());
details.torrentCursor.moveToFirst();
assertEquals("gc14.01.12.test....baba", Torrent.getName(details.torrentCursor));
expected = new Object[][] {
{
"gc14.01.12.test....baba/.txt", "gc14.01.12.test....baba/chair.14.01.12.test.baba.",
"gc14.01.12.test....baba/picture.tiny", "gc14.01.12.test....baba/log.tiny"
},
{33l, 743958774l, 28858l, 248955l},
{31l, 743958374l, 21858l, 248655l},
{0, 0, 2, 0},
{false, true, true, false},
};
index = -1;
details.filesCursor.moveToFirst();
while (!details.filesCursor.isAfterLast()) {
assertEquals(expected[0][++index], Torrent.File.getName(details.filesCursor));
assertEquals(expected[1][index], Torrent.File.getLength(details.filesCursor));
assertEquals(expected[2][index], Torrent.File.getBytesCompleted(details.filesCursor));
assertEquals(expected[3][index], Torrent.File.getPriority(details.filesCursor));
assertEquals(expected[4][index], Torrent.File.isWanted(details.filesCursor));
details.filesCursor.moveToNext();
}
expected = new Object[][] {
{
"http://p2p.google.com:2710/45c8fa2244c08084280785fe891b6e85/announce",
"http://p2p.test.net:2710/45c8fa2244c08084280785fe891b6e85/announce",
"udp://tracker.example.com:80/announce",
"https://server.domain/announce.php?passkey=mypasskey",
}, //announce
{0, 1, 2, 3}, //id
{
"http://p2p.google.com:2710/45c8fa2244c08084280785fe891b6e85/scrape",
"http://p2p.test.net:2710/45c8fa2244c08084280785fe891b6e85/scrape",
"udp://tracker.example.com:80/scrape",
"https://server.domain/scrape.php?passkey=mypasskey",
}, //scrape
{0, 1, 2, 3}, //tier
{1, 1, 0, 123}, //seedercount
{0, 0, 0, 7}, //leechercount
{false, false, false, true}, //hasannounced
{0l, 0l, 0l, 1395713941l}, //lastannouncetime
{false, false, false, true}, //lastannouncesucceeded
{0, 0, 0, 10}, //lastannouncepeercount
{
"", "", "", "Success"
}, //lastannounceresult
{true, true, true, true}, //hasscraped
{1396699910l, 1396700500l, 1396700910l, 1395713830l}, //lastscrapetime
{true, true, true, true}, //lastscrapesucceeded
{
"Could not connect to tracker", "Could not connect to tracker",
"Connection failed", ""
}, //lastscraperesult
};
index = -1;
details.trackersCursor.moveToFirst();
while (!details.trackersCursor.isAfterLast()) {
assertEquals(expected[0][++index], Torrent.Tracker.getAnnounce(details.trackersCursor));
assertEquals(expected[1][index], Torrent.Tracker.getId(details.trackersCursor));
assertEquals(expected[2][index], Torrent.Tracker.getScrape(details.trackersCursor));
assertEquals(expected[3][index], Torrent.Tracker.getTier(details.trackersCursor));
assertEquals(expected[4][index], Torrent.Tracker.getSeederCount(details.trackersCursor));
assertEquals(expected[5][index], Torrent.Tracker.getLeecherCount(details.trackersCursor));
assertEquals(expected[6][index], Torrent.Tracker.hasAnnounced(details.trackersCursor));
assertEquals(expected[7][index], Torrent.Tracker.getLastAnnounceTime(details.trackersCursor));
assertEquals(expected[8][index], Torrent.Tracker.hasLastAnnounceSucceeded(details.trackersCursor));
assertEquals(expected[9][index], Torrent.Tracker.getLastAnnouncePeerCount(details.trackersCursor));
assertEquals(expected[10][index], Torrent.Tracker.getLastAnnounceResult(details.trackersCursor));
assertEquals(expected[11][index], Torrent.Tracker.hasScraped(details.trackersCursor));
assertEquals(expected[12][index], Torrent.Tracker.getLastScrapeTime(details.trackersCursor));
assertEquals(expected[13][index], Torrent.Tracker.hasLastScrapeSucceeded(details.trackersCursor));
assertEquals(expected[14][index], Torrent.Tracker.getLastScrapeResult(details.trackersCursor));
details.trackersCursor.moveToNext();
}
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
updateTorrents("/json/torrents2.json", "existing2");
updateTorrents("/json/torrent.json", "existing");
details = ds.getTorrentDetails(profile, "caf28f38387ff5ccf2326d4b7392a1f8233083");
details.trackersCursor.moveToFirst();
while (!details.trackersCursor.isAfterLast()) {
details.trackersCursor.moveToNext();
}
assertEquals(2, details.trackersCursor.getCount());
details.trackersCursor.moveToFirst();
expected = new Object[][] {
{"https://tracker.yahoo:80", "http://tracker.example.biz:6969"}
};
index = -1;
while (!details.trackersCursor.isAfterLast()) {
assertEquals(expected[0][++index], Torrent.Tracker.getAnnounce(details.trackersCursor));
details.trackersCursor.moveToNext();
}
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
ds.removeTrackers("caf28f38387ff5ccf2326d4b7392a1f8233083", 0);
details = ds.getTorrentDetails(profile, "caf28f38387ff5ccf2326d4b7392a1f8233083");
assertEquals(1, details.trackersCursor.getCount());
details.trackersCursor.moveToFirst();
assertEquals("http://tracker.example.biz:6969", Torrent.Tracker.getAnnounce(details.trackersCursor));
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
details = ds.getTorrentDetails("existing2", "caf28f38387ff5ccf2326d4b7392a1f8233083");
assertEquals(1, details.trackersCursor.getCount());
details.trackersCursor.moveToFirst();
assertEquals("http://tracker.example.biz:6969", Torrent.Tracker.getAnnounce(details.trackersCursor));
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
updateTorrents();
details = ds.getTorrentDetails(profile, "caf28f38387ff5ccf2326d4b7392a1f8233083");
assertEquals(4, details.trackersCursor.getCount());
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
ds.removeTrackers("caf28f38387ff5ccf2326d4b7392a1f8233083", 0, 1, 3);
details = ds.getTorrentDetails(profile, "caf28f38387ff5ccf2326d4b7392a1f8233083");
assertEquals(1, details.trackersCursor.getCount());
details.trackersCursor.moveToFirst();
assertEquals("http://tracker.example.biz:6969", Torrent.Tracker.getAnnounce(details.trackersCursor));
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
details = ds.getTorrentDetails(profile, "f0034cc5deafdfb589d0f48c2dd29a62ff52e120");
assertEquals(4, details.trackersCursor.getCount());
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
} finally {
if (details != null) {
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
}
}
}
@Test public void downloadDirectories() {
String profile = "existing";
updateTorrents();
String[] expected = {
"",
"/test/Example",
"/test/foo",
"/test/foo/alpha",
"/test/foo/bar",
"/test/foo/gamma Ray",
};
List<String> dirs = ds.getDownloadDirectories(profile);
assertEquals(6, dirs.size());
int index = -1;
for (String d : dirs) {
assertEquals(expected[++index], d);
}
}
@Test public void tracherAnnounceURLs() {
String profile = "existing";
updateTorrents();
String[] expected = {
"http://exodus.desync.com:6969/announce",
"http://from.cold.com:3310/announce",
"http://p2p.google.com:2710/45c8fa2244c08084280785fe891b6e85/announce",
"http://p2p.test.net:2710/45c8fa2244c08084280785fe891b6e85/announce",
"http://test.net/announce.php",
"http://testtorrents.net:2710/announce",
"http://tracker.ex.ua/announce",
"http://tracker.example.biz:6969",
"http://tracker.example.com:80",
"http://tracker.testgoogle.com/announce",
"https://server.domain/announce.php?passkey=mypasskey",
"https://tracker.yahoo:80",
"udp://9.trackerexample.biz:2710/announce",
"udp://fromtracker.cold.com:3310/announce",
"udp://open.org.net:1337",
"udp://tracker.1337x.org:80/announce",
"udp://tracker.example.biz:6969",
"udp://tracker.example.biz:80",
"udp://tracker.example.com:80",
"udp://tracker.example.com:80/announce",
"udp://tracker.nsa.gov:80",
"udp://tracker.yahoo:80",
};
List<String> urls = ds.getTrackerAnnounceURLs(profile);
assertEquals(22, urls.size());
int index = -1;
for (String u : urls) {
assertEquals(expected[++index], u);
}
}
@Test public void trackerAnnounceAuthorities() {
String profile = "existing";
updateTorrents();
String[] expected = {
"9.trackerexample.biz:2710",
"exodus.desync.com:6969",
"from.cold.com:3310",
"fromtracker.cold.com:3310",
"open.org.net:1337",
"p2p.google.com:2710",
"p2p.test.net:2710",
"server.domain",
"test.net",
"testtorrents.net:2710",
"tracker.1337x.org:80",
"tracker.ex.ua",
"tracker.example.biz:6969",
"tracker.example.biz:80",
"tracker.example.com:80",
"tracker.nsa.gov:80",
"tracker.testgoogle.com",
"tracker.yahoo:80",
};
List<String> urls = ds.getTrackerAnnounceAuthorities(profile);
assertEquals(18, urls.size());
int index = -1;
for (String u : urls) {
assertEquals(expected[++index], u);
}
}
@Test public void checkers() {
String profile = "existing";
updateTorrents();
assertFalse(ds.hasCompleteMetadata(profile));
assertFalse(ds.hasExtraInfo(profile));
String[] hashStrings = ds.getUnnamedTorrentHashStrings(profile);
String[] expected = {"35134a5bc91cf4eae1f27a813f275bc6fbf0b166",};
int index = -1;
for (String h : hashStrings) {
assertEquals(expected[++index], h);
}
}
@Test public void actions() {
String profile = "existing";
updateTorrents();
Cursor cursor = null;
try {
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(26, cursor.getCount());
cursor.close();
String[] removed = {
"cafe1c1591c5e548cbe542f9g5376b9ce250d3",
"a7ff11f3517cd8e4abb4d525b8a58155c80b8c9c",
"1af28f38397ff5ccf2326d4b7392a1f8233083"
};
assertTrue(ds.removeTorrents(removed));
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(23, cursor.getCount());
Set<String> hashStrings = new HashSet<>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
hashStrings.add(Torrent.getHashString(cursor));
cursor.moveToNext();
}
for (String r : removed) {
assertFalse(hashStrings.contains(r));
}
cursor.close();
int[] ids = { 5, 14, 45, };
removed = new String[] {
"d4fdfe1cf9549035c7fb1cac28ff722c7bf5e808",
"12399a999792837b4461dafbcde0f3bc5a071702",
"2325f787f7801ca23367a94506e0e43e97aca5cf",
};
assertTrue(ds.removeTorrents(profile, ids));
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(20, cursor.getCount());
hashStrings.clear();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
hashStrings.add(Torrent.getHashString(cursor));
cursor.moveToNext();
}
for (String r : removed) {
assertFalse(hashStrings.contains(r));
}
cursor.close();
String newHashString = "c167a187f780fa823165a975c6b0ed344ea37f5a";
assertTrue(ds.addTorrent(profile, 312, "foo", newHashString, "/test/bar"));
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(21, cursor.getCount());
hashStrings.clear();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
hashStrings.add(Torrent.getHashString(cursor));
cursor.moveToNext();
}
assertTrue(hashStrings.contains(newHashString));
cursor.close();
assertTrue(ds.clearTorrentsForProfile(profile));
cursor = ds.getTorrentCursor(profile, defaultPrefs);
assertEquals(0, cursor.getCount());
cursor.close();
} finally {
if (cursor != null) {
cursor.close();
}
}
}
@Test public void trafficSpeed() {
String profile = "existing";
updateTorrents();
long[] speed = ds.getTrafficSpeed(profile);
assertEquals(530000l, speed[0]);
assertEquals(185000l, speed[1]);
}
private TorrentStatus updateTorrents() {
return updateTorrents("/json/torrents.json", "existing");
}
private TorrentStatus updateTorrents(String path, String profile) {
TorrentDetails details = null;
InputStream is = null;
URL url = getClass().getResource(path);
ds.open();
try {
is = url.openStream();
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonFactory factory = mapper.getFactory();
JsonParser parser = factory.createParser(is);
parser.nextToken();
return ds.updateTorrents(profile, parser, false);
} catch (IOException e) {
assertTrue(e.toString(), false);
return null;
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (details != null) {
try {
details.torrentCursor.close();
details.filesCursor.close();
details.trackersCursor.close();
} catch (Exception ignored) {
}
}
}
}
}