1d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam/*
2d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam * Copyright (C) 2015 The Android Open Source Project
3d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam *
4d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam * Licensed under the Apache License, Version 2.0 (the "License");
5d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam * you may not use this file except in compliance with the License.
6d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam * You may obtain a copy of the License at
7d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam *
8d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam *      http://www.apache.org/licenses/LICENSE-2.0
9d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam *
10d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam * Unless required by applicable law or agreed to in writing, software
11d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam * distributed under the License is distributed on an "AS IS" BASIS,
12d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam * See the License for the specific language governing permissions and
14d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam * limitations under the License.
15d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam */
16d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
17d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lampackage com.android.setupwizardlib.test;
18d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
19d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.content.Context;
20d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.content.ContextWrapper;
21d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.content.Intent;
22d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.content.pm.ActivityInfo;
23d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.content.pm.ApplicationInfo;
24d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.content.pm.PackageManager;
25d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.content.pm.ResolveInfo;
26d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.content.res.Resources;
27d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.test.InstrumentationTestCase;
28d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.test.mock.MockPackageManager;
2964158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lamimport android.test.mock.MockResources;
30d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport android.test.suitebuilder.annotation.SmallTest;
3164158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lamimport android.util.SparseArray;
32d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
33d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport com.android.setupwizardlib.util.Partner;
34d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport com.android.setupwizardlib.util.Partner.ResourceEntry;
35d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
36d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport java.util.ArrayList;
37d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport java.util.Arrays;
3864158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lamimport java.util.HashMap;
39d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lamimport java.util.List;
4064158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lamimport java.util.Map;
41d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
42d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lampublic class PartnerTest extends InstrumentationTestCase {
43d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
44d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    private TestContext mTestContext;
45d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
46d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    @Override
47d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    protected void setUp() throws Exception {
48d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        super.setUp();
49d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        mTestContext = new TestContext(getInstrumentation().getTargetContext());
50d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        Partner.resetForTesting();
51d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    }
52d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
53d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    @SmallTest
54d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    public void testLoadPartner() {
55d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        mTestContext.partnerList = Arrays.asList(
56d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                createResolveInfo("hocus.pocus", false),
57d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                createResolveInfo("com.android.setupwizardlib.test", true)
58d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        );
59d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
60d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        Partner partner = Partner.get(mTestContext);
61d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        assertNotNull("Partner should not be null", partner);
62d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    }
63d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
64d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    @SmallTest
65d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    public void testLoadNoPartner() {
66d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        mTestContext.partnerList = new ArrayList<>();
67d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
68d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        Partner partner = Partner.get(mTestContext);
69d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        assertNull("Partner should be null", partner);
70d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    }
71d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
72d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    @SmallTest
73d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    public void testLoadNonSystemPartner() {
74d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        mTestContext.partnerList = Arrays.asList(
75d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                createResolveInfo("hocus.pocus", false),
76d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                createResolveInfo("com.android.setupwizardlib.test", false)
77d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        );
78d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
79d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        Partner partner = Partner.get(mTestContext);
80d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        assertNull("Partner should be null", partner);
81d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    }
82d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
8364158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam    @SmallTest
84d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    public void testLoadPartnerValue() {
85d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        mTestContext.partnerList = Arrays.asList(
86d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                createResolveInfo("hocus.pocus", false),
87d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                createResolveInfo("com.android.setupwizardlib.test", true)
88d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        );
89d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
90d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        ResourceEntry entry =
91d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                Partner.getResourceEntry(mTestContext, R.integer.suwTransitionDuration);
92d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        int partnerValue = entry.resources.getInteger(entry.id);
93d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        assertEquals("Partner value should be overlaid to 5000", 5000, partnerValue);
9464158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        assertTrue("Partner value should come from overlay", entry.isOverlay);
95d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    }
96d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
9764158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam    @SmallTest
98d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    public void testLoadDefaultValue() {
99d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        mTestContext.partnerList = Arrays.asList(
100d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                createResolveInfo("hocus.pocus", false),
101d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                createResolveInfo("com.android.setupwizardlib.test", true)
102d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        );
103d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
104d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        ResourceEntry entry =
105d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                Partner.getResourceEntry(mTestContext, R.color.suw_navbar_text_dark);
106d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        int partnerValue = entry.resources.getColor(entry.id);
107d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        assertEquals("Partner value should default to 0xdeffffff", 0xdeffffff, partnerValue);
10864158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        assertFalse("Partner value should come from fallback", entry.isOverlay);
109d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    }
110d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
111d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    private ResolveInfo createResolveInfo(String packageName, boolean isSystem) {
112d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        ResolveInfo info = new ResolveInfo();
113d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        info.resolvePackageName = packageName;
114d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        ActivityInfo activityInfo = new ActivityInfo();
115d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        ApplicationInfo appInfo = new ApplicationInfo();
116d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        appInfo.flags = isSystem ? ApplicationInfo.FLAG_SYSTEM : 0;
117d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        appInfo.packageName = packageName;
118d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        activityInfo.applicationInfo = appInfo;
119d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        activityInfo.packageName = packageName;
120d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        activityInfo.name = packageName;
121d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        info.activityInfo = activityInfo;
122d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        return info;
123d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    }
124d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
12564158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam    private static class TestResources extends MockResources {
12664158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam
12764158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        private static final Map<String, Integer> TEST_RESOURCE_IDS = new HashMap<>();
12864158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        private static final SparseArray<Object> TEST_RESOURCES = new SparseArray<>();
12964158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam
13064158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        private static void addItem(String name, int id, Object value) {
13164158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            TEST_RESOURCE_IDS.put(name, id);
13264158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            TEST_RESOURCES.put(id, value);
13364158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        }
13464158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam
13564158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        static {
13664158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            addItem("integer/suwTransitionDuration", 0x7f010000, 5000);
13764158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        }
13864158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam
13964158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        @Override
14064158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        public int getIdentifier(String name, String defType, String defPackage) {
14164158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            String key = defType + "/" + name;
14264158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            if (TEST_RESOURCE_IDS.containsKey(key)) {
14364158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam                return TEST_RESOURCE_IDS.get(key);
14464158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            }
14564158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            return 0;
14664158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        }
14764158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam
14864158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        @Override
14964158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        public int getInteger(int id) throws NotFoundException {
15064158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            if (TEST_RESOURCES.indexOfKey(id) >= 0) {
15164158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam                return (int) TEST_RESOURCES.get(id);
15264158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            } else {
15364158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam                throw new NotFoundException();
15464158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            }
15564158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        }
15664158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam
15764158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        @Override
15864158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        public int getColor(int id) throws NotFoundException {
15964158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            if (TEST_RESOURCES.indexOfKey(id) >= 0) {
16064158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam                return (int) TEST_RESOURCES.get(id);
16164158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            } else {
16264158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam                throw new NotFoundException();
16364158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            }
16464158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        }
16564158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam    }
16664158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam
167d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    private static class TestPackageManager extends MockPackageManager {
168d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
169d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        private Context mTestContext;
17064158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam        private Resources mTestResources;
171d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
172d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        public TestPackageManager(Context testContext) {
173d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam            mTestContext = testContext;
17464158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam            mTestResources = new TestResources();
175d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        }
176d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
177d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        @Override
178d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        public Resources getResourcesForApplication(ApplicationInfo app) {
179d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam            if (app != null && "com.android.setupwizardlib.test".equals(app.packageName)) {
18064158e33c3ad618ed0eecef71fd20dd8e3c02568Maurice Lam                return mTestResources;
181d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam            } else {
182d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                return super.getResourcesForApplication(app);
183d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam            }
184d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        }
185d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
186d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        @Override
187d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) {
188d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam            if ("com.android.setupwizard.action.PARTNER_CUSTOMIZATION".equals(intent.getAction())) {
189d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                return ((TestContext) mTestContext).partnerList;
190d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam            } else {
191d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam                return super.queryBroadcastReceivers(intent, flags);
192d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam            }
193d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        }
194d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    }
195d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
196d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    private static class TestContext extends ContextWrapper {
197d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
198d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        public List<ResolveInfo> partnerList;
199d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
200d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        public TestContext(Context context) {
201d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam            super(context);
202d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        }
203d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam
204d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        @Override
205d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        public PackageManager getPackageManager() {
206d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam            return new TestPackageManager(this);
207d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam        }
208d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam    }
209d617ee5e12914b052682ee6f1bdf3ece28392f54Maurice Lam}
210