1package android.net;
2
3import static junit.framework.Assert.assertFalse;
4import static junit.framework.Assert.assertSame;
5import static junit.framework.Assert.fail;
6
7import static org.mockito.Matchers.anyString;
8import static org.mockito.Matchers.eq;
9
10import android.Manifest.permission;
11import android.content.Context;
12import android.support.test.runner.AndroidJUnit4;
13
14import org.junit.Before;
15import org.junit.Test;
16import org.junit.runner.RunWith;
17import org.mockito.Mock;
18import org.mockito.Mockito;
19import org.mockito.MockitoAnnotations;
20
21import java.util.concurrent.CountDownLatch;
22import java.util.concurrent.Executor;
23import java.util.concurrent.Executors;
24import java.util.concurrent.TimeUnit;
25
26/**
27 * Unit test for the {@link NetworkRecommendationProvider}.
28 */
29@RunWith(AndroidJUnit4.class)
30public class NetworkRecommendationProviderTest {
31    @Mock private Context mContext;
32    private NetworkRecProvider mRecProvider;
33    private INetworkRecommendationProvider mStub;
34    private CountDownLatch mScoreRequestLatch;
35    private NetworkKey[] mTestNetworkKeys;
36
37    @Before
38    public void setUp() throws Exception {
39        MockitoAnnotations.initMocks(this);
40
41        Executor executor = Executors.newSingleThreadExecutor();
42        mScoreRequestLatch = new CountDownLatch(1);
43        mRecProvider = new NetworkRecProvider(mContext, executor, mScoreRequestLatch);
44        mStub = INetworkRecommendationProvider.Stub.asInterface(mRecProvider.getBinder());
45        mTestNetworkKeys = new NetworkKey[2];
46        mTestNetworkKeys[0] = new NetworkKey(new WifiKey("\"ssid_01\"", "00:00:00:00:00:11"));
47        mTestNetworkKeys[1] = new NetworkKey(new WifiKey("\"ssid_02\"", "00:00:00:00:00:22"));
48    }
49
50    @Test
51    public void testScoreRequestReceived() throws Exception {
52        mStub.requestScores(mTestNetworkKeys);
53
54        // wait for onRequestScores() to be called in our impl below.
55        mScoreRequestLatch.await(200, TimeUnit.MILLISECONDS);
56
57        assertSame(mTestNetworkKeys, mRecProvider.mCapturedNetworks);
58    }
59
60    @Test
61    public void testScoreRequest_nullInput() throws Exception {
62        mStub.requestScores(null);
63
64        // onRequestScores() should never be called
65        assertFalse(mScoreRequestLatch.await(200, TimeUnit.MILLISECONDS));
66    }
67
68    @Test
69    public void testScoreRequest_emptyInput() throws Exception {
70        mStub.requestScores(new NetworkKey[0]);
71
72        // onRequestScores() should never be called
73        assertFalse(mScoreRequestLatch.await(200, TimeUnit.MILLISECONDS));
74    }
75
76    @Test
77    public void testScoreRequest_permissionsEnforced() throws Exception {
78        Mockito.doThrow(new SecurityException())
79                .when(mContext)
80                .enforceCallingOrSelfPermission(eq(permission.REQUEST_NETWORK_SCORES), anyString());
81
82        try {
83            mStub.requestScores(mTestNetworkKeys);
84            fail("SecurityException expected.");
85        } catch (SecurityException e) {
86            // expected
87        }
88    }
89
90    private static class NetworkRecProvider extends NetworkRecommendationProvider {
91        private final CountDownLatch mScoreRequestLatch;
92        NetworkKey[] mCapturedNetworks;
93
94        NetworkRecProvider(Context context, Executor executor, CountDownLatch networkRequestLatch) {
95            super(context, executor);
96            mScoreRequestLatch = networkRequestLatch;
97        }
98
99        @Override
100        public void onRequestScores(NetworkKey[] networks) {
101            mCapturedNetworks = networks;
102            mScoreRequestLatch.countDown();
103        }
104    }
105}
106