/*
* Copyright (C) 2014 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.server.devicepolicy;
import android.app.admin.DeviceAdminReceiver;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.UserHandle;
import android.provider.Settings;
import android.test.AndroidTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
/**
* Tests for application restrictions persisting via profile owner:
* make -j FrameworksServicesTests
* runtest --path frameworks/base/services/tests/servicestests/ \
* src/com/android/server/devicepolicy/ApplicationRestrictionsTest.java
*/
public class ApplicationRestrictionsTest extends AndroidTestCase {
static DevicePolicyManager sDpm;
static ComponentName sAdminReceiver;
private static final String RESTRICTED_APP = "com.example.restrictedApp";
static boolean sAddBack = false;
public static class AdminReceiver extends DeviceAdminReceiver {
@Override
public void onDisabled(Context context, Intent intent) {
if (sAddBack) {
sDpm.setActiveAdmin(sAdminReceiver, false);
sAddBack = false;
}
super.onDisabled(context, intent);
}
}
@Override
public void setUp() {
final Context context = getContext();
sAdminReceiver = new ComponentName(mContext.getPackageName(),
AdminReceiver.class.getName());
sDpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
Settings.Secure.putInt(context.getContentResolver(),
Settings.Secure.USER_SETUP_COMPLETE, 0);
sDpm.setProfileOwner(sAdminReceiver, "Test", UserHandle.myUserId());
Settings.Secure.putInt(context.getContentResolver(),
Settings.Secure.USER_SETUP_COMPLETE, 1);
// Remove the admin if already registered. It's async, so add it back
// when the admin gets a broadcast. Otherwise add it back right away.
if (sDpm.isAdminActive(sAdminReceiver)) {
sAddBack = true;
sDpm.removeActiveAdmin(sAdminReceiver);
} else {
sDpm.setActiveAdmin(sAdminReceiver, false);
}
}
@Override
public void tearDown() {
Settings.Secure.putInt(getContext().getContentResolver(),
Settings.Secure.USER_SETUP_COMPLETE, 0);
sDpm.removeActiveAdmin(sAdminReceiver);
Settings.Secure.putInt(getContext().getContentResolver(),
Settings.Secure.USER_SETUP_COMPLETE, 1);
}
public void testSettingRestrictions() {
Bundle restrictions = new Bundle();
restrictions.putString("KEY_STRING", "Foo");
assertNotNull(sDpm.getApplicationRestrictions(sAdminReceiver, RESTRICTED_APP));
sDpm.setApplicationRestrictions(sAdminReceiver, RESTRICTED_APP, restrictions);
Bundle returned = sDpm.getApplicationRestrictions(sAdminReceiver, RESTRICTED_APP);
assertNotNull(returned);
assertEquals(returned.size(), 1);
assertEquals(returned.get("KEY_STRING"), "Foo");
sDpm.setApplicationRestrictions(sAdminReceiver, RESTRICTED_APP, new Bundle());
returned = sDpm.getApplicationRestrictions(sAdminReceiver, RESTRICTED_APP);
assertEquals(returned.size(), 0);
}
public void testRestrictionTypes() {
Bundle restrictions = new Bundle();
restrictions.putString("KEY_STRING", "Foo");
restrictions.putInt("KEY_INT", 7);
restrictions.putBoolean("KEY_BOOLEAN", true);
restrictions.putBoolean("KEY_BOOLEAN_2", false);
restrictions.putString("KEY_STRING_2", "Bar");
restrictions.putStringArray("KEY_STR_ARRAY", new String[] { "Foo", "Bar" });
sDpm.setApplicationRestrictions(sAdminReceiver, RESTRICTED_APP, restrictions);
Bundle returned = sDpm.getApplicationRestrictions(sAdminReceiver, RESTRICTED_APP);
assertTrue(returned.getBoolean("KEY_BOOLEAN"));
assertFalse(returned.getBoolean("KEY_BOOLEAN_2"));
assertFalse(returned.getBoolean("KEY_BOOLEAN_3"));
assertEquals(returned.getInt("KEY_INT"), 7);
assertTrue(returned.get("KEY_BOOLEAN") instanceof Boolean);
assertTrue(returned.get("KEY_INT") instanceof Integer);
assertEquals(returned.get("KEY_STRING"), "Foo");
assertEquals(returned.get("KEY_STRING_2"), "Bar");
assertTrue(returned.getStringArray("KEY_STR_ARRAY") instanceof String[]);
sDpm.setApplicationRestrictions(sAdminReceiver, RESTRICTED_APP, new Bundle());
}
public void testTextEscaping() {
String fancyText = " "
+ "{ \"One\": { \"OneOne\": \"11\", \"OneTwo\": \"12\" }, \"Two\": \"2\" } ";
Bundle restrictions = new Bundle();
restrictions.putString("KEY_FANCY_TEXT", fancyText);
sDpm.setApplicationRestrictions(sAdminReceiver, RESTRICTED_APP, restrictions);
Bundle returned = sDpm.getApplicationRestrictions(sAdminReceiver, RESTRICTED_APP);
assertEquals(returned.getString("KEY_FANCY_TEXT"), fancyText);
}
}