From 83d3d7fa8f14f0b30742289ea25cd8d2bea01ac0 Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Wed, 14 Aug 2024 13:42:59 +0200 Subject: [PATCH] Make `--offline` tests resilient to unannounced Scala versions --- build.sc | 1 + .../cli/integration/RunTestDefinitions.scala | 60 +++++++++++++++---- project/deps.sc | 7 ++- 3 files changed, 52 insertions(+), 16 deletions(-) diff --git a/build.sc b/build.sc index f12e6e989f..98febbb36f 100644 --- a/build.sc +++ b/build.sc @@ -1000,6 +1000,7 @@ trait CliIntegration extends SbtModule with ScalaCliPublishModule with HasTests | def scala3Lts = "${Scala.scala3Lts}" | def scala3NextRc = "${Scala.scala3NextRc}" | def scala3Next = "${Scala.scala3Next}" + | def scala3NextAnnounced = "${Scala.scala3NextAnnounced}" | def defaultScala = "${Scala.defaultUser}" | def defaultScalafmtVersion = "${Deps.scalafmtCli.dep.version}" | def maxAmmoniteScala212Version = "${Scala.maxAmmoniteScala212Version}" diff --git a/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala b/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala index ab14e2ca3b..4fe1f2c065 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/RunTestDefinitions.scala @@ -1967,13 +1967,42 @@ abstract class RunTestDefinitions } } - if (!actualScalaVersion.contains("RC")) - test("offline mode should fail on missing artifacts") { + if (!actualScalaVersion.contains("RC")) { + val actualAnnouncedScalaVersion = actualScalaVersion match { + case _ + if actualScalaVersion == Constants.scala3Next && + Constants.scala3Next != Constants.scala3NextAnnounced => + // if the version isn't public yet, Coursier won't be able to install it + Constants.scala3NextAnnounced + case s => s + } + + test( + s"offline mode should fail on missing artifacts (with Scala $actualAnnouncedScalaVersion)" + ) { // Kill bloop deamon to test scalac fallback os.proc(TestUtil.cli, "--power", "bloop", "exit") .call(cwd = os.pwd) - val depScalaVersion = actualScalaVersion match { + // ensure extra options use an announced Scala version + val customExtraOptions: Seq[String] = + if ( + scalaVersionOpt.isEmpty && + Constants.scala3Next != Constants.scala3NextAnnounced + ) + extraOptions ++ Seq("--scala", actualAnnouncedScalaVersion) + else if ( + actualScalaVersion == Constants.scala3Next && + actualScalaVersion != actualAnnouncedScalaVersion + ) + extraOptions + .map { + case opt if opt == Constants.scala3Next => actualAnnouncedScalaVersion + case opt => opt + } + else extraOptions + + val depScalaVersion = actualAnnouncedScalaVersion match { case sv if sv.startsWith("2.12") => "2.12" case sv if sv.startsWith("2.13") => "2.13" case _ => "3" @@ -2008,7 +2037,7 @@ abstract class RunTestDefinitions TestUtil.cli, "--power", "NoDeps.scala", - extraOptions, + customExtraOptions, "--offline", "--cache", cachePath.toString @@ -2020,19 +2049,23 @@ abstract class RunTestDefinitions expect(emptyCacheWalkSize == os.walk(cachePath).size) // Download the artifacts for scala - os.proc(TestUtil.cs, "install", s"scala:$actualScalaVersion") + os.proc(TestUtil.cs, "install", s"scala:$actualAnnouncedScalaVersion") .call(cwd = root, env = extraEnv) - os.proc(TestUtil.cs, "install", s"scalac:$actualScalaVersion") + os.proc(TestUtil.cs, "install", s"scalac:$actualAnnouncedScalaVersion") .call(cwd = root, env = extraEnv) - (if (actualScalaVersion.startsWith("3")) Some("scala3-sbt-bridge") + (if (actualAnnouncedScalaVersion.startsWith("3")) Some("scala3-sbt-bridge") else if ( - actualScalaVersion.startsWith("2.13.") && - actualScalaVersion.coursierVersion >= "2.13.12".coursierVersion + actualAnnouncedScalaVersion.startsWith("2.13.") && + actualAnnouncedScalaVersion.coursierVersion >= "2.13.12".coursierVersion ) Some("scala2-sbt-bridge") else None) .foreach { bridgeArtifactName => - os.proc(TestUtil.cs, "fetch", s"org.scala-lang:$bridgeArtifactName:$actualScalaVersion") + os.proc( + TestUtil.cs, + "fetch", + s"org.scala-lang:$bridgeArtifactName:$actualAnnouncedScalaVersion" + ) .call(cwd = root, env = extraEnv) } @@ -2046,7 +2079,7 @@ abstract class RunTestDefinitions TestUtil.cli, "--power", "NoDeps.scala", - extraOptions, + customExtraOptions, "--offline", "--cache", cachePath.toString, @@ -2076,7 +2109,7 @@ abstract class RunTestDefinitions "--power", cliOption, "WithDeps.scala", - extraOptions, + customExtraOptions, "--cache", cachePath.toString ) @@ -2098,7 +2131,7 @@ abstract class RunTestDefinitions TestUtil.cli, "--power", "WithDeps.scala", - extraOptions, + customExtraOptions, "--offline", "--cache", cachePath.toString, @@ -2118,6 +2151,7 @@ abstract class RunTestDefinitions expect(withDependencyCacheWalkSize == os.walk(cachePath).size) } } + } test("JVM id is printed with compilation info correctly") { val msg = "Hello" diff --git a/project/deps.sc b/project/deps.sc index c3fbf8b18f..6099af09b4 100644 --- a/project/deps.sc +++ b/project/deps.sc @@ -7,9 +7,10 @@ object Scala { def scala213 = "2.13.14" def runnerScala3 = "3.0.2" // the newest version that is compatible with all Scala 3.x versions def scala3LtsPrefix = "3.3" // used for the LTS version tags - def scala3Lts = s"$scala3LtsPrefix.3" // the LTS version currently used in the build - def scala3Next = "3.4.2" // the newest/next version of Scala - def scala3NextRc = "3.5.0-RC7" // the latest RC version of Scala Next + def scala3Lts = s"$scala3LtsPrefix.3" // the LTS version currently used in the build + def scala3Next = "3.4.2" // the newest/next version of Scala + def scala3NextAnnounced = scala3Next // the newest/next version of Scala that's been announced + def scala3NextRc = "3.5.0-RC7" // the latest RC version of Scala Next // The Scala version used to build the CLI itself. def defaultInternal = sys.props.get("scala.version.internal").getOrElse(scala3Lts)