diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/csharp/Grpc.Core.Tests/ChannelConnectivityTest.cs | 86 | ||||
-rw-r--r-- | src/csharp/Grpc.Core.Tests/ClientServerTest.cs | 29 | ||||
-rw-r--r-- | src/csharp/Grpc.Core/Channel.cs | 17 | ||||
-rw-r--r-- | src/csharp/tests.json | 1 | ||||
-rwxr-xr-x | src/objective-c/tests/run_tests.sh | 13 | ||||
-rw-r--r-- | src/php/ext/grpc/channel_credentials.c | 8 |
6 files changed, 118 insertions, 36 deletions
diff --git a/src/csharp/Grpc.Core.Tests/ChannelConnectivityTest.cs b/src/csharp/Grpc.Core.Tests/ChannelConnectivityTest.cs new file mode 100644 index 0000000000..a43040f01a --- /dev/null +++ b/src/csharp/Grpc.Core.Tests/ChannelConnectivityTest.cs @@ -0,0 +1,86 @@ +#region Copyright notice and license + +// 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. + +#endregion + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Grpc.Core; +using Grpc.Core.Internal; +using Grpc.Core.Profiling; +using Grpc.Core.Utils; +using NUnit.Framework; + +namespace Grpc.Core.Tests +{ + public class ChannelConnectivityTest + { + const string Host = "127.0.0.1"; + + MockServiceHelper helper; + Server server; + Channel channel; + + [SetUp] + public void Init() + { + helper = new MockServiceHelper(Host); + server = helper.GetServer(); + server.Start(); + channel = helper.GetChannel(); + } + + [TearDown] + public void Cleanup() + { + channel.ShutdownAsync().Wait(); + server.ShutdownAsync().Wait(); + } + + [Test] + public async Task Channel_WaitForStateChangedAsync() + { + helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) => + { + return Task.FromResult(request); + }); + + Assert.ThrowsAsync(typeof(TaskCanceledException), + async () => await channel.WaitForStateChangedAsync(channel.State, DateTime.UtcNow.AddMilliseconds(10))); + + var stateChangedTask = channel.WaitForStateChangedAsync(channel.State); + + await Calls.AsyncUnaryCall(helper.CreateUnaryCall(), "abc"); + + await stateChangedTask; + Assert.AreEqual(ChannelState.Ready, channel.State); + } + + [Test] + public async Task Channel_ConnectAsync() + { + await channel.ConnectAsync(); + Assert.AreEqual(ChannelState.Ready, channel.State); + + await channel.ConnectAsync(DateTime.UtcNow.AddMilliseconds(1000)); + Assert.AreEqual(ChannelState.Ready, channel.State); + } + } +} diff --git a/src/csharp/Grpc.Core.Tests/ClientServerTest.cs b/src/csharp/Grpc.Core.Tests/ClientServerTest.cs index 90dd365b07..331c3321e1 100644 --- a/src/csharp/Grpc.Core.Tests/ClientServerTest.cs +++ b/src/csharp/Grpc.Core.Tests/ClientServerTest.cs @@ -373,34 +373,5 @@ namespace Grpc.Core.Tests }); Assert.AreEqual("PASS", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "abc")); } - - [Test] - public async Task Channel_WaitForStateChangedAsync() - { - helper.UnaryHandler = new UnaryServerMethod<string, string>((request, context) => - { - return Task.FromResult(request); - }); - - Assert.ThrowsAsync(typeof(TaskCanceledException), - async () => await channel.WaitForStateChangedAsync(channel.State, DateTime.UtcNow.AddMilliseconds(10))); - - var stateChangedTask = channel.WaitForStateChangedAsync(channel.State); - - await Calls.AsyncUnaryCall(helper.CreateUnaryCall(), "abc"); - - await stateChangedTask; - Assert.AreEqual(ChannelState.Ready, channel.State); - } - - [Test] - public async Task Channel_ConnectAsync() - { - await channel.ConnectAsync(); - Assert.AreEqual(ChannelState.Ready, channel.State); - - await channel.ConnectAsync(DateTime.UtcNow.AddMilliseconds(1000)); - Assert.AreEqual(ChannelState.Ready, channel.State); - } } } diff --git a/src/csharp/Grpc.Core/Channel.cs b/src/csharp/Grpc.Core/Channel.cs index f9925a8a76..e39da9c1c2 100644 --- a/src/csharp/Grpc.Core/Channel.cs +++ b/src/csharp/Grpc.Core/Channel.cs @@ -152,8 +152,11 @@ namespace Grpc.Core "Shutdown is a terminal state. No further state changes can occur."); var tcs = new TaskCompletionSource<object>(); var deadlineTimespec = deadline.HasValue ? Timespec.FromDateTime(deadline.Value) : Timespec.InfFuture; - // pass "tcs" as "state" for WatchConnectivityStateHandler. - handle.WatchConnectivityState(lastObservedState, deadlineTimespec, completionQueue, WatchConnectivityStateHandler, tcs); + lock (myLock) + { + // pass "tcs" as "state" for WatchConnectivityStateHandler. + handle.WatchConnectivityState(lastObservedState, deadlineTimespec, completionQueue, WatchConnectivityStateHandler, tcs); + } return tcs.Task; } @@ -236,7 +239,10 @@ namespace Grpc.Core Logger.Warning("Channel shutdown was called but there are still {0} active calls for that channel.", activeCallCount); } - handle.Dispose(); + lock (myLock) + { + handle.Dispose(); + } await Task.WhenAll(GrpcEnvironment.ReleaseAsync(), connectivityWatcherTask).ConfigureAwait(false); } @@ -285,7 +291,10 @@ namespace Grpc.Core { try { - return handle.CheckConnectivityState(tryToConnect); + lock (myLock) + { + return handle.CheckConnectivityState(tryToConnect); + } } catch (ObjectDisposedException) { diff --git a/src/csharp/tests.json b/src/csharp/tests.json index 82573edecb..469328af1a 100644 --- a/src/csharp/tests.json +++ b/src/csharp/tests.json @@ -14,6 +14,7 @@ "Grpc.Core.Tests.CallCancellationTest", "Grpc.Core.Tests.CallCredentialsTest", "Grpc.Core.Tests.CallOptionsTest", + "Grpc.Core.Tests.ChannelConnectivityTest", "Grpc.Core.Tests.ChannelCredentialsTest", "Grpc.Core.Tests.ChannelOptionsTest", "Grpc.Core.Tests.ChannelTest", diff --git a/src/objective-c/tests/run_tests.sh b/src/objective-c/tests/run_tests.sh index 62c4e10b99..cf0b07e8c0 100755 --- a/src/objective-c/tests/run_tests.sh +++ b/src/objective-c/tests/run_tests.sh @@ -34,6 +34,19 @@ $BINDIR/interop_server --port=5051 --max_send_message_size=8388608 --use_tls & # Kill them when this script exits. trap 'kill -9 `jobs -p` ; echo "EXIT TIME: $(date)"' EXIT +# Boot Xcode first with several retries since Xcode might fail due to a bug: +# http://www.openradar.me/29785686 +xcrun simctl list | egrep 'iPhone 6 \(' +udid=`xcrun simctl list | egrep 'iPhone 6 \(.*\) \(.*\)' | sed -E 's/ *iPhone 6 \(([^\)]*)\).*/\1/g' | head -n 1` +retries=0 +while [ $retries -lt 3 ] && ! open -a Simulator --args -CurrentDeviceUDID $udid ; do +retries=$(($retries+1)) +done +if [ $retries == 3 ]; then + echo "Xcode simulator failed to start after 3 retries." + exit 1 +fi + # xcodebuild is very verbose. We filter its output and tell Bash to fail if any # element of the pipe fails. # TODO(jcanizales): Use xctool instead? Issue #2540. diff --git a/src/php/ext/grpc/channel_credentials.c b/src/php/ext/grpc/channel_credentials.c index 86e4f46c67..d120d6e90f 100644 --- a/src/php/ext/grpc/channel_credentials.c +++ b/src/php/ext/grpc/channel_credentials.c @@ -35,6 +35,7 @@ #include <zend_hash.h> #include <grpc/support/alloc.h> +#include <grpc/support/string_util.h> #include <grpc/grpc.h> #include <grpc/grpc_security.h> @@ -46,10 +47,11 @@ static char *default_pem_root_certs = NULL; static grpc_ssl_roots_override_result get_ssl_roots_override( char **pem_root_certs) { - *pem_root_certs = default_pem_root_certs; - if (default_pem_root_certs == NULL) { + if (!default_pem_root_certs) { + *pem_root_certs = NULL; return GRPC_SSL_ROOTS_OVERRIDE_FAIL; } + *pem_root_certs = gpr_strdup(default_pem_root_certs); return GRPC_SSL_ROOTS_OVERRIDE_OK; } @@ -101,7 +103,7 @@ PHP_METHOD(ChannelCredentials, setDefaultRootsPem) { "setDefaultRootsPem expects 1 string", 1 TSRMLS_CC); return; } - default_pem_root_certs = gpr_malloc((pem_roots_length + 1) * sizeof(char)); + default_pem_root_certs = gpr_realloc(default_pem_root_certs, (pem_roots_length + 1) * sizeof(char)); memcpy(default_pem_root_certs, pem_roots, pem_roots_length + 1); } |