Skip to content

Commit

Permalink
refactor: Rename FileLocator to ObjectLocator and don't add the numbe…
Browse files Browse the repository at this point in the history
…r disabled tests to the total of tests (#156)
  • Loading branch information
felipebz committed May 21, 2024
1 parent 4355716 commit 2c14fe2
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import org.sonar.api.Plugin
import org.sonar.api.PropertyType
import org.sonar.api.config.PropertyDefinition
import org.sonar.api.resources.Qualifiers
import org.sonar.plsqlopen.symbols.FileLocator
import org.sonar.plsqlopen.symbols.ObjectLocator
import org.sonar.plsqlopen.util.log.SonarQubeLoggers
import org.sonar.plsqlopen.utils.log.Loggers

Expand Down Expand Up @@ -70,7 +70,7 @@ class PlSqlPlugin : Plugin {
PlSqlProfile::class.java,
PlSqlSquidSensor::class.java,
PlSqlRuleRepository::class.java,
FileLocator::class.java,
ObjectLocator::class.java,
)

addUtPlSqlExtensions(context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import org.sonar.plsqlopen.rules.SonarQubeActiveRulesAdapter
import org.sonar.plsqlopen.rules.SonarQubeRuleMetadataLoader
import org.sonar.plsqlopen.squid.PlSqlAstScanner
import org.sonar.plsqlopen.squid.ProgressReport
import org.sonar.plsqlopen.symbols.FileLocator
import org.sonar.plsqlopen.symbols.ObjectLocator
import org.sonar.plsqlopen.utils.log.Logger
import org.sonar.plsqlopen.utils.log.Loggers
import org.sonar.plugins.plsqlopen.api.ZpaRulesDefinition
Expand All @@ -41,7 +41,7 @@ import java.util.concurrent.TimeUnit
class PlSqlSquidSensor @JvmOverloads constructor(activeRules: ActiveRules, settings: Configuration, private val noSonarFilter: NoSonarFilter,
private val fileLinesContextFactory: FileLinesContextFactory,
customRulesDefinition: Array<ZpaRulesDefinition>? = null,
private val fileLocator: FileLocator) : Sensor {
private val objectLocator: ObjectLocator) : Sensor {

private val logger: Logger = Loggers.getLogger(PlSqlSquidSensor::class.java)

Expand All @@ -64,7 +64,7 @@ class PlSqlSquidSensor @JvmOverloads constructor(activeRules: ActiveRules, setti
val inputFiles = fs.inputFiles(fs.predicates().hasLanguage(PlSql.KEY)).toList()

val progressReport = ProgressReport("Report about progress of code analyzer", TimeUnit.SECONDS.toMillis(10))
val scanner = PlSqlAstScanner(context, checks, noSonarFilter, formsMetadata, isErrorRecoveryEnabled, fileLinesContextFactory, fileLocator)
val scanner = PlSqlAstScanner(context, checks, noSonarFilter, formsMetadata, isErrorRecoveryEnabled, fileLinesContextFactory, objectLocator)

progressReport.start(inputFiles.map { it.toString() })

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,19 +29,18 @@ import org.sonar.api.config.Configuration
import org.sonar.api.measures.CoreMetrics
import org.sonar.api.notifications.AnalysisWarnings
import org.sonar.api.utils.WildcardPattern
import org.sonar.plsqlopen.squid.SonarQubePlSqlFile
import org.sonar.plsqlopen.symbols.FileLocator
import org.sonar.plsqlopen.symbols.ObjectLocator
import org.sonar.plsqlopen.utils.log.Logger
import org.sonar.plsqlopen.utils.log.Loggers
import org.sonar.plsqlopen.utplsql.TestCaseStatus
import org.sonar.plsqlopen.utplsql.TestExecutions
import org.sonar.plugins.plsqlopen.api.PlSqlFile
import org.sonar.plugins.plsqlopen.api.PlSqlGrammar
import java.io.File
import java.io.Serializable


class UtPlSqlTestSensor(private val conf: Configuration,
private val fileLocator: FileLocator,
private val objectLocator: ObjectLocator,
private val analysisWarnings: AnalysisWarnings) : Sensor {

private val logger: Logger = Loggers.getLogger(UtPlSqlTestSensor::class.java)
Expand Down Expand Up @@ -95,38 +94,23 @@ class UtPlSqlTestSensor(private val conf: Configuration,

private fun processTestExecutions(context: SensorContext, testExecutions: TestExecutions) {
testExecutions.files?.forEach { file ->
val mappedTest = fileLocator.declaredScopes.firstOrNull {
it.plSqlFile != null &&
it.plSqlFile?.type() === PlSqlFile.Type.TEST &&
it.identifier?.equals(file.path, ignoreCase = true) == true &&
it.type === PlSqlGrammar.CREATE_PACKAGE_BODY
}
val mappedTest = objectLocator.findTestObject(file.path, PlSqlGrammar.CREATE_PACKAGE_BODY)

if (mappedTest != null) {
var testCount = 0
var failureCount = 0
var errorCount = 0
var skippedCount = 0
var duration = 0L

file.testCases?.forEach { testCase ->
testCount++
if (testCase.failure != null) {
failureCount++
} else if (testCase.error != null) {
errorCount++
} else if (testCase.skipped != null) {
skippedCount++
}
duration += testCase.duration
file.testCases?.let { testCase ->
val testCount = testCase.count { it.status != TestCaseStatus.SKIPPED }
val failureCount = testCase.count { it.status == TestCaseStatus.FAILED }
val errorCount = testCase.count { it.status == TestCaseStatus.ERROR }
val skippedCount = testCase.count { it.status == TestCaseStatus.SKIPPED }
val duration = testCase.sumOf { it.duration }

val plSqlFile = mappedTest.inputFile
saveMetricOnFile(context, plSqlFile, CoreMetrics.TESTS, testCount)
saveMetricOnFile(context, plSqlFile, CoreMetrics.TEST_FAILURES, failureCount)
saveMetricOnFile(context, plSqlFile, CoreMetrics.TEST_ERRORS, errorCount)
saveMetricOnFile(context, plSqlFile, CoreMetrics.SKIPPED_TESTS, skippedCount)
saveMetricOnFile(context, plSqlFile, CoreMetrics.TEST_EXECUTION_TIME, duration)
}

val plSqlFile = (mappedTest.plSqlFile as SonarQubePlSqlFile).inputFile
saveMetricOnFile(context, plSqlFile, CoreMetrics.TESTS, testCount)
saveMetricOnFile(context, plSqlFile, CoreMetrics.TEST_FAILURES, failureCount)
saveMetricOnFile(context, plSqlFile, CoreMetrics.TEST_ERRORS, errorCount)
saveMetricOnFile(context, plSqlFile, CoreMetrics.SKIPPED_TESTS, skippedCount)
saveMetricOnFile(context, plSqlFile, CoreMetrics.TEST_EXECUTION_TIME, duration)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import org.sonar.plsqlopen.highlight.PlSqlHighlighterVisitor
import org.sonar.plsqlopen.metadata.FormsMetadata
import org.sonar.plsqlopen.metrics.CpdVisitor
import org.sonar.plsqlopen.rules.SonarQubeRuleKeyAdapter
import org.sonar.plsqlopen.symbols.FileLocator
import org.sonar.plsqlopen.symbols.ObjectLocator
import org.sonar.plsqlopen.symbols.SonarQubeSymbolTable
import org.sonar.plugins.plsqlopen.api.PlSqlFile
import org.sonar.plugins.plsqlopen.api.checks.PlSqlVisitor
Expand All @@ -59,9 +59,9 @@ class PlSqlAstScanner(private val context: SensorContext,
formsMetadata: FormsMetadata?,
isErrorRecoveryEnabled: Boolean,
fileLinesContextFactory: FileLinesContextFactory,
fileLocator: FileLocator) : this(context, checks.all(), noSonarFilter, formsMetadata, isErrorRecoveryEnabled, fileLinesContextFactory) {
objectLocator: ObjectLocator) : this(context, checks.all(), noSonarFilter, formsMetadata, isErrorRecoveryEnabled, fileLinesContextFactory) {
this.plsqlChecks = checks
fileLocator.setScope(astScanner.globalScope)
objectLocator.setScope(astScanner.globalScope)
}

fun scanFile(inputFile: InputFile) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.sonar.plsqlopen.symbols

import com.felipebz.flr.api.AstNodeType
import org.sonar.api.batch.fs.InputFile
import org.sonar.plugins.plsqlopen.api.PlSqlFile
import java.nio.file.Path

data class MappedObject(
val identifier: String,
val objectType: AstNodeType,
val fileType: PlSqlFile.Type,
val path: Path,
val inputFile: InputFile
) {
val isMain: Boolean
get() = fileType === PlSqlFile.Type.MAIN
val isTest: Boolean
get() = fileType === PlSqlFile.Type.TEST
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,32 @@
*/
package org.sonar.plsqlopen.symbols

import com.felipebz.flr.api.AstNodeType
import org.sonar.api.scanner.ScannerSide
import org.sonar.plsqlopen.squid.SonarQubePlSqlFile
import org.sonar.plugins.plsqlopen.api.symbols.Scope

@ScannerSide
class FileLocator {
class ObjectLocator {
private var scope: Scope = ScopeImpl()

private val mappedObjects
get() = scope.innerScopes.map {
val plSqlFile = it.plSqlFile as SonarQubePlSqlFile? ?: return@map null
val identifier = it.identifier ?: return@map null
val type = it.type ?: return@map null
MappedObject(identifier, type, plSqlFile.type(), plSqlFile.path(), plSqlFile.inputFile)
}.filterNotNull()

fun setScope(scope: Scope) {
this.scope = scope
}

val declaredScopes
get() = scope.innerScopes
fun findMainObject(identifier: String, vararg types: AstNodeType): MappedObject? {
return mappedObjects.find { it.isMain && it.identifier == identifier && it.objectType in types }
}

fun findTestObject(identifier: String, vararg types: AstNodeType): MappedObject? {
return mappedObjects.find { it.isTest && it.identifier == identifier && it.objectType in types }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ data class TestCase @JvmOverloads constructor(
var name: String = "",

@field:Attribute(name = "duration")
var duration: Int = 0,
var duration: Long = 0,

@field:Element(name = "skipped", required = false)
var skipped: Skipped? = null,
Expand All @@ -58,7 +58,17 @@ data class TestCase @JvmOverloads constructor(

@field:Element(name = "error", required = false)
var error: Error? = null
)
) {
val status: TestCaseStatus
get() {
return when {
skipped != null -> TestCaseStatus.SKIPPED
failure != null -> TestCaseStatus.FAILED
error != null -> TestCaseStatus.ERROR
else -> TestCaseStatus.PASSED
}
}
}

@Root(name = "skipped", strict = false)
class Skipped
Expand All @@ -68,3 +78,10 @@ class Failure

@Root(name = "error", strict = false)
class Error

enum class TestCaseStatus {
PASSED,
FAILED,
SKIPPED,
ERROR
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ import org.sonar.api.measures.CoreMetrics
import org.sonar.api.measures.FileLinesContext
import org.sonar.api.measures.FileLinesContextFactory
import org.sonar.api.rule.RuleKey
import org.sonar.plsqlopen.symbols.FileLocator
import org.sonar.plsqlopen.symbols.ObjectLocator
import java.io.File
import java.nio.charset.StandardCharsets
import java.nio.file.Paths
Expand All @@ -60,7 +60,7 @@ class PlSqlSquidSensorTest {
fileLinesContext = mock(FileLinesContext::class.java)
`when`(fileLinesContextFactory.createFor(any(InputFile::class.java))).thenReturn(fileLinesContext)

sensor = PlSqlSquidSensor(activeRules, MapSettings().asConfig(), mock(NoSonarFilter::class.java), fileLinesContextFactory, null, FileLocator())
sensor = PlSqlSquidSensor(activeRules, MapSettings().asConfig(), mock(NoSonarFilter::class.java), fileLinesContextFactory, null, ObjectLocator())
}

@Test
Expand Down

0 comments on commit 2c14fe2

Please sign in to comment.