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