/*
 * 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 android.telephony.euicc.cts;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.euicc.DownloadableSubscription;

import androidx.test.runner.AndroidJUnit4;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(AndroidJUnit4.class)
public class DownloadableSubscriptionTest {

    private static final String ACTIVATION_CODE =
            "1$SMDP.GSMA.COM$04386-AGYFT-A74Y8-3F815$1.3.6.1.4.1.31746";

    private DownloadableSubscription mDownloadableSubscription;

    @Before
    public void setUp() throws Exception {
        mDownloadableSubscription = DownloadableSubscription.forActivationCode(ACTIVATION_CODE);
    }

    @Test
    public void testDownloadableSubscriptionBuilder() {
        final String confirmationCode = "fake confirmation code";
        DownloadableSubscription downloadableSubscription =
                new DownloadableSubscription.Builder(ACTIVATION_CODE)
                        .setConfirmationCode(confirmationCode)
                        .build();

        assertNotNull(downloadableSubscription);
        assertEquals(ACTIVATION_CODE, downloadableSubscription.getEncodedActivationCode());
        assertEquals(confirmationCode, downloadableSubscription.getConfirmationCode());
    }

    @Test
    public void testGetEncodedActivationCode() {
        assertNotNull(mDownloadableSubscription);
        assertEquals(ACTIVATION_CODE, mDownloadableSubscription.getEncodedActivationCode());
    }

    @Test
    public void testDescribeContents() {
        assertNotNull(mDownloadableSubscription);
        int bitmask = mDownloadableSubscription.describeContents();
        assertTrue(bitmask == 0 || bitmask == Parcelable.CONTENTS_FILE_DESCRIPTOR);
    }

    @Test
    public void testGetConfirmationCode() throws NoSuchFieldException, IllegalAccessException {
        // There is no way to set DownloadableSubscription#confirmationCode from here because
        // Android P doesn't allow accessing a platform class's @hide methods or private fields
        // through reflection.. so let's just verify confirmationCode is null.
        assertNotNull(mDownloadableSubscription);
        assertNull(mDownloadableSubscription.getConfirmationCode());
    }

    @Test
    public void testWriteToParcel() {
        assertNotNull(mDownloadableSubscription);

        // write object to parcel
        Parcel parcel = Parcel.obtain();
        mDownloadableSubscription.writeToParcel(
                parcel, mDownloadableSubscription.describeContents());

        // extract object from parcel
        parcel.setDataPosition(0 /* pos */);
        DownloadableSubscription downloadableSubscriptionFromParcel =
                DownloadableSubscription.CREATOR.createFromParcel(parcel);
        assertEquals(
                ACTIVATION_CODE, downloadableSubscriptionFromParcel.getEncodedActivationCode());

        // There is no way to set DownloadableSubscription#confirmationCode from here because
        // Android P doesn't allow accessing a platform class's @hide methods or private fields
        // through reflection.. so let's just verify confirmationCode is null.
        assertNull(downloadableSubscriptionFromParcel.getConfirmationCode());

        // Similarly there is no way to get DownloadableSubscription#carrierName or
        // DownloadableSubscription#accessRules on Android P so we can't verify them here.
    }
}
