/*
 * Copyright (C) 2022 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.security.cts;

import static org.junit.Assume.assumeNoException;

import android.platform.test.annotations.AsbSecurityTest;

import com.android.sts.common.tradefed.testtype.StsExtraBusinessLogicHostTestBase;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.testtype.DeviceJUnit4ClassRunner;

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

@RunWith(DeviceJUnit4ClassRunner.class)
public class CVE_2022_20353 extends StsExtraBusinessLogicHostTestBase {

    @AsbSecurityTest(cveBugId = 221041256)
    @Test
    public void testPocCVE_2022_20353() {
        try {
            final String testPkg = "android.security.cts.CVE_2022_20353";
            ITestDevice device = getDevice();

            AdbUtils.runCommandLine("input keyevent KEYCODE_WAKEUP", device);
            AdbUtils.runCommandLine("input keyevent KEYCODE_MENU", device);
            AdbUtils.runCommandLine("input keyevent KEYCODE_HOME", device);

            // to generate NOTICE.html if not already present
            AdbUtils.runCommandLine("am start -a android.settings.LICENSE", device);

            installPackage("CVE-2022-20353.apk");

            runDeviceTests(testPkg, testPkg + ".DeviceTest", "testDefaultRingtonePreference");
        } catch (Exception e) {
            assumeNoException(e);
        }
    }
}
