package com.felkertech.cumulustv.test; import android.os.Build; import android.util.Log; import com.felkertech.cumulustv.model.JsonListing; import com.felkertech.cumulustv.plugins.CumulusChannel; import com.felkertech.n.cumulustv.BuildConfig; import com.felkertech.cumulustv.MockChannelDatabase; import com.felkertech.cumulustv.model.ChannelDatabase; import com.felkertech.cumulustv.model.JsonChannel; import com.felkertech.settingsmanager.SettingsManager; import junit.framework.TestCase; import org.json.JSONArray; import org.json.JSONException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * Tests management of channels in the {@link ChannelDatabase}. */ @RunWith(RobolectricTestRunner.class) @Config(constants = BuildConfig.class, sdk = Build.VERSION_CODES.M) public class ChannelDatabaseUnitTest extends TestCase { private static final String TAG = ChannelDatabaseUnitTest.class.getSimpleName(); private static final String NAME = "My Channel"; private static final String MEDIA_URL = "http://example.com/stream.m3u8"; private static final String NUMBER = "1-1"; public ChannelDatabaseUnitTest() {} /** * Deletes data from the {@link SettingsManager}. */ @Before public void clearDatabase() { MockChannelDatabase.reset(); SettingsManager settingsManager = new SettingsManager(RuntimeEnvironment.application); settingsManager.setString(MockChannelDatabase.KEY, ""); } /** * Start out with nothing and try to create a {@link MockChannelDatabase}. * Make sure that the various getters do not fail in the null case. */ @Test public void testEmptyDatabase() throws JSONException { MockChannelDatabase mockChannelDatabase = MockChannelDatabase.getMockedInstance(RuntimeEnvironment.application); List<JsonChannel> jsonChannelList = mockChannelDatabase.getJsonChannels(); assertEquals(0, jsonChannelList.size()); JSONArray jsonArray = mockChannelDatabase.getJSONArray(); assertEquals(0, jsonArray.length()); String[] channelNames = mockChannelDatabase.getChannelNames(); assertEquals(0, channelNames.length); } /** * Tests that we can insert and query channels from the database. Then make sure we can delete * it afterward. */ @Test public void testChannelInsertion() throws JSONException { MockChannelDatabase mockChannelDatabase = MockChannelDatabase.getMockedInstance(RuntimeEnvironment.application); CumulusChannel sampleChannel = new JsonChannel.Builder() .setName(NAME) .setNumber(NUMBER) .setMediaUrl(MEDIA_URL) .build(); mockChannelDatabase.add(sampleChannel); List<JsonChannel> jsonChannelList = mockChannelDatabase.getJsonChannels(); assertEquals(sampleChannel, jsonChannelList.get(0)); JSONArray jsonArray = mockChannelDatabase.getJSONArray(); assertEquals(sampleChannel.toJson().toString(), jsonArray.getJSONObject(0).toString()); String[] channelNames = mockChannelDatabase.getChannelNames(); assertEquals(sampleChannel.getNumber() + " " + sampleChannel.getName(), channelNames[0]); mockChannelDatabase.delete(sampleChannel); jsonChannelList = mockChannelDatabase.getJsonChannels(); assertEquals(0, jsonChannelList.size()); } /** * Tests that we can insert and then check whether this channel exists and finally find it. */ @Test public void testChannelFind() throws JSONException { MockChannelDatabase mockChannelDatabase = MockChannelDatabase.getMockedInstance(RuntimeEnvironment.application); CumulusChannel sampleChannel = new JsonChannel.Builder() .setName(NAME) .setNumber(NUMBER) .setMediaUrl(MEDIA_URL) .build(); mockChannelDatabase.add(sampleChannel); assertTrue(mockChannelDatabase.channelExists(sampleChannel)); assertTrue(mockChannelDatabase.channelNumberExists(NUMBER)); assertEquals(sampleChannel, mockChannelDatabase.findChannelByMediaUrl(MEDIA_URL)); } /** * Adds a JSON Listing and then tries to read data from it shortly after. * @throws JSONException * @throws InterruptedException */ @Test public void testJsonListingParsing() throws JSONException, InterruptedException { MockChannelDatabase mockChannelDatabase = MockChannelDatabase.getMockedInstance(RuntimeEnvironment.application); JsonListing listing = new JsonListing.Builder() .setUrl(JsonListingUnitTest.M3U_URL) .build(); mockChannelDatabase.add(listing); // Confirm we have one item in array. assertEquals(1, mockChannelDatabase.getJSONArray().length()); Log.d(TAG, mockChannelDatabase.getJSONArray().toString()); mockChannelDatabase.readMockJsonListings(); // Wait for network action. assertFalse(new CountDownLatch(1).await(5, TimeUnit.SECONDS)); // Confirm two channels have been added. assertEquals(2, mockChannelDatabase.getJsonChannels().size()); } }