mirror of https://github.com/grpc/grpc.git
commit
b633a86e1a
100 changed files with 4580 additions and 3276 deletions
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,112 @@ |
||||
#region Copyright notice and license |
||||
|
||||
// Copyright 2015-2016 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. |
||||
|
||||
#endregion |
||||
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.IO; |
||||
using System.Linq; |
||||
using System.Threading; |
||||
using System.Threading.Tasks; |
||||
using Google.Protobuf; |
||||
using Grpc.Core; |
||||
using Grpc.Core.Utils; |
||||
using Grpc.Testing; |
||||
using NUnit.Framework; |
||||
|
||||
namespace Grpc.IntegrationTesting |
||||
{ |
||||
/// <summary> |
||||
/// Shows how to attach custom error details as a binary trailer. |
||||
/// </summary> |
||||
public class CustomErrorDetailsTest |
||||
{ |
||||
const string DebugInfoTrailerName = "debug-info-bin"; |
||||
const string ExceptionDetail = "Exception thrown on purpose."; |
||||
const string Host = "localhost"; |
||||
Server server; |
||||
Channel channel; |
||||
TestService.TestServiceClient client; |
||||
|
||||
[TestFixtureSetUp] |
||||
public void Init() |
||||
{ |
||||
// Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755 |
||||
server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) }) |
||||
{ |
||||
Services = { TestService.BindService(new CustomErrorDetailsTestServiceImpl()) }, |
||||
Ports = { { Host, ServerPort.PickUnused, ServerCredentials.Insecure } } |
||||
}; |
||||
server.Start(); |
||||
|
||||
channel = new Channel(Host, server.Ports.Single().BoundPort, ChannelCredentials.Insecure); |
||||
client = new TestService.TestServiceClient(channel); |
||||
} |
||||
|
||||
[TestFixtureTearDown] |
||||
public void Cleanup() |
||||
{ |
||||
channel.ShutdownAsync().Wait(); |
||||
server.ShutdownAsync().Wait(); |
||||
} |
||||
|
||||
[Test] |
||||
public async Task UnaryCall() |
||||
{ |
||||
var call = client.UnaryCallAsync(new SimpleRequest { ResponseSize = 10 }); |
||||
|
||||
try |
||||
{ |
||||
await call.ResponseAsync; |
||||
Assert.Fail(); |
||||
} |
||||
catch (RpcException e) |
||||
{ |
||||
Assert.AreEqual(StatusCode.Unknown, e.Status.StatusCode); |
||||
var debugInfo = GetDebugInfo(call.GetTrailers()); |
||||
Assert.AreEqual(debugInfo.Detail, ExceptionDetail); |
||||
Assert.IsNotEmpty(debugInfo.StackEntries); |
||||
} |
||||
} |
||||
|
||||
private DebugInfo GetDebugInfo(Metadata trailers) |
||||
{ |
||||
var entry = trailers.First((e) => e.Key == DebugInfoTrailerName); |
||||
return DebugInfo.Parser.ParseFrom(entry.ValueBytes); |
||||
} |
||||
|
||||
private class CustomErrorDetailsTestServiceImpl : TestService.TestServiceBase |
||||
{ |
||||
public override async Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context) |
||||
{ |
||||
try |
||||
{ |
||||
throw new ArgumentException(ExceptionDetail); |
||||
} |
||||
catch (Exception e) |
||||
{ |
||||
// Fill debug info with some structured details about the failure. |
||||
var debugInfo = new DebugInfo(); |
||||
debugInfo.Detail = e.Message; |
||||
debugInfo.StackEntries.AddRange(e.StackTrace.Split(new[] { Environment.NewLine }, StringSplitOptions.None)); |
||||
context.ResponseTrailers.Add(DebugInfoTrailerName, debugInfo.ToByteArray()); |
||||
throw new RpcException(new Status(StatusCode.Unknown, "The handler threw exception.")); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,78 @@ |
||||
%YAML 1.2 |
||||
--- | |
||||
# Copyright 2017 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. |
||||
|
||||
FROM debian:jessie |
||||
|
||||
# Install JDK 8 and Git |
||||
RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && ${'\\'} |
||||
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list && ${'\\'} |
||||
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list && ${'\\'} |
||||
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 |
||||
RUN apt-get update && apt-get -y install ${'\\'} |
||||
git ${'\\'} |
||||
libapr1 ${'\\'} |
||||
oracle-java8-installer ${'\\'} |
||||
&& ${'\\'} |
||||
apt-get clean && rm -r /var/cache/oracle-jdk8-installer/ |
||||
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle |
||||
ENV PATH $PATH:$JAVA_HOME/bin |
||||
|
||||
# Install protobuf |
||||
RUN apt-get update && apt-get install -y ${'\\'} |
||||
autoconf ${'\\'} |
||||
build-essential ${'\\'} |
||||
curl ${'\\'} |
||||
gcc ${'\\'} |
||||
libtool ${'\\'} |
||||
unzip ${'\\'} |
||||
&& ${'\\'} |
||||
apt-get clean |
||||
WORKDIR / |
||||
RUN git clone https://github.com/google/protobuf.git |
||||
WORKDIR /protobuf |
||||
RUN git checkout v3.3.1 && ${'\\'} |
||||
./autogen.sh && ${'\\'} |
||||
./configure && ${'\\'} |
||||
make && ${'\\'} |
||||
make check && ${'\\'} |
||||
make install |
||||
|
||||
# Install gcloud command line tools |
||||
ENV CLOUD_SDK_REPO "cloud-sdk-jessie" |
||||
RUN echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && ${'\\'} |
||||
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && ${'\\'} |
||||
apt-get update && apt-get install -y google-cloud-sdk && apt-get clean && ${'\\'} |
||||
gcloud config set component_manager/disable_update_check true |
||||
|
||||
# Download and install grpc-java |
||||
WORKDIR / |
||||
RUN git clone https://github.com/grpc/grpc-java.git |
||||
WORKDIR /grpc-java |
||||
RUN ./gradlew install |
||||
|
||||
# Setup the Android SDK licenses |
||||
ENV ANDROID_HOME "/grpc-java/android-interop-testing/.android" |
||||
RUN mkdir -p "<%text>${ANDROID_HOME}</%text>/licenses" |
||||
RUN echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "<%text>${ANDROID_HOME}</%text>/licenses/android-sdk-license" |
||||
RUN echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "<%text>${ANDROID_HOME}</%text>/licenses/android-sdk-preview-license" |
||||
|
||||
# Build the Android interop apks |
||||
WORKDIR /grpc-java/android-interop-testing |
||||
RUN ../gradlew assembleDebug |
||||
RUN ../gradlew assembleDebugAndroidTest |
||||
|
||||
# Define the default command. |
||||
CMD ["bash"] |
@ -0,0 +1,298 @@ |
||||
/*
|
||||
* |
||||
* Copyright 2017 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. |
||||
* |
||||
*/ |
||||
|
||||
#include "test/core/end2end/end2end_tests.h" |
||||
|
||||
#include <stdio.h> |
||||
#include <string.h> |
||||
|
||||
#include <grpc/byte_buffer.h> |
||||
#include <grpc/support/alloc.h> |
||||
#include <grpc/support/log.h> |
||||
#include <grpc/support/time.h> |
||||
#include <grpc/support/useful.h> |
||||
|
||||
#include "src/core/lib/channel/channel_args.h" |
||||
#include "src/core/lib/slice/slice_internal.h" |
||||
#include "src/core/lib/transport/metadata.h" |
||||
#include "src/core/lib/transport/service_config.h" |
||||
|
||||
#include "test/core/end2end/cq_verifier.h" |
||||
#include "test/core/end2end/tests/cancel_test_helpers.h" |
||||
|
||||
static void *tag(intptr_t t) { return (void *)t; } |
||||
|
||||
static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config, |
||||
const char *test_name, |
||||
grpc_channel_args *client_args, |
||||
grpc_channel_args *server_args) { |
||||
grpc_end2end_test_fixture f; |
||||
gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name); |
||||
f = config.create_fixture(client_args, server_args); |
||||
config.init_server(&f, server_args); |
||||
config.init_client(&f, client_args); |
||||
return f; |
||||
} |
||||
|
||||
static gpr_timespec n_seconds_from_now(int n) { |
||||
return grpc_timeout_seconds_to_deadline(n); |
||||
} |
||||
|
||||
static gpr_timespec five_seconds_from_now(void) { |
||||
return n_seconds_from_now(5); |
||||
} |
||||
|
||||
static void drain_cq(grpc_completion_queue *cq) { |
||||
grpc_event ev; |
||||
do { |
||||
ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL); |
||||
} while (ev.type != GRPC_QUEUE_SHUTDOWN); |
||||
} |
||||
|
||||
static void shutdown_server(grpc_end2end_test_fixture *f) { |
||||
if (!f->server) return; |
||||
grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000)); |
||||
GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000), |
||||
grpc_timeout_seconds_to_deadline(5), |
||||
NULL) |
||||
.type == GRPC_OP_COMPLETE); |
||||
grpc_server_destroy(f->server); |
||||
f->server = NULL; |
||||
} |
||||
|
||||
static void shutdown_client(grpc_end2end_test_fixture *f) { |
||||
if (!f->client) return; |
||||
grpc_channel_destroy(f->client); |
||||
f->client = NULL; |
||||
} |
||||
|
||||
static void end_test(grpc_end2end_test_fixture *f) { |
||||
shutdown_server(f); |
||||
shutdown_client(f); |
||||
|
||||
grpc_completion_queue_shutdown(f->cq); |
||||
drain_cq(f->cq); |
||||
grpc_completion_queue_destroy(f->cq); |
||||
grpc_completion_queue_destroy(f->shutdown_cq); |
||||
} |
||||
|
||||
/* Cancel after accept, no payload */ |
||||
static void test_cancel_after_round_trip(grpc_end2end_test_config config, |
||||
cancellation_mode mode, |
||||
bool use_service_config) { |
||||
grpc_op ops[6]; |
||||
grpc_op *op; |
||||
grpc_call *c; |
||||
grpc_call *s; |
||||
grpc_metadata_array initial_metadata_recv; |
||||
grpc_metadata_array trailing_metadata_recv; |
||||
grpc_metadata_array request_metadata_recv; |
||||
grpc_call_details call_details; |
||||
grpc_status_code status; |
||||
grpc_call_error error; |
||||
grpc_slice details; |
||||
grpc_byte_buffer *request_payload_recv = NULL; |
||||
grpc_byte_buffer *response_payload_recv = NULL; |
||||
grpc_slice request_payload_slice = |
||||
grpc_slice_from_copied_string("hello world"); |
||||
grpc_slice response_payload_slice = |
||||
grpc_slice_from_copied_string("hello you"); |
||||
grpc_byte_buffer *request_payload = |
||||
grpc_raw_byte_buffer_create(&request_payload_slice, 1); |
||||
grpc_byte_buffer *response_payload = |
||||
grpc_raw_byte_buffer_create(&response_payload_slice, 1); |
||||
int was_cancelled = 2; |
||||
|
||||
grpc_channel_args *args = NULL; |
||||
if (use_service_config) { |
||||
grpc_arg arg; |
||||
arg.type = GRPC_ARG_STRING; |
||||
arg.key = GRPC_ARG_SERVICE_CONFIG; |
||||
arg.value.string = |
||||
"{\n" |
||||
" \"methodConfig\": [ {\n" |
||||
" \"name\": [\n" |
||||
" { \"service\": \"service\", \"method\": \"method\" }\n" |
||||
" ],\n" |
||||
" \"timeout\": \"5s\"\n" |
||||
" } ]\n" |
||||
"}"; |
||||
args = grpc_channel_args_copy_and_add(args, &arg, 1); |
||||
} |
||||
|
||||
grpc_end2end_test_fixture f = |
||||
begin_test(config, "cancel_after_round_trip", args, NULL); |
||||
cq_verifier *cqv = cq_verifier_create(f.cq); |
||||
|
||||
gpr_timespec deadline = use_service_config |
||||
? gpr_inf_future(GPR_CLOCK_MONOTONIC) |
||||
: five_seconds_from_now(); |
||||
c = grpc_channel_create_call( |
||||
f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, |
||||
grpc_slice_from_static_string("/service/method"), |
||||
get_host_override_slice("foo.test.google.fr:1234", config), deadline, |
||||
NULL); |
||||
GPR_ASSERT(c); |
||||
|
||||
grpc_metadata_array_init(&initial_metadata_recv); |
||||
grpc_metadata_array_init(&trailing_metadata_recv); |
||||
grpc_metadata_array_init(&request_metadata_recv); |
||||
grpc_call_details_init(&call_details); |
||||
|
||||
memset(ops, 0, sizeof(ops)); |
||||
op = ops; |
||||
op->op = GRPC_OP_SEND_INITIAL_METADATA; |
||||
op->data.send_initial_metadata.count = 0; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
op->op = GRPC_OP_SEND_MESSAGE; |
||||
op->data.send_message.send_message = request_payload; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
op->op = GRPC_OP_RECV_INITIAL_METADATA; |
||||
op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
op->op = GRPC_OP_RECV_MESSAGE; |
||||
op->data.recv_message.recv_message = &response_payload_recv; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(1), NULL); |
||||
GPR_ASSERT(GRPC_CALL_OK == error); |
||||
|
||||
error = |
||||
grpc_server_request_call(f.server, &s, &call_details, |
||||
&request_metadata_recv, f.cq, f.cq, tag(101)); |
||||
GPR_ASSERT(GRPC_CALL_OK == error); |
||||
CQ_EXPECT_COMPLETION(cqv, tag(101), 1); |
||||
cq_verify(cqv); |
||||
|
||||
memset(ops, 0, sizeof(ops)); |
||||
op = ops; |
||||
op->op = GRPC_OP_RECV_MESSAGE; |
||||
op->data.recv_message.recv_message = &request_payload_recv; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
op->op = GRPC_OP_SEND_INITIAL_METADATA; |
||||
op->data.send_initial_metadata.count = 0; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
op->op = GRPC_OP_SEND_MESSAGE; |
||||
op->data.send_message.send_message = response_payload; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(102), NULL); |
||||
GPR_ASSERT(GRPC_CALL_OK == error); |
||||
|
||||
CQ_EXPECT_COMPLETION(cqv, tag(102), 1); |
||||
CQ_EXPECT_COMPLETION(cqv, tag(1), 1); |
||||
cq_verify(cqv); |
||||
|
||||
grpc_byte_buffer_destroy(request_payload_recv); |
||||
grpc_byte_buffer_destroy(response_payload_recv); |
||||
request_payload_recv = NULL; |
||||
response_payload_recv = NULL; |
||||
|
||||
memset(ops, 0, sizeof(ops)); |
||||
op = ops; |
||||
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; |
||||
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv; |
||||
op->data.recv_status_on_client.status = &status; |
||||
op->data.recv_status_on_client.status_details = &details; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
op->op = GRPC_OP_RECV_MESSAGE; |
||||
op->data.recv_message.recv_message = &response_payload_recv; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(2), NULL); |
||||
GPR_ASSERT(GRPC_CALL_OK == error); |
||||
|
||||
GPR_ASSERT(GRPC_CALL_OK == mode.initiate_cancel(c, NULL)); |
||||
|
||||
memset(ops, 0, sizeof(ops)); |
||||
op = ops; |
||||
op->op = GRPC_OP_RECV_CLOSE_ON_SERVER; |
||||
op->data.recv_close_on_server.cancelled = &was_cancelled; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
op->op = GRPC_OP_SEND_MESSAGE; |
||||
op->data.send_message.send_message = response_payload; |
||||
op->flags = 0; |
||||
op->reserved = NULL; |
||||
op++; |
||||
error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(103), NULL); |
||||
GPR_ASSERT(GRPC_CALL_OK == error); |
||||
|
||||
CQ_EXPECT_COMPLETION(cqv, tag(2), 1); |
||||
CQ_EXPECT_COMPLETION(cqv, tag(103), 1); |
||||
cq_verify(cqv); |
||||
|
||||
GPR_ASSERT(status == mode.expect_status || status == GRPC_STATUS_INTERNAL); |
||||
GPR_ASSERT(was_cancelled == 1); |
||||
|
||||
grpc_metadata_array_destroy(&initial_metadata_recv); |
||||
grpc_metadata_array_destroy(&trailing_metadata_recv); |
||||
grpc_metadata_array_destroy(&request_metadata_recv); |
||||
grpc_call_details_destroy(&call_details); |
||||
|
||||
grpc_byte_buffer_destroy(request_payload); |
||||
grpc_byte_buffer_destroy(response_payload); |
||||
grpc_byte_buffer_destroy(request_payload_recv); |
||||
grpc_byte_buffer_destroy(response_payload_recv); |
||||
grpc_slice_unref(details); |
||||
|
||||
grpc_call_unref(c); |
||||
grpc_call_unref(s); |
||||
|
||||
if (args != NULL) { |
||||
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; |
||||
grpc_channel_args_destroy(&exec_ctx, args); |
||||
grpc_exec_ctx_finish(&exec_ctx); |
||||
} |
||||
|
||||
cq_verifier_destroy(cqv); |
||||
end_test(&f); |
||||
config.tear_down_data(&f); |
||||
} |
||||
|
||||
void cancel_after_round_trip(grpc_end2end_test_config config) { |
||||
unsigned i; |
||||
|
||||
for (i = 0; i < GPR_ARRAY_SIZE(cancellation_modes); i++) { |
||||
test_cancel_after_round_trip(config, cancellation_modes[i], |
||||
false /* use_service_config */); |
||||
if (config.feature_mask & FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL && |
||||
cancellation_modes[i].expect_status == GRPC_STATUS_DEADLINE_EXCEEDED) { |
||||
test_cancel_after_round_trip(config, cancellation_modes[i], |
||||
true /* use_service_config */); |
||||
} |
||||
} |
||||
} |
||||
|
||||
void cancel_after_round_trip_pre_init(void) {} |
@ -0,0 +1,76 @@ |
||||
# Copyright 2017 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. |
||||
|
||||
FROM debian:jessie |
||||
|
||||
# Install JDK 8 and Git |
||||
RUN echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && \ |
||||
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list && \ |
||||
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list && \ |
||||
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 |
||||
RUN apt-get update && apt-get -y install \ |
||||
git \ |
||||
libapr1 \ |
||||
oracle-java8-installer \ |
||||
&& \ |
||||
apt-get clean && rm -r /var/cache/oracle-jdk8-installer/ |
||||
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle |
||||
ENV PATH $PATH:$JAVA_HOME/bin |
||||
|
||||
# Install protobuf |
||||
RUN apt-get update && apt-get install -y \ |
||||
autoconf \ |
||||
build-essential \ |
||||
curl \ |
||||
gcc \ |
||||
libtool \ |
||||
unzip \ |
||||
&& \ |
||||
apt-get clean |
||||
WORKDIR / |
||||
RUN git clone https://github.com/google/protobuf.git |
||||
WORKDIR /protobuf |
||||
RUN git checkout v3.3.1 && \ |
||||
./autogen.sh && \ |
||||
./configure && \ |
||||
make && \ |
||||
make check && \ |
||||
make install |
||||
|
||||
# Install gcloud command line tools |
||||
ENV CLOUD_SDK_REPO "cloud-sdk-jessie" |
||||
RUN echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \ |
||||
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - && \ |
||||
apt-get update && apt-get install -y google-cloud-sdk && apt-get clean && \ |
||||
gcloud config set component_manager/disable_update_check true |
||||
|
||||
# Download and install grpc-java |
||||
WORKDIR / |
||||
RUN git clone https://github.com/grpc/grpc-java.git |
||||
WORKDIR /grpc-java |
||||
RUN ./gradlew install |
||||
|
||||
# Setup the Android SDK licenses |
||||
ENV ANDROID_HOME "/grpc-java/android-interop-testing/.android" |
||||
RUN mkdir -p "${ANDROID_HOME}/licenses" |
||||
RUN echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "${ANDROID_HOME}/licenses/android-sdk-license" |
||||
RUN echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "${ANDROID_HOME}/licenses/android-sdk-preview-license" |
||||
|
||||
# Build the Android interop apks |
||||
WORKDIR /grpc-java/android-interop-testing |
||||
RUN ../gradlew assembleDebug |
||||
RUN ../gradlew assembleDebugAndroidTest |
||||
|
||||
# Define the default command. |
||||
CMD ["bash"] |
@ -1,52 +0,0 @@ |
||||
# Copyright 2016 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. |
||||
|
||||
FROM ubuntu:14.04 |
||||
|
||||
RUN apt-get update && \ |
||||
apt-get install -y \ |
||||
git build-essential \ |
||||
pkg-config flex \ |
||||
bison \ |
||||
libkrb5-dev \ |
||||
libsasl2-dev \ |
||||
libnuma-dev \ |
||||
pkg-config \ |
||||
libssl-dev \ |
||||
autoconf libtool \ |
||||
cmake \ |
||||
libiberty-dev \ |
||||
g++ unzip \ |
||||
curl make automake libtool libboost-dev |
||||
|
||||
# Configure git |
||||
RUN git config --global user.name "Jenkins" && \ |
||||
git config --global user.email "jenkins@grpc" |
||||
|
||||
# Clone gRPC |
||||
RUN git clone https://github.com/grpc/grpc |
||||
|
||||
# Update Submodules |
||||
RUN cd grpc && git submodule update --init |
||||
|
||||
# Install protobuf |
||||
RUN cd grpc/third_party/protobuf && ./autogen.sh && ./configure && \ |
||||
make -j && make check -j && make install && ldconfig |
||||
|
||||
# Install gRPC |
||||
RUN cd grpc && make -j && make install |
||||
|
||||
# Install thrift |
||||
RUN cd grpc/third_party/thrift && git am --signoff < ../../tools/grift/grpc_plugins_generator.patch && \ |
||||
./bootstrap.sh && ./configure && make -j && make install |
@ -1,24 +0,0 @@ |
||||
# Documentation |
||||
|
||||
grift is integration of [Apache Thrift](https://github.com/apache/thrift.git) Serializer with gRPC. |
||||
|
||||
This integration allows you to use grpc to send thrift messages in C++ and java. |
||||
|
||||
grift uses Compact Protocol to serialize thrift messages. |
||||
|
||||
## generating grpc plugins for thrift services |
||||
|
||||
### C++ |
||||
```sh |
||||
$ thrift --gen cpp <thrift-file> |
||||
``` |
||||
|
||||
### Java |
||||
```sh |
||||
$ thrift --gen java <thrift-file> |
||||
``` |
||||
|
||||
# Installation |
||||
|
||||
Before Installing thrift make sure to apply this [patch](grpc_plugins_generator.patch) to third_party/thrift. |
||||
Go to third_party/thrift and follow the [INSTALLATION](https://github.com/apache/thrift.git) instructions to install thrift with commit id bcad91771b7f0bff28a1cac1981d7ef2b9bcef3c. |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,36 @@ |
||||
#!/bin/bash |
||||
# Copyright 2017 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. |
||||
|
||||
# Helper that runs inside the docker container and builds the APKs and |
||||
# invokes Firebase Test Lab via gcloud. |
||||
|
||||
SERVICE_KEY=$1 |
||||
|
||||
gcloud auth activate-service-account --key-file=$SERVICE_KEY || exit 1 |
||||
gcloud config set project grpc-testing || exit 1 |
||||
|
||||
rm -rf grpc-java |
||||
git clone https://github.com/grpc/grpc-java.git |
||||
cd grpc-java |
||||
./gradlew install || exit 1 |
||||
cd android-interop-testing |
||||
../gradlew assembleDebug |
||||
../gradlew assembleDebugAndroidTest |
||||
|
||||
gcloud firebase test android run \ |
||||
--type instrumentation \ |
||||
--app app/build/outputs/apk/app-debug.apk \ |
||||
--test app/build/outputs/apk/app-debug-androidTest.apk \ |
||||
--device model=Nexus6,version=21,locale=en,orientation=portrait |
@ -0,0 +1,30 @@ |
||||
#!/bin/bash |
||||
# Copyright 2017 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. |
||||
|
||||
# Builds the gRPC Android instrumented interop tests inside a docker container |
||||
# and runs them on Firebase Test Lab |
||||
|
||||
DOCKERFILE=tools/dockerfile/interoptest/grpc_interop_android_java/Dockerfile |
||||
DOCKER_TAG=android_interop_test |
||||
SERVICE_KEY=~/android-interops-service-key.json |
||||
HELPER=$(pwd)/tools/run_tests/interop/android/android_interop_helper.sh |
||||
|
||||
docker build -t $DOCKER_TAG -f $DOCKERFILE . |
||||
|
||||
docker run --interactive --rm \ |
||||
--volume="$SERVICE_KEY":/service-key.json:ro \ |
||||
--volume="$HELPER":/android_interop_helper.sh:ro \ |
||||
$DOCKER_TAG \ |
||||
/bin/bash -c "/android_interop_helper.sh /service-key.json" |
@ -0,0 +1,55 @@ |
||||
#!/usr/bin/env python |
||||
# Copyright 2016 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. |
||||
|
||||
# Use to patch schema of existing scenario results tables (after adding fields). |
||||
|
||||
from __future__ import print_function |
||||
|
||||
import argparse |
||||
import calendar |
||||
import json |
||||
import os |
||||
import sys |
||||
import time |
||||
import uuid |
||||
|
||||
|
||||
gcp_utils_dir = os.path.abspath(os.path.join( |
||||
os.path.dirname(__file__), '../../gcp/utils')) |
||||
sys.path.append(gcp_utils_dir) |
||||
import big_query_utils |
||||
|
||||
|
||||
_PROJECT_ID='grpc-testing' |
||||
|
||||
def _patch_results_table(dataset_id, table_id): |
||||
bq = big_query_utils.create_big_query() |
||||
with open(os.path.dirname(__file__) + '/scenario_result_schema.json', 'r') as f: |
||||
table_schema = json.loads(f.read()) |
||||
desc = 'Results of performance benchmarks.' |
||||
return big_query_utils.patch_table(bq, _PROJECT_ID, dataset_id, |
||||
table_id, table_schema) |
||||
|
||||
|
||||
argp = argparse.ArgumentParser(description='Patch schema of scenario results table.') |
||||
argp.add_argument('--bq_result_table', required=True, default=None, type=str, |
||||
help='Bigquery "dataset.table" to patch.') |
||||
|
||||
args = argp.parse_args() |
||||
|
||||
dataset_id, table_id = args.bq_result_table.split('.', 2) |
||||
|
||||
_patch_results_table(dataset_id, table_id) |
||||
print('Successfully patched schema of %s.\n' % args.bq_result_table) |
Loading…
Reference in new issue