From 95542897861b9a3e3d6f1f4a917fca18f29be01e Mon Sep 17 00:00:00 2001 From: Roman Langolf Date: Mon, 11 Mar 2024 11:53:46 +0700 Subject: [PATCH] add custom protocol hadler test --- build.sbt | 3 +- .../loader/MavenRepoMetadataLoader.scala | 5 +-- .../sbt/service/VersionServiceSpec.scala | 31 +++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index 3521ed8..4717da5 100644 --- a/build.sbt +++ b/build.sbt @@ -16,7 +16,8 @@ inThisBuild(List( "yanbo.ai@gmail.com", url("https://aiyanbo.github.io/") ) - ) + ), + Test / fork := true )) coverageScalacPluginVersion := "2.0.10" diff --git a/src/main/scala/org/jmotor/sbt/artifact/metadata/loader/MavenRepoMetadataLoader.scala b/src/main/scala/org/jmotor/sbt/artifact/metadata/loader/MavenRepoMetadataLoader.scala index 46f4d2e..b802172 100644 --- a/src/main/scala/org/jmotor/sbt/artifact/metadata/loader/MavenRepoMetadataLoader.scala +++ b/src/main/scala/org/jmotor/sbt/artifact/metadata/loader/MavenRepoMetadataLoader.scala @@ -27,8 +27,9 @@ class MavenRepoMetadataLoader(url: String)(implicit ec: ExecutionContext) extend artifactId: String, attrs: Map[String, String] ): Future[Seq[ArtifactVersion]] = { - val location = - protocol + s"$base/${organization.split('.').mkString("/")}/$artifactId/maven-metadata.xml" + val location = new URI(s"$protocol$base/${organization.split('.').mkString("/")}/$artifactId/maven-metadata.xml") + .normalize() + .toString() download(organization, artifactId, location).map { file => val stream = Files.newInputStream(file) try { diff --git a/src/test/scala/org/jmotor/sbt/service/VersionServiceSpec.scala b/src/test/scala/org/jmotor/sbt/service/VersionServiceSpec.scala index d03a0b2..cdd7b45 100644 --- a/src/test/scala/org/jmotor/sbt/service/VersionServiceSpec.scala +++ b/src/test/scala/org/jmotor/sbt/service/VersionServiceSpec.scala @@ -7,6 +7,8 @@ import sbt.util.Logger import scala.concurrent.Await import scala.concurrent.duration.* +import java.net.{URI, URL, URLConnection, URLStreamHandler, URLStreamHandlerFactory} +import java.util.concurrent.atomic.AtomicReference /** Component: Description: Date: 2018/3/1 * @@ -57,4 +59,33 @@ class VersionServiceSpec extends AnyFunSuite { assert(status.status == Status.Expired) } + test("uses custom protocol handlers") { + val downloadsCalled = new AtomicReference(Vector.empty[String]) + + // setting stream handler can be executed only once on jvm + // to be able to execute it multiple times from sbt shell it requires forking enabled like "Test / fork := true" + URL.setURLStreamHandlerFactory(new URLStreamHandlerFactory { + def createURLStreamHandler(protocol: String): URLStreamHandler = protocol match { + case "artifactregistry" => + new URLStreamHandler { + protected def openConnection(url: URL): URLConnection = { + downloadsCalled.getAndUpdate(_ :+ url.toString()) + new URI(s"https://${url.getHost}${url.getPath()}").normalize.toURL.openConnection + } + } + case _ => null + } + }) + + val testResolver = MavenRepo("m2", "artifactregistry://repo1.maven.org/maven2/") + val versionService = VersionService(Logger.Null, "2.12.4", "2.12", Seq(testResolver), Seq.empty) + Await.result(versionService.checkForUpdates(ModuleID("com.google.guava", "guava", "23.0-jre")), 30.seconds) + + assert( + downloadsCalled + .get() + .contains("artifactregistry://repo1.maven.org/maven2/com/google/guava/guava/maven-metadata.xml") + ) + } + }