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

Commit 046a14ee authored by Automerger Merge Worker's avatar Automerger Merge Worker Committed by Remi NGUYEN VAN
Browse files

Add an annotation for ignoring tests by dev SDK

Contrary to androidx.test.filters.SdkSuppress, this annotation
considers the SDK to be higher than the Build.VERSION.SDK_INT reported
by the device when the device is not using a release SDK. For example,
an aosp/master build based on SDK 29 is considered to have a development
SDK that is strictly higher than 29.

Test: atest CtsNetTestCasesLatestSdk:android.net.CaptivePortalTest using
          the change on a Q build and an AOSP build.
Bug: 150918852

Merged-In: Ibaea05565bd8a362e829cdd1e5420aa2881b0889
(cherry picked from commit f30540f2)

Change-Id: I57f95d4673031a1ff58218bf4c79bb26b7eaa16d
parent 2eb7b002
Loading
Loading
Loading
Loading
+71 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 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.testutils

import android.os.Build
import org.junit.Assume.assumeTrue
import org.junit.rules.TestRule
import org.junit.runner.Description
import org.junit.runners.model.Statement

/**
 * A test rule to ignore tests based on the development SDK level.
 *
 * If the device is not using a release SDK, the development SDK is considered to be higher than
 * [Build.VERSION.SDK_INT].
 */
class DevSdkIgnoreRule : TestRule {
    override fun apply(base: Statement, description: Description): Statement {
        return IgnoreBySdkStatement(base, description)
    }

    /**
     * Ignore the test for any development SDK that is strictly after [value].
     *
     * If the device is not using a release SDK, the development SDK is considered to be higher
     * than [Build.VERSION.SDK_INT].
     */
    annotation class IgnoreAfter(val value: Int)

    /**
     * Ignore the test for any development SDK that lower than or equal to [value].
     *
     * If the device is not using a release SDK, the development SDK is considered to be higher
     * than [Build.VERSION.SDK_INT].
     */
    annotation class IgnoreUpTo(val value: Int)

    private class IgnoreBySdkStatement(
        private val base: Statement,
        private val description: Description
    ) : Statement() {
        override fun evaluate() {
            val ignoreAfter = description.getAnnotation(IgnoreAfter::class.java)
            val ignoreUpTo = description.getAnnotation(IgnoreUpTo::class.java)

            // In-development API n+1 will have SDK_INT == n and CODENAME != REL.
            // Stable API n has SDK_INT == n and CODENAME == REL.
            val release = "REL" == Build.VERSION.CODENAME
            val sdkInt = Build.VERSION.SDK_INT
            val devApiLevel = sdkInt + if (release) 0 else 1
            val message = "Skipping test for ${if (!release) "non-" else ""}release SDK $sdkInt"
            assumeTrue(message, ignoreAfter == null || devApiLevel <= ignoreAfter.value)
            assumeTrue(message, ignoreUpTo == null || devApiLevel > ignoreUpTo.value)
            base.evaluate()
        }
    }
}
 No newline at end of file