• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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  */
16 
17 package com.android.modules.utils.testing;
18 
19 import android.provider.DeviceConfig;
20 
21 import androidx.test.filters.SmallTest;
22 import androidx.test.runner.AndroidJUnit4;
23 
24 import com.android.dx.mockito.inline.extended.ExtendedMockito;
25 import com.android.dx.mockito.inline.extended.StaticMockitoSessionBuilder;
26 
27 import org.junit.Assert;
28 import org.junit.Rule;
29 import org.junit.Test;
30 import org.junit.runner.RunWith;
31 
32 import java.util.ArrayList;
33 import java.util.List;
34 
35 @RunWith(AndroidJUnit4.class)
36 @SmallTest
37 public class TestableDeviceConfigAndOtherStaticMocksTest {
38     @Rule
39     public ExtendedMockitoRule mExtendedMockitoRule = new ExtendedMockitoRule.Builder(this)
40             .addStaticMockFixtures(TestableDeviceConfig::new, AB::new, CD::new).build();
41 
42     private List<String> mCollected;
43 
44     @Test
testDeviceConfigAndOtherStaticMocks()45     public void testDeviceConfigAndOtherStaticMocks() throws Exception {
46         mCollected = new ArrayList<>();
47         int n = 0;
48 
49         String namespace = "foo";
50         String flag = "bar";
51         String flagValue = "new value";
52 
53         Assert.assertNull(DeviceConfig.getProperty(namespace, flag));
54 
55         A.a();
56         verifyCollected(++n, "A.a");
57 
58         DeviceConfig.setProperty(namespace, flag, flagValue, false);
59 
60         D.b();
61         verifyCollected(++n, "D.b");
62 
63         Assert.assertEquals(flagValue, DeviceConfig.getProperty(namespace, flag));
64 
65         C.b();
66         verifyCollected(++n, "C.b");
67 
68         B.a();
69         verifyCollected(++n, "B.a");
70     }
71 
verifyCollected(int n, String last)72     private void verifyCollected(int n, String last) {
73         Assert.assertEquals(n, mCollected.size());
74         Assert.assertEquals(last, mCollected.get(n - 1));
75     }
76 
77     private static class A {
a()78         /* package */ static void a() {}
b()79         /* package */ static void b() {}
80     }
81 
82     private static class B {
a()83         /* package */ static void a() {}
b()84         /* package */ static void b() {}
85     }
86 
87     private static class C {
a()88         /* package */ static void a() {}
b()89         /* package */ static void b() {}
90     }
91 
92     private static class D {
a()93         /* package */ static void a() {}
b()94         /* package */ static void b() {}
95     }
96 
97     /**
98      * AB StaticMockFixture class that handles two mocked classes, {@link A} and {@link B}.
99      */
100     private class AB implements StaticMockFixture {
101         @Override
setUpMockedClasses( StaticMockitoSessionBuilder sessionBuilder)102         public StaticMockitoSessionBuilder setUpMockedClasses(
103                 StaticMockitoSessionBuilder sessionBuilder) {
104             sessionBuilder.spyStatic(A.class);
105             sessionBuilder.spyStatic(B.class);
106             return sessionBuilder;
107         }
108 
109         @Override
setUpMockBehaviors()110         public void setUpMockBehaviors() {
111             ExtendedMockito.doAnswer(invocation -> {
112                 mCollected.add("A.a");
113                 return null;
114             }).when(A::a);
115             ExtendedMockito.doAnswer(invocation -> {
116                 mCollected.add("A.b");
117                 return null;
118             }).when(A::b);
119             ExtendedMockito.doAnswer(invocation -> {
120                 mCollected.add("B.a");
121                 return null;
122             }).when(B::a);
123             ExtendedMockito.doAnswer(invocation -> {
124                 mCollected.add("B.b");
125                 return null;
126             }).when(B::b);
127         }
128 
129         @Override
tearDown()130         public void tearDown() {
131 
132         }
133     }
134 
135     /**
136      * AB StaticMockFixture class that handles two mocked classes, {@link C} and {@link D}.
137      */
138     private class CD implements StaticMockFixture {
139         @Override
setUpMockedClasses( StaticMockitoSessionBuilder sessionBuilder)140         public StaticMockitoSessionBuilder setUpMockedClasses(
141                 StaticMockitoSessionBuilder sessionBuilder) {
142             sessionBuilder.spyStatic(C.class);
143             sessionBuilder.spyStatic(D.class);
144             return sessionBuilder;
145         }
146 
147         @Override
setUpMockBehaviors()148         public void setUpMockBehaviors() {
149             ExtendedMockito.doAnswer(invocation -> {
150                 mCollected.add("C.a");
151                 return null;
152             }).when(C::a);
153             ExtendedMockito.doAnswer(invocation -> {
154                 mCollected.add("C.b");
155                 return null;
156             }).when(C::b);
157             ExtendedMockito.doAnswer(invocation -> {
158                 mCollected.add("D.a");
159                 return null;
160             }).when(D::a);
161             ExtendedMockito.doAnswer(invocation -> {
162                 mCollected.add("D.b");
163                 return null;
164             }).when(D::b);
165         }
166 
167         @Override
tearDown()168         public void tearDown() {
169 
170         }
171     }
172 }
173