package com.zachklipp.captivate.test.service; import com.zachklipp.captivate.Preferences; import com.zachklipp.captivate.captive_portal.PortalDetector; import com.zachklipp.captivate.captive_portal.PortalDetector.OverrideMode; import com.zachklipp.captivate.service.PortalDetectorService; import com.zachklipp.captivate.state_machine.PortalStateMachine; import com.zachklipp.captivate.state_machine.StateMachine; import com.zachklipp.captivate.state_machine.PortalStateMachine.StorageBackendFactory; import com.zachklipp.captivate.state_machine.StateMachineStorage.StorageBackend; import com.zachklipp.captivate.test.captive_portal.MockPortalDetector; import com.zachklipp.captivate.test.state_machine.MockStorageBackend; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.test.ServiceTestCase; import android.util.Log; /* * These tests currently require Wifi to be on on the testing device. */ public class PortalDetectorServiceTest extends ServiceTestCase<PortalDetectorService> { private static final String LOG_TAG = "captivate-tests"; private MockBroadcastReceiver mBroadcastReceiver; private MockPortalDetector mDetector; private IntentFilter mPortalStateChangedIntentFilter; PortalDetector.Factory mDetectorFactory = new PortalDetector.Factory() { @Override public PortalDetector create() { return mDetector; } }; public PortalDetectorServiceTest() { super(PortalDetectorService.class); } @Override protected void setUp() throws Exception { super.setUp(); setServiceEnabled(true); mBroadcastReceiver = new MockBroadcastReceiver(); mPortalStateChangedIntentFilter = new IntentFilter( PortalDetectorService.ACTION_PORTAL_STATE_CHANGED); assertNotNull(mBroadcastReceiver); assertNotNull(mContext); assertNotNull(mPortalStateChangedIntentFilter); Log.d(LOG_TAG, "context class: " + mContext.getClass().getName()); mDetector = new MockPortalDetector(); mContext.registerReceiver(mBroadcastReceiver, mPortalStateChangedIntentFilter); MockPortalStorageBackend.Factory storageFactory = new MockPortalStorageBackend.Factory(); storageFactory.mLoadFromSave = true; PortalDetectorService.setPortalDetectorFactory(mDetectorFactory); PortalDetectorService.setStorageBackendFactory(storageFactory); } @Override protected void tearDown() { mContext.unregisterReceiver(mBroadcastReceiver); } public void testSendsBroadcastIntentOnPortalDetected() { mDetector.setTestingOverride(OverrideMode.ALWAYS_DETECT); startService(); assertChangedToState(PortalStateMachine.State.SIGNIN_REQUIRED); } /* public void testDetectionStateChange() { mDetector.setTestingOverride(OverrideMode.ALWAYS_DETECT); startService(); assertChangedToState(PortalStateMachine.State.SIGNIN_REQUIRED); mDetector.setTestingOverride(OverrideMode.NEVER_DETECT); startService(); assertChangedToState(PortalStateMachine.State.SIGNED_IN); } public void testDisablePreference() { mDetector.setTestingOverride(OverrideMode.ALWAYS_DETECT); startService(); assertChangedToState(PortalStateMachine.State.SIGNIN_REQUIRED); // Disable via preferences setServiceEnabled(false); startService(); assertChangedToState(PortalStateMachine.State.UNKNOWN); setServiceEnabled(true); startService(); assertChangedToState(PortalStateMachine.State.SIGNIN_REQUIRED); // Disable via preferences setServiceEnabled(false); startService(); assertChangedToState(PortalStateMachine.State.UNKNOWN); setServiceEnabled(true); mDetector.setTestingOverride(OverrideMode.NEVER_DETECT); startService(); assertChangedToState(PortalStateMachine.State.NO_PORTAL); } */ private void startService() { startService(new Intent(mContext, PortalDetectorService.class)); } private void setServiceEnabled(boolean enabled) { SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(mContext).edit(); editor.putBoolean(Preferences.ENABLED_KEY, enabled); editor.commit(); } private void assertChangedToState(PortalStateMachine.State expectedState) { mBroadcastReceiver.waitForIntents(1, 30000); Intent[] receivedIntents = mBroadcastReceiver.getReceivedIntentsAndClear(); assertEquals(1, receivedIntents.length); assertState(expectedState, receivedIntents[0]); } private void assertState(PortalStateMachine.State expectedState, Intent receivedIntent) { String stateName = receivedIntent.getStringExtra( PortalDetectorService.EXTRA_PORTAL_STATE); assertEquals(expectedState.getName(), stateName); } } class MockPortalStorageBackend extends MockStorageBackend { public static class Factory implements StorageBackendFactory { public boolean mLoadFromSave = false; @Override public StorageBackend create(Context context, PortalDetector detector) { MockPortalStorageBackend backend = new MockPortalStorageBackend(detector); backend.setLoadFromSave(mLoadFromSave); return backend; } } private PortalDetector mDetector; public MockPortalStorageBackend(PortalDetector detector) { mDetector = detector; } @Override public StateMachine create() { super.create(); return new PortalStateMachine(mDetector); } }