Home | History | Annotate | Download | only in slice
      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