blob: dc46ff8a45009a648b9b165512e6fbb7e344fce5 [file] [log] [blame]
/*
* Copyright (C) 2019 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 static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.app.admin.FactoryResetProtectionPolicy;
import android.os.Parcel;
import android.util.Xml;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.util.FastXmlSerializer;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* Unit tests for {@link android.app.admin.FactoryResetProtectionPolicy}.
*
* atest com.android.server.devicepolicy.FactoryResetProtectionPolicyTest
*/
@RunWith(AndroidJUnit4.class)
public class FactoryResetProtectionPolicyTest {
private static final String TAG_FACTORY_RESET_PROTECTION_POLICY =
"factory_reset_protection_policy";
@Test
public void testNonDefaultFactoryResetProtectionPolicyObject() throws Exception {
List<String> accounts = new ArrayList<>();
accounts.add("Account 1");
accounts.add("Account 2");
FactoryResetProtectionPolicy policy = new FactoryResetProtectionPolicy.Builder()
.setFactoryResetProtectionAccounts(accounts)
.setFactoryResetProtectionEnabled(false)
.build();
testParcelAndUnparcel(policy);
testSerializationAndDeserialization(policy);
}
@Test
public void testInvalidXmlFactoryResetProtectionPolicyObject() throws Exception {
List<String> accounts = new ArrayList<>();
accounts.add("Account 1");
accounts.add("Account 2");
FactoryResetProtectionPolicy policy = new FactoryResetProtectionPolicy.Builder()
.setFactoryResetProtectionAccounts(accounts)
.setFactoryResetProtectionEnabled(false)
.build();
testParcelAndUnparcel(policy);
testInvalidXmlSerializationAndDeserialization(policy);
}
private void testParcelAndUnparcel(FactoryResetProtectionPolicy policy) {
Parcel parcel = Parcel.obtain();
policy.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
FactoryResetProtectionPolicy actualPolicy =
FactoryResetProtectionPolicy.CREATOR.createFromParcel(parcel);
assertPoliciesAreEqual(policy, actualPolicy);
parcel.recycle();
}
private void testSerializationAndDeserialization(FactoryResetProtectionPolicy policy)
throws Exception {
ByteArrayOutputStream outStream = serialize(policy);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
TypedXmlPullParser parser = Xml.newFastPullParser();
parser.setInput(new InputStreamReader(inStream));
assertThat(parser.next()).isEqualTo(XmlPullParser.START_TAG);
assertPoliciesAreEqual(policy, policy.readFromXml(parser));
}
private void testInvalidXmlSerializationAndDeserialization(FactoryResetProtectionPolicy policy)
throws Exception {
ByteArrayOutputStream outStream = serialize(policy);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
TypedXmlPullParser parser = mock(TypedXmlPullParser.class);
when(parser.next()).thenThrow(XmlPullParserException.class);
parser.setInput(new InputStreamReader(inStream));
// If deserialization fails, then null is returned.
assertThat(policy.readFromXml(parser)).isNull();
}
private ByteArrayOutputStream serialize(FactoryResetProtectionPolicy policy)
throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
final TypedXmlSerializer outXml = Xml.newFastSerializer();
outXml.setOutput(outStream, StandardCharsets.UTF_8.name());
outXml.startDocument(null, true);
outXml.startTag(null, TAG_FACTORY_RESET_PROTECTION_POLICY);
policy.writeToXml(outXml);
outXml.endTag(null, TAG_FACTORY_RESET_PROTECTION_POLICY);
outXml.endDocument();
outXml.flush();
return outStream;
}
private void assertPoliciesAreEqual(FactoryResetProtectionPolicy expectedPolicy,
FactoryResetProtectionPolicy actualPolicy) {
assertThat(actualPolicy.isFactoryResetProtectionEnabled())
.isEqualTo(expectedPolicy.isFactoryResetProtectionEnabled());
assertAccountsAreEqual(expectedPolicy.getFactoryResetProtectionAccounts(),
actualPolicy.getFactoryResetProtectionAccounts());
}
private void assertAccountsAreEqual(List<String> expectedAccounts,
List<String> actualAccounts) {
assertThat(actualAccounts.size()).isEqualTo(expectedAccounts.size());
for (int i = 0; i < expectedAccounts.size(); i++) {
assertThat(actualAccounts.get(i)).isEqualTo(expectedAccounts.get(i));
}
}
}