Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6de1445a authored by Evan Charlton's avatar Evan Charlton
Browse files

Fix the broken unit tests

PhoneAccountRegistrarTest is broken, and also non-functional. Get them
updated by fixing proguard (don't strip @VisibleForTesting things),
fixing the setup (need a real ConnectionService), and fixing the tests
themselves to test what PhoneAccountRegistrar does now.

Bug: 17620636
Change-Id: Ibd4d5a4104ff2158b0e7c01a41910f866b94196a
parent 150d8684
Loading
Loading
Loading
Loading

proguard.flags

0 → 100644
+4 −0
Original line number Diff line number Diff line
-verbose

# Keep @VisibleForTesting elements
-keep @com.android.internal.annotations.VisibleForTesting class *
+7 −0
Original line number Diff line number Diff line
@@ -38,6 +38,13 @@
            </intent-filter>
        </service>

        <service android:name="com.android.server.telecom.tests.MockConnectionService"
                 android:permission="android.permission.BIND_CONNECTION_SERVICE" >
            <intent-filter>
                <action android:name="android.telecom.ConnectionService" />
            </intent-filter>
        </service>

        <service android:name="com.android.server.telecom.testapps.TestConnectionManager"
                 android:permission="android.permission.BIND_CONNECTION_SERVICE" >
            <intent-filter>
+26 −0
Original line number Diff line number Diff line
/*
 * 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;

import android.telecom.ConnectionService;

/**
 * A non-functional {@link android.telecom.ConnectionService} to use for unit tests.
 */
public class MockConnectionService extends ConnectionService {

}
+161 −176
Original line number Diff line number Diff line
@@ -36,7 +36,6 @@ import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.Arrays;

public class PhoneAccountRegistrarTest extends AndroidTestCase {

@@ -46,62 +45,167 @@ public class PhoneAccountRegistrarTest extends AndroidTestCase {
    @Override
    public void setUp() {
        mRegistrar = new PhoneAccountRegistrar(getContext(), FILE_NAME);
        mRegistrar.registerPhoneAccount(PhoneAccount.builder(
                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0"),
                "label0")
                .setAddress(Uri.parse("tel:555-1212"))
                .setSubscriptionAddress(Uri.parse("tel:555-1212"))
                .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
                .setIconResId(0)
                .setShortDescription("desc0")
    }

    @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(PhoneAccount.builder(
                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id1"),
                "label1")
                .setAddress(Uri.parse("tel:555-1212"))
                .setSubscriptionAddress(Uri.parse("tel:555-1212"))
                .setCapabilities(
                        PhoneAccount.CAPABILITY_CALL_PROVIDER
                                | PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION
                )
                .setIconResId(0)
                .setShortDescription("desc1")
        mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
                .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
                        | PhoneAccount.CAPABILITY_CALL_PROVIDER)
                .build());
        mRegistrar.registerPhoneAccount(PhoneAccount.builder(
                new PhoneAccountHandle(new ComponentName("pkg1", "cls1"), "id2"),
                "label2")
                .setAddress(Uri.parse("tel:555-1212"))
                .setSubscriptionAddress(Uri.parse("tel:555-1212"))
                .setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER)
                .setIconResId(0)
                .setShortDescription("desc2")
        mRegistrar.registerPhoneAccount(makeQuickAccountBuilder("id" + i, i++)
                .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER
                        | PhoneAccount.CAPABILITY_CALL_PROVIDER)
                .build());
        mRegistrar.registerPhoneAccount(PhoneAccount.builder(
                new PhoneAccountHandle(new ComponentName("sippkg", "sipcls"), "id4"),
                "label2")
                .setAddress(Uri.parse("sip:test@sip.com"))
                .setSubscriptionAddress(Uri.parse("test"))
        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)
                .setIconResId(0)
                .setShortDescription("desc2")
                .setSupportedUriSchemes(Arrays.asList(PhoneAccount.SCHEME_TEL))
                .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());
        mRegistrar.registerPhoneAccount(PhoneAccount.builder(
                new PhoneAccountHandle(new ComponentName("sippkg", "sipcls"), "id4"),
                "label2")
                .setAddress(Uri.parse("sip:test@sip.com"))
                .setSubscriptionAddress(Uri.parse("test"))
        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)
                .setIconResId(0)
                .setShortDescription("desc2")
                .setSupportedUriSchemes(Arrays.asList(PhoneAccount.SCHEME_TEL))
                .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));
    }

    @Override
    public void tearDown() {
        mRegistrar = null;
        new File(getContext().getFilesDir(), FILE_NAME).delete();
    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(
@@ -137,7 +241,7 @@ public class PhoneAccountRegistrarTest extends AndroidTestCase {
        return result;
    }

    private void assertPhoneAccountHandleEquals(PhoneAccountHandle a, PhoneAccountHandle b) {
    private static void assertPhoneAccountHandleEquals(PhoneAccountHandle a, PhoneAccountHandle b) {
        if (a != b) {
            assertEquals(
                    a.getComponentName().getPackageName(),
@@ -149,20 +253,7 @@ public class PhoneAccountRegistrarTest extends AndroidTestCase {
        }
    }

    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);
    }

    private void assertPhoneAccountEquals(PhoneAccount a, PhoneAccount b) {
    private static void assertPhoneAccountEquals(PhoneAccount a, PhoneAccount b) {
        if (a != b) {
            assertPhoneAccountHandleEquals(a.getAccountHandle(), b.getAccountHandle());
            assertEquals(a.getAddress(), b.getAddress());
@@ -175,21 +266,8 @@ public class PhoneAccountRegistrarTest extends AndroidTestCase {
        }
    }

    public void testPhoneAccount() throws Exception {
        PhoneAccount input = makeQuickAccount("pkg0", "cls0", "id0", 0);
        PhoneAccount result = roundTrip(this, input, PhoneAccountRegistrar.sPhoneAccountXml,
                mContext);
        assertPhoneAccountEquals(input, result);

        PhoneAccountHandle handleN =
            new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), null);
        PhoneAccount inputN = PhoneAccount.builder(handleN, "label").build();
        PhoneAccount resultN = roundTrip(this, inputN, PhoneAccountRegistrar.sPhoneAccountXml,
                mContext);
        assertPhoneAccountEquals(inputN, resultN);
    }

    private void assertStateEquals(PhoneAccountRegistrar.State a, PhoneAccountRegistrar.State b) {
    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());
@@ -198,104 +276,11 @@ public class PhoneAccountRegistrarTest extends AndroidTestCase {
        }
    }

    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 {
        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 {
        // Establish initial conditions
        assertEquals(null, mRegistrar.getSimCallManager());
        PhoneAccountHandle h = new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0");
        mRegistrar.setSimCallManager(h);
        assertPhoneAccountHandleEquals(h, mRegistrar.getSimCallManager());
        mRegistrar.unregisterPhoneAccount(h);
        // If account is un-registered, querying returns null
        assertEquals(null, mRegistrar.getSimCallManager());
        // But if account is re-registered, setting comes back
        mRegistrar.registerPhoneAccount(makeQuickAccount("pkg0", "cls0", "id0", 99));
        assertPhoneAccountHandleEquals(h, mRegistrar.getSimCallManager());
        // De-register by setting to null
        mRegistrar.setSimCallManager(null);
        assertEquals(null, mRegistrar.getSimCallManager());
        // If argument not have SIM_CALL_MANAGER capability, this is a no-op
        mRegistrar.setSimCallManager(
                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id1"));
        assertEquals(null, mRegistrar.getSimCallManager());
    }

    public void testDefaultOutgoing() {
        // Establish initial conditions
        assertEquals(null, mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
        PhoneAccountHandle h = new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id1");
        mRegistrar.setUserSelectedOutgoingPhoneAccount(h);
        assertPhoneAccountHandleEquals(h, mRegistrar.getDefaultOutgoingPhoneAccount(
                        PhoneAccount.SCHEME_TEL));
        // If account is un-registered, querying returns null
        mRegistrar.unregisterPhoneAccount(h);
        assertEquals(null, mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
        // But if account is re-registered, setting comes back
        mRegistrar.registerPhoneAccount(makeQuickAccount("pkg0", "cls0", "id1", 99));
        assertPhoneAccountHandleEquals(h, mRegistrar.getDefaultOutgoingPhoneAccount(
                        PhoneAccount.SCHEME_TEL));
        // De-register by setting to null
        mRegistrar.setUserSelectedOutgoingPhoneAccount(null);
        assertEquals(null, mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
        // If argument not have CALL_PROVIDER capability, this is a no-op
        mRegistrar.setUserSelectedOutgoingPhoneAccount(
                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0"));
        assertEquals(null, mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
        // If only have one account, it is the default
        mRegistrar.unregisterPhoneAccount(
                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0"));
        mRegistrar.unregisterPhoneAccount(
                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id1"));
        mRegistrar.unregisterPhoneAccount(
                new PhoneAccountHandle(new ComponentName("pkg1", "cls1"), "id2"));
        assertPhoneAccountHandleEquals(
                new PhoneAccountHandle(new ComponentName("pkg1", "cls1"), "id3"),
                mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
        // If have one account but not suitable, default returns null
        mRegistrar.unregisterPhoneAccount(
                new PhoneAccountHandle(new ComponentName("pkg1", "cls1"), "id3"));
        mRegistrar.registerPhoneAccount(PhoneAccount.builder(
                new PhoneAccountHandle(new ComponentName("pkg0", "cls0"), "id0"),
                "label0")
                .setAddress(Uri.parse("tel:555-1212"))
                .setSubscriptionAddress(Uri.parse("tel:555-1212"))
                .setCapabilities(PhoneAccount.CAPABILITY_CONNECTION_MANAGER)
                .setIconResId(0)
                .setShortDescription("desc0")
                .build());
        assertEquals(null, mRegistrar.getDefaultOutgoingPhoneAccount(PhoneAccount.SCHEME_TEL));
    }

    private static PhoneAccount makeQuickAccount(String pkg, String cls, String id, int idx) {
        return PhoneAccount.builder(
                new PhoneAccountHandle(new ComponentName(pkg, cls), id),
                "label" + 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 PhoneAccountRegistrar.State makeQuickState() {
    private PhoneAccountRegistrar.State makeQuickState() {
        PhoneAccountRegistrar.State s = new PhoneAccountRegistrar.State();
        s.accounts.add(makeQuickAccount("pkg0", "cls0", "id0", 0));
        s.accounts.add(makeQuickAccount("pkg0", "cls0", "id1", 1));
        s.accounts.add(makeQuickAccount("pkg1", "cls1", "id2", 2));
        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;