Skip to content

Commit 6ac0fc4

Browse files
committed
feat(sbt-plugin): add generateUnmanagedTest
1 parent 3d089e4 commit 6ac0fc4

6 files changed

Lines changed: 112 additions & 3 deletions

File tree

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright 2021 Lightbend Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.akkaserverless.codegen.scalasdk
18+
19+
import com.akkaserverless.Annotations
20+
import com.akkaserverless.codegen.scalasdk.impl.SourceGenerator
21+
import com.google.protobuf.ExtensionRegistry
22+
import com.google.protobuf.compiler.PluginProtos.CodeGeneratorResponse
23+
import com.lightbend.akkasls.codegen.ModelBuilder
24+
import protocbridge.Artifact
25+
import protocgen.CodeGenApp
26+
import protocgen.CodeGenRequest
27+
import protocgen.CodeGenResponse
28+
29+
object AkkaserverlessUnmanagedTestGenerator extends CodeGenApp {
30+
override def registerExtensions(registry: ExtensionRegistry): Unit = {
31+
Annotations.registerAllExtensions(registry)
32+
}
33+
34+
override def process(request: CodeGenRequest): CodeGenResponse = {
35+
val debugEnabled = request.parameter.contains(AkkaserverlessGenerator.enableDebug)
36+
val model = ModelBuilder.introspectProtobufClasses(request.filesToGenerate)(
37+
DebugPrintlnLog(debugEnabled),
38+
FullyQualifiedNameExtractor(request))
39+
try {
40+
CodeGenResponse.succeed(
41+
SourceGenerator
42+
.generateUnmanagedTest(model)
43+
.map(file =>
44+
CodeGeneratorResponse.File
45+
.newBuilder()
46+
.setName(file.name)
47+
.setContent(file.content)
48+
.build()))
49+
} catch {
50+
case t: Throwable =>
51+
t.printStackTrace()
52+
CodeGenResponse.fail(t.getMessage)
53+
}
54+
}
55+
56+
override def suggestedDependencies: Seq[Artifact] = Nil
57+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright 2021 Lightbend Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.akkaserverless.codegen.scalasdk
18+
19+
import protocbridge.SandboxedJvmGenerator
20+
21+
object genUnmanagedTest {
22+
def apply(options: Seq[String] = Seq.empty): (SandboxedJvmGenerator, Seq[String]) =
23+
gen(options, "com.akkaserverless.codegen.scalasdk.AkkaserverlessUnmanagedTestGenerator$")
24+
}

samples/scala-value-entity-customer-registry/build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ Test / logBuffered := false
2929
run / fork := false
3030
Global / cancelable := false // ctrl-c
3131

32-
// FIXME include these dependencies via the AkkaserverlessPlugin
3332
val AkkaServerlessSdkVersion = System.getProperty("akkaserverless-sdk.version", "0.7.2")
3433
libraryDependencies ++= Seq(
3534
"org.scalatest" %% "scalatest" % "3.2.7" % Test,
35+
// FIXME include testkit dependency via the AkkaserverlessPlugin
3636
"com.akkaserverless" %% "akkaserverless-scala-sdk-testkit" % AkkaServerlessSdkVersion % Test)

sbt-plugin/src/main/scala/com/akkaserverless/sbt/AkkaserverlessPlugin.scala

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import akka.grpc.sbt.AkkaGrpcPlugin.autoImport.AkkaGrpc
2323
import java.nio.file.Path
2424
import java.nio.file.Paths
2525
import java.nio.file.Files
26-
import com.akkaserverless.codegen.scalasdk.{ gen, genTests, genUnmanaged, AkkaserverlessGenerator }
26+
import com.akkaserverless.codegen.scalasdk.{ gen, genTests, genUnmanaged, genUnmanagedTest, AkkaserverlessGenerator }
2727
import sbt.{ Compile, _ }
2828
import sbt.Keys._
2929
import sbtprotoc.ProtocPlugin
@@ -40,6 +40,7 @@ object AkkaserverlessPlugin extends AutoPlugin {
4040
"These are the source files that are placed in the source tree, and after initial generation should typically be maintained by the user.\n" +
4141
"Files that already exist they are not re-generated.")
4242
val temporaryUnmanagedDirectory = settingKey[File]("Directory to generate 'unmanaged' sources into")
43+
val temporaryUnmanagedTestDirectory = settingKey[File]("Directory to generate 'unmanaged' test sources into")
4344
}
4445
object autoImport extends Keys
4546
import autoImport._
@@ -52,12 +53,15 @@ object AkkaserverlessPlugin extends AutoPlugin {
5253
gen(
5354
akkaGrpcCodeGeneratorSettings.value :+ AkkaserverlessGenerator.enableDebug) -> (Compile / sourceManaged).value / "akkaserverless",
5455
Compile / temporaryUnmanagedDirectory := (Compile / baseDirectory).value / "target" / "akkaserverless-unmanaged",
56+
Test / temporaryUnmanagedTestDirectory := (Test / baseDirectory).value / "target" / "akkaserverless-unmanaged-test",
5557
// FIXME there is a name clash between the Akka gRPC server-side service 'handler'
5658
// and the Akka Serverless 'handler'. For now working around it by only generating
5759
// the client, but we should probably resolve this before the first public release.
5860
Compile / akkaGrpcGeneratedSources := Seq(AkkaGrpc.Client),
5961
Compile / PB.targets ++= Seq(genUnmanaged(
6062
akkaGrpcCodeGeneratorSettings.value :+ AkkaserverlessGenerator.enableDebug) -> (Compile / temporaryUnmanagedDirectory).value),
63+
Test / PB.targets ++= Seq(genUnmanagedTest(
64+
akkaGrpcCodeGeneratorSettings.value :+ AkkaserverlessGenerator.enableDebug) -> (Test / temporaryUnmanagedTestDirectory).value),
6165
Test / PB.protoSources ++= (Compile / PB.protoSources).value,
6266
Test / PB.targets +=
6367
genTests(
@@ -71,10 +75,23 @@ object AkkaserverlessPlugin extends AutoPlugin {
7175
Paths.get((Compile / temporaryUnmanagedDirectory).value.toURI),
7276
Paths.get((Compile / sourceDirectory).value.toURI).resolve("scala"))
7377
},
78+
Test / generateUnmanaged := {
79+
Files.createDirectories(Paths.get((Test / temporaryUnmanagedTestDirectory).value.toURI))
80+
// Make sure generation has happened
81+
val _ = (Test / PB.generate).value
82+
// Then copy over any new generated unmanaged sources
83+
copyIfNotExist(
84+
Paths.get((Test / temporaryUnmanagedTestDirectory).value.toURI),
85+
Paths.get((Test / sourceDirectory).value.toURI).resolve("scala"))
86+
},
7487
Compile / managedSources :=
7588
(Compile / managedSources).value.filter(s => !isIn(s, (Compile / temporaryUnmanagedDirectory).value)),
7689
Compile / unmanagedSources :=
77-
(Compile / generateUnmanaged).value ++ (Compile / unmanagedSources).value)
90+
(Compile / generateUnmanaged).value ++ (Compile / unmanagedSources).value,
91+
Test / managedSources :=
92+
(Test / managedSources).value.filter(s => !isIn(s, (Test / temporaryUnmanagedTestDirectory).value)),
93+
Test / unmanagedSources :=
94+
(Test / generateUnmanaged).value ++ (Test / unmanagedSources).value)
7895

7996
def isIn(file: File, dir: File): Boolean =
8097
Paths.get(file.toURI).startsWith(Paths.get(dir.toURI))
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
11
scalaVersion := "2.13.6"
22

33
enablePlugins(AkkaserverlessPlugin)
4+
5+
val AkkaServerlessSdkVersion = System.getProperty("plugin.version", "0.7.2")
6+
libraryDependencies ++= Seq(
7+
"org.scalatest" %% "scalatest" % "3.2.7" % Test,
8+
// FIXME include testkit dependency via the AkkaserverlessPlugin
9+
"com.akkaserverless" %% "akkaserverless-scala-sdk-testkit" % AkkaServerlessSdkVersion % Test)

sbt-plugin/src/sbt-test/sbt-akkaserverless/basic/test

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,8 @@ $ exists src/main/scala/com/example/valueentity/domain/User.scala
6666
$ exists target/scala-2.13/src_managed/main/akkaserverless/com/example/valueentity/domain/AbstractUser.scala
6767

6868
> Test/compile
69+
70+
# com/example/valueentity/some_value_entity_api.proto
71+
# com/example/valueentity/domain/some_value_entity_domain.proto
72+
$ exists src/test/scala/com/example/valueentity/domain/SomeValueEntitySpec.scala
73+
$ exists target/scala-2.13/src_managed/test/akkaserverless/com/example/valueentity/domain/SomeValueEntityTestKit.scala

0 commit comments

Comments
 (0)