Skip to content

Commit

Permalink
add server examples - fixes #317
Browse files Browse the repository at this point in the history
  • Loading branch information
jamesward committed Feb 15, 2022
1 parent b233a2e commit 9f94fa0
Show file tree
Hide file tree
Showing 17 changed files with 250 additions and 72 deletions.
14 changes: 9 additions & 5 deletions examples/android/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ plugins {
kotlin("android")
}

val composeVersion = "1.0.5"
val composeVersion = "1.1.0"

dependencies {
implementation(project(":stub-android"))
implementation(kotlin("stdlib"))
implementation("androidx.activity:activity-compose:1.4.0")
implementation("androidx.appcompat:appcompat:1.4.0")
implementation("androidx.appcompat:appcompat:1.4.1")

implementation("androidx.compose.foundation:foundation-layout:$composeVersion")
implementation("androidx.compose.material:material:$composeVersion")
Expand All @@ -22,13 +22,13 @@ dependencies {
}

android {
compileSdkVersion(31)
compileSdk = 31
buildToolsVersion = "31.0.0"

defaultConfig {
applicationId = "io.grpc.examples.hello"
minSdkVersion(26)
targetSdkVersion(31)
minSdk = 26
targetSdk = 31
versionCode = 1
versionName = "1.0"

Expand All @@ -54,6 +54,10 @@ android {
composeOptions {
kotlinCompilerExtensionVersion = composeVersion
}

packagingOptions {
resources.excludes += "META-INF/kotlinx_coroutines_core.version"
}
}

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
Expand Down
6 changes: 3 additions & 3 deletions examples/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
plugins {
id("com.android.application") version "7.0.2" apply false
id("com.android.application") version "7.0.4" apply false
id("com.google.protobuf") version "0.8.18" apply false
kotlin("jvm") version "1.5.31" apply false // Compose Compiler required version
kotlin("jvm") version "1.6.10" apply false // Compose Compiler required version
id("org.jlleitschuh.gradle.ktlint") version "10.2.0"
}

// todo: move to subprojects, but how?
ext["grpcVersion"] = "1.39.0" // need to wait for grpc kotlin to move past this
ext["grpcKotlinVersion"] = "1.2.1" // CURRENT_GRPC_KOTLIN_VERSION
ext["protobufVersion"] = "3.19.2"
ext["coroutinesVersion"] = "1.5.2"
ext["coroutinesVersion"] = "1.6.0"

allprojects {
repositories {
Expand Down
2 changes: 1 addition & 1 deletion examples/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
14 changes: 7 additions & 7 deletions examples/native-client/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
plugins {
application
kotlin("jvm")
id("com.palantir.graal") version "0.7.2"
id("com.palantir.graal") version "0.10.0"
}

java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}

dependencies {
Expand All @@ -19,17 +19,17 @@ application {
}

// todo: add graalvm-config-create task
// JAVA_HOME=~/.gradle/caches/com.palantir.graal/20.2.0/8/graalvm-ce-java8-20.2.0 JAVA_OPTS=-agentlib:native-image-agent=config-output-dir=native-client/src/graal native-client/build/install/native-client/bin/native-client
// ./gradlew :native-client:install
// JAVA_HOME=~/.gradle/caches/com.palantir.graal/22.0.0.2/11/graalvm-ce-java11-22.0.0.2 JAVA_OPTS=-agentlib:native-image-agent=config-output-dir=native-client/src/graal native-client/build/install/native-client/bin/native-client

graal {
graalVersion("20.2.0")
graalVersion("22.0.0.2")
javaVersion("11")
mainClass(application.mainClass.get())
outputName("hello-world")
option("--verbose")
option("--no-server")
option("--no-fallback")
option("-H:+ReportExceptionStackTraces")
option("-H:+TraceClassInitialization")
option("-H:+PrintClassInitialization")
option("-H:ReflectionConfigurationFiles=src/graal/reflect-config.json")
}
72 changes: 40 additions & 32 deletions examples/native-client/src/graal/reflect-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@
},
{
"name":"io.grpc.examples.helloworld.HelloReply",
"fields":[{"name":"message_", "allowUnsafeAccess":true}]
"fields":[{"name":"message_"}]
},
{
"name":"io.grpc.examples.helloworld.HelloRequest",
"fields":[{"name":"name_", "allowUnsafeAccess":true}]
"fields":[{"name":"name_"}]
},
{
"name":"io.grpc.internal.DnsNameResolverProvider"
Expand All @@ -20,6 +20,9 @@
{
"name":"io.grpc.internal.PickFirstLoadBalancerProvider"
},
{
"name":"io.grpc.okhttp.OkHttpChannelProvider"
},
{
"name":"io.grpc.util.SecretRoundRobinLoadBalancerProvider$Provider"
},
Expand All @@ -29,51 +32,56 @@
},
{
"name":"java.nio.Buffer",
"fields":[{"name":"address", "allowUnsafeAccess":true}]
"fields":[{"name":"address"}]
},
{
"name":"java.util.concurrent.ScheduledThreadPoolExecutor",
"methods":[{"name":"setRemoveOnCancelPolicy","parameterTypes":["boolean"] }]
},
{
"name":"java.util.concurrent.atomic.LongAdder",
"allPublicConstructors":true,
"queryAllPublicConstructors":true,
"methods":[
{"name":"add","parameterTypes":["long"] },
{"name":"sum","parameterTypes":[] }
]
{"name":"<init>","parameterTypes":[] },
{"name":"add","parameterTypes":["long"] }
],
"queriedMethods":[{"name":"sum","parameterTypes":[] }]
},
{
"name":"javax.naming.directory.InitialDirContext"
},
{
"name":"kotlin.internal.jdk8.JDK8PlatformImplementations",
"methods":[{"name":"<init>","parameterTypes":[] }]
},
{
"name":"sun.misc.Unsafe",
"allDeclaredFields":true,
"methods":[
{"name":"arrayBaseOffset","parameterTypes":["java.lang.Class"] },
{"name":"arrayIndexScale","parameterTypes":["java.lang.Class"] },
{"name":"copyMemory","parameterTypes":["long","long","long"] },
{"name":"copyMemory","parameterTypes":["java.lang.Object","long","java.lang.Object","long","long"] },
{"name":"getBoolean","parameterTypes":["java.lang.Object","long"] },
{"name":"getByte","parameterTypes":["long"] },
{"name":"getByte","parameterTypes":["java.lang.Object","long"] },
{"name":"getDouble","parameterTypes":["java.lang.Object","long"] },
{"name":"getFloat","parameterTypes":["java.lang.Object","long"] },
{"name":"getInt","parameterTypes":["long"] },
{"name":"getInt","parameterTypes":["java.lang.Object","long"] },
{"name":"getLong","parameterTypes":["long"] },
{"name":"getLong","parameterTypes":["java.lang.Object","long"] },
{"name":"getObject","parameterTypes":["java.lang.Object","long"] },
{"name":"objectFieldOffset","parameterTypes":["java.lang.reflect.Field"] },
{"name":"putBoolean","parameterTypes":["java.lang.Object","long","boolean"] },
{"name":"putByte","parameterTypes":["long","byte"] },
{"name":"putByte","parameterTypes":["java.lang.Object","long","byte"] },
{"name":"putDouble","parameterTypes":["java.lang.Object","long","double"] },
{"name":"putFloat","parameterTypes":["java.lang.Object","long","float"] },
{"name":"putInt","parameterTypes":["long","int"] },
{"name":"putInt","parameterTypes":["java.lang.Object","long","int"] },
{"name":"putLong","parameterTypes":["long","long"] },
{"name":"putLong","parameterTypes":["java.lang.Object","long","long"] },
"queriedMethods":[
{"name":"arrayBaseOffset","parameterTypes":["java.lang.Class"] },
{"name":"arrayIndexScale","parameterTypes":["java.lang.Class"] },
{"name":"copyMemory","parameterTypes":["long","long","long"] },
{"name":"copyMemory","parameterTypes":["java.lang.Object","long","java.lang.Object","long","long"] },
{"name":"getBoolean","parameterTypes":["java.lang.Object","long"] },
{"name":"getByte","parameterTypes":["long"] },
{"name":"getByte","parameterTypes":["java.lang.Object","long"] },
{"name":"getDouble","parameterTypes":["java.lang.Object","long"] },
{"name":"getFloat","parameterTypes":["java.lang.Object","long"] },
{"name":"getInt","parameterTypes":["long"] },
{"name":"getInt","parameterTypes":["java.lang.Object","long"] },
{"name":"getLong","parameterTypes":["long"] },
{"name":"getLong","parameterTypes":["java.lang.Object","long"] },
{"name":"getObject","parameterTypes":["java.lang.Object","long"] },
{"name":"objectFieldOffset","parameterTypes":["java.lang.reflect.Field"] },
{"name":"putBoolean","parameterTypes":["java.lang.Object","long","boolean"] },
{"name":"putByte","parameterTypes":["long","byte"] },
{"name":"putByte","parameterTypes":["java.lang.Object","long","byte"] },
{"name":"putDouble","parameterTypes":["java.lang.Object","long","double"] },
{"name":"putFloat","parameterTypes":["java.lang.Object","long","float"] },
{"name":"putInt","parameterTypes":["long","int"] },
{"name":"putInt","parameterTypes":["java.lang.Object","long","int"] },
{"name":"putLong","parameterTypes":["long","long"] },
{"name":"putLong","parameterTypes":["java.lang.Object","long","long"] },
{"name":"putObject","parameterTypes":["java.lang.Object","long","java.lang.Object"] }
]
}
Expand Down
13 changes: 13 additions & 0 deletions examples/server/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ java {
dependencies {
implementation(project(":stub"))
runtimeOnly("io.grpc:grpc-netty:${rootProject.ext["grpcVersion"]}")

testImplementation(kotlin("test-junit"))
testImplementation("io.grpc:grpc-testing:${rootProject.ext["grpcVersion"]}")
}

tasks.register<JavaExec>("HelloWorldServer") {
Expand Down Expand Up @@ -57,3 +60,13 @@ tasks.named("startScripts") {
dependsOn(routeGuideServerStartScripts)
dependsOn(animalsServerStartScripts)
}

tasks.withType<Test> {
useJUnit()

testLogging {
events = setOf(org.gradle.api.tasks.testing.logging.TestLogEvent.PASSED, org.gradle.api.tasks.testing.logging.TestLogEvent.SKIPPED, org.gradle.api.tasks.testing.logging.TestLogEvent.FAILED)
exceptionFormat = org.gradle.api.tasks.testing.logging.TestExceptionFormat.FULL
showStandardStreams = true
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,19 +47,19 @@ class AnimalsServer constructor(private val port: Int) {
server.awaitTermination()
}

private class DogService : DogGrpcKt.DogCoroutineImplBase() {
internal class DogService : DogGrpcKt.DogCoroutineImplBase() {
override suspend fun bark(request: BarkRequest) = barkReply {
message = "Bark!"
}
}

private class PigService : PigGrpcKt.PigCoroutineImplBase() {
internal class PigService : PigGrpcKt.PigCoroutineImplBase() {
override suspend fun oink(request: OinkRequest) = oinkReply {
message = "Oink!"
}
}

private class SheepService : SheepGrpcKt.SheepCoroutineImplBase() {
internal class SheepService : SheepGrpcKt.SheepCoroutineImplBase() {
override suspend fun baa(request: BaaRequest) = baaReply {
message = "Baa!"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class HelloWorldServer(private val port: Int) {
server.awaitTermination()
}

private class HelloWorldService : GreeterGrpcKt.GreeterCoroutineImplBase() {
internal class HelloWorldService : GreeterGrpcKt.GreeterCoroutineImplBase() {
override suspend fun sayHello(request: HelloRequest) = helloReply {
message = "Hello ${request.name}"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,9 @@ class RouteGuideServer(
server.awaitTermination()
}

class RouteGuideService(
val features: Collection<Feature>,
val ticker: Ticker = Ticker.systemTicker()
internal class RouteGuideService(
private val features: Collection<Feature>,
private val ticker: Ticker = Ticker.systemTicker()
) : RouteGuideGrpcKt.RouteGuideCoroutineImplBase() {
private val routeNotes = ConcurrentHashMap<Point, MutableList<RouteNote>>()

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright 2020 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package io.grpc.examples.animals

import io.grpc.testing.GrpcServerRule
import kotlinx.coroutines.runBlocking
import org.junit.Rule
import kotlin.test.Test
import kotlin.test.assertEquals

class AnimalsServerTest {

@get:Rule
val grpcServerRule: GrpcServerRule = GrpcServerRule().directExecutor()

@Test
fun animals() = runBlocking {
val dogService = AnimalsServer.DogService()
val pigService = AnimalsServer.PigService()
val sheepService = AnimalsServer.SheepService()
grpcServerRule.serviceRegistry.addService(dogService)
grpcServerRule.serviceRegistry.addService(pigService)
grpcServerRule.serviceRegistry.addService(sheepService)

val dogStub = DogGrpcKt.DogCoroutineStub(grpcServerRule.channel)
val dogBark = dogStub.bark(barkRequest { })
assertEquals("Bark!", dogBark.message)

val pigStub = PigGrpcKt.PigCoroutineStub(grpcServerRule.channel)
val pigOink = pigStub.oink(oinkRequest { })
assertEquals("Oink!", pigOink.message)

val sheepStub = SheepGrpcKt.SheepCoroutineStub(grpcServerRule.channel)
val sheepBaa = sheepStub.baa(baaRequest { })
assertEquals("Baa!", sheepBaa.message)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Copyright 2020 gRPC authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package io.grpc.examples.helloworld

import io.grpc.testing.GrpcServerRule
import kotlinx.coroutines.runBlocking
import org.junit.Rule
import kotlin.test.Test
import kotlin.test.assertEquals

class HelloWorldServerTest {

@get:Rule
val grpcServerRule: GrpcServerRule = GrpcServerRule().directExecutor()

@Test
fun sayHello() = runBlocking {
val service = HelloWorldServer.HelloWorldService()
grpcServerRule.serviceRegistry.addService(service)

val stub = GreeterGrpcKt.GreeterCoroutineStub(grpcServerRule.channel)
val testName = "test name"

val reply = stub.sayHello(helloRequest { name = testName })

assertEquals("Hello $testName", reply.message)
}
}
Loading

0 comments on commit 9f94fa0

Please sign in to comment.