blob: 1db89673d6007cb4802af2b92602b29a2d5dbe86 [file] [log] [blame]
Jason Monk74f5e362017-12-06 08:56:33 -05001/*
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
15package com.android.server.slice;
16
17import static android.content.ContentProvider.maybeAddUserId;
Jason Monk42e03f82018-03-30 11:26:56 -040018import static android.content.pm.PackageManager.PERMISSION_DENIED;
Jason Monk74f5e362017-12-06 08:56:33 -050019import static android.content.pm.PackageManager.PERMISSION_GRANTED;
20
Jason Monk4f645cc2018-06-22 16:01:55 -040021import static org.junit.Assert.assertEquals;
Jason Monk42e03f82018-03-30 11:26:56 -040022import static org.mockito.ArgumentMatchers.any;
Jason Monk74f5e362017-12-06 08:56:33 -050023import static org.mockito.ArgumentMatchers.anyInt;
Jason Monkf88d25e2018-03-06 20:13:24 -050024import static org.mockito.ArgumentMatchers.anyString;
Jason Monk74f5e362017-12-06 08:56:33 -050025import static org.mockito.ArgumentMatchers.eq;
26import static org.mockito.Mockito.doReturn;
27import static org.mockito.Mockito.mock;
28import static org.mockito.Mockito.never;
29import static org.mockito.Mockito.spy;
30import static org.mockito.Mockito.times;
31import static org.mockito.Mockito.verify;
32import static org.mockito.Mockito.when;
33
34import android.app.AppOpsManager;
Jason Monk74f5e362017-12-06 08:56:33 -050035import android.app.slice.SliceSpec;
Jason Monk1918ef72018-03-14 09:20:39 -040036import android.app.usage.UsageStatsManagerInternal;
Jason Monk74f5e362017-12-06 08:56:33 -050037import android.content.pm.PackageManagerInternal;
38import android.net.Uri;
Jason Monk38df2802018-02-22 19:28:12 -050039import android.os.Binder;
40import android.os.IBinder;
Jason Monk42e03f82018-03-30 11:26:56 -040041import android.os.Process;
Jason Monk74f5e362017-12-06 08:56:33 -050042import android.os.RemoteException;
43import android.support.test.filters.SmallTest;
44import android.testing.AndroidTestingRunner;
Jason Monk42e03f82018-03-30 11:26:56 -040045import android.testing.TestableContext;
Jason Monk74f5e362017-12-06 08:56:33 -050046import android.testing.TestableLooper;
47import android.testing.TestableLooper.RunWithLooper;
48
49import com.android.server.LocalServices;
50import com.android.server.UiServiceTestCase;
51
52import org.junit.After;
53import org.junit.Before;
54import org.junit.Test;
55import org.junit.runner.RunWith;
56
57@SmallTest
58@RunWith(AndroidTestingRunner.class)
59@RunWithLooper
60public class SliceManagerServiceTest extends UiServiceTestCase {
61
62 private static final String AUTH = "com.android.services.uitests";
Jason Monk4f645cc2018-06-22 16:01:55 -040063 private static final Uri TEST_URI = Uri.parse("content://" + AUTH + "/path");
Jason Monk74f5e362017-12-06 08:56:33 -050064
65 private static final SliceSpec[] EMPTY_SPECS = new SliceSpec[]{
66 };
67
68 private SliceManagerService mService;
69 private PinnedSliceState mCreatedSliceState;
Jason Monk38df2802018-02-22 19:28:12 -050070 private IBinder mToken = new Binder();
Jason Monk42e03f82018-03-30 11:26:56 -040071 private TestableContext mContextSpy;
Jason Monk74f5e362017-12-06 08:56:33 -050072
73 @Before
74 public void setup() {
Jason Monk1918ef72018-03-14 09:20:39 -040075 LocalServices.addService(UsageStatsManagerInternal.class,
76 mock(UsageStatsManagerInternal.class));
Jason Monk74f5e362017-12-06 08:56:33 -050077 mContext.addMockSystemService(AppOpsManager.class, mock(AppOpsManager.class));
78 mContext.getTestablePermissions().setPermission(TEST_URI, PERMISSION_GRANTED);
79
Jason Monk42e03f82018-03-30 11:26:56 -040080 mContextSpy = spy(mContext);
81 mService = spy(new SliceManagerService(mContextSpy, TestableLooper.get(this).getLooper()));
Jason Monk74f5e362017-12-06 08:56:33 -050082 mCreatedSliceState = mock(PinnedSliceState.class);
Jason Monkf88d25e2018-03-06 20:13:24 -050083 doReturn(mCreatedSliceState).when(mService).createPinnedSlice(eq(TEST_URI), anyString());
Jason Monk74f5e362017-12-06 08:56:33 -050084 }
85
86 @After
87 public void teardown() {
Jason Monk1918ef72018-03-14 09:20:39 -040088 LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
Jason Monk74f5e362017-12-06 08:56:33 -050089 }
90
91 @Test
Jason Monk74f5e362017-12-06 08:56:33 -050092 public void testAddPinCreatesPinned() throws RemoteException {
93 doReturn("pkg").when(mService).getDefaultHome(anyInt());
94
Jason Monk38df2802018-02-22 19:28:12 -050095 mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
96 mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
Jason Monk4f645cc2018-06-22 16:01:55 -040097 verify(mService, times(1)).createPinnedSlice(eq(maybeAddUserId(TEST_URI, 0)), anyString());
Jason Monk74f5e362017-12-06 08:56:33 -050098 }
99
100 @Test
101 public void testRemovePinDestroysPinned() throws RemoteException {
102 doReturn("pkg").when(mService).getDefaultHome(anyInt());
103
Jason Monk38df2802018-02-22 19:28:12 -0500104 mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
Jason Monk74f5e362017-12-06 08:56:33 -0500105
Jason Monk38df2802018-02-22 19:28:12 -0500106 when(mCreatedSliceState.unpin(eq("pkg"), eq(mToken))).thenReturn(false);
107 mService.unpinSlice("pkg", TEST_URI, mToken);
Jason Monk74f5e362017-12-06 08:56:33 -0500108 verify(mCreatedSliceState, never()).destroy();
Jason Monk74f5e362017-12-06 08:56:33 -0500109 }
110
Jason Monk42e03f82018-03-30 11:26:56 -0400111 @Test
112 public void testCheckAutoGrantPermissions() throws RemoteException {
113 String[] testPerms = new String[] {
114 "perm1",
115 "perm2",
116 };
117 when(mContextSpy.checkUriPermission(any(), anyInt(), anyInt(), anyInt()))
118 .thenReturn(PERMISSION_DENIED);
119 when(mContextSpy.checkPermission("perm1", Process.myPid(), Process.myUid()))
120 .thenReturn(PERMISSION_DENIED);
121 when(mContextSpy.checkPermission("perm2", Process.myPid(), Process.myUid()))
122 .thenReturn(PERMISSION_GRANTED);
123 mService.checkSlicePermission(TEST_URI, mContext.getPackageName(), Process.myPid(),
124 Process.myUid(), testPerms);
125
126 verify(mContextSpy).checkPermission(eq("perm1"), eq(Process.myPid()), eq(Process.myUid()));
127 verify(mContextSpy).checkPermission(eq("perm2"), eq(Process.myPid()), eq(Process.myUid()));
128 }
129
Jason Monk4f645cc2018-06-22 16:01:55 -0400130 @Test(expected = IllegalStateException.class)
131 public void testNoPinThrow() throws Exception {
132 mService.getPinnedSpecs(TEST_URI, "pkg");
133 }
134
135 @Test
136 public void testGetPinnedSpecs() throws Exception {
137 SliceSpec[] specs = new SliceSpec[] {
138 new SliceSpec("Something", 1) };
139 mService.pinSlice("pkg", TEST_URI, specs, mToken);
140
141 when(mCreatedSliceState.getSpecs()).thenReturn(specs);
142 assertEquals(specs, mService.getPinnedSpecs(TEST_URI, "pkg"));
143 }
144
Jason Monk397f6d82018-04-24 17:01:11 -0400145}