/*
 * Copyright (C) 2018 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.internal.telephony.uicc.euicc;

import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.res.Resources;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.service.carrier.CarrierIdentifier;
import android.service.euicc.EuiccProfileInfo;
import android.telephony.UiccAccessRule;
import android.telephony.euicc.EuiccCardManager;
import android.telephony.euicc.EuiccNotification;
import android.telephony.euicc.EuiccRulesAuthTable;
import android.util.ExceptionUtils;
import android.util.Log;

import com.android.internal.telephony.CommandsInterface;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.uicc.IccCardApplicationStatus;
import com.android.internal.telephony.uicc.IccCardStatus;
import com.android.internal.telephony.uicc.IccUtils;
import com.android.internal.telephony.uicc.asn1.Asn1Node;
import com.android.internal.telephony.uicc.asn1.InvalidAsn1DataException;
import com.android.internal.telephony.uicc.asn1.TagNotFoundException;
import com.android.internal.telephony.uicc.euicc.apdu.LogicalChannelMocker;
import com.android.internal.telephony.uicc.euicc.async.AsyncResultCallback;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;

import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class EuiccCardTest extends TelephonyTest {
    private static final long WAIT_TIMEOUT_MLLIS = 5000;

    private static class ResultCaptor<T> extends AsyncResultCallback<T> {
        public T result;
        public Throwable exception;

        private CountDownLatch mLatch;

        private ResultCaptor() {
            mLatch = new CountDownLatch(1);
        }

        public void await() {
            try {
                mLatch.await(WAIT_TIMEOUT_MLLIS, TimeUnit.MILLISECONDS);
            } catch (InterruptedException e) {
                fail("Execution is interrupted: " + e);
            }
        }

        @Override
        public void onResult(T r) {
            result = r;
            mLatch.countDown();
        }

        @Override
        public void onException(Throwable e) {
            exception = e;
            mLatch.countDown();
        }
    }

    private class UiccCardHandlerThread extends HandlerThread {
        private UiccCardHandlerThread(String name) {
            super(name);
        }

        @Override
        public void onLooperPrepared() {
            mEuiccCard =
                    new EuiccCard(mContextFixture.getTestDouble(), mMockCi, mMockIccCardStatus,
                            0 /* phoneId */) {
                        @Override
                        protected byte[] getDeviceId() {
                            return IccUtils.bcdToBytes("987654321012345");
                        }

                        @Override
                        protected void loadEidAndNotifyRegistrants() {}

                        @Override
                        protected Resources getResources() {
                            return mMockResources;
                        }

                    };
            mHandler = new Handler(mTestHandlerThread.getLooper());
            setReady(true);
        }
    }

    @Mock
    private CommandsInterface mMockCi;
    @Mock
    private IccCardStatus mMockIccCardStatus;

    private UiccCardHandlerThread mTestHandlerThread;
    private Handler mHandler;

    private EuiccCard mEuiccCard;

    @Mock
    private Resources mMockResources;

    @Before
    public void setUp() throws Exception {
        super.setUp(getClass().getSimpleName());

        mMockIccCardStatus.mApplications = new IccCardApplicationStatus[]{};
        mMockIccCardStatus.mCdmaSubscriptionAppIndex =
                mMockIccCardStatus.mImsSubscriptionAppIndex =
                        mMockIccCardStatus.mGsmUmtsSubscriptionAppIndex = -1;
        mMockIccCardStatus.mCardState = IccCardStatus.CardState.CARDSTATE_PRESENT;

        mTestHandlerThread = new UiccCardHandlerThread(getClass().getSimpleName());
        mTestHandlerThread.start();

        waitUntilReady();
    }

    @After
    public void tearDown() throws Exception {
        mTestHandlerThread.quit();
        super.tearDown();
    }

    private void assertUnexpectedException(Throwable e) {
        if (e != null) {
            fail("Unexpected exception: " + ExceptionUtils.getCompleteMessage(e) + "\n-----\n"
                    + Log.getStackTraceString(e.getCause()) + "-----");
        }
    }

    @Test
    public void testLoadEidAndNotifyRegistrants() throws InterruptedException {
        int channel = mockLogicalChannelResponses("BF3E065A041A2B3C4D9000");

        {
            final CountDownLatch latch = new CountDownLatch(1);
            mHandler.post(() -> {
                mEuiccCard = new EuiccCard(mContextFixture.getTestDouble(), mMockCi,
                        mMockIccCardStatus, 0 /* phoneId */);
                latch.countDown();
            });
            assertTrue(latch.await(WAIT_TIMEOUT_MLLIS, TimeUnit.MILLISECONDS));
        }

        final int eventEidReady = 0;
        final CountDownLatch latch = new CountDownLatch(1);
        Handler handler = new Handler(mTestHandlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == eventEidReady) {
                    assertEquals("1A2B3C4D", mEuiccCard.getEid());
                    latch.countDown();
                }
            }
        };

        mEuiccCard.registerForEidReady(handler, eventEidReady, null /* obj */);
        assertTrue(latch.await(WAIT_TIMEOUT_MLLIS, TimeUnit.MILLISECONDS));

        verifyStoreData(channel, "BF3E035C015A");
    }

    @Test
    public void testGetAllProfiles() {
        int channel = mockLogicalChannelResponses(
                "BF2D14A012E3105A0A896700000000004523019F7001019000");

        ResultCaptor<EuiccProfileInfo[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getAllProfiles(resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        EuiccProfileInfo[] profiles = resultCaptor.result;
        assertEquals(1, profiles.length);
        assertEquals("98760000000000543210", profiles[0].getIccid());
        assertEquals(EuiccProfileInfo.PROFILE_STATE_ENABLED, profiles[0].getState());
        verifyStoreData(channel, "BF2D0D5C0B5A909192B79F709599BF76");
    }

    @Test
    public void testFSuffix() {
        // iccID is 987600000000005432FF.
        int channel = mockLogicalChannelResponses(
                "BF2D14A012E3105A0A896700000000004523FF9F7001019000");

        ResultCaptor<EuiccProfileInfo[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getAllProfiles(resultCaptor, mHandler);
        resultCaptor.await();

        EuiccProfileInfo[] profiles = resultCaptor.result;
        assertEquals(1, profiles.length);
        assertEquals("987600000000005432", profiles[0].getIccid());
        assertEquals(EuiccProfileInfo.PROFILE_STATE_ENABLED, profiles[0].getState());
        verifyStoreData(channel, "BF2D0D5C0B5A909192B79F709599BF76");
    }

    @Test
    public void testGetProfile() {
        int channel = mockLogicalChannelResponses("BF2D8184A08181E37F"
                + "5A0A89670000000000452301" // ICCID
                + "90046E69636B" // Nickname
                + "9103746D6F" // Service provider name
                + "92027031" // Profile name
                + "B70F800312F34581030102038203040506" // Operator id
                + "9F700101" // Profile state
                + "950101" // Profile class
                + "990206C0" // Policy rules
                + "BF7645E243E135C114ABCD92CBB156B280FA4E1429A6ECEEB6E5C1BFE4"
                + "CA1D636F6D2E676F6F676C652E616E64726F69642E617070732E6D79617070"
                + "E30ADB080000000000000001" // Carrier privilege rules
                + "9000");

        ResultCaptor<EuiccProfileInfo> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getProfile("98760000000000543210", resultCaptor, mHandler);
        resultCaptor.await();

        EuiccProfileInfo profile = resultCaptor.result;
        assertEquals("98760000000000543210", profile.getIccid());
        assertEquals("nick", profile.getNickname());
        assertEquals("tmo", profile.getServiceProviderName());
        assertEquals("p1", profile.getProfileName());
        assertEquals("213", profile.getCarrierIdentifier().getMcc());
        assertEquals("54", profile.getCarrierIdentifier().getMnc());
        assertEquals("010203", profile.getCarrierIdentifier().getGid1());
        assertEquals("040506", profile.getCarrierIdentifier().getGid2());
        assertEquals(EuiccProfileInfo.PROFILE_STATE_ENABLED, profile.getState());
        assertEquals(EuiccProfileInfo.PROFILE_CLASS_PROVISIONING, profile.getProfileClass());
        assertEquals(
                EuiccProfileInfo.POLICY_RULE_DO_NOT_DELETE
                        | EuiccProfileInfo.POLICY_RULE_DO_NOT_DISABLE,
                profile.getPolicyRules());
        assertArrayEquals(
                new UiccAccessRule[] {
                        new UiccAccessRule(
                                IccUtils.hexStringToBytes(
                                        "ABCD92CBB156B280FA4E1429A6ECEEB6E5C1BFE4"),
                                "com.google.android.apps.myapp", 1)
                },
                profile.getUiccAccessRules().toArray());
        verifyStoreData(channel, "BF2D1BA00C5A0A896700000000004523015C0B5A909192B79F709599BF76");
    }

    @Test
    public void testDisableProfile() {
        int channel = mockLogicalChannelResponses("BF32038001009000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.disableProfile("98760000000000543210", true, resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF3211A00C5A0A896700000000004523018101FF");
    }

    @Test
    public void testDisableProfile_SimRefresh() {
        int channel = mockLogicalChannelResponses("6106", "6f00");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.disableProfile("98760000000000543210", true, resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF3211A00C5A0A896700000000004523018101FF");
    }

    @Test
    public void testDisableProfile_Error() {
        int channel = mockLogicalChannelResponses("BF32038001039000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.disableProfile("98760000000000543210", true, resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(3, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel, "BF3211A00C5A0A896700000000004523018101FF");
    }

    @Test
    public void testSwitchToProfile() {
        int channel = mockLogicalChannelResponses("BF31038001009000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.switchToProfile("98760000000000543210", true, resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF3111A00C5A0A896700000000004523018101FF");
    }

    @Test
    public void testSwitchToProfile_SimRefresh() {
        int channel = mockLogicalChannelResponses("6106", "6f00");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.switchToProfile("98760000000000543210", true, resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF3111A00C5A0A896700000000004523018101FF");
    }

    @Test
    public void testSwitchToProfile_Error() {
        int channel = mockLogicalChannelResponses("BF31038001039000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.switchToProfile("98760000000000543210", true, resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(3, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel, "BF3111A00C5A0A896700000000004523018101FF");
    }

    @Test
    public void testGetEid() {
        int channel = mockLogicalChannelResponses("BF3E065A041A2B3C4D9000");

        ResultCaptor<String> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getEid(resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals("1A2B3C4D", resultCaptor.result);
        verifyStoreData(channel, "BF3E035C015A");
    }

    @Test
    public void testSetNickname() {
        int channel = mockLogicalChannelResponses("BF29038001009000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.setNickname("98760000000000543210", "new nickname", resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF291A5A0A89670000000000452301900C6E6577206E69636B6E616D65");
    }

    @Test
    public void testDeleteProfile() {
        int channel = mockLogicalChannelResponses("BF33038001009000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.deleteProfile("98760000000000543210", resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF330C5A0A89670000000000452301");
    }

    @Test
    public void testDeleteProfile_Error() {
        int channel = mockLogicalChannelResponses("BF33038001039000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.deleteProfile("98760000000000543210", resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(3, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel, "BF330C5A0A89670000000000452301");
    }

    @Test
    public void testGetDefaultSmdpAddress() {
        int channel = mockLogicalChannelResponses(
                "BF3C148008534D44502E434F4D8108736D64732E636F6D9000");

        ResultCaptor<String> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getDefaultSmdpAddress(resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals("SMDP.COM", resultCaptor.result);
        verifyStoreData(channel, "BF3C00");
    }

    @Test
    public void testGetSmdsAddress() {
        int channel = mockLogicalChannelResponses(
                "BF3C148008534D44502E434F4D8108736D64732E636F6D9000");

        ResultCaptor<String> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getSmdsAddress(resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals("smds.com", resultCaptor.result);
        verifyStoreData(channel, "BF3C00");
    }

    @Test
    public void testSetDefaultSmdpAddress() {
        int channel = mockLogicalChannelResponses("BF3F038001009000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.setDefaultSmdpAddress("smdp.gsma.com", resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF3F0F800D736D64702E67736D612E636F6D");
    }

    @Test
    public void testGetRulesAuthTable() {
        int channel = mockLogicalChannelResponses("BF4347"
                + "A021" // Rule #1
                + "800206C0" // Policy rules: DO_NOT_DELETE | DO_NOT_DISABLE
                + "A118" // Operator IDs
                + "B70A800312F3458103010203" // ID #1: 213, 54, [1,2,3], null
                + "B70A800312F3458203040506" // ID #2: 213, 54, null, [4,5,6]
                + "820108" // Flag (no user consent)
                + "A022" // Rule #2
                + "80020780" // Policy rules: DO_NOT_DISABLE
                + "A118" // Operator IDs
                + "B70A800312E3458103010203" // ID #1: 213, 54E, [1,2,3], null
                + "B70A8003EEEE458203040506" // ID #2: EEE, 54E, null, [4,5,6]
                + "82020780" // Flag (user consent)
                + "9000");

        ResultCaptor<EuiccRulesAuthTable> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getRulesAuthTable(resultCaptor, mHandler);
        resultCaptor.await();

        EuiccRulesAuthTable rat = resultCaptor.result;
        assertEquals(-1,
                rat.findIndex(EuiccProfileInfo.POLICY_RULE_DO_NOT_DELETE,
                        new CarrierIdentifier(new byte[] {0x12, (byte) 0xF3, 0x45}, null, null)));
        assertEquals(1,
                rat.findIndex(EuiccProfileInfo.POLICY_RULE_DO_NOT_DISABLE,
                        new CarrierIdentifier(new byte[] {0x23, 0x67, 0x45}, null, "040506")));
        assertFalse(rat.hasPolicyRuleFlag(0,
                EuiccRulesAuthTable.POLICY_RULE_FLAG_CONSENT_REQUIRED));
        assertTrue(rat.hasPolicyRuleFlag(1,
                EuiccRulesAuthTable.POLICY_RULE_FLAG_CONSENT_REQUIRED));
        verifyStoreData(channel, "BF4300");
    }

    @Test
    public void testResetMemory() {
        int channel = mockLogicalChannelResponses("BF34038001009000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.resetMemory(EuiccCardManager.RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES,
                resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF340482020640");
    }

    @Test
    public void testResetMemory_SimRefresh() {
        int channel = mockLogicalChannelResponses("6106", "6f00");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.resetMemory(EuiccCardManager.RESET_OPTION_DELETE_FIELD_LOADED_TEST_PROFILES,
                resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF340482020640");
    }

    @Test
    public void testGetEuiccChallenge() {
        int channel = mockLogicalChannelResponses("BF2E0580030102039000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getEuiccChallenge(resultCaptor, mHandler);
        resultCaptor.await();

        assertArrayEquals(new byte[] {1, 2, 3}, resultCaptor.result);
        verifyStoreData(channel, "BF2E00");
    }

    @Test
    public void testGetEuiccInfo1() {
        int channel = mockLogicalChannelResponses("BF20030102039000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getEuiccInfo1(resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals("BF2003010203", IccUtils.bytesToHexString(resultCaptor.result));
        verifyStoreData(channel, "BF2000");
    }

    @Test
    public void testGetEuiccInfo2() {
        int channel = mockLogicalChannelResponses("BF22030102039000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.getEuiccInfo2(resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals("BF2203010203", IccUtils.bytesToHexString(resultCaptor.result));
        verifyStoreData(channel, "BF2200");
    }

    @Test
    public void testAuthenticateServer() {
        when(mMockResources.getStringArray(
                com.android.internal.R.array.config_telephonyEuiccDeviceCapabilities))
                .thenReturn(new String[] {});

        int channel = mockLogicalChannelResponses("BF3802A0009000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.authenticateServer("A1B2C3-X4Y5Z6", // Matching id
                Asn1Node.newBuilder(0xA0).build().toBytes(),
                Asn1Node.newBuilder(0xA1).build().toBytes(),
                Asn1Node.newBuilder(0xA2).build().toBytes(),
                Asn1Node.newBuilder(0xA3).build().toBytes(), resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        assertEquals("BF3802A000", IccUtils.bytesToHexString(resultCaptor.result));
        verifyStoreData(channel,
                "BF382D" + "A000" + "A100" + "A200" + "A300" + "A023"
                        + "800D4131423243332D583459355A36" // Matching id
                        + "A112800489674523" // TAC
                        + "A100" // Device capabilities
                        + "82088967452301214305"); // IMEI
    }

    @Test
    public void testAuthenticateServer_Error() {
        when(mMockResources.getStringArray(
                com.android.internal.R.array.config_telephonyEuiccDeviceCapabilities))
                .thenReturn(new String[] {});

        int channel = mockLogicalChannelResponses("BF38038101039000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.authenticateServer("A1B2C3-X4Y5Z6", // Matching id
                Asn1Node.newBuilder(0xA0).build().toBytes(),
                Asn1Node.newBuilder(0xA1).build().toBytes(),
                Asn1Node.newBuilder(0xA2).build().toBytes(),
                Asn1Node.newBuilder(0xA3).build().toBytes(), resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(3, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel,
                "BF382D" + "A000" + "A100" + "A200" + "A300" + "A023"
                        + "800D4131423243332D583459355A36" // Matching id
                        + "A112800489674523" // TAC
                        + "A100" // Device capabilities
                        + "82088967452301214305"); // IMEI
    }

    @Test
    public void testAuthenticateService_devCap() {
        when(mMockResources.getStringArray(
                com.android.internal.R.array.config_telephonyEuiccDeviceCapabilities))
                .thenReturn(new String[] {
                        "gsm,11",
                        "utran,11",
                        "cdma1x,1",
                        "hrpd,3",
                        "ehrpd,12",
                        "eutran,11"});

        int channel = mockLogicalChannelResponses("BF3802A0009000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.authenticateServer("A1B2C3-X4Y5Z6", // Matching id
                Asn1Node.newBuilder(0xA0).build().toBytes(),
                Asn1Node.newBuilder(0xA1).build().toBytes(),
                Asn1Node.newBuilder(0xA2).build().toBytes(),
                Asn1Node.newBuilder(0xA3).build().toBytes(), resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        assertEquals("BF3802A000", IccUtils.bytesToHexString(resultCaptor.result));
        verifyStoreData(channel,
                "BF384B" + "A000" + "A100" + "A200" + "A300" + "A041"
                        + "800D4131423243332D583459355A36" // Matching id
                        + "A130800489674523" // TAC
                        // Device capabilities
                        + "A11E80030B000081030B00008203010000830303000084030C000085030B0000"
                        + "82088967452301214305"); // IMEI
    }

    @Test
    public void testPrepareDownload() {
        int channel = mockLogicalChannelResponses("BF2102A0009000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.prepareDownload(
                IccUtils.hexStringToBytes("4131423243332D583459355A36"), // hashCc
                Asn1Node.newBuilder(0xA0).build().toBytes(),
                Asn1Node.newBuilder(0xA1).build().toBytes(),
                Asn1Node.newBuilder(0xA2).build().toBytes(), resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals("BF2102A000", IccUtils.bytesToHexString(resultCaptor.result));
        verifyStoreData(channel,
                "BF2115" + "A000" + "A100"
                        + "040D4131423243332D583459355A36" // hashCc
                        + "A200");
    }

    @Test
    public void testPrepareDownload_Error() {
        int channel = mockLogicalChannelResponses("BF2105A1030201039000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.prepareDownload(
                IccUtils.hexStringToBytes("4131423243332D583459355A36"), // hashCc
                Asn1Node.newBuilder(0xA0).build().toBytes(),
                Asn1Node.newBuilder(0xA1).build().toBytes(),
                Asn1Node.newBuilder(0xA2).build().toBytes(), resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(3, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel,
                "BF2115" + "A000" + "A100"
                        + "040D4131423243332D583459355A36" // hashCc
                        + "A200");
    }

    @Test
    public void testLoadBoundProfilePackage() {
        int channel = mockLogicalChannelResponses(
                // For boundProfilePackage head + initialiseSecureChannelRequest
                // (ES8+.InitialiseSecureChannel)
                "9000",
                // For firstSequenceOf87 (ES8+.ConfigureISDP)
                "9000",
                // For head of sequenceOf88 (ES8+.StoreMetadata)
                "9000",
                // For body (element 1) of sequenceOf88 (ES8+.StoreMetadata)
                "9000",
                "9000",
                // For head of sequenceOf86 (ES8+.LoadProfileElements)
                "9000",
                // For body (element 1) of sequenceOf86 (ES8+.LoadProfileElements)
                "9000",
                // Profile installation result (element 2 of sequenceOf86)
                "BF37009000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.loadBoundProfilePackage(
                Asn1Node.newBuilder(0xBF36)
                        .addChild(Asn1Node.newBuilder(0xBF23))
                        .addChild(Asn1Node.newBuilder(0xA0)
                                .addChildAsBytes(0x87, new byte[] {1, 2, 3}))
                        .addChild(Asn1Node.newBuilder(0xA1)
                                .addChildAsBytes(0x88, new byte[] {4, 5, 6}))
                        .addChild(Asn1Node.newBuilder(0xA2))
                        .addChild(Asn1Node.newBuilder(0xA3)
                                .addChildAsBytes(0x86, new byte[] {7, 8, 9})
                                .addChildAsBytes(0x86, new byte[] {0xA, 0xB, 0xC}))
                        .build().toBytes(),
                resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals("BF3700", IccUtils.bytesToHexString(resultCaptor.result));
        verifyStoreData(channel, "BF361FBF2300"); // ES8+.InitialiseSecureChannel
        verifyStoreData(channel, "A0058703010203"); // ES8+.ConfigureISDP
        verifyStoreData(channel, "A105"); // ES8+.StoreMetadata
        verifyStoreData(channel, "8803040506"); // ES8+.StoreMetadata
        verifyStoreData(channel, "A200");
        verifyStoreData(channel, "A30A"); // ES8+.LoadProfileElements
        verifyStoreData(channel, "8603070809"); // ES8+.LoadProfileElements
        verifyStoreData(channel, "86030A0B0C"); // ES8+.LoadProfileElements
    }

    @Test
    public void testLoadBoundProfilePackage_Error() {
        int channel = mockLogicalChannelResponses(
                // For boundProfilePackage head + initialiseSecureChannelRequest
                // (ES8+.InitialiseSecureChannel)
                "9000",
                // For firstSequenceOf87 (ES8+.ConfigureISDP)
                "9000",
                // For head of sequenceOf88 (ES8+.StoreMetadata)
                "9000",
                // For body (element 1) of sequenceOf88 (ES8+.StoreMetadata)
                "9000",
                "9000",
                // For head of sequenceOf86 (ES8+.LoadProfileElements)
                "9000",
                // For body (element 1) of sequenceOf86 (ES8+.LoadProfileElements)
                "9000",
                // Profile installation result (element 2 of sequenceOf86)
                "BF370ABF2707A205A1038101039000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.loadBoundProfilePackage(
                Asn1Node.newBuilder(0xBF36)
                        .addChild(Asn1Node.newBuilder(0xBF23))
                        .addChild(Asn1Node.newBuilder(0xA0)
                                .addChildAsBytes(0x87, new byte[] {1, 2, 3}))
                        .addChild(Asn1Node.newBuilder(0xA1)
                                .addChildAsBytes(0x88, new byte[] {4, 5, 6}))
                        .addChild(Asn1Node.newBuilder(0xA2))
                        .addChild(Asn1Node.newBuilder(0xA3)
                                .addChildAsBytes(0x86, new byte[] {7, 8, 9})
                                .addChildAsBytes(0x86, new byte[] {0xA, 0xB, 0xC}))
                        .build().toBytes(),
                resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(3, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel, "BF361FBF2300"); // ES8+.InitialiseSecureChannel
        verifyStoreData(channel, "A0058703010203"); // ES8+.ConfigureISDP
        verifyStoreData(channel, "A105"); // ES8+.StoreMetadata
        verifyStoreData(channel, "8803040506"); // ES8+.StoreMetadata
        verifyStoreData(channel, "A200");
        verifyStoreData(channel, "A30A"); // ES8+.LoadProfileElements
        verifyStoreData(channel, "8603070809"); // ES8+.LoadProfileElements
        verifyStoreData(channel, "86030A0B0C"); // ES8+.LoadProfileElements
    }

    @Test
    public void testCancelSession() {
        int channel = mockLogicalChannelResponses("BF41009000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.cancelSession(IccUtils.hexStringToBytes("A1B2C3"),
                EuiccCardManager.CANCEL_REASON_POSTPONED, resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals("BF4100", IccUtils.bytesToHexString(resultCaptor.result));
        verifyStoreData(channel, "BF41088003A1B2C3810101");
    }

    @Test
    public void testCancelSession_Error() {
        int channel = mockLogicalChannelResponses("BF41038101039000");

        ResultCaptor<byte[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.cancelSession(IccUtils.hexStringToBytes("A1B2C3"),
                EuiccCardManager.CANCEL_REASON_POSTPONED, resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(3, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel, "BF41088003A1B2C3810101");
    }

    @Test
    public void testListNotifications() {
        int channel = mockLogicalChannelResponses("BF282BA029"
                + "BF2F118001010C08736D64702E636F6D81020410" // Notification #1
                + "BF2F128001020C09736D6470322E636F6D81020420" // Notification #2
                + "9000");

        ResultCaptor<EuiccNotification[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.listNotifications(
                EuiccNotification.EVENT_DELETE | EuiccNotification.EVENT_DISABLE,
                resultCaptor, mHandler);
        resultCaptor.await();

        assertArrayEquals(
                new EuiccNotification[] {
                        new EuiccNotification(1, "smdp.com", EuiccNotification.EVENT_DELETE, null),
                        new EuiccNotification(2, "smdp2.com", EuiccNotification.EVENT_DISABLE, null)
                },
                resultCaptor.result);
        verifyStoreData(channel, "BF280481020430");
    }

    @Test
    public void testListNotifications_Error() {
        int channel = mockLogicalChannelResponses("BF28038101039000");

        ResultCaptor<EuiccNotification[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.listNotifications(
                EuiccNotification.EVENT_DELETE | EuiccNotification.EVENT_DISABLE,
                resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(3, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel, "BF280481020430");
    }

    @Test
    public void testRetrieveNotificationList() {
        int channel = mockLogicalChannelResponses("BF2B2FA02D"
                // Notification #1
                + "3014BF2F118001010C08736D64702E636F6D81020410"
                // Notification #2
                + "3015BF2F128001020C09736D6470322E636F6D81020420"
                + "9000");

        ResultCaptor<EuiccNotification[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.retrieveNotificationList(
                EuiccNotification.EVENT_DELETE | EuiccNotification.EVENT_DISABLE,
                resultCaptor, mHandler);
        resultCaptor.await();

        assertArrayEquals(
                new EuiccNotification[] {
                        new EuiccNotification(1, "smdp.com", EuiccNotification.EVENT_DELETE,
                                IccUtils.hexStringToBytes(
                                        "3014BF2F118001010C08736D64702E636F6D81020410")),
                        new EuiccNotification(2, "smdp2.com", EuiccNotification.EVENT_DISABLE,
                                IccUtils.hexStringToBytes(
                                        "3015BF2F128001020C09736D6470322E636F6D81020420"))
                },
                resultCaptor.result);
        verifyStoreData(channel, "BF2B06A00481020430");
    }

    @Test
    public void testRetrieveNotificationList_Empty() {
        int channel = mockLogicalChannelResponses("BF2B038101019000");

        ResultCaptor<EuiccNotification[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.retrieveNotificationList(
                EuiccNotification.EVENT_DELETE | EuiccNotification.EVENT_DISABLE,
                resultCaptor, mHandler);
        resultCaptor.await();

        assertArrayEquals(new EuiccNotification[0], resultCaptor.result);
        verifyStoreData(channel, "BF2B06A00481020430");
    }

    @Test
    public void testRetrieveNotificationList_Error() {
        int channel = mockLogicalChannelResponses("BF2B038101039000");

        ResultCaptor<EuiccNotification[]> resultCaptor = new ResultCaptor<>();
        mEuiccCard.retrieveNotificationList(
                EuiccNotification.EVENT_DELETE | EuiccNotification.EVENT_DISABLE,
                resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(3, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel, "BF2B06A00481020430");
    }

    @Test
    public void testRetrieveNotification() {
        int channel = mockLogicalChannelResponses("BF2B18A016"
                + "3014BF2F118001010C08736D64702E636F6D81020410" // Notification
                + "9000");

        ResultCaptor<EuiccNotification> resultCaptor = new ResultCaptor<>();
        mEuiccCard.retrieveNotification(5, resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(
                new EuiccNotification(1, "smdp.com", EuiccNotification.EVENT_DELETE,
                        IccUtils.hexStringToBytes("3014BF2F118001010C08736D64702E636F6D81020410")),
                resultCaptor.result);
        verifyStoreData(channel, "BF2B05A003800105");
    }

    @Test
    public void testRetrieveNotification_Error() {
        int channel = mockLogicalChannelResponses("BF2B038101019000");

        ResultCaptor<EuiccNotification> resultCaptor = new ResultCaptor<>();
        mEuiccCard.retrieveNotification(5, resultCaptor, mHandler);
        resultCaptor.await();

        assertEquals(1, ((EuiccCardErrorException) resultCaptor.exception).getErrorCode());
        verifyStoreData(channel, "BF2B05A003800105");
    }

    @Test
    public void testRemoveNotificationFromList() {
        int channel = mockLogicalChannelResponses("BF30038001009000");

        ResultCaptor<Void> resultCaptor = new ResultCaptor<>();
        mEuiccCard.removeNotificationFromList(5, resultCaptor, mHandler);
        resultCaptor.await();

        assertUnexpectedException(resultCaptor.exception);
        verifyStoreData(channel, "BF3003800105");
    }

    @Test
    public void testAddDeviceCapability() throws InvalidAsn1DataException, TagNotFoundException {
        Asn1Node.Builder devCapsBuilder = Asn1Node.newBuilder(Tags.TAG_CTX_COMP_1);

        String devCapItem = "gsm,11";
        mEuiccCard.addDeviceCapability(devCapsBuilder, devCapItem);
        Asn1Node node = devCapsBuilder.build();

        assertTrue(node.hasChild(Tags.TAG_CTX_0));
        Asn1Node child = node.getChild(Tags.TAG_CTX_0);
        assertTrue(Arrays.equals(new byte[] {11, 0 , 0}, child.asBytes()));

        devCapItem = "utran,11";
        mEuiccCard.addDeviceCapability(devCapsBuilder, devCapItem);
        node = devCapsBuilder.build();

        assertTrue(node.hasChild(Tags.TAG_CTX_1));
        child = node.getChild(Tags.TAG_CTX_1);
        assertTrue(Arrays.equals(new byte[] {11, 0 , 0}, child.asBytes()));

        devCapItem = "cdma1x,1";
        mEuiccCard.addDeviceCapability(devCapsBuilder, devCapItem);
        node = devCapsBuilder.build();

        assertTrue(node.hasChild(Tags.TAG_CTX_2));
        child = node.getChild(Tags.TAG_CTX_2);
        assertTrue(Arrays.equals(new byte[] {1, 0 , 0}, child.asBytes()));

        devCapItem = "hrpd,1";
        mEuiccCard.addDeviceCapability(devCapsBuilder, devCapItem);
        node = devCapsBuilder.build();

        assertTrue(node.hasChild(Tags.TAG_CTX_3));
        child = node.getChild(Tags.TAG_CTX_3);
        assertTrue(Arrays.equals(new byte[] {1, 0 , 0}, child.asBytes()));

        devCapItem = "ehrpd,12";
        mEuiccCard.addDeviceCapability(devCapsBuilder, devCapItem);
        node = devCapsBuilder.build();

        assertTrue(node.hasChild(Tags.TAG_CTX_4));
        child = node.getChild(Tags.TAG_CTX_4);
        assertTrue(Arrays.equals(new byte[] {12, 0 , 0}, child.asBytes()));

        devCapItem = "eutran,11";
        mEuiccCard.addDeviceCapability(devCapsBuilder, devCapItem);
        node = devCapsBuilder.build();

        assertTrue(node.hasChild(Tags.TAG_CTX_5));
        child = node.getChild(Tags.TAG_CTX_5);
        assertTrue(Arrays.equals(new byte[] {11, 0 , 0}, child.asBytes()));

        devCapItem = "nfc,0";
        mEuiccCard.addDeviceCapability(devCapsBuilder, devCapItem);
        node = devCapsBuilder.build();

        assertTrue(node.hasChild(Tags.TAG_CTX_6));
        child = node.getChild(Tags.TAG_CTX_6);
        assertTrue(Arrays.equals(new byte[] {0, 0 , 0}, child.asBytes()));

        devCapItem = "crl,0";
        mEuiccCard.addDeviceCapability(devCapsBuilder, devCapItem);
        node = devCapsBuilder.build();

        assertTrue(node.hasChild(Tags.TAG_CTX_7));
        child = node.getChild(Tags.TAG_CTX_7);
        assertTrue(Arrays.equals(new byte[] {0, 0 , 0}, child.asBytes()));

        // Array length should not be 3.
        Asn1Node.Builder devCapsBuilder2 = Asn1Node.newBuilder(Tags.TAG_CTX_COMP_1);
        devCapItem = "gsm,1,1";
        mEuiccCard.addDeviceCapability(devCapsBuilder2, devCapItem);
        node = devCapsBuilder2.build();

        assertFalse(node.hasChild(Tags.TAG_CTX_0));
    }

    private void verifyStoreData(int channel, String command) {
        verify(mMockCi, times(1))
                .iccTransmitApduLogicalChannel(eq(channel), eq(0x80 | channel), eq(0xE2), eq(0x91),
                        eq(0), eq(command.length() / 2), eq(command), any());
    }

    private int mockLogicalChannelResponses(Object... responses) {
        int channel = LogicalChannelMocker.mockOpenLogicalChannelResponse(mMockCi,
                "E00582030200009000");
        LogicalChannelMocker.mockSendToLogicalChannel(mMockCi, channel, responses);
        LogicalChannelMocker.mockCloseLogicalChannel(mMockCi, channel);
        return channel;
    }
}
