Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,10 @@ jobs:
linux_6_0_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable"
linux_nightly_6_0_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable"
linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable"

plugin-tests:
name: Plugin tests
uses: apple/swift-nio/.github/workflows/swift_load_test_matrix.yml@main
with:
name: "Plugin tests"
matrix_path: ".github/workflows/matrices/plugin-tests.json"
1 change: 1 addition & 0 deletions .github/workflows/matrices/plugin-tests.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"config":[{"name":"Plugin tests (6.0)","swift_version":"6.0","runner":"ubuntu-latest","image":"swift:6.0-jammy","platform":"Linux","setup_command":"apt-get update -y -q && apt-get install -y -q curl protobuf-compiler","command":"curl -s https://raw.githubusercontent.com/rnro/grpc-swift-protobuf/refs/heads/build_plugin_integration_tests/dev/plugin-tests.sh| GITHUB_ACTIONS=true bash","command_arguments":""},{"name":"Plugin tests (nightly-6.1)","swift_version":"nightly-6.1","runner":"ubuntu-latest","image":"swiftlang/swift:nightly-6.1-jammy","platform":"Linux","setup_command":"apt-get update -y -q && apt-get install -y -q curl protobuf-compiler","command":"curl -s https://raw.githubusercontent.com/rnro/grpc-swift-protobuf/refs/heads/build_plugin_integration_tests/dev/plugin-tests.sh| GITHUB_ACTIONS=true bash","command_arguments":""},{"name":"Plugin tests (nightly-main)","swift_version":"nightly-main","runner":"ubuntu-latest","image":"swiftlang/swift:nightly-main-jammy","platform":"Linux","setup_command":"apt-get update -y -q && apt-get install -y -q curl protobuf-compiler","command":"curl -s https://raw.githubusercontent.com/rnro/grpc-swift-protobuf/refs/heads/build_plugin_integration_tests/dev/plugin-tests.sh| GITHUB_ACTIONS=true bash","command_arguments":""}]}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Late realisation: if we use this vs. this approach we have to update it for each new Swift version. Can we do the alternative?

7 changes: 7 additions & 0 deletions .github/workflows/pull_request.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@ jobs:
linux_nightly_6_0_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable"
linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error -Xswiftc -require-explicit-sendable"

plugin-tests:
name: Plugin tests
uses: apple/swift-nio/.github/workflows/swift_load_test_matrix.yml@main
with:
name: "Plugin tests"
matrix_path: ".github/workflows/matrices/plugin-tests.json"

cxx-interop:
name: Cxx interop
uses: apple/swift-nio/.github/workflows/cxx_interop.yml@main
Expand Down
1 change: 1 addition & 0 deletions .licenseignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ dev/git.commit.template
dev/version-bump.commit.template
dev/protos/local/*
dev/protos/upstream/*
IntegrationTests/PluginTests/**/*.proto
.unacceptablelanguageignore
LICENSE
**/*.swift
Expand Down
7 changes: 7 additions & 0 deletions IntegrationTests/PluginTests/Resources/Foo/foo-messages.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// Leading trivia.
syntax = "proto3";

package foo;

message FooInput {}
message FooOutput {}
13 changes: 13 additions & 0 deletions IntegrationTests/PluginTests/Resources/Foo/foo-service.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
syntax = "proto3";

import "Foo/foo-messages.proto";

package foo;

service FooService1 {
rpc Foo (FooInput) returns (FooOutput) {}
}

service FooService2 {
rpc Foo (FooInput) returns (FooOutput) {}
}
74 changes: 74 additions & 0 deletions IntegrationTests/PluginTests/Resources/FooHelloWorldAdopter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
/*
* Copyright 2024, gRPC Authors All rights reserved.
*
* 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.
*/

import GRPCCore
import GRPCInProcessTransport
import GRPCProtobuf

@main
struct PluginAdopter {
static func main() async throws {
let inProcess = InProcessTransport()
try await withGRPCServer(transport: inProcess.server, services: [Greeter()]) { server in
try await withGRPCClient(transport: inProcess.client) { client in
try await Self.doRPC(Helloworld_Greeter.Client(wrapping: client))
}
}

try await withGRPCServer(transport: inProcess.server, services: [FooService1()]) { server in
try await withGRPCClient(transport: inProcess.client) { client in
try await Self.doRPC(Foo_FooService1.Client(wrapping: client))
}
}
}

static func doRPC<Transport>(_ greeter: Helloworld_Greeter.Client<Transport>) async throws {
do {
let reply = try await greeter.sayHello(.with { $0.name = "(ignored)" })
print("Reply: \(reply.message)")
} catch {
print("Error: \(error)")
}
}

static func doRPC<Transport>(_ fooService1: Foo_FooService1.Client<Transport>) async throws {
do {
let reply = try await fooService1.foo(.with { _ in () })
print("Reply: \(reply.hashValue)")
} catch {
print("Error: \(error)")
}
}
}

struct Greeter: Helloworld_Greeter.SimpleServiceProtocol {
func sayHello(
request: Helloworld_HelloRequest,
context: ServerContext
) async throws -> Helloworld_HelloReply {
return .with { reply in
reply.message = "Hello, world!"
}
}
}

struct FooService1: Foo_FooService1.SimpleServiceProtocol {
func foo(request: Foo_FooInput, context: GRPCCore.ServerContext) async throws -> Foo_FooOutput {
return .with { _ in
()
}
}
}
37 changes: 37 additions & 0 deletions IntegrationTests/PluginTests/Resources/HelloWorld/HelloWorld.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
// Copyright 2015, gRPC Authors All rights reserved.
//
// 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.
syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
string name = 1;
}

// The response message containing the greetings
message HelloReply {
string message = 1;
}
31 changes: 31 additions & 0 deletions IntegrationTests/PluginTests/Resources/HelloWorld/Messages.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Copyright 2015, gRPC Authors All rights reserved.
//
// 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.
syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

// The request message containing the user's name.
message HelloRequest {
string name = 1;
}

// The response message containing the greetings
message HelloReply {
string message = 1;
}
29 changes: 29 additions & 0 deletions IntegrationTests/PluginTests/Resources/HelloWorld/Service.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Copyright 2015, gRPC Authors All rights reserved.
//
// 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.
syntax = "proto3";

option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
option objc_class_prefix = "HLW";

package helloworld;

import "Messages.proto";

// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
51 changes: 51 additions & 0 deletions IntegrationTests/PluginTests/Resources/HelloWorldAdopter.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
* Copyright 2024, gRPC Authors All rights reserved.
*
* 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.
*/

import GRPCCore
import GRPCInProcessTransport
import GRPCProtobuf

@main
struct PluginAdopter {
static func main() async throws {
let inProcess = InProcessTransport()
try await withGRPCServer(transport: inProcess.server, services: [Greeter()]) { server in
try await withGRPCClient(transport: inProcess.client) { client in
try await Self.doRPC(Helloworld_Greeter.Client(wrapping: client))
}
}
}

static func doRPC<Transport>(_ greeter: Helloworld_Greeter.Client<Transport>) async throws {
do {
let reply = try await greeter.sayHello(.with { $0.name = "(ignored)" })
print("Reply: \(reply.message)")
} catch {
print("Error: \(error)")
}
}
}

struct Greeter: Helloworld_Greeter.SimpleServiceProtocol {
func sayHello(
request: Helloworld_HelloRequest,
context: ServerContext
) async throws -> Helloworld_HelloReply {
return .with { reply in
reply.message = "Hello, world!"
}
}
}
50 changes: 50 additions & 0 deletions IntegrationTests/PluginTests/Resources/Package.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// swift-tools-version: 6.0
/*
* Copyright 2024, gRPC Authors All rights reserved.
*
* 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.
*/

import PackageDescription

var package = Package(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: this should be a let as Package is a class 🙃

name: "grpc-adopter",
platforms: [
.macOS(.v15),
.iOS(.v18),
.tvOS(.v18),
.watchOS(.v11),
.visionOS(.v2),
],
dependencies: [
// Dependency on grpc-swift-protobuf to be added by setup-plugin-tests.sh script

.package(
url: "https://github.com/grpc/grpc-swift.git",
branch: "main"
)
],
targets: [
.executableTarget(
name: "grpc-adopter",
dependencies: [
.product(name: "GRPCCore", package: "grpc-swift"),
.product(name: "GRPCInProcessTransport", package: "grpc-swift"),
.product(name: "GRPCProtobuf", package: "grpc-swift-protobuf"),
],
plugins: [
.plugin(name: "GRPCProtobufGenerator", package: "grpc-swift-protobuf")
]
)
]
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"generatedSource": {
"accessLevel": "internal"
},
"protoc": {
"importPaths": [
".",
"../directory_1"
]
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"generatedSource": {
"accessLevel": "internal"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"generatedSource": {
"accessLevel": "public"
}
}

Loading
Loading