Refactured initial scalatest setup.

This commit is contained in:
Achim D. Brucker 2016-08-29 22:47:33 +01:00
parent 9c27279a2a
commit fca31dfc39
2 changed files with 55 additions and 39 deletions

View File

@ -25,11 +25,16 @@ import eu.aniketos.dasca.crosslanguage.util.SourceLocation
import eu.aniketos.dasca.crosslanguage.builder.FilterJSFrameworks
import scala.collection.mutable.LinkedHashSet
import com.ibm.wala.classLoader.IMethod
import eu.aniketos.dasca.crosslanguage.builder.CrossBuilderOption
import eu.aniketos.dasca.crosslanguage.builder.FilterJavaCallSites
import eu.aniketos.dasca.crosslanguage.builder.MockCordovaExec
import eu.aniketos.dasca.crosslanguage.builder.ReplacePluginDefinesAndRequires
import eu.aniketos.dasca.crosslanguage.builder.FilterJSFrameworks
import eu.aniketos.dasca.crosslanguage.builder.PreciseJS
import eu.aniketos.dasca.crosslanguage.builder.RunBuildersInParallel
class AppTest(apk:String, expectedConnections:Set[(SourceLocation, SourceLocation)]){
class AppTest {
def apkDir = "src/main/resources/";
private var js2JavaHits = -1;
private var js2JavaMisses = -1;
private var js2JavaTotal = -1;
@ -57,7 +62,6 @@ class AppTest(apk:String, expectedConnections:Set[(SourceLocation, SourceLocatio
100.0 * js2JavaHits / js2JavaTotal
}
def getJava2JSHits() = {
java2JSHits
}
@ -92,13 +96,12 @@ class AppTest(apk:String, expectedConnections:Set[(SourceLocation, SourceLocatio
def getFalsePositives() = {
falsePositives
}
def analyze() = {
val builder = CordovaCGBuilder(new File(apkDir,apk))
val mcg = builder.createCallGraph
val crossTargets = mcg.getAllCrossTargets
def analyze(apk:String, options:List[CrossBuilderOption], expectedConnections:Set[(SourceLocation, SourceLocation)]):Boolean = {
val builder = CordovaCGBuilder(new File(apkDir, apk))
builder.setOptions(options:_*)
val crossTargets = builder.createCallGraph.getAllCrossTargets
val convertedCrossTargets = convertToSourceLocationPairs(crossTargets)
val (javaPairs, jsPairs) = convertedCrossTargets.partition({case (origin, target) => origin.isInstanceOf[JavaSourceLocation]})
java2JSTotal = javaPairs.size
js2JavaTotal = jsPairs.size
@ -111,9 +114,10 @@ class AppTest(apk:String, expectedConnections:Set[(SourceLocation, SourceLocatio
truePositives = found
falseNegatives = notFound
falsePositives = convertedCrossTargets -- expectedConnections
true
}
def convertToSourceLocationPairs(crossTargets: Map[(CGNode, CallSiteReference), LinkedHashSet[CGNode]]): Set[(SourceLocation, SourceLocation)] = {
def convertToSourceLocationPairs(crossTargets: Map[(CGNode, CallSiteReference), LinkedHashSet[CGNode]]): Set[(SourceLocation, SourceLocation)] = {
for (
origin <- crossTargets.keys;
target <- crossTargets.get(origin).get
@ -131,4 +135,7 @@ class AppTest(apk:String, expectedConnections:Set[(SourceLocation, SourceLocatio
}
}
}.toSet
}

View File

@ -18,9 +18,17 @@ import org.scalatest.junit.JUnitRunner
import eu.aniketos.dasca.crosslanguage.util.JavaScriptSourceLocation
import eu.aniketos.dasca.crosslanguage.util.JavaSourceLocation
import eu.aniketos.dasca.crosslanguage.util.SourceLocation
import eu.aniketos.dasca.crosslanguage.builder.CrossBuilderOption
import eu.aniketos.dasca.crosslanguage.builder.FilterJavaCallSites
import eu.aniketos.dasca.crosslanguage.builder.MockCordovaExec
import eu.aniketos.dasca.crosslanguage.builder.ReplacePluginDefinesAndRequires
import eu.aniketos.dasca.crosslanguage.builder.FilterJSFrameworks
import eu.aniketos.dasca.crosslanguage.builder.PreciseJS
import eu.aniketos.dasca.crosslanguage.builder.RunBuildersInParallel
@RunWith(classOf[JUnitRunner])
class FeatherweightInfoTest extends FlatSpec with Matchers {
class FeatherweightInfoTest extends FlatSpec with Matchers with BeforeAndAfterAll {
def ApkName: String = "de.zertapps.dvhma.featherweight.apk"
def connections = Set[(SourceLocation, SourceLocation)](
(new JavaSourceLocation(43, "com/borismus/webintent/WebIntent"), new JavaScriptSourceLocation(31, 12, "www/js/index.js"))
@ -39,69 +47,70 @@ class FeatherweightInfoTest extends FlatSpec with Matchers {
,(new JavaScriptSourceLocation(16, 12, "www/plugins/de.zertapps.dvhma.plugins.storage/www/DVHMA-Storage.js"), new JavaSourceLocation(43, "de/zertapps/dvhma/plugins/storage/DVHMAStorage"))
,(new JavaScriptSourceLocation(20, 12, "www/plugins/de.zertapps.dvhma.plugins.storage/www/DVHMA-Storage.js"), new JavaSourceLocation(43, "de/zertapps/dvhma/plugins/storage/DVHMAStorage"))
)
def fixture =
new {
val app = new AppTest(ApkName, connections);
app.analyze();
}
def options = List(
FilterJavaCallSites
,MockCordovaExec
,ReplacePluginDefinesAndRequires
,FilterJSFrameworks
)
val app = new AppTest();
override def beforeAll(){
app.analyze(ApkName, options, connections)
}
"Java -> JavaScript" should "report ten hits" in {
fixture.app.getJS2JavaHits() should be (10)
app.getJava2JSHits() should be (10)
}
it should "report no misses" in {
fixture.app.getJS2JavaMisses() should be (0)
app.getJS2JavaMisses() should be (0)
}
it should "report no errors" in {
fixture.app.getJS2JavaErrors() should be (0)
app.getJS2JavaErrors() should be (0)
}
it should "have a precision of 100%" in {
fixture.app.getJS2JavaPrecision() should be (100.0 +- 0.1)
app.getJS2JavaPrecision() should be (100.0 +- 0.1)
}
it should "have a recall of 100%" in {
fixture.app.getJS2JavaRecall() should be (100.0 +- 0.1)
}
app.getJS2JavaRecall() should be (100.0 +- 0.1)
}
"JavaScript -> Java" should "report ten hits" in {
fixture.app.getJS2JavaHits() should be (5)
"JavaScript -> Java" should "report five hits" in {
app.getJS2JavaHits() should be (5)
}
it should "report no misses" in {
fixture.app.getJS2JavaMisses() should be (0)
app.getJS2JavaMisses() should be (0)
}
it should "report no errors" in {
fixture.app.getJS2JavaErrors() should be (0)
app.getJS2JavaErrors() should be (0)
}
it should "have a precision of 100%" in {
fixture.app.getJS2JavaPrecision() should be (100.0 +- 0.1)
app.getJS2JavaPrecision() should be (100.0 +- 0.1)
}
it should "have a recall of 100%" in {
fixture.app.getJS2JavaRecall() should be (100.0 +- 0.1)
app.getJS2JavaRecall() should be (100.0 +- 0.1)
}
"Reported connections" should "contain all expected connections" in {
fixture.app.getTruePositives() should contain theSameElementsAs connections
app.getTruePositives() should contain theSameElementsAs connections
}
it should "not contain false negatives" in {
fixture.app.getFalseNegatives() shouldBe empty
app.getFalseNegatives() shouldBe empty
}
it should "not contain false positives" in {
fixture.app.getFalsePositives() shouldBe empty
app.getFalsePositives() shouldBe empty
}
}