1 /*
2  * Copyright (C) 2018 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 org.junit.Assert.assertEquals;
18 import static org.mockito.ArgumentMatchers.eq;
19 import static org.mockito.Mockito.clearInvocations;
20 import static org.mockito.Mockito.mock;
21 import static org.mockito.Mockito.verify;
22 
23 import android.testing.AndroidTestingRunner;
24 import android.testing.TestableLooper.RunWithLooper;
25 import android.util.Xml.Encoding;
26 
27 import androidx.test.filters.SmallTest;
28 
29 import com.android.server.UiServiceTestCase;
30 import com.android.server.slice.SlicePermissionManager.PkgUser;
31 import com.android.server.slice.SliceProviderPermissions.SliceAuthority;
32 
33 import org.junit.Test;
34 import org.junit.runner.RunWith;
35 import org.xmlpull.v1.XmlPullParser;
36 import org.xmlpull.v1.XmlPullParserException;
37 import org.xmlpull.v1.XmlPullParserFactory;
38 import org.xmlpull.v1.XmlSerializer;
39 
40 import java.io.ByteArrayInputStream;
41 import java.io.ByteArrayOutputStream;
42 import java.io.IOException;
43 import java.util.ArrayList;
44 import java.util.Comparator;
45 
46 @SmallTest
47 @RunWith(AndroidTestingRunner.class)
48 @RunWithLooper
49 public class SliceProviderPermissionsTest extends UiServiceTestCase {
50 
51     @Test
testDirty_addAuthority()52     public void testDirty_addAuthority() {
53         PkgUser pkg = new PkgUser("com.android.pkg", 0);
54         DirtyTracker tracker = mock(DirtyTracker.class);
55         SliceProviderPermissions provider = new SliceProviderPermissions(pkg, tracker);
56 
57         provider.getOrCreateAuthority("some_auth");
58 
59         verify(tracker).onPersistableDirty(eq(provider));
60     }
61 
62     @Test
testDirty_addPkg()63     public void testDirty_addPkg() {
64         PkgUser pkg = new PkgUser("com.android.pkg", 0);
65         DirtyTracker tracker = mock(DirtyTracker.class);
66         SliceProviderPermissions provider = new SliceProviderPermissions(pkg, tracker);
67 
68         SliceAuthority auth = provider.getOrCreateAuthority("some_auth");
69         clearInvocations(tracker);
70 
71         auth.addPkg(new PkgUser("pkg", 0));
72 
73         verify(tracker).onPersistableDirty(eq(provider));
74     }
75 
76     @Test
testCreation()77     public void testCreation() {
78         SliceProviderPermissions provider = createProvider();
79         ArrayList<SliceAuthority> authorities = new ArrayList<>(provider.getAuthorities());
80         authorities.sort(Comparator.comparing(SliceAuthority::getAuthority));
81 
82         assertEquals(2, authorities.size());
83         assertEquals("com.android.pkg", authorities.get(0).getAuthority());
84         assertEquals("com.android.pkg.slices", authorities.get(1).getAuthority());
85 
86         assertEquals(1, authorities.get(0).getPkgs().size());
87         assertEquals(2, authorities.get(1).getPkgs().size());
88     }
89 
90     @Test
testSerialization()91     public void testSerialization() throws XmlPullParserException, IOException {
92         SliceProviderPermissions provider = createProvider();
93 
94         ByteArrayOutputStream output = new ByteArrayOutputStream();
95         XmlSerializer serializer = XmlPullParserFactory.newInstance().newSerializer();
96         serializer.setOutput(output, Encoding.UTF_8.name());
97 
98         provider.writeTo(serializer);
99         serializer.flush();
100 
101         ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
102         XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
103         parser.setInput(input, Encoding.UTF_8.name());
104 
105         SliceProviderPermissions deser = SliceProviderPermissions.createFrom(parser,
106                 mock(DirtyTracker.class));
107 
108         assertEquivalent(provider, deser);
109     }
110 
assertEquivalent(SliceProviderPermissions o1, SliceProviderPermissions o2)111     private void assertEquivalent(SliceProviderPermissions o1, SliceProviderPermissions o2) {
112         assertEquals(o1.getPkg(), o2.getPkg());
113         assertEquals(o1.getAuthorities(), o2.getAuthorities());
114     }
115 
createProvider()116     private static SliceProviderPermissions createProvider() {
117         PkgUser pkg = new PkgUser("com.android.pkg", 2);
118         DirtyTracker tracker = mock(DirtyTracker.class);
119         SliceProviderPermissions provider = new SliceProviderPermissions(pkg, tracker);
120 
121         SliceAuthority auth = provider.getOrCreateAuthority("com.android.pkg.slices");
122         auth.addPkg(new PkgUser("com.example.pkg", 0));
123         auth.addPkg(new PkgUser("example.pkg.com", 10));
124 
125         auth = provider.getOrCreateAuthority("com.android.pkg");
126         auth.addPkg(new PkgUser("com.example.pkg", 2));
127         return provider;
128     }
129 
130 }