package com.b2msolutions.reyna.services; import android.content.Context; import android.content.Intent; import android.util.Log; import com.b2msolutions.reyna.*; import com.b2msolutions.reyna.blackout.Time; import com.b2msolutions.reyna.blackout.TimeRange; import com.b2msolutions.reyna.system.Logger; import com.b2msolutions.reyna.system.Message; import com.b2msolutions.reyna.system.Preferences; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import java.net.URI; import java.net.URISyntaxException; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import static org.junit.Assert.*; import static org.mockito.Mockito.verify; import static test.Assert.assertServiceStarted; @RunWith(RobolectricTestRunner.class) public class StoreServiceTest { @Mock Repository repository; private StoreService storeService; @Before public void setup() { MockitoAnnotations.initMocks(this); this.storeService = org.robolectric.Robolectric.setupService(StoreService.class); this.storeService.repository = repository; StoreService.setBatchUploadConfiguration(this.storeService.getApplicationContext(), false, URI.create("http://google.com"), 1); } @Test public void testConstruction() { assertNotNull(this.storeService); assertNotNull(this.storeService.repository); } @Test public void onHandleIntentWithNullIntentShouldNotThrow() { this.storeService.onHandleIntent(null); } @Test public void onHandleIntentWithoutMessageShouldNotThrow() { Intent intent = new Intent(); this.storeService.onHandleIntent(intent); } @Test public void onHandleIntentWithMessageShouldStoreAndStartForwardService() throws URISyntaxException { Message message = RepositoryTest.getMessageWithHeaders(); Intent intent = new Intent(); intent.putExtra("com.b2msolutions.reyna.MESSAGE", message); this.storeService.onHandleIntent(intent); ArgumentCaptor<Message> argument = ArgumentCaptor.forClass(Message.class); verify(this.repository).insert(argument.capture()); Message other = argument.getValue(); assertNotNull(other); assertEquals(message.getUrl(), other.getUrl()); assertEquals(message.getBody(), other.getBody()); assertEquals("h1", message.getHeaders()[0].getKey()); assertEquals("v1", message.getHeaders()[0].getValue()); assertEquals("h2", message.getHeaders()[1].getKey()); assertEquals("v2", message.getHeaders()[1].getValue()); assertServiceStarted(ForwardService.class); } @Test public void onHandleIntentWithMessageAndBatchUploadEnabledShouldStoreAndStartForwardService() throws URISyntaxException { Message message = RepositoryTest.getMessageWithHeaders(); Intent intent = new Intent(); intent.putExtra("com.b2msolutions.reyna.MESSAGE", message); StoreService.setBatchUploadConfiguration(this.storeService.getApplicationContext(), true, URI.create("http://google.com"), 1); this.storeService.onHandleIntent(intent); ArgumentCaptor<Message> argument = ArgumentCaptor.forClass(Message.class); verify(this.repository).insert(argument.capture()); Message other = argument.getValue(); assertNotNull(other); assertEquals(message.getUrl(), other.getUrl()); assertEquals(message.getBody(), other.getBody()); assertEquals("h1", message.getHeaders()[0].getKey()); assertEquals("v1", message.getHeaders()[0].getValue()); assertEquals("h2", message.getHeaders()[1].getKey()); assertEquals("v2", message.getHeaders()[1].getValue()); assertServiceStarted(ForwardService.class); } @Test public void onHandleIntentWithMessageShouldStoreWithDbSizeLimitAndStartForwardService() throws URISyntaxException { Context context = RuntimeEnvironment.application.getApplicationContext(); Message message = RepositoryTest.getMessageWithHeaders(); Intent intent = new Intent(); intent.putExtra("com.b2msolutions.reyna.MESSAGE", message); StoreService.setStorageSizeLimit(context, 2100042); this.storeService.onHandleIntent(intent); ArgumentCaptor<Message> argument = ArgumentCaptor.forClass(Message.class); ArgumentCaptor<Long> argumentLimit = ArgumentCaptor.forClass(Long.class); verify(this.repository).insert(argument.capture(), argumentLimit.capture()); Message other = argument.getValue(); assertNotNull(other); assertEquals(message.getUrl(), other.getUrl()); assertEquals(message.getBody(), other.getBody()); assertEquals("h1", message.getHeaders()[0].getKey()); assertEquals("v1", message.getHeaders()[0].getValue()); assertEquals("h2", message.getHeaders()[1].getKey()); assertEquals("v2", message.getHeaders()[1].getValue()); long limit = argumentLimit.getValue(); assertEquals(2100042, limit); assertServiceStarted(ForwardService.class); } @Test public void setLogLevelShouldChangeLogLevel() { StoreService.setLogLevel(Log.DEBUG); assertEquals(Log.DEBUG, Logger.getLevel()); } @Test public void setCellularDataBlackoutShouldSave() { TimeRange range = new TimeRange(new Time(3, 0), new Time(19, 0)); Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setCellularDataBlackout(context, range); Preferences preferences = new Preferences(context); TimeRange saved = preferences.getCellularDataBlackout(); assertEquals(range.getFrom().getMinuteOfDay(), saved.getFrom().getMinuteOfDay()); assertEquals(range.getTo().getMinuteOfDay(), saved.getTo().getMinuteOfDay()); } @Test public void resetCellularDataBlackoutShouldRemoveKeys() { TimeRange range = new TimeRange(new Time(3, 0), new Time(19, 0)); Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setCellularDataBlackout(context, range); Preferences preferences = new Preferences(context); TimeRange saved = preferences.getCellularDataBlackout(); assertNotNull(saved); StoreService.resetCellularDataBlackout(context); saved = preferences.getCellularDataBlackout(); assertNull(saved); } @Test public void setWlanBlackoutShouldSave() { String ranges = "06:00-07:00,08:30-10:00,12:19-13:50"; Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setWlanBlackout(context, ranges); Preferences preferences = new Preferences(context); String saved = preferences.getWlanBlackout(); assertEquals(saved, ranges); } @Test public void setWwanBlackoutShouldSave() { String ranges = "06:00-07:00,08:30-10:00,12:19-13:50"; Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setWwanBlackout(context, ranges); Preferences preferences = new Preferences(context); String saved = preferences.getWwanBlackout(); assertEquals(saved, ranges); } @Test public void setWwanRoamingBlackoutShouldSave() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setWwanRoamingBlackout(context, false); Preferences preferences = new Preferences(context); assertTrue(preferences.canSendOnRoaming()); } @Test public void setOnChargeBlackoutShouldSave() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setOnChargeBlackout(context, false); Preferences preferences = new Preferences(context); assertTrue(preferences.canSendOnCharge()); } @Test public void setOffChargeBlackoutShouldSave() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setOffChargeBlackout(context, false); Preferences preferences = new Preferences(context); assertTrue(preferences.canSendOffCharge()); } @Test public void setStorageLimitShouldSaveTheLimit() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setStorageSizeLimit(context, 2100042); assertEquals(2100042, StoreService.getStorageSizeLimit(context)); } @Test public void setStorageLimitShouldSetLimitToMinValueIfItLessThan0() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setStorageSizeLimit(context, 2100042); StoreService.setStorageSizeLimit(context, -100); assertEquals(1867776, StoreService.getStorageSizeLimit(context)); } @Test public void setStorageLimitShouldSetLimitToMinValueIfItLessEqual0() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setStorageSizeLimit(context, 2100042); StoreService.setStorageSizeLimit(context, 0); assertEquals(1867776, StoreService.getStorageSizeLimit(context)); } @Test public void setStorageLimitShouldSetSizeToMinValueIfPassedValueIsLessThanMinValue() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setStorageSizeLimit(context, 42); assertEquals(1867776, StoreService.getStorageSizeLimit(context)); } @Test public void resetStorageLimitShouldSetItToDefault() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.resetStorageSizeLimit(context); assertEquals(-1, StoreService.getStorageSizeLimit(context)); } @Test public void setBatchUploadToTrueShouldSave() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setBatchUploadConfiguration(context, true, URI.create("http://msn.com"), 1000); Preferences preferences = new Preferences(context); assertTrue(preferences.getBatchUpload()); assertEquals(URI.create("http://msn.com"), preferences.getBatchUploadUrl()); assertEquals(1000, preferences.getBatchUploadCheckInterval()); } @Test public void setBatchUploadToFalseShouldSave() { Context context = RuntimeEnvironment.application.getApplicationContext(); StoreService.setBatchUploadConfiguration(context, false, URI.create("http://google.com"), 100); Preferences preferences = new Preferences(context); assertFalse(preferences.getBatchUpload()); assertEquals(URI.create("http://google.com"), preferences.getBatchUploadUrl()); assertEquals(100, preferences.getBatchUploadCheckInterval()); } @Test public void whenCallingStartShouldAcquirePowerLock() { StoreService.start(RuntimeEnvironment.application.getApplicationContext(), null); Intent intent = assertServiceStarted(StoreService.class); int lockId = intent.getIntExtra("android.support.content.wakelockid", -1); assertTrue(lockId != -1); } @Test public void whenCallingSaveNonRecurringWwanBlackoutStartTimeShouldRecordStartTimeOfBlackout() { Context context = RuntimeEnvironment.application.getApplicationContext(); Preferences preferences = new Preferences(context); StoreService.setNonRecurringWwanBlackoutStartTime(context, 42L); assertEquals(42L, preferences.getNonRecurringWwanBlackoutStartTime(-1)); } @Test public void whenCallingSaveNonRecurringWwanBlackoutEndTimeShouldRecordEndTimeOfBlackout() { Context context = RuntimeEnvironment.application.getApplicationContext(); Preferences preferences = new Preferences(context); StoreService.setNonRecurringWwanBlackoutEndTime(context, 42L); assertEquals(42L, preferences.getNonRecurringWwanBlackoutEndTime(-1)); } @Test public void whenCallingResetNonRecurringWwanBlackoutShouldRemoveStartAndEndValuesFromPrefsAndGetValuesAsStringShouldReturnNull() { Context context = RuntimeEnvironment.application.getApplicationContext(); Preferences preferences = new Preferences(context); StoreService.resetNonRecurringWwanBlackout(context); assertEquals(null, preferences.getNonRecurringWwanBlackoutStartTimeAsString()); assertEquals(null, preferences.getNonRecurringWwanBlackoutEndTimeAsString()); } }