Skip to content

Commit 9575220

Browse files
authored
Merge pull request #652 from dwijnand/int-test-scala3-library
2 parents b20f56d + b92d342 commit 9575220

File tree

6 files changed

+80
-74
lines changed

6 files changed

+80
-74
lines changed

RELEASING.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ See the [prerequisites](#prerequisites) if this is your first release.
1010

1111
## Release checklist
1212

13-
* [ ] [Check Travis CI][travis-ci] passes against the latest Scala versions.
13+
* [ ] [Check CI][ci] passes against the latest Scala versions.
1414
* [ ] [Create a new milestone][milestones/new] for the release you are about to perform, if one [doesn't exist][milestones/list].
1515
* [ ] [Draft a new release][releases/new] for the release, by [comparing changes][compare/view].
1616
* [ ] Bump the version in the `README.md` and `git commit -am 'Release 0.x.y`.
@@ -43,14 +43,14 @@ See the [prerequisites](#prerequisites) if this is your first release.
4343
[repo1/list]: https://repo1.maven.org/maven2/com/typesafe/mima-core_2.12/0.5.0/
4444
[sonatype/guide]: https://central.sonatype.org/pages/releasing-the-deployment.html
4545
[sonatype/staging-repos]: https://oss.sonatype.org/#stagingRepositories
46-
[travis-ci]: https://travis-ci.com/github/lightbend/mima
46+
[ci]: https://github.com/lightbend/mima/actions/workflows/ci.yml
4747

4848
You are done!
4949

5050
## Prerequisites
5151

5252
* repo push rights
53-
* publishing crendentials for Sonatype, typically in `~/.sbt/1.0/credentials.sbt`:
53+
* publishing credentials for Sonatype, typically in `~/.sbt/1.0/credentials.sbt`:
5454

5555
```scala
5656
credentials += Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", <username>, <password>)

build.sbt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ val functionalTests = Project("functional-tests", file("functional-tests"))
8181
// ^ disabled b/c of "Build triggered by [..]/target/scala-2.12/v2-classes."
8282
testFunctional := (Test / test).value,
8383
Defaults.itSettings,
84-
Test / mainClass := Some("com.typesafe.tools.mima.lib.UnitTests"),
85-
IntegrationTest / mainClass := Some("com.typesafe.tools.mima.lib.IntegrationTests"),
84+
Test / mainClass := Some("com.typesafe.tools.mima.lib.UnitTests"),
85+
IntegrationTest / testOptions += Tests.Argument(TestFrameworks.MUnit, "-b"), // disable buffering => immediate output
8686
mimaFailOnNoPrevious := false,
8787
publish / skip := true,
8888
)
Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,27 @@
11
package com.typesafe.tools.mima.lib
22

3-
import munit._
3+
import scala.reflect.io.Directory
44

5-
class IntegrationTestSuite extends Suite {
6-
type TestValue = Unit
5+
import IntegrationTests._
76

8-
def munitTests() = IntegrationTests.munitTests
7+
class IntegrationTestSuite extends munit.FunSuite {
8+
itTest("scala-library-2-10")
9+
itTest("scala-library-2-11")
10+
itTest("scala-library-2-12")
11+
itTest("scala-library-2-13")
12+
13+
itTest("scala-reflect-2-10")
14+
itTest("scala-reflect-2-11")
15+
itTest("scala-reflect-2-12")
16+
itTest("scala-reflect-2-13")
17+
18+
itTest("java-9-module-info")
19+
20+
test("scala3-library")(testIntegration("org.scala-lang", "scala3-library_3", "3.0.0", "3.0.1")(
21+
excludeAnnots = List("scala.annotation.experimental"),
22+
))
23+
24+
def itTest(name: String)(implicit loc: munit.Location) = test(name) {
25+
testIntegrationDir(Directory(s"functional-tests/src/it/$name")).get
26+
}
927
}

functional-tests/src/main/scala/com/typesafe/tools/mima/lib/CollectProblemsTest.scala

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,30 @@ package com.typesafe.tools.mima.lib
33
import java.io.File
44
import java.nio.file.Files
55

6-
import com.typesafe.tools.mima.core.Problem
6+
import com.typesafe.tools.mima.core.ProblemFilter
77

88
import scala.collection.JavaConverters._
99
import scala.util.{ Failure, Success, Try }
1010

1111
object CollectProblemsTest {
1212
def testCollectProblems(testCase: TestCase, direction: Direction): Try[Unit] = for {
1313
() <- testCase.compileBoth
14-
problems = collectProblems(cp = Nil, testCase.outV1.jfile, testCase.outV2.jfile, direction)
14+
(v1, v2) = direction.ordered(testCase.outV1, testCase.outV2)
1515
expected = readOracleFile(testCase.versionedFile(direction.oracleFile).jfile)
16-
() <- diffProblems(problems, expected, direction)
16+
() <- collectAndDiff(cp = Nil, v1.jfile, v2.jfile)(
17+
expected,
18+
excludeAnnots = excludeAnnots,
19+
direction = direction,
20+
)
1721
} yield ()
1822

19-
def collectProblems(cp: Seq[File], v1: File, v2: File, direction: Direction): List[Problem] = {
20-
val (lhs, rhs) = direction.ordered(v1, v2)
21-
new MiMaLib(cp).collectProblems(lhs, rhs, excludeAnnots)
22-
}
23-
24-
def readOracleFile(oracleFile: File): List[String] = {
25-
Files.lines(oracleFile.toPath).iterator.asScala.filter(!_.startsWith("#")).toList
26-
}
27-
28-
def diffProblems(problems: List[Problem], expected: List[String], direction: Direction): Try[Unit] = {
23+
def collectAndDiff(cp: Seq[File], v1: File, v2: File)(
24+
expected: List[String] = Nil,
25+
problemFilter: ProblemFilter = _ => true,
26+
excludeAnnots: List[String] = Nil,
27+
direction: Direction = Backwards,
28+
): Try[Unit] = {
29+
val problems = new MiMaLib(cp).collectProblems(v1, v2, excludeAnnots).filter(problemFilter)
2930
val affectedVersion = direction match {
3031
case Backwards => "new"
3132
case Forwards => "other"
@@ -52,5 +53,9 @@ object CollectProblemsTest {
5253
}
5354
}
5455

56+
def readOracleFile(oracleFile: File): List[String] = {
57+
Files.lines(oracleFile.toPath).iterator.asScala.filter(!_.startsWith("#")).toList
58+
}
59+
5560
private val excludeAnnots = List("mima.annotation.exclude")
5661
}

functional-tests/src/main/scala/com/typesafe/tools/mima/lib/IntegrationTests.scala

Lines changed: 35 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,78 +7,62 @@ import scala.reflect.io.Directory
77
import scala.util.{ Failure, Success, Try }
88

99
import com.typesafe.config.ConfigFactory
10-
import com.typesafe.tools.mima.core.{ Problem, ProblemFilters }
10+
import com.typesafe.tools.mima.core.{ ProblemFilter, ProblemFilters }
1111
import coursier._
12-
import munit.GenericTest
1312

14-
object IntegrationTests {
15-
def main(args: Array[String]): Unit = fromArgs(args.toList).unsafeRunTest()
16-
def munitTests(): List[GenericTest[Unit]] = fromArgs(Nil).munitTests
13+
import CollectProblemsTest._, IntegrationTests._
1714

18-
def fromArgs(args: List[String]): Tests = {
19-
val dirs = Directory("functional-tests/src/it").dirs.filter(args match {
20-
case Seq() => dir => dir.files.exists(_.name == "test.conf")
21-
case names => dir => names.contains(dir.name)
22-
}).toList.sortBy(_.path)
23-
Tests(dirs.map(dir => Test(dir.name, testIntegration(dir))))
15+
object IntegrationTests {
16+
def testIntegrationDir(baseDir: Directory): Try[Unit] = {
17+
val conf = ConfigFactory.parseFile((baseDir / "test.conf").jfile)
18+
.withFallback(ConfigFactory.parseString("filter.problems = []"))
19+
.resolve()
20+
val problemFilter = conf.getConfigList("filter.problems").asScala.map { conf =>
21+
ProblemFilters.exclude(conf.getString("problemName"), conf.getString("matchName"))
22+
}.foldAll
23+
val direction = Backwards
24+
testIntegration(
25+
conf.getString("groupId"),
26+
conf.getString("artifactId"),
27+
conf.getString("v1"),
28+
conf.getString("v2"),
29+
)(readOracleFile((baseDir / direction.oracleFile).jfile), problemFilter)
2430
}
2531

26-
def testIntegration(baseDir: Directory): Try[Unit] = {
27-
val conf = ConfigFactory.parseFile((baseDir / "test.conf").jfile).resolve()
28-
val groupId = conf.getString("groupId")
29-
val artifactId = conf.getString("artifactId")
32+
def testIntegration(groupId: String, artifactId: String, v1: String, v2: String)(
33+
expected: List[String] = Nil,
34+
problemFilter: ProblemFilter = _ => true,
35+
excludeAnnots: List[String] = Nil,
36+
moduleAttrs: Map[String, String] = Map.empty,
37+
) = {
38+
val module = Module(Organization(groupId), ModuleName(artifactId), moduleAttrs)
3039
for {
31-
(v1, _) <- getArtifact(groupId, artifactId, conf.getString("v1"))
32-
(v2, cp) <- getArtifact(groupId, artifactId, conf.getString("v2"))
33-
problemFilter <- getProblemFilter(baseDir.jfile)
34-
() <- testCollectProblems(baseDir, problemFilter, cp, v1, v2, Backwards)
35-
//() <- testCollectProblems(baseDir, problemFilter, cp, v1, v2, Forwards)
40+
(v1, _) <- fetchArtifact(Dependency(module, v1))
41+
(v2, cp) <- fetchArtifact(Dependency(module, v2))
42+
() <- collectAndDiff(cp, v1, v2)(expected, problemFilter, excludeAnnots)
3643
} yield ()
3744
}
3845

39-
def getArtifact(groupId: String, artifactId: String, version: String): Try[(File, Seq[File])] = {
40-
fetchArtifact(Dependency(Module(Organization(groupId), ModuleName(artifactId)), version))
41-
}
42-
4346
def fetchArtifact(dep: Dependency): Try[(File, Seq[File])] = {
4447
Coursier.fetch(dep) match {
45-
case Nil => Failure(sys.error(s"Could not resolve artifact: $dep"))
4648
case Seq(jar, cp @ _*) => Success((jar, cp))
49+
case _ => Failure(sys.error(s"Could not resolve artifact: $dep"))
4750
}
4851
}
4952

50-
def getProblemFilter(baseDir: File): Try[Problem => Boolean] = Try {
51-
val configFile = new File(baseDir, "test.conf")
52-
val configFallback = ConfigFactory.parseString("filter { problems = [] }")
53-
val config = ConfigFactory.parseFile(configFile).withFallback(configFallback).resolve()
54-
val filters = for (conf <- config.getConfigList("filter.problems").asScala)
55-
yield ProblemFilters.exclude(conf.getString("problemName"), conf.getString("matchName"))
56-
(p: Problem) => filters.forall(filter => filter(p))
57-
}
58-
59-
def testCollectProblems(baseDir: Directory, problemFilter: Problem => Boolean, cp: Seq[File], v1: File, v2: File, direction: Direction): Try[Unit] = {
60-
val problems = CollectProblemsTest.collectProblems(cp, v1, v2, direction).filter(problemFilter)
61-
val expected = CollectProblemsTest.readOracleFile((baseDir / direction.oracleFile).jfile)
62-
CollectProblemsTest.diffProblems(problems, expected, direction)
53+
implicit class PredicatesOps[A](private val ps: Iterable[A => Boolean]) extends AnyVal {
54+
def foldAll: A => Boolean = (x: A) => ps.forall(p => p(x))
55+
def foldAny: A => Boolean = (x: A) => ps.exists(p => p(x))
6356
}
6457
}
6558

6659
object CompareJars {
6760
def main(args: Array[String]): Unit = args.toList match {
68-
case Seq(file) => runTry(compare(new File(file), new File(file), Nil))
69-
case Seq(groupId, artifactId, version1, version2, attrStrs @ _*) =>
61+
case Seq(file) =>
62+
runTry(collectAndDiff(Nil, new File(file), new File(file))())
63+
case Seq(groupId, artifactId, v1, v2, attrStrs @ _*) =>
7064
val attrs = attrStrs.map { s => val Array(k, v) = s.split('='); k -> v }.toMap
71-
val module = Module(Organization(groupId), ModuleName(artifactId)).withAttributes(attrs)
72-
runTry(for {
73-
(v1, _) <- IntegrationTests.fetchArtifact(Dependency(module, version1))
74-
(v2, cp) <- IntegrationTests.fetchArtifact(Dependency(module, version2))
75-
() <- compare(v1, v2, cp)
76-
} yield ())
77-
}
78-
79-
def compare(v1: File, v2: File, cp: Seq[File], direction: Direction = Backwards): Try[Unit] = {
80-
val problems = CollectProblemsTest.collectProblems(cp, v1, v2, direction)
81-
CollectProblemsTest.diffProblems(problems, Nil, direction)
65+
runTry(testIntegration(groupId, artifactId, v1, v2)(moduleAttrs = attrs))
8266
}
8367

8468
def runTry(tri: Try[Unit]) = tri match {

project/plugins.sbt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,3 @@ resolvers ++= (if (isStaging) List(stagingResolver) else Nil)
1414
addSbtPlugin("com.dwijnand" % "sbt-dynver" % "4.1.1")
1515
addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2")
1616
addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "0.9.2")
17-
addSbtPlugin("com.dwijnand" % "sbt-travisci" % "1.2.0")

0 commit comments

Comments
 (0)