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