SetupWizardLibrary/library/test/robotest/src/com/android/setupwizardlib/util/PartnerTest.java

199 lines
7.5 KiB
Java

/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.setupwizardlib.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.robolectric.RuntimeEnvironment.application;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import com.android.setupwizardlib.R;
import com.android.setupwizardlib.robolectric.SuwLibRobolectricTestRunner;
import com.android.setupwizardlib.util.Partner.ResourceEntry;
import com.android.setupwizardlib.util.PartnerTest.ShadowApplicationPackageManager;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowResources;
import java.util.Arrays;
import java.util.Collections;
@RunWith(SuwLibRobolectricTestRunner.class)
@Config(
sdk = { Config.OLDEST_SDK, Config.NEWEST_SDK },
shadows = ShadowApplicationPackageManager.class)
public class PartnerTest {
private static final String ACTION_PARTNER_CUSTOMIZATION =
"com.android.setupwizard.action.PARTNER_CUSTOMIZATION";
private Context mContext;
private Resources mPartnerResources;
private ShadowApplicationPackageManager mPackageManager;
@Before
public void setUp() throws Exception {
Partner.resetForTesting();
mContext = spy(application);
mPartnerResources = spy(ShadowResources.getSystem());
mPackageManager =
(ShadowApplicationPackageManager) Shadows.shadowOf(application.getPackageManager());
mPackageManager.partnerResources = mPartnerResources;
}
@Test
public void testLoadPartner() {
mPackageManager.addResolveInfoForIntent(
new Intent(ACTION_PARTNER_CUSTOMIZATION),
Arrays.asList(
createResolveInfo("foo.bar", false, true),
createResolveInfo("test.partner.package", true, true))
);
Partner partner = Partner.get(mContext);
assertNotNull("Partner should not be null", partner);
}
@Test
public void testLoadNoPartner() {
Partner partner = Partner.get(mContext);
assertNull("Partner should be null", partner);
}
@Test
public void testLoadNonSystemPartner() {
mPackageManager.addResolveInfoForIntent(
new Intent(ACTION_PARTNER_CUSTOMIZATION),
Arrays.asList(
createResolveInfo("foo.bar", false, true),
createResolveInfo("test.partner.package", false, true))
);
Partner partner = Partner.get(mContext);
assertNull("Partner should be null", partner);
}
@Test
public void testLoadPartnerValue() {
doReturn(0x7f010000).when(mPartnerResources)
.getIdentifier(eq("suwTransitionDuration"), eq("integer"), anyString());
doReturn(5000).when(mPartnerResources).getInteger(eq(0x7f010000));
mPackageManager.addResolveInfoForIntent(
new Intent(ACTION_PARTNER_CUSTOMIZATION),
Arrays.asList(
createResolveInfo("foo.bar", false, true),
createResolveInfo("test.partner.package", true, true))
);
ResourceEntry entry = Partner.getResourceEntry(mContext, R.integer.suwTransitionDuration);
int partnerValue = entry.resources.getInteger(entry.id);
assertEquals("Partner value should be overlaid to 5000", 5000, partnerValue);
assertTrue("Partner value should come from overlay", entry.isOverlay);
}
@Test
public void testLoadDefaultValue() {
mPackageManager.addResolveInfoForIntent(
new Intent(ACTION_PARTNER_CUSTOMIZATION),
Arrays.asList(
createResolveInfo("foo.bar", false, true),
createResolveInfo("test.partner.package", true, true))
);
ResourceEntry entry = Partner.getResourceEntry(mContext, R.color.suw_color_accent_dark);
int partnerValue = entry.resources.getColor(entry.id);
assertEquals("Partner value should default to 0xff448aff", 0xff448aff, partnerValue);
assertFalse("Partner value should come from fallback", entry.isOverlay);
}
@Test
public void testNotDirectBootAware() {
mPackageManager.addResolveInfoForIntent(
new Intent(ACTION_PARTNER_CUSTOMIZATION),
Collections.singletonList(createResolveInfo("test.partner.package", true, false)));
ResourceEntry entry = Partner.getResourceEntry(mContext, R.color.suw_color_accent_dark);
int partnerValue = entry.resources.getColor(entry.id);
assertEquals("Partner value should default to 0xff448aff", 0xff448aff, partnerValue);
assertFalse("Partner value should come from fallback", entry.isOverlay);
}
private ResolveInfo createResolveInfo(
String packageName,
boolean isSystem,
boolean directBootAware) {
ResolveInfo info = new ResolveInfo();
info.resolvePackageName = packageName;
ActivityInfo activityInfo = new ActivityInfo();
ApplicationInfo appInfo = new ApplicationInfo();
appInfo.flags = isSystem ? ApplicationInfo.FLAG_SYSTEM : 0;
appInfo.packageName = packageName;
activityInfo.applicationInfo = appInfo;
activityInfo.packageName = packageName;
activityInfo.name = packageName;
if (VERSION.SDK_INT >= VERSION_CODES.N) {
activityInfo.directBootAware = directBootAware;
}
info.activityInfo = activityInfo;
return info;
}
@Implements(className = "android.app.ApplicationPackageManager")
public static class ShadowApplicationPackageManager extends
org.robolectric.shadows.ShadowApplicationPackageManager {
public Resources partnerResources;
@Implementation
@Override
public Resources getResourcesForApplication(ApplicationInfo app)
throws NameNotFoundException {
if (app != null && "test.partner.package".equals(app.packageName)) {
return partnerResources;
} else {
return super.getResourcesForApplication(app);
}
}
}
}