blob: cd1bbd1a0d7cc95a66b03a8f105027d880a0b2e0 [file] [log] [blame]
/*
* 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.telecom.tests.unit;
import com.android.internal.util.FastXmlSerializer;
import com.android.server.telecom.Log;
import com.android.server.telecom.PhoneAccountRegistrar;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;
import android.content.ComponentName;
import android.content.Context;
import android.net.Uri;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.test.AndroidTestCase;
import android.util.Xml;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
public class PhoneAccountRegistrarTest extends AndroidTestCase {
private static final String FILE_NAME = "phone-account-registrar-test.xml";
private PhoneAccountRegistrar mRegistrar;
@Override
public void setUp() {
mRegistrar = new PhoneAccountRegistrar(getContext(), FILE_NAME);
}
@Override
public void tearDown() {
mRegistrar = null;
new File(getContext().getFilesDir(), FILE_NAME).delete();
}
public void testPhoneAccountHandle() throws Exception {
PhoneAccountHandle input = new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0");
PhoneAccountHandle result = roundTrip(this, input,
PhoneAccountRegistrar.sPhoneAccountHandleXml, mContext);
assertPhoneAccountHandleEquals(input, result);
PhoneAccountHandle inputN = new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), null);
PhoneAccountHandle resultN = roundTrip(this, inputN,
PhoneAccountRegistrar.sPhoneAccountHandleXml, mContext);
Log.i(this, "inputN = %s, resultN = %s", inputN, resultN);
assertPhoneAccountHandleEquals(inputN, resultN);
}
public void testPhoneAccount() throws Exception {
PhoneAccount input = makeQuickAccountBuilder("id0", 0)
.addSupportedUriScheme(PhoneAccount.SCHEME_TEL)
.addSupportedUriScheme(PhoneAccount.SCHEME_VOICEMAIL)
.build();
PhoneAccount result = roundTrip(this, input, PhoneAccountRegistrar.sPhoneAccountXml,
mContext);
assertPhoneAccountEquals(input, result);
}
public void testState() throws Exception {
PhoneAccountRegistrar.State input = makeQuickState();
PhoneAccountRegistrar.State result = roundTrip(this, input, PhoneAccountRegistrar.sStateXml,
mContext);
assertStateEquals(input, result);
}
public void testAccounts() throws Exception {
int i = 0;
mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
.setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
| PhoneAccount.CAPABILITY_CALL_PROVIDER)
.build());
mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
.setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
| PhoneAccount.CAPABILITY_CALL_PROVIDER)
.build());
mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
.setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
| PhoneAccount.CAPABILITY_CALL_PROVIDER)
.build());
mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
.setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
.build());
assertEquals(4, mRegistrar.getAllPhoneAccountHandles().size());
assertEquals(3, mRegistrar.getCallCapablePhoneAccounts().size());
assertEquals(null, mRegistrar.getSimCallManager());
assertEquals(null, mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
}
public void testSimCallManager() throws Exception {
PhoneAccountHandle simManager = makeQuickAccountHandle("sim_mgr");
PhoneAccount simManagerAccount = new PhoneAccount.Builder(simManager, "sim_mgr")
.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER
| PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
.build();
mRegistrar.registerPhoneAccount(simManagerAccount);
assertNull(mRegistrar.getSimCallManager());
// Test the basic case
mRegistrar.setSimCallManager(simManager);
assertEquals(simManager, mRegistrar.getSimCallManager());
// Make sure clearing it works, too
mRegistrar.unregisterPhoneAccount(simManager);
assertNull(mRegistrar.getSimCallManager());
// Re-registering it makes the setting come back
mRegistrar.registerPhoneAccount(simManagerAccount);
assertEquals(simManager, mRegistrar.getSimCallManager());
// Make sure that the manager has CAPABILITY_CONNECTION_MANAGER
PhoneAccountHandle simManagerImposter = makeQuickAccountHandle("imposter");
PhoneAccount simManagerImposterAccount =
new PhoneAccount.Builder(simManagerImposter, "imposter")
.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
.build();
mRegistrar.registerPhoneAccount(simManagerImposterAccount);
mRegistrar.setSimCallManager(null);
assertNull(mRegistrar.getSimCallManager());
mRegistrar.setSimCallManager(simManagerImposter);
assertNull(mRegistrar.getSimCallManager());
}
public void testDefaultOutgoing() {
// By default, there is no default outgoing account (nothing has been registered)
assertNull(mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
// Register one tel: account
PhoneAccountHandle telAccount = makeQuickAccountHandle("tel_acct");
mRegistrar.registerPhoneAccount(new PhoneAccount.Builder(telAccount, "tel_acct")
.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
.addSupportedUriScheme(PhoneAccount.SCHEME_TEL)
.build());
PhoneAccountHandle defaultAccount =
mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL);
assertEquals(telAccount, defaultAccount);
// Add a SIP account, make sure tel: doesn't change
PhoneAccountHandle sipAccount = makeQuickAccountHandle("sip_acct");
mRegistrar.registerPhoneAccount(new PhoneAccount.Builder(sipAccount, "sip_acct")
.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
.addSupportedUriScheme(PhoneAccount.SCHEME_SIP)
.build());
defaultAccount = mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_SIP);
assertEquals(sipAccount, defaultAccount);
defaultAccount = mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL);
assertEquals(telAccount, defaultAccount);
// Add a connection manager, make sure tel: doesn't change
PhoneAccountHandle connectionManager = makeQuickAccountHandle("mgr_acct");
mRegistrar.registerPhoneAccount(new PhoneAccount.Builder(connectionManager, "mgr_acct")
.setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
.addSupportedUriScheme(PhoneAccount.SCHEME_TEL)
.build());
defaultAccount = mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL);
assertEquals(telAccount, defaultAccount);
// Unregister the tel: account, make sure there is no tel: default now.
mRegistrar.unregisterPhoneAccount(telAccount);
assertNull(mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
}
private static PhoneAccountHandle makeQuickAccountHandle(String id) {
return new PhoneAccountHandle(
new ComponentName(
"com.android.server.telecom.tests",
"com.android.server.telecom.tests.MockConnectionService"
),
id
);
}
private PhoneAccount.Builder makeQuickAccountBuilder(String id, int idx) {
return new PhoneAccount.Builder(
makeQuickAccountHandle(id),
"label" + idx
);
}
private PhoneAccount makeQuickAccount(String id, int idx) {
return makeQuickAccountBuilder(id, idx)
.setAddress(Uri.parse("http://foo.com/" + idx))
.setSubscriptionAddress(Uri.parse("tel:555-000" + idx))
.setCapabilities(idx)
.setIconResId(idx)
.setShortDescription("desc" + idx)
.build();
}
private static <T> T roundTrip(
Object self,
T input,
PhoneAccountRegistrar.XmlSerialization<T> xml,
Context context)
throws Exception {
Log.d(self, "Input = %s", input);
byte[] data;
{
XmlSerializer serializer = new FastXmlSerializer();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
xml.writeToXml(input, serializer);
serializer.flush();
data = baos.toByteArray();
}
Log.d(self, "====== XML data ======\n%s", new String(data));
T result = null;
{
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new BufferedInputStream(new ByteArrayInputStream(data)), null);
parser.nextTag();
result = xml.readFromXml(parser, 0, context);
}
Log.d(self, "result = " + result);
return result;
}
private static void assertPhoneAccountHandleEquals(PhoneAccountHandle a, PhoneAccountHandle b) {
if (a != b) {
assertEquals(
a.getComponentName().getPackageName(),
b.getComponentName().getPackageName());
assertEquals(
a.getComponentName().getClassName(),
b.getComponentName().getClassName());
assertEquals(a.getId(), b.getId());
}
}
private static void assertPhoneAccountEquals(PhoneAccount a, PhoneAccount b) {
if (a != b) {
assertPhoneAccountHandleEquals(a.getAccountHandle(), b.getAccountHandle());
assertEquals(a.getAddress(), b.getAddress());
assertEquals(a.getSubscriptionAddress(), b.getSubscriptionAddress());
assertEquals(a.getCapabilities(), b.getCapabilities());
assertEquals(a.getIconResId(), b.getIconResId());
assertEquals(a.getColor(), b.getColor());
assertEquals(a.getLabel(), b.getLabel());
assertEquals(a.getShortDescription(), b.getShortDescription());
assertEquals(a.getSupportedUriSchemes(), b.getSupportedUriSchemes());
}
}
private static void assertStateEquals(
PhoneAccountRegistrar.State a, PhoneAccountRegistrar.State b) {
assertPhoneAccountHandleEquals(a.defaultOutgoing, b.defaultOutgoing);
assertPhoneAccountHandleEquals(a.simCallManager, b.simCallManager);
assertEquals(a.accounts.size(), b.accounts.size());
for (int i = 0; i < a.accounts.size(); i++) {
assertPhoneAccountEquals(a.accounts.get(i), b.accounts.get(i));
}
}
private PhoneAccountRegistrar.State makeQuickState() {
PhoneAccountRegistrar.State s = new PhoneAccountRegistrar.State();
s.accounts.add(makeQuickAccount("id0", 0));
s.accounts.add(makeQuickAccount("id1", 1));
s.accounts.add(makeQuickAccount("id2", 2));
s.defaultOutgoing = new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0");
s.simCallManager = new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id1");
return s;
}
}