1/*
2 * Copyright 2018 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
17package androidx.slice.compat;
18
19import static androidx.core.content.PermissionChecker.PERMISSION_DENIED;
20import static androidx.core.content.PermissionChecker.PERMISSION_GRANTED;
21
22import static org.junit.Assert.assertEquals;
23import static org.mockito.ArgumentMatchers.eq;
24import static org.mockito.Mockito.spy;
25import static org.mockito.Mockito.verify;
26import static org.mockito.Mockito.when;
27
28import android.content.ContentResolver;
29import android.content.Context;
30import android.content.ContextWrapper;
31import android.content.pm.PackageManager;
32import android.net.Uri;
33import android.os.Process;
34import android.support.test.InstrumentationRegistry;
35import android.support.test.filters.SmallTest;
36import android.support.test.runner.AndroidJUnit4;
37
38import org.junit.Test;
39import org.junit.runner.RunWith;
40
41@RunWith(AndroidJUnit4.class)
42@SmallTest
43public class CompatPermissionManagerTest {
44
45    private final Context mContext = InstrumentationRegistry.getContext();
46
47    @Test
48    public void testAutoGrant() {
49        final Uri uri = new Uri.Builder()
50                .scheme(ContentResolver.SCHEME_CONTENT)
51                .authority("my.authority")
52                .path("my_path")
53                .build();
54        final String testPermission = "android.permission.SOME_PERMISSION";
55
56        final int grantedPid = Process.myPid();
57        final int grantedUid = Process.myUid();
58
59        final int nonGrantedPid = grantedPid + 1;
60        final int nonGrantedUid = grantedUid + 1;
61
62        Context permContext = new ContextWrapper(mContext) {
63            @Override
64            public int checkPermission(String permission, int pid, int uid) {
65                if (testPermission.equals(permission)) {
66                    if (grantedUid == uid) {
67                        return PackageManager.PERMISSION_GRANTED;
68                    } else if (nonGrantedUid == uid) {
69                        return PackageManager.PERMISSION_DENIED;
70                    }
71                }
72                return super.checkPermission(permission, pid, uid);
73            }
74
75            @Override
76            public PackageManager getPackageManager() {
77                PackageManager pm = spy(super.getPackageManager());
78                when(pm.getPackagesForUid(grantedUid)).thenReturn(new String[] { "grant_pkg"});
79                when(pm.getPackagesForUid(nonGrantedUid)).thenReturn(new String[] { "other_pkg"});
80                return pm;
81            }
82        };
83        CompatPermissionManager manager = spy(new CompatPermissionManager(permContext, "nothing", 0,
84                new String[] {testPermission}));
85
86        assertEquals(PERMISSION_DENIED, manager.checkSlicePermission(uri,
87                nonGrantedPid, nonGrantedUid));
88
89        assertEquals(PERMISSION_GRANTED, manager.checkSlicePermission(uri, grantedPid, grantedUid));
90        verify(manager).grantSlicePermission(eq(uri), eq("grant_pkg"));
91
92    }
93
94}
95