1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.server.slice; 16 17 import static android.content.ContentProvider.maybeAddUserId; 18 import static android.content.pm.PackageManager.PERMISSION_DENIED; 19 import static android.content.pm.PackageManager.PERMISSION_GRANTED; 20 21 import static org.mockito.ArgumentMatchers.any; 22 import static org.mockito.ArgumentMatchers.anyInt; 23 import static org.mockito.ArgumentMatchers.anyString; 24 import static org.mockito.ArgumentMatchers.eq; 25 import static org.mockito.Mockito.doReturn; 26 import static org.mockito.Mockito.mock; 27 import static org.mockito.Mockito.never; 28 import static org.mockito.Mockito.spy; 29 import static org.mockito.Mockito.times; 30 import static org.mockito.Mockito.verify; 31 import static org.mockito.Mockito.when; 32 33 import android.app.AppOpsManager; 34 import android.app.slice.SliceSpec; 35 import android.app.usage.UsageStatsManagerInternal; 36 import android.content.pm.PackageManagerInternal; 37 import android.net.Uri; 38 import android.os.Binder; 39 import android.os.IBinder; 40 import android.os.Process; 41 import android.os.RemoteException; 42 import android.support.test.filters.SmallTest; 43 import android.testing.AndroidTestingRunner; 44 import android.testing.TestableContext; 45 import android.testing.TestableLooper; 46 import android.testing.TestableLooper.RunWithLooper; 47 48 import com.android.server.LocalServices; 49 import com.android.server.UiServiceTestCase; 50 51 import org.junit.After; 52 import org.junit.Before; 53 import org.junit.Test; 54 import org.junit.runner.RunWith; 55 56 @SmallTest 57 @RunWith(AndroidTestingRunner.class) 58 @RunWithLooper 59 public class SliceManagerServiceTest extends UiServiceTestCase { 60 61 private static final String AUTH = "com.android.services.uitests"; 62 private static final Uri TEST_URI = maybeAddUserId(Uri.parse("content://" + AUTH + "/path"), 0); 63 64 private static final SliceSpec[] EMPTY_SPECS = new SliceSpec[]{ 65 }; 66 67 private SliceManagerService mService; 68 private PinnedSliceState mCreatedSliceState; 69 private IBinder mToken = new Binder(); 70 private TestableContext mContextSpy; 71 72 @Before 73 public void setup() { 74 LocalServices.addService(UsageStatsManagerInternal.class, 75 mock(UsageStatsManagerInternal.class)); 76 mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class)); 77 mContext.getTestablePermissions().setPermission(TEST_URI, PERMISSION_GRANTED); 78 79 mContextSpy = spy(mContext); 80 mService = spy(new SliceManagerService(mContextSpy, TestableLooper.get(this).getLooper())); 81 mCreatedSliceState = mock(PinnedSliceState.class); 82 doReturn(mCreatedSliceState).when(mService).createPinnedSlice(eq(TEST_URI), anyString()); 83 } 84 85 @After 86 public void teardown() { 87 LocalServices.removeServiceForTest(UsageStatsManagerInternal.class); 88 } 89 90 @Test 91 public void testAddPinCreatesPinned() throws RemoteException { 92 doReturn("pkg").when(mService).getDefaultHome(anyInt()); 93 94 mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); 95 mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); 96 verify(mService, times(1)).createPinnedSlice(eq(TEST_URI), anyString()); 97 } 98 99 @Test 100 public void testRemovePinDestroysPinned() throws RemoteException { 101 doReturn("pkg").when(mService).getDefaultHome(anyInt()); 102 103 mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken); 104 105 when(mCreatedSliceState.unpin(eq("pkg"), eq(mToken))).thenReturn(false); 106 mService.unpinSlice("pkg", TEST_URI, mToken); 107 verify(mCreatedSliceState, never()).destroy(); 108 } 109 110 @Test 111 public void testCheckAutoGrantPermissions() throws RemoteException { 112 String[] testPerms = new String[] { 113 "perm1", 114 "perm2", 115 }; 116 when(mContextSpy.checkUriPermission(any(), anyInt(), anyInt(), anyInt())) 117 .thenReturn(PERMISSION_DENIED); 118 when(mContextSpy.checkPermission("perm1", Process.myPid(), Process.myUid())) 119 .thenReturn(PERMISSION_DENIED); 120 when(mContextSpy.checkPermission("perm2", Process.myPid(), Process.myUid())) 121 .thenReturn(PERMISSION_GRANTED); 122 mService.checkSlicePermission(TEST_URI, mContext.getPackageName(), Process.myPid(), 123 Process.myUid(), testPerms); 124 125 verify(mContextSpy).checkPermission(eq("perm1"), eq(Process.myPid()), eq(Process.myUid())); 126 verify(mContextSpy).checkPermission(eq("perm2"), eq(Process.myPid()), eq(Process.myUid())); 127 } 128 129 } 130