// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.base;

import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import static org.chromium.base.PackageUtils.byteArrayToHexString;
import static org.chromium.base.PackageUtils.getCertificateSHA256FingerprintForPackage;

import android.content.pm.PackageManager;

import androidx.test.filters.SmallTest;

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

import org.chromium.base.test.BaseJUnit4ClassRunner;
import org.chromium.base.test.util.Batch;

import java.util.Collections;
import java.util.List;

/**
 * Tests for {@link PackageUtils}.
 */
@RunWith(BaseJUnit4ClassRunner.class)
@Batch(Batch.UNIT_TESTS)
public class PackageUtilsTest {
    private static final byte[] BYTE_ARRAY = new byte[] {(byte) 0xaa, (byte) 0xbb, (byte) 0xcc,
            (byte) 0x10, (byte) 0x20, (byte) 0x30, (byte) 0x01, (byte) 0x02};
    private static final String STRING_ARRAY = "AA:BB:CC:10:20:30:01:02";

    private static final String SHA_256_FINGERPRINT_PUBLIC =
            "32:A2:FC:74:D7:31:10:58:59:E5:A8:5D:F1:6D:95:F1:02:D8:5B"
            + ":22:09:9B:80:64:C5:D8:91:5C:61:DA:D1:E0";
    private static final String SHA_256_FINGERPRINT_OFFICIAL =
            "19:75:B2:F1:71:77:BC:89:A5:DF:F3:1F:9E:64:A6:CA:E2:81:A5"
            + ":3D:C1:D1:D5:9B:1D:14:7F:E1:C8:2A:FA:00";
    private static final String PACKAGE_NAME =
            ContextUtils.getApplicationContext().getPackageName();

    @Test
    @SmallTest
    public void testByteArrayToHexString() {
        Assert.assertEquals(STRING_ARRAY, byteArrayToHexString(BYTE_ARRAY));
    }

    @Test
    @SmallTest
    public void testSHA256CertificateChecks() {
        PackageManager pm = ContextUtils.getApplicationContext().getPackageManager();
        List<String> fingerprints = getCertificateSHA256FingerprintForPackage(PACKAGE_NAME);

        assertThat(fingerprints,
                anyOf(is(Collections.singletonList(SHA_256_FINGERPRINT_PUBLIC)),
                        is(Collections.singletonList(SHA_256_FINGERPRINT_OFFICIAL))));
    }
}
