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}