1cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki/* 2cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * Copyright (C) 2015 The Android Open Source Project 3cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * 4cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License"); 5cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * you may not use this file except in compliance with the License. 6cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * You may obtain a copy of the License at 7cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * 8cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * http://www.apache.org/licenses/LICENSE-2.0 9cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * 10cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * Unless required by applicable law or agreed to in writing, software 11cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS, 12cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * See the License for the specific language governing permissions and 14cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki * limitations under the License. 15cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki */ 16cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 17cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukipackage com.android.server.devicepolicy; 18cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 19068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport com.google.android.collect.Lists; 20068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport com.google.android.collect.Sets; 21068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 22068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.content.Context; 23068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.os.Bundle; 24cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.os.FileUtils; 25d932f7689d799b07a6776bc7c59749f672528239Makoto Onukiimport android.os.Parcel; 26d932f7689d799b07a6776bc7c59749f672528239Makoto Onukiimport android.os.Parcelable; 27068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport android.test.AndroidTestCase; 28cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.util.Log; 29cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport android.util.Printer; 30cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 31cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport org.junit.Assert; 32cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 33068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.io.BufferedReader; 34cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onukiimport java.io.File; 35068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.io.FileWriter; 36068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.io.IOException; 37068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.io.InputStreamReader; 38068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.io.PrintWriter; 39068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.util.ArrayList; 40068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.util.Collections; 41f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onukiimport java.util.List; 42068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.util.Objects; 43068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport java.util.Set; 44cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 45068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukiimport junit.framework.AssertionFailedError; 46cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 47068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onukipublic class DpmTestUtils extends AndroidTestCase { 48cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki public static void clearDir(File dir) { 49cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki if (dir.exists()) { 50cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki Assert.assertTrue("failed to delete dir", FileUtils.deleteContents(dir)); 51cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki } 52cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki dir.mkdirs(); 53f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki Log.i(DpmTestBase.TAG, "Created " + dir); 54f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki } 55f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki 56f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki public static int getListSizeAllowingNull(List<?> list) { 57f76b06a6b546f430cf85e561858ed12eedc32b81Makoto Onuki return list == null ? 0 : list.size(); 58cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki } 59cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki 60068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki public static Bundle newRestrictions(String... restrictions) { 61068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final Bundle ret = new Bundle(); 62068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki for (String restriction : restrictions) { 63068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki ret.putBoolean(restriction, true); 64068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 65068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki return ret; 66068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 67068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 68068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki public static void assertRestrictions(Bundle expected, Bundle actual) { 69068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final ArrayList<String> elist; 70068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki if (expected == null) { 71068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki elist = null; 72068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } else { 73068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki elist = Lists.newArrayList(); 74068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki for (String key : expected.keySet()) { 75068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki if (expected.getBoolean(key)) { 76068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki elist.add(key); 77068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 78068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 79068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki Collections.sort(elist); 80068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 81068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 82068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final ArrayList<String> alist; 83068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki if (actual == null) { 84068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki alist = null; 85068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } else { 86068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki alist = Lists.newArrayList(); 87068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki for (String key : actual.keySet()) { 88068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki if (actual.getBoolean(key)) { 89068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki alist.add(key); 90068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 91068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 92068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki Collections.sort(alist); 93068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 94068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 95068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertEquals(elist, alist); 96068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 97068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 98d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki public static <T extends Parcelable> T cloneParcelable(T source) { 99d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki Parcel p = Parcel.obtain(); 100d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki p.writeParcelable(source, 0); 101d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki p.setDataPosition(0); 102d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki final T clone = p.readParcelable(DpmTestUtils.class.getClassLoader()); 103d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki p.recycle(); 104d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki return clone; 105d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki } 106d932f7689d799b07a6776bc7c59749f672528239Makoto Onuki 107cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki public static Printer LOG_PRINTER = new Printer() { 108cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki @Override 109cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki public void println(String x) { 110cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki Log.i(DpmTestBase.TAG, x); 111cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki } 112cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki }; 113068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 114068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki public static String readAsset(Context context, String assetPath) throws IOException { 115068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final StringBuilder sb = new StringBuilder(); 116068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki try (BufferedReader br = new BufferedReader( 117068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki new InputStreamReader( 118068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki context.getResources().getAssets().open(assetPath)))) { 119068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki String line; 120068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki while ((line = br.readLine()) != null) { 121068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki sb.append(line); 122068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki sb.append(System.lineSeparator()); 123068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 124068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 125068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki return sb.toString(); 126068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 127068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 128068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki public static void writeToFile(File path, String content) 129068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki throws IOException { 130068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki path.getParentFile().mkdirs(); 131068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 132068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki try (FileWriter writer = new FileWriter(path)) { 133068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki Log.i(DpmTestBase.TAG, "Writing to " + path); 134068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki Log.i(DpmTestBase.TAG, content); 135068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki writer.write(content); 136068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 137068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 138068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 139068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki private static boolean checkAssertRestrictions(Bundle a, Bundle b) { 140068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki try { 141068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertRestrictions(a, b); 142068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki return true; 143068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } catch (AssertionFailedError e) { 144068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki return false; 145068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 146068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 147068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 148068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki public void testAssertRestrictions() { 149068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final Bundle a = newRestrictions(); 150068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final Bundle b = newRestrictions("a"); 151068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final Bundle c = newRestrictions("a"); 152068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final Bundle d = newRestrictions("b", "c"); 153068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki final Bundle e = newRestrictions("b", "c"); 154068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 155068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertTrue(checkAssertRestrictions(null, null)); 156068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertFalse(checkAssertRestrictions(null, a)); 157068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertFalse(checkAssertRestrictions(a, null)); 158068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertTrue(checkAssertRestrictions(a, a)); 159068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 160068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertFalse(checkAssertRestrictions(a, b)); 161068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertTrue(checkAssertRestrictions(b, c)); 162068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki 163068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertFalse(checkAssertRestrictions(c, d)); 164068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki assertTrue(checkAssertRestrictions(d, e)); 165068c54a5be697c3df4657dcda33cd17c4b547710Makoto Onuki } 166cc4bbeb76af92a8484fe05f37c4ff412b4c47cccMakoto Onuki} 167