NetworkRecommendationProviderTest.java revision 280f82c3127a331d9f8b6f61726176a380892f66
1package android.net; 2 3import static android.net.NetworkRecommendationProvider.EXTRA_RECOMMENDATION_RESULT; 4import static android.net.NetworkRecommendationProvider.EXTRA_SEQUENCE; 5 6import android.content.Context; 7import android.os.Bundle; 8import android.os.Handler; 9import android.os.HandlerThread; 10import android.os.IRemoteCallback; 11import android.test.InstrumentationTestCase; 12import android.test.suitebuilder.annotation.MediumTest; 13import android.test.suitebuilder.annotation.SmallTest; 14 15import org.mockito.ArgumentCaptor; 16import org.mockito.Mock; 17import org.mockito.Mockito; 18import org.mockito.MockitoAnnotations; 19 20import java.util.concurrent.CountDownLatch; 21import java.util.concurrent.TimeUnit; 22 23/** 24 * Unit test for the {@link NetworkRecommendationProvider}. 25 */ 26public class NetworkRecommendationProviderTest extends InstrumentationTestCase { 27 @Mock private IRemoteCallback mMockRemoteCallback; 28 private NetworkRecProvider mRecProvider; 29 private Handler mHandler; 30 private INetworkRecommendationProvider mStub; 31 private CountDownLatch mCountDownLatch; 32 33 @Override 34 public void setUp() throws Exception { 35 super.setUp(); 36 37 // Configuration needed to make mockito/dexcache work. 38 final Context context = getInstrumentation().getTargetContext(); 39 System.setProperty("dexmaker.dexcache", 40 context.getCacheDir().getPath()); 41 ClassLoader newClassLoader = getInstrumentation().getClass().getClassLoader(); 42 Thread.currentThread().setContextClassLoader(newClassLoader); 43 44 MockitoAnnotations.initMocks(this); 45 46 HandlerThread thread = new HandlerThread("NetworkRecommendationProviderTest"); 47 thread.start(); 48 mCountDownLatch = new CountDownLatch(1); 49 mHandler = new Handler(thread.getLooper()); 50 mRecProvider = new NetworkRecProvider(mHandler, mCountDownLatch); 51 mStub = INetworkRecommendationProvider.Stub.asInterface(mRecProvider.getBinder()); 52 } 53 54 @MediumTest 55 public void testRequestReceived() throws Exception { 56 final RecommendationRequest request = new RecommendationRequest.Builder().build(); 57 final int sequence = 100; 58 mStub.requestRecommendation(request, mMockRemoteCallback, sequence); 59 60 // wait for onRequestRecommendation() to be called in our impl below. 61 mCountDownLatch.await(200, TimeUnit.MILLISECONDS); 62 NetworkRecommendationProvider.ResultCallback expectedResultCallback = 63 new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence); 64 assertEquals(request, mRecProvider.mCapturedRequest); 65 assertEquals(expectedResultCallback, mRecProvider.mCapturedCallback); 66 } 67 68 @SmallTest 69 public void testResultCallbackOnResult() throws Exception { 70 final int sequence = 100; 71 final NetworkRecommendationProvider.ResultCallback callback = 72 new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence); 73 74 final RecommendationResult result = new RecommendationResult(null); 75 callback.onResult(result); 76 77 final ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); 78 Mockito.verify(mMockRemoteCallback).sendResult(bundleCaptor.capture()); 79 Bundle capturedBundle = bundleCaptor.getValue(); 80 assertEquals(sequence, capturedBundle.getInt(EXTRA_SEQUENCE)); 81 assertSame(result, capturedBundle.getParcelable(EXTRA_RECOMMENDATION_RESULT)); 82 } 83 84 @SmallTest 85 public void testResultCallbackOnResult_runTwice_throwsException() throws Exception { 86 final int sequence = 100; 87 final NetworkRecommendationProvider.ResultCallback callback = 88 new NetworkRecommendationProvider.ResultCallback(mMockRemoteCallback, sequence); 89 90 final RecommendationResult result = new RecommendationResult(null); 91 callback.onResult(result); 92 93 try { 94 callback.onResult(result); 95 fail("Callback ran more than once."); 96 } catch (IllegalStateException e) { 97 // expected 98 } 99 } 100 101 private static class NetworkRecProvider extends NetworkRecommendationProvider { 102 private final CountDownLatch mCountDownLatch; 103 RecommendationRequest mCapturedRequest; 104 ResultCallback mCapturedCallback; 105 106 NetworkRecProvider(Handler handler, CountDownLatch countDownLatch) { 107 super(handler); 108 mCountDownLatch = countDownLatch; 109 } 110 111 @Override 112 public void onRequestRecommendation(RecommendationRequest request, 113 ResultCallback callback) { 114 mCapturedRequest = request; 115 mCapturedCallback = callback; 116 mCountDownLatch.countDown(); 117 } 118 } 119} 120