1 /* 2 * Copyright (C) 2024 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.nfc; 18 19 import static org.mockito.ArgumentMatchers.eq; 20 import static org.mockito.Mockito.mock; 21 import static org.mockito.Mockito.when; 22 23 import android.annotation.NonNull; 24 import android.annotation.Nullable; 25 import android.app.ActivityManager; 26 import android.content.BroadcastReceiver; 27 import android.content.Context; 28 import android.content.ContextWrapper; 29 import android.content.Intent; 30 import android.content.IntentFilter; 31 import android.content.pm.ActivityInfo; 32 import android.content.pm.PackageManager; 33 import android.content.pm.ResolveInfo; 34 import android.content.res.Resources; 35 import android.content.res.XmlResourceParser; 36 import android.nfc.NfcAdapter; 37 import android.os.Handler; 38 import android.os.PowerManager; 39 import android.os.UserHandle; 40 import android.util.Log; 41 42 import org.junit.Assert; 43 import org.junit.Before; 44 import org.junit.Test; 45 import org.junit.runner.RunWith; 46 import org.mockito.Mockito; 47 48 import com.android.nfc.flags.Flags; 49 50 import org.mockito.ArgumentMatchers; 51 import org.xmlpull.v1.XmlPullParser; 52 import org.xmlpull.v1.XmlPullParserException; 53 54 import androidx.test.ext.junit.runners.AndroidJUnit4; 55 import androidx.test.platform.app.InstrumentationRegistry; 56 57 import java.io.IOException; 58 import java.util.ArrayList; 59 import java.util.List; 60 61 @RunWith(AndroidJUnit4.class) 62 public final class RegisteredComponentCacheTest { 63 64 private RegisteredComponentCache mRegisteredComponentCache; 65 private Context mockContext; 66 private static final String TAG = RegisteredComponentCacheTest.class.getSimpleName(); 67 68 @Before setUp()69 public void setUp() { 70 Context context = InstrumentationRegistry.getInstrumentation().getTargetContext(); 71 PowerManager mockPowerManager = mock(PowerManager.class); 72 when(mockPowerManager.isInteractive()).thenReturn(false); 73 Resources mockResources = mock(Resources.class); 74 when(mockResources.getBoolean(eq(R.bool.tag_intent_app_pref_supported))) 75 .thenReturn(false); 76 77 mockContext = new ContextWrapper(context) { 78 @Override 79 public Object getSystemService(String name) { 80 if (Context.POWER_SERVICE.equals(name)) { 81 Log.i(TAG, "[Mock] mockPowerManager"); 82 return mockPowerManager; 83 } 84 return super.getSystemService(name); 85 } 86 87 @Override 88 public Resources getResources() { 89 Log.i(TAG, "[Mock] getResources"); 90 return mockResources; 91 } 92 93 @Override 94 public Intent registerReceiverForAllUsers(@Nullable BroadcastReceiver receiver, 95 @NonNull IntentFilter filter, @Nullable String broadcastPermission, 96 @Nullable Handler scheduler) { 97 Log.i(TAG, "[Mock] getIntent"); 98 return mock(Intent.class); 99 } 100 101 @NonNull 102 public Context createPackageContextAsUser( 103 @NonNull String packageName, @CreatePackageOptions int flags, 104 @NonNull UserHandle user) { 105 Log.i(TAG, "[Mock] createPackageContextAsUser"); 106 Context mockedContext = mock(Context.class); 107 PackageManager packageManager = mock(PackageManager.class); 108 when(mockedContext.getPackageManager()).thenReturn(packageManager); 109 ResolveInfo resolveInfo = mock(ResolveInfo.class); 110 ActivityInfo mockActivityInfo = mock(ActivityInfo.class); 111 mockActivityInfo.packageName = "com.android.nfc"; 112 mockActivityInfo.name = "NfcRootActivity"; 113 XmlResourceParser parser = mock(XmlResourceParser.class); 114 try { 115 when(parser.getEventType()).thenReturn(XmlPullParser.START_TAG); 116 when(parser.next()).thenReturn(XmlPullParser.START_TAG, XmlPullParser.END_TAG, 117 XmlPullParser.END_DOCUMENT); 118 when(parser.getName()).thenReturn("tech", "tech-list"); 119 } catch (XmlPullParserException | IOException ignored) { 120 } 121 when(mockActivityInfo.loadXmlMetaData(packageManager, 122 NfcAdapter.ACTION_TECH_DISCOVERED)).thenReturn(parser); 123 resolveInfo.activityInfo = mockActivityInfo; 124 List<ResolveInfo> resolveInfoList = new ArrayList<ResolveInfo>(); 125 resolveInfoList.add(resolveInfo); 126 when(packageManager.queryIntentActivitiesAsUser(Mockito.any(Intent.class), 127 Mockito.any(PackageManager.ResolveInfoFlags.class), 128 Mockito.any(UserHandle.class))).thenReturn(resolveInfoList); 129 130 return mockedContext; 131 } 132 }; 133 134 InstrumentationRegistry.getInstrumentation().runOnMainSync( 135 () -> mRegisteredComponentCache = new RegisteredComponentCache(mockContext, 136 NfcAdapter.ACTION_TECH_DISCOVERED, NfcAdapter.ACTION_TECH_DISCOVERED)); 137 Assert.assertNotNull(mRegisteredComponentCache); 138 } 139 140 @Test testGetComponents()141 public void testGetComponents() { 142 ArrayList<RegisteredComponentCache.ComponentInfo> componentInfos = 143 mRegisteredComponentCache.getComponents(); 144 Assert.assertNotNull(componentInfos); 145 Assert.assertTrue(componentInfos.size() > 0); 146 } 147 } 148