|
1 | 1 | package org.usvm.project |
2 | 2 |
|
| 3 | +import mu.KotlinLogging |
3 | 4 | import org.jacodb.ets.model.EtsScene |
4 | 5 | import org.jacodb.ets.utils.ANONYMOUS_CLASS_PREFIX |
5 | 6 | import org.jacodb.ets.utils.ANONYMOUS_METHOD_PREFIX |
6 | 7 | import org.jacodb.ets.utils.CONSTRUCTOR_NAME |
7 | 8 | import org.jacodb.ets.utils.INSTANCE_INIT_METHOD_NAME |
8 | 9 | import org.jacodb.ets.utils.STATIC_INIT_METHOD_NAME |
9 | | -import org.jacodb.ets.utils.loadEtsProjectFromIR |
10 | | -import org.junit.jupiter.api.condition.EnabledIf |
| 10 | +import org.jacodb.ets.utils.loadEtsProjectAutoConvert |
| 11 | +import org.junit.jupiter.api.Tag |
11 | 12 | import org.usvm.machine.TsMachine |
12 | 13 | import org.usvm.machine.TsOptions |
13 | 14 | import org.usvm.util.TsMethodTestRunner |
14 | 15 | import org.usvm.util.getResourcePath |
15 | | -import org.usvm.util.getResourcePathOrNull |
16 | 16 | import kotlin.test.Test |
17 | 17 | import kotlin.time.Duration.Companion.seconds |
18 | 18 |
|
19 | | -@EnabledIf("projectAvailable") |
| 19 | +private val logger = KotlinLogging.logger {} |
| 20 | + |
| 21 | +@Tag("manual") |
20 | 22 | class RunOnDemoCalcProject : TsMethodTestRunner() { |
21 | 23 |
|
22 | 24 | companion object { |
23 | | - private const val PROJECT_PATH = "/projects/Demo_Calc/etsir/entry" |
24 | | - private const val SDK_PATH = "/sdk/ohos/etsir" |
25 | | - |
26 | | - @JvmStatic |
27 | | - private fun projectAvailable(): Boolean { |
28 | | - val isProjectPresent = getResourcePathOrNull(PROJECT_PATH) != null |
29 | | - val isSdkPreset = getResourcePathOrNull(SDK_PATH) != null |
30 | | - return isProjectPresent && isSdkPreset |
31 | | - } |
| 25 | + private const val PROJECT_PATH = "/projects/Demo_Calc/source/entry" |
| 26 | + private const val SDK_OHOS_PATH = "/sdk/ohos/5.0.1.111/ets" |
32 | 27 | } |
33 | 28 |
|
34 | 29 | override val scene: EtsScene = run { |
35 | | - val projectPath = getResourcePath(PROJECT_PATH) |
36 | | - val sdkPath = getResourcePathOrNull(SDK_PATH) |
37 | | - ?: error( |
38 | | - "Could not load SDK from resources '$SDK_PATH'. " + |
39 | | - "Try running './gradlew generateSdkIR' to generate it." |
40 | | - ) |
41 | | - loadEtsProjectFromIR(projectPath, sdkPath) |
| 30 | + val project = loadEtsProjectAutoConvert(getResourcePath(PROJECT_PATH)) |
| 31 | + val sdkFiles = listOf(SDK_OHOS_PATH).flatMap { sdk -> |
| 32 | + val sdkPath = getResourcePath(sdk) |
| 33 | + val sdkProject = loadEtsProjectAutoConvert(sdkPath, useArkAnalyzerTypeInference = null) |
| 34 | + sdkProject.projectFiles |
| 35 | + } |
| 36 | + EtsScene(project.projectFiles, sdkFiles, projectName = project.projectName) |
42 | 37 | } |
43 | 38 |
|
44 | 39 | @Test |
45 | | - fun `test run on each method`() { |
| 40 | + fun `test run on each class`() { |
46 | 41 | val exceptions = mutableListOf<Throwable>() |
47 | | - val classes = scene.projectClasses.filterNot { it.name.startsWith(ANONYMOUS_CLASS_PREFIX) } |
| 42 | + val classes = scene.projectClasses |
| 43 | + .filterNot { it.name.startsWith(ANONYMOUS_CLASS_PREFIX) } |
48 | 44 |
|
49 | 45 | println("Total classes: ${classes.size}") |
50 | 46 |
|
51 | | - classes |
52 | | - .forEach { cls -> |
53 | | - val methods = cls.methods |
54 | | - .filterNot { it.cfg.stmts.isEmpty() } |
55 | | - .filterNot { it.isStatic } |
56 | | - .filterNot { it.name.startsWith(ANONYMOUS_METHOD_PREFIX) } |
57 | | - .filterNot { it.name == "build" } |
58 | | - .filterNot { it.name == INSTANCE_INIT_METHOD_NAME } |
59 | | - .filterNot { it.name == STATIC_INIT_METHOD_NAME } |
60 | | - .filterNot { it.name == CONSTRUCTOR_NAME } |
61 | | - |
62 | | - if (methods.isEmpty()) return@forEach |
63 | | - |
64 | | - runCatching { |
65 | | - val tsOptions = TsOptions() |
66 | | - TsMachine(scene, options, tsOptions).use { machine -> |
67 | | - val states = machine.analyze(methods) |
68 | | - states.let {} |
69 | | - } |
70 | | - }.onFailure { |
71 | | - exceptions += it |
| 47 | + for (cls in classes) { |
| 48 | + logger.info { |
| 49 | + "Analyzing class ${cls.name} with ${cls.methods.size} methods" |
| 50 | + } |
| 51 | + |
| 52 | + val methods = cls.methods |
| 53 | + .filterNot { it.cfg.stmts.isEmpty() } |
| 54 | + .filterNot { it.isStatic } |
| 55 | + .filterNot { it.name.startsWith(ANONYMOUS_METHOD_PREFIX) } |
| 56 | + .filterNot { it.name == "build" } |
| 57 | + .filterNot { it.name == INSTANCE_INIT_METHOD_NAME } |
| 58 | + .filterNot { it.name == STATIC_INIT_METHOD_NAME } |
| 59 | + .filterNot { it.name == CONSTRUCTOR_NAME } |
| 60 | + |
| 61 | + if (methods.isEmpty()) continue |
| 62 | + |
| 63 | + runCatching { |
| 64 | + val tsOptions = TsOptions() |
| 65 | + TsMachine(scene, options, tsOptions).use { machine -> |
| 66 | + val states = machine.analyze(methods) |
| 67 | + states.let {} |
72 | 68 | } |
| 69 | + }.onFailure { |
| 70 | + exceptions += it |
73 | 71 | } |
| 72 | + } |
74 | 73 |
|
75 | 74 | val exc = exceptions.groupBy { it } |
76 | 75 | println("Total exceptions: ${exc.size}") |
|
0 commit comments