1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package android.net;
17
18import static android.net.NetworkPolicyManager.MASK_ALL_NETWORKS;
19import static android.net.NetworkPolicyManager.MASK_METERED_NETWORKS;
20import static android.net.NetworkPolicyManager.POLICY_ALLOW_METERED_BACKGROUND;
21import static android.net.NetworkPolicyManager.POLICY_NONE;
22import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
23import static android.net.NetworkPolicyManager.RULE_ALLOW_ALL;
24import static android.net.NetworkPolicyManager.RULE_ALLOW_METERED;
25import static android.net.NetworkPolicyManager.RULE_NONE;
26import static android.net.NetworkPolicyManager.RULE_REJECT_ALL;
27import static android.net.NetworkPolicyManager.RULE_REJECT_METERED;
28import static android.net.NetworkPolicyManager.RULE_TEMPORARY_ALLOW_METERED;
29import static android.net.NetworkPolicyManager.uidPoliciesToString;
30import static android.net.NetworkPolicyManager.uidRulesToString;
31
32import static org.junit.Assert.assertEquals;
33import static org.junit.Assert.fail;
34
35import org.junit.Test;
36import org.junit.runner.RunWith;
37import org.junit.runners.JUnit4;
38
39import java.util.Arrays;
40
41@RunWith(JUnit4.class)
42public class NetworkPolicyManagerTest {
43
44    @Test
45    public void testUidRulesToString() {
46        uidRulesToStringTest(RULE_NONE, "0 (NONE)");
47        uidRulesToStringTest(RULE_ALLOW_METERED, "1 (ALLOW_METERED)");
48        uidRulesToStringTest(RULE_TEMPORARY_ALLOW_METERED, "2 (TEMPORARY_ALLOW_METERED)");
49        uidRulesToStringTest(RULE_REJECT_METERED, "4 (REJECT_METERED)");
50        uidRulesToStringTest(RULE_ALLOW_ALL, "32 (ALLOW_ALL)");
51        uidRulesToStringTest(RULE_REJECT_ALL, "64 (REJECT_ALL)");
52
53        uidRulesToStringTest(RULE_ALLOW_METERED | RULE_ALLOW_ALL,
54                "33 (ALLOW_METERED|ALLOW_ALL)",
55                "33 (ALLOW_ALL|ALLOW_METERED)");
56        uidRulesToStringTest(RULE_ALLOW_METERED | RULE_REJECT_ALL,
57                "65 (ALLOW_METERED|REJECT_ALL)",
58                "65 (REJECT_ALL|ALLOW_METERED)");
59        uidRulesToStringTest(RULE_TEMPORARY_ALLOW_METERED | RULE_ALLOW_ALL,
60                "34 (TEMPORARY_ALLOW_METERED|ALLOW_ALL)",
61                "34 (ALLOW_ALL|TEMPORARY_ALLOW_METERED)");
62        uidRulesToStringTest(RULE_TEMPORARY_ALLOW_METERED | RULE_REJECT_ALL,
63                "66 (TEMPORARY_ALLOW_METERED|REJECT_ALL)",
64                "66 (REJECT_ALL|TEMPORARY_ALLOW_METERED)");
65        uidRulesToStringTest(RULE_REJECT_METERED | RULE_ALLOW_ALL,
66                "36 (REJECT_METERED|ALLOW_ALL)",
67                "36 (ALLOW_ALL|REJECT_METERED)");
68        uidRulesToStringTest(RULE_REJECT_METERED | RULE_REJECT_ALL,
69                "68 (REJECT_METERED|REJECT_ALL)",
70                "68 (REJECT_ALL|REJECT_METERED)");
71    }
72
73    private void uidRulesToStringTest(int uidRules, String... expectedOptions) {
74        assertContains(uidRulesToString(uidRules), expectedOptions);
75    }
76
77    @Test
78    public void testUidPoliciesToString() {
79        uidPoliciesToStringTest(POLICY_NONE, "0 (NONE)");
80        uidPoliciesToStringTest(POLICY_REJECT_METERED_BACKGROUND,
81                "1 (REJECT_METERED_BACKGROUND)");
82        uidPoliciesToStringTest(POLICY_ALLOW_METERED_BACKGROUND,
83                "4 (ALLOW_BACKGROUND_BATTERY_SAVE)");
84    }
85
86    private void uidPoliciesToStringTest(int policyRules, String... expectedOptions) {
87        assertContains(uidPoliciesToString(policyRules), expectedOptions);
88    }
89
90    @Test
91    public void testMeteredNetworksMask() {
92        assertEquals(RULE_NONE, MASK_METERED_NETWORKS
93                & RULE_NONE);
94
95        assertEquals(RULE_ALLOW_METERED, MASK_METERED_NETWORKS
96                & RULE_ALLOW_METERED);
97        assertEquals(RULE_ALLOW_METERED, MASK_METERED_NETWORKS
98                & (RULE_ALLOW_METERED | RULE_ALLOW_ALL));
99        assertEquals(RULE_ALLOW_METERED, MASK_METERED_NETWORKS
100                & (RULE_ALLOW_METERED | RULE_REJECT_ALL));
101
102        assertEquals(RULE_TEMPORARY_ALLOW_METERED, MASK_METERED_NETWORKS
103                & RULE_TEMPORARY_ALLOW_METERED);
104        assertEquals(RULE_TEMPORARY_ALLOW_METERED, MASK_METERED_NETWORKS
105                & (RULE_TEMPORARY_ALLOW_METERED | RULE_ALLOW_ALL));
106        assertEquals(RULE_TEMPORARY_ALLOW_METERED, MASK_METERED_NETWORKS
107                & (RULE_TEMPORARY_ALLOW_METERED | RULE_REJECT_ALL));
108
109        assertEquals(RULE_REJECT_METERED, MASK_METERED_NETWORKS
110                & RULE_REJECT_METERED);
111        assertEquals(RULE_REJECT_METERED, MASK_METERED_NETWORKS
112                & (RULE_REJECT_METERED | RULE_ALLOW_ALL));
113        assertEquals(RULE_REJECT_METERED, MASK_METERED_NETWORKS
114                & (RULE_REJECT_METERED | RULE_REJECT_ALL));
115    }
116
117    @Test
118    public void testAllNetworksMask() {
119        assertEquals(RULE_NONE, MASK_ALL_NETWORKS
120                & RULE_NONE);
121
122        assertEquals(RULE_ALLOW_ALL, MASK_ALL_NETWORKS
123                & RULE_ALLOW_ALL);
124        assertEquals(RULE_ALLOW_ALL, MASK_ALL_NETWORKS
125                & (RULE_ALLOW_ALL | RULE_ALLOW_METERED));
126        assertEquals(RULE_ALLOW_ALL, MASK_ALL_NETWORKS
127                & (RULE_ALLOW_ALL | RULE_TEMPORARY_ALLOW_METERED));
128        assertEquals(RULE_ALLOW_ALL, MASK_ALL_NETWORKS
129                & (RULE_ALLOW_ALL | RULE_REJECT_METERED));
130
131        assertEquals(RULE_REJECT_ALL, MASK_ALL_NETWORKS
132                & RULE_REJECT_ALL);
133        assertEquals(RULE_REJECT_ALL, MASK_ALL_NETWORKS
134                & (RULE_REJECT_ALL | RULE_ALLOW_METERED));
135        assertEquals(RULE_REJECT_ALL, MASK_ALL_NETWORKS
136                & (RULE_REJECT_ALL | RULE_TEMPORARY_ALLOW_METERED));
137        assertEquals(RULE_REJECT_ALL, MASK_ALL_NETWORKS
138                & (RULE_REJECT_ALL | RULE_REJECT_METERED));
139    }
140
141    // TODO: use Truth or Hamcrest
142    private void assertContains(String actual, String...expectedOptions) {
143        for (String expected : expectedOptions) {
144            if (expected.equals(actual)) return;
145        }
146        fail(actual + " not in " + Arrays.toString(expectedOptions));
147    }
148}
149