Port Ledger API Test Tool to Scala 2.13 (#8875)

* 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
This commit is contained in:
Moritz Kiefer 2021-02-17 12:34:25 +01:00 committed by GitHub
parent efe0f4a096
commit 182eb825c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 59 additions and 39 deletions

View File

@ -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:

View File

@ -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",

View File

@ -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():

View File

@ -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

View File

@ -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.")

View File

@ -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 {

View File

@ -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 {

View File

@ -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))
}
}

View File

@ -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 =

View File

@ -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 =

View File

@ -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

View File

@ -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

View File

@ -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,
)
}
}

View File

@ -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)

View File

@ -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

View File

@ -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",
],
)

View File

@ -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]
}
}
}