From 182eb825c8e3141529b12a68ffae20820ee27fca Mon Sep 17 00:00:00 2001 From: Moritz Kiefer Date: Wed, 17 Feb 2021 12:34:25 +0100 Subject: [PATCH] Port Ledger API Test Tool to Scala 2.13 (#8875) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Port Ledger API Test Tool to Scala 2.13 And with that we’re finally at //... building on Scala 2.13. changelog_begin changelog_end * Fix build on 2.12 changelog_begin changelog_end * Fix kvutils export on 2.13 changelog_begin changelog_end --- ci/build.yml | 10 +---- ledger/ledger-api-test-tool/BUILD.bazel | 39 +++++++++++++------ ledger/ledger-api-test-tool/conformance.bzl | 2 +- .../com/daml/ledger/api/testtool/Cli.scala | 4 +- .../api/testtool/LedgerApiTestTool.scala | 7 +++- .../testtool/infrastructure/Assertions.scala | 2 +- .../infrastructure/BenchmarkReporter.scala | 2 +- .../testtool/infrastructure/Envelope.scala | 2 +- .../LedgerTestCasesRunner.scala | 2 +- .../testtool/infrastructure/Reporter.scala | 2 +- .../suites/PackageManagementServiceIT.scala | 3 +- .../suites/PartyManagementServiceIT.scala | 3 +- .../testtool/suites/PerformanceEnvelope.scala | 2 +- .../suites/TransactionServiceIT.scala | 3 +- ledger/participant-state/kvutils/BUILD.bazel | 4 +- .../non-repudiation-postgresql/BUILD.bazel | 5 +-- .../NonRepudiationProxyConformance.scala | 6 +-- 17 files changed, 59 insertions(+), 39 deletions(-) diff --git a/ci/build.yml b/ci/build.yml index 5d5a29d3ac..3e98f0c6ac 100644 --- a/ci/build.yml +++ b/ci/build.yml @@ -175,14 +175,8 @@ jobs: - bash: | set -euo pipefail eval "$(./dev-env/bin/dade-assist)" - bazel build --config scala_2_13 -- \ - //... \ - -//ledger/ledger-api-test-tool/... \ - -//runtime-components/non-repudiation-postgresql:test - bazel test --config scala_2_13 -- \ - //... \ - -//ledger/ledger-api-test-tool/... \ - -//runtime-components/non-repudiation-postgresql:test + bazel build --config scala_2_13 //... + bazel test --config scala_2_13 //... displayName: 'Build' - template: tell-slack-failed.yml parameters: diff --git a/ledger/ledger-api-test-tool/BUILD.bazel b/ledger/ledger-api-test-tool/BUILD.bazel index 8690bba138..475d59ac37 100644 --- a/ledger/ledger-api-test-tool/BUILD.bazel +++ b/ledger/ledger-api-test-tool/BUILD.bazel @@ -24,6 +24,7 @@ load( "da_scala_binary", "da_scala_library", "da_scala_test_suite", + "silencer_plugin", ) load( ":conformance.bzl", @@ -52,6 +53,10 @@ dar_to_scala( da_scala_library( name = "PackageManagementTest.scala", srcs = [":PackageManagementTest.scala-codegen"], + plugins = [silencer_plugin], + scalacopts = [ + "-P:silencer:lineContentFilters=import _root_.scala.language.higherKinds;", + ], deps = [ "//language-support/scala/bindings", ], @@ -105,6 +110,13 @@ EOF generated_srcs = [ ":DarsResourceNames%s.scala" % lf_version_suffix, ], + scala_deps = [ + "@maven//:com_softwaremill_diffx_diffx_core", + "@maven//:com_typesafe_akka_akka_actor", + "@maven//:com_typesafe_akka_akka_stream", + "@maven//:org_scala_lang_modules_scala_collection_compat", + "@maven//:org_scala_lang_modules_scala_java8_compat", + ], visibility = [ "//:__subpackages__", ], @@ -119,20 +131,26 @@ EOF "//libs-scala/resources-akka", "//libs-scala/resources-grpc", "//libs-scala/timer-utils", - "@maven//:com_softwaremill_diffx_diffx_core_2_12", - "@maven//:com_typesafe_akka_akka_actor_2_12", - "@maven//:com_typesafe_akka_akka_stream_2_12", "@maven//:com_typesafe_config", "@maven//:io_netty_netty_common", "@maven//:io_netty_netty_transport", - "@maven//:org_scala_lang_modules_scala_collection_compat_2_12", - "@maven//:org_scala_lang_modules_scala_java8_compat_2_12", "@maven//:org_slf4j_slf4j_api", ], ), da_scala_library_suite( name = "ledger-api-test-tool-test-suites%s" % lf_version_suffix, srcs = glob(["src/main/scala/com/daml/ledger/api/testtool/suites/**/*.scala"]), + plugins = [silencer_plugin], + scala_deps = [ + "@maven//:com_chuusai_shapeless", + "@maven//:com_propensive_magnolia", # transitive dependency of diffx + "@maven//:com_propensive_mercator", # transitive dependency of diffx + "@maven//:com_softwaremill_diffx_diffx_core", + "@maven//:org_scala_lang_modules_scala_collection_compat", + ], + scalacopts = [ + "-P:silencer:lineContentFilters=import scala.collection.compat._", + ], scaladoc = False, visibility = [ "//:__subpackages__", @@ -149,13 +167,8 @@ EOF "//ledger/test-common:semantic-tests%s.scala" % lf_version_suffix, "//libs-scala/grpc-utils", "//libs-scala/timer-utils", - "@maven//:com_chuusai_shapeless_2_12", - "@maven//:com_propensive_magnolia_2_12", # transitive dependency of diffx - "@maven//:com_propensive_mercator_2_12", # transitive dependency of diffx - "@maven//:com_softwaremill_diffx_diffx_core_2_12", "@maven//:io_grpc_grpc_api", "@maven//:io_grpc_grpc_context", - "@maven//:org_scala_lang_modules_scala_collection_compat_2_12", "@maven//:org_slf4j_slf4j_api", ], ), @@ -183,6 +196,7 @@ EOF ":DarsResourceNames%s.scala" % lf_version_suffix, ], main_class = "com.daml.ledger.api.testtool.LedgerApiTestTool", + plugins = [silencer_plugin], resources = [ "src/main/resources/logback.xml", ":PackageManagementTest.dar", @@ -190,6 +204,10 @@ EOF ], scala_deps = [ "@maven//:org_scala_lang_modules_scala_collection_compat", + "@maven//:com_github_scopt_scopt", + ], + scalacopts = [ + "-P:silencer:lineContentFilters=import scala.collection.compat._", ], tags = [ "maven_coordinates=com.daml:ledger-api-test-tool%s:__VERSION__" % lf_version_suffix, @@ -210,7 +228,6 @@ EOF "//libs-scala/resources", "//libs-scala/resources-akka", "//libs-scala/resources-grpc", - "@maven//:com_github_scopt_scopt_2_12", "@maven//:io_grpc_grpc_api", "@maven//:io_grpc_grpc_core", "@maven//:io_grpc_grpc_netty", diff --git a/ledger/ledger-api-test-tool/conformance.bzl b/ledger/ledger-api-test-tool/conformance.bzl index 452ece33f4..021ea2660a 100644 --- a/ledger/ledger-api-test-tool/conformance.bzl +++ b/ledger/ledger-api-test-tool/conformance.bzl @@ -34,7 +34,7 @@ def conformance_test( "exclusive", ] + tags, flaky = flaky, - ) if not is_windows and scala_major_version == "2.12" else None + ) if not is_windows else None def server_conformance_test(name, servers, server_args = [], test_tool_args = [], flaky = False): for server_name, server in servers.items(): diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Cli.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Cli.scala index 4a230b056a..99a0b0ba6b 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Cli.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/Cli.scala @@ -12,6 +12,7 @@ import com.daml.ledger.api.testtool.tests.Tests import com.daml.ledger.api.tls.TlsConfiguration import scopt.{OptionParser, Read} +import scala.collection.compat.immutable.LazyList import scala.concurrent.duration.{DurationInt, FiniteDuration} import scala.util.Try @@ -231,7 +232,8 @@ object Cli { private def oneOfRead[T](readersHead: Read[T], readersTail: Read[T]*): Read[T] = Read.reads { str => - val results = (readersHead #:: Stream(readersTail: _*)).map(reader => Try(reader.reads(str))) + val results = + (readersHead #:: LazyList(readersTail: _*)).map(reader => Try(reader.reads(str))) results.find(_.isSuccess) match { case Some(value) => value.get case None => results.head.get // throw the first failure diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/LedgerApiTestTool.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/LedgerApiTestTool.scala index 6abfdc693c..4cad6c0f46 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/LedgerApiTestTool.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/LedgerApiTestTool.scala @@ -15,6 +15,7 @@ import io.grpc.Channel import io.grpc.netty.{NegotiationType, NettyChannelBuilder} import org.slf4j.LoggerFactory +import scala.collection.compat._ import scala.concurrent.duration.DurationInt import scala.concurrent.{ExecutionContext, Future} import scala.util.{Failure, Success} @@ -126,7 +127,11 @@ object LedgerApiTestTool { } val performanceTestsToRun = - Tests.performanceTests(config.performanceTestsReport).filterKeys(config.performanceTests) + Tests + .performanceTests(config.performanceTestsReport) + .view + .filterKeys(config.performanceTests) + .toMap if (config.included.nonEmpty && performanceTestsToRun.nonEmpty) { println("Either regular or performance tests can be run, but not both.") diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Assertions.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Assertions.scala index 908559f2b7..188d06a369 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Assertions.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Assertions.scala @@ -10,7 +10,7 @@ import com.daml.grpc.{GrpcException, GrpcStatus} import io.grpc.Status import scala.concurrent.Future -import scala.language.{higherKinds, implicitConversions} +import scala.language.implicitConversions import scala.util.control.NonFatal object Assertions extends DiffExtensions { diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/BenchmarkReporter.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/BenchmarkReporter.scala index 437bcf202d..9abf36871a 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/BenchmarkReporter.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/BenchmarkReporter.scala @@ -6,7 +6,7 @@ package com.daml.ledger.api.testtool.infrastructure import java.io.PrintStream import java.nio.file.{Files, Path, StandardOpenOption} -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ trait BenchmarkReporter { diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Envelope.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Envelope.scala index 4c4899d31c..dde2ecbcfe 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Envelope.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Envelope.scala @@ -9,7 +9,7 @@ import scala.collection.immutable import scala.concurrent.duration.Duration sealed abstract class Envelope(val name: String) extends Product with Serializable { - def this(names: Vector[String]) { + def this(names: Vector[String]) = { this(names.mkString(Envelope.Separator)) } } diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/LedgerTestCasesRunner.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/LedgerTestCasesRunner.scala index 172d3983e9..af93542824 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/LedgerTestCasesRunner.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/LedgerTestCasesRunner.scala @@ -59,7 +59,7 @@ final class LedgerTestCasesRunner( private def start(test: LedgerTestCase, session: LedgerSession)(implicit executionContext: ExecutionContext ): Future[Duration] = { - val execution = Promise[Duration] + val execution = Promise[Duration]() val scaledTimeout = DefaultTimeout * timeoutScaleFactor * test.timeoutScale val startedTest = diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Reporter.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Reporter.scala index 09025bbe91..5ce5072703 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Reporter.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/infrastructure/Reporter.scala @@ -52,7 +52,7 @@ object Reporter { private def indented(msg: String, n: Int = 2): String = { val indent = " " * n - msg.lines.map(l => s"$indent$l").mkString("\n") + msg.linesIterator.map(l => s"$indent$l").mkString("\n") } private def printReport(results: Vector[LedgerTestSummary]): Unit = diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PackageManagementServiceIT.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PackageManagementServiceIT.scala index 2a08fe8fa5..1a41553556 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PackageManagementServiceIT.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PackageManagementServiceIT.scala @@ -11,6 +11,7 @@ import com.daml.ledger.packagemanagementtest.PackageManagementTest.PackageManage import com.google.protobuf.ByteString import io.grpc.Status +import scala.collection.compat._ import scala.concurrent.{ExecutionContext, Future} final class PackageManagementServiceIT extends LedgerTestSuite { @@ -59,7 +60,7 @@ final class PackageManagementServiceIT extends LedgerTestSuite { acsAfter <- ledger.activeContracts(party) } yield { val duplicatePackageIds = - knownPackages.groupBy(_.packageId).mapValues(_.size).filter(_._2 > 1) + knownPackages.groupBy(_.packageId).view.mapValues(_.size).filter(_._2 > 1).toMap assert( duplicatePackageIds.isEmpty, s"There are duplicate package identifiers: ${duplicatePackageIds diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PartyManagementServiceIT.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PartyManagementServiceIT.scala index af0c092a8d..691f01165c 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PartyManagementServiceIT.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PartyManagementServiceIT.scala @@ -14,6 +14,7 @@ import io.grpc.Status import scalaz.Tag import scalaz.syntax.tag.ToTagOps +import scala.collection.compat._ import scala.util.Random final class PartyManagementServiceIT extends LedgerTestSuite { @@ -135,7 +136,7 @@ final class PartyManagementServiceIT extends LedgerTestSuite { for { parties <- ledger.allocateParties(100) } yield { - val nonUniqueNames = parties.groupBy(Tag.unwrap).mapValues(_.size).filter(_._2 > 1) + val nonUniqueNames = parties.groupBy(Tag.unwrap).view.mapValues(_.size).filter(_._2 > 1).toMap assert( nonUniqueNames.isEmpty, s"There are non-unique party names: ${nonUniqueNames diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PerformanceEnvelope.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PerformanceEnvelope.scala index a02fe587ab..c0655325b1 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PerformanceEnvelope.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/PerformanceEnvelope.scala @@ -132,7 +132,7 @@ sealed trait PerformanceEnvelope[E <: Envelope] { val finished = Instant.now ( Duration.between(started, finished), - timings.values.flatMap(_.right.toOption.toList).toList, + timings.values.flatMap(_.toOption.toList).toList, ) } } diff --git a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/TransactionServiceIT.scala b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/TransactionServiceIT.scala index 74422e7ec8..6378b3d5c4 100644 --- a/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/TransactionServiceIT.scala +++ b/ledger/ledger-api-test-tool/src/main/scala/com/daml/ledger/api/testtool/suites/TransactionServiceIT.scala @@ -36,6 +36,7 @@ import com.softwaremill.diffx.generic.auto._ import io.grpc.Status import scalaz.Tag +import scala.collection.compat._ import scala.collection.mutable import scala.concurrent.Future @@ -1652,7 +1653,7 @@ object TransactionServiceIT { t.copy( commandId = "commandId", offset = "offset", - eventsById = t.eventsById.mapValues(_.modifyWitnessParties(_.sorted)), + eventsById = t.eventsById.view.mapValues(_.modifyWitnessParties(_.sorted)).toMap, ) ) .sortBy(_.transactionId) diff --git a/ledger/participant-state/kvutils/BUILD.bazel b/ledger/participant-state/kvutils/BUILD.bazel index 5a7b75a242..a9b26efd96 100644 --- a/ledger/participant-state/kvutils/BUILD.bazel +++ b/ledger/participant-state/kvutils/BUILD.bazel @@ -228,11 +228,11 @@ client_server_build( "--participant=participant-id=%s,port=%d" % (REFERENCE_LEDGER_EXPORT_NAME, REFERENCE_LEDGER_EXPORT_PORT), ], visibility = [":__subpackages__"], -) if not is_windows and scala_major_version == "2.12" else None +) if not is_windows else None # Test for checking the integrity of the ledger export produced above. integrity_test( name = "%s-integrity-test" % REFERENCE_LEDGER_EXPORT_NAME, checker = "//ledger/participant-state/kvutils/tools:integrity-check", dump = ":%s" % REFERENCE_LEDGER_EXPORT_NAME, -) if not is_windows and scala_major_version == "2.12" else None +) if not is_windows else None diff --git a/runtime-components/non-repudiation-postgresql/BUILD.bazel b/runtime-components/non-repudiation-postgresql/BUILD.bazel index 7656cbeba8..93c74e85ee 100644 --- a/runtime-components/non-repudiation-postgresql/BUILD.bazel +++ b/runtime-components/non-repudiation-postgresql/BUILD.bazel @@ -45,10 +45,8 @@ da_scala_test( "@maven//:org_typelevel_cats_core", "@maven//:org_typelevel_cats_effect", "@maven//:org_typelevel_cats_kernel", + "@maven//:org_scala_lang_modules_scala_collection_compat", ], - versioned_scala_deps = { - "2.12": ["@maven//:org_scala_lang_modules_scala_collection_compat"], - }, runtime_deps = [ "@maven//:ch_qos_logback_logback_classic", ], @@ -78,5 +76,6 @@ da_scala_test( "@maven//:io_grpc_grpc_api", "@maven//:io_grpc_grpc_core", "@maven//:io_grpc_grpc_netty", + "@maven//:org_slf4j_slf4j_api", ], ) diff --git a/runtime-components/non-repudiation-postgresql/src/test/scala/com/daml/nonrepudiation/postgresql/NonRepudiationProxyConformance.scala b/runtime-components/non-repudiation-postgresql/src/test/scala/com/daml/nonrepudiation/postgresql/NonRepudiationProxyConformance.scala index df0e62f5cf..423a9d40a4 100644 --- a/runtime-components/non-repudiation-postgresql/src/test/scala/com/daml/nonrepudiation/postgresql/NonRepudiationProxyConformance.scala +++ b/runtime-components/non-repudiation-postgresql/src/test/scala/com/daml/nonrepudiation/postgresql/NonRepudiationProxyConformance.scala @@ -30,7 +30,7 @@ import doobie.hikari.HikariTransactor import doobie.util.log.LogHandler import io.grpc.inprocess.{InProcessChannelBuilder, InProcessServerBuilder} import io.grpc.netty.NettyChannelBuilder -import org.scalatest.EitherValues +import org.scalatest.OptionValues import org.scalatest.flatspec.AsyncFlatSpec import org.scalatest.matchers.should.Matchers import sun.security.tools.keytool.CertAndKeyGen @@ -42,7 +42,7 @@ import scala.concurrent.duration.DurationInt final class NonRepudiationProxyConformance extends AsyncFlatSpec with Matchers - with EitherValues + with OptionValues with PostgresAroundAll { import NonRepudiationProxyConformance._ @@ -104,7 +104,7 @@ final class NonRepudiationProxyConformance runner.runTests.map { summaries => summaries.foldLeft(succeed) { case (_, LedgerTestSummary(_, name, description, result)) => withClue(s"$name: $description") { - result.right.value shouldBe a[Result.Succeeded] + result.toOption.value shouldBe a[Result.Succeeded] } } }