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