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