You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iceraven-browser/mozilla-detekt-rules/src/main/java/org/mozilla/fenix/detektrules/MozillaCorrectUnitTestRunne...

77 lines
3.0 KiB
Kotlin

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.detektrules
import io.gitlab.arturbosch.detekt.api.CodeSmell
import io.gitlab.arturbosch.detekt.api.Config
import io.gitlab.arturbosch.detekt.api.Debt
import io.gitlab.arturbosch.detekt.api.Entity
import io.gitlab.arturbosch.detekt.api.Issue
import io.gitlab.arturbosch.detekt.api.Rule
import io.gitlab.arturbosch.detekt.api.Severity
import io.gitlab.arturbosch.detekt.api.internal.PathFilters
import org.jetbrains.kotlin.psi.KtAnnotationEntry
private val BANNED_TEST_RUNNERS = setOf(
// When updating this list, also update the violation message.
"AndroidJUnit4",
"RobolectricTestRunner"
)
// There is a change to how we output violations in a different PR so the formatting for message
// might be weird but it should still be readable.
private val VIOLATION_MSG = """The following code blocks:
|
| @RunWith(AndroidJUnit4::class)
| @Config(application = TestApplication::class)
| OR
| @RunWith(RobolectricTestRunner::class)
| @Config(application = TestApplication::class)
|
| should be replaced with:
|
| @RunWith(FenixRobolectricTestRunner::class)
|
| To reduce redundancy of setting @Config. No @Config specification is necessary because
| the FenixRobolectricTestRunner sets it automatically.
|
| Relatedly, adding robolectric to a test increases its runtime non-trivially so please
| ensure Robolectric is necessary before adding it.""".trimMargin()
/**
* Ensures we're using the correct Robolectric unit test runner.
*/
class MozillaCorrectUnitTestRunner(config: Config) : Rule(config) {
override val issue = Issue(
MozillaCorrectUnitTestRunner::class.simpleName!!,
Severity.Defect,
"Verifies we're using the correct Robolectric unit test runner",
Debt.FIVE_MINS
)
override val filters: PathFilters?
get() = PathFilters.of(
includes = listOf("**/test/**"), // unit tests only.
excludes = emptyList()
)
override fun visitAnnotationEntry(annotationEntry: KtAnnotationEntry) {
super.visitAnnotationEntry(annotationEntry)
// Example of an annotation: @RunWith(FenixRobolectricUnitTestRunner::class)
val annotationClassName = annotationEntry.shortName?.identifier
if (annotationClassName == "RunWith") {
// Example arg in parens: "(FenixRobolectricUnitTestRunner::class)"
val argInParens = annotationEntry.lastChild.node.chars
val argClassName = argInParens.substring(1 until argInParens.indexOf(":"))
val isInViolation = BANNED_TEST_RUNNERS.any { it == argClassName }
if (isInViolation) {
report(CodeSmell(issue, Entity.from(annotationEntry), VIOLATION_MSG))
}
}
}
}