예제 #1
0
        public async Task GetStateAndEtagAsync_ValidateRequest()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();
            var metadata = new Dictionary <string, string>
            {
                { "partitionKey", "mypartition" }
            };

            var task = daprClient.GetStateAsync <Widget>("testStore", "test", metadata: metadata);

            // Get Request & Validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <Autogenerated.GetStateRequest>(entry.Request);

            request.StoreName.Should().Be("testStore");
            request.Key.Should().Be("test");
            request.Metadata.Should().BeEquivalentTo(metadata);

            // Create Response & Respond
            await SendResponseWithState <Widget>(null, entry);

            // Get response and validate
            var state = await task;

            state.Should().BeNull();
        }
예제 #2
0
        public async Task SetStateAsync_ThrowsForNonSuccess()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var widget = new Widget()
            {
                Size = "small", Color = "yellow",
            };
            var task = daprClient.SaveStateAsync("testStore", "test", widget);

            // Create Response & Respond
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var response = GrpcUtils.CreateResponse(HttpStatusCode.NotAcceptable);

            entry.Completion.SetResult(response);

            var ex = await Assert.ThrowsAsync <DaprException>(async() => await task);

            Assert.IsType <RpcException>(ex.InnerException);
        }
예제 #3
0
        public async Task SaveStateAsync_CanSaveState()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var widget = new Widget()
            {
                Size = "small", Color = "yellow",
            };
            var task = daprClient.SaveStateAsync("testStore", "test", widget);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <Autogenerated.SaveStateRequest>(entry.Request);

            request.StoreName.Should().Be("testStore");
            request.States.Count.Should().Be(1);
            var state = request.States[0];

            state.Key.Should().Be("test");

            var stateJson        = state.Value.ToStringUtf8();
            var stateFromRequest = JsonSerializer.Deserialize <Widget>(stateJson);

            stateFromRequest.Size.Should().Be(widget.Size);
            stateFromRequest.Color.Should().Be(widget.Color);
        }
        public async Task InvokeBindingAsync_ValidateRequest()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var metadata = new Dictionary <string, string>();

            metadata.Add("key1", "value1");
            metadata.Add("key2", "value2");
            var invokeRequest = new InvokeRequest()
            {
                RequestParameter = "Hello "
            };
            var task = daprClient.InvokeBindingAsync <InvokeRequest>("test", invokeRequest, metadata);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetEnvelopeFromRequestMessageAsync <InvokeBindingEnvelope>(entry.Request);

            envelope.Name.Should().Be("test");
            envelope.Metadata.Count.Should().Be(2);
            envelope.Metadata.Keys.Contains("key1").Should().BeTrue();
            envelope.Metadata.Keys.Contains("key2").Should().BeTrue();
            envelope.Metadata["key1"].Should().Be("value1");
            envelope.Metadata["key2"].Should().Be("value2");
            var json            = envelope.Data.Value.ToStringUtf8();
            var typeFromRequest = JsonSerializer.Deserialize <InvokeRequest>(json);

            typeFromRequest.RequestParameter.Should().Be("Hello ");
        }
예제 #5
0
        public async Task GetBulkStateAsync_ValidateRequest()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var metadata = new Dictionary <string, string>
            {
                { "partitionKey", "mypartition" }
            };

            var key  = "test";
            var task = daprClient.GetBulkStateAsync("testStore", new List <string>()
            {
                key
            }, null, metadata: metadata);

            // Create Response & Validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <Autogenerated.GetBulkStateRequest>(entry.Request);

            request.StoreName.Should().Be("testStore");
            request.Metadata.Should().BeEquivalentTo(metadata);
        }
예제 #6
0
        private async Task SendEmptyResponse(TestHttpClient.Entry entry, HttpStatusCode code = HttpStatusCode.OK)
        {
            var response      = new Autogenerated.GetSecretResponse();
            var streamContent = await GrpcUtils.CreateResponseContent(response);

            entry.Completion.SetResult(GrpcUtils.CreateResponse(code, streamContent));
        }
예제 #7
0
        public async Task GetSecretAsync_ValidateRequest()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var metadata = new Dictionary <string, string>();

            metadata.Add("key1", "value1");
            metadata.Add("key2", "value2");
            var task = daprClient.GetSecretAsync("testStore", "test_key", metadata);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <Autogenerated.GetSecretRequest>(entry.Request);

            request.StoreName.Should().Be("testStore");
            request.Key.Should().Be("test_key");
            request.Metadata.Count.Should().Be(2);
            request.Metadata.Keys.Contains("key1").Should().BeTrue();
            request.Metadata.Keys.Contains("key2").Should().BeTrue();
            request.Metadata["key1"].Should().Be("value1");
            request.Metadata["key2"].Should().Be("value2");
        }
예제 #8
0
        public async Task InvokeMethodAsync_ValidateRequest()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var httpOptions = HttpInvocationOptions
                              .UsingPost()
                              .WithQueryParam("key1", "value1")
                              .WithQueryParam("key2", "value2");

            var task = daprClient.InvokeMethodAsync <Response>("app1", "mymethod", httpOptions);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetRequestFromRequestMessageAsync <InvokeServiceRequest>(entry.Request);

            envelope.Id.Should().Be("app1");
            envelope.Message.Method.Should().Be("mymethod");
            envelope.Message.ContentType.Should().Be(Constants.ContentTypeApplicationJson);
            envelope.Message.HttpExtension.Verb.Should().Be(Autogen.Grpc.v1.HTTPExtension.Types.Verb.Post);
            envelope.Message.HttpExtension.Querystring.Count.Should().Be(2);
            envelope.Message.HttpExtension.Querystring.ContainsKey("key1").Should().BeTrue();
            envelope.Message.HttpExtension.Querystring.ContainsKey("key2").Should().BeTrue();
            envelope.Message.HttpExtension.Querystring["key1"].Should().Be("value1");
            envelope.Message.HttpExtension.Querystring["key2"].Should().Be("value2");
        }
예제 #9
0
        public async Task InvokeMethodAsync_CanInvokeMethodWithNoReturnTypeAndData_ThrowsErrorNonSuccess()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var task = daprClient.InvokeMethodAsync <InvokeRequest>("test", "test", new InvokeRequest()
            {
                RequestParameter = "Hello "
            });

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetEnvelopeFromRequestMessageAsync <InvokeServiceEnvelope>(entry.Request);

            envelope.Id.Should().Be("test");
            envelope.Method.Should().Be("test");
            var json            = envelope.Data.Value.ToStringUtf8();
            var typeFromRequest = JsonSerializer.Deserialize <InvokeRequest>(json);

            typeFromRequest.RequestParameter.Should().Be("Hello ");

            // Create Response & Respond
            var response = GrpcUtils.CreateResponse(HttpStatusCode.NotAcceptable);

            entry.Completion.SetResult(response);

            //validate response
            await FluentActions.Awaiting(async() => await task).Should().ThrowAsync <RpcException>();
        }
예제 #10
0
        public async Task InvokeMethodAsync_CanInvokeMethodWithReturnTypeAndData()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var task = daprClient.InvokeMethodAsync <InvokedResponse>("test", "test");

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetEnvelopeFromRequestMessageAsync <InvokeServiceEnvelope>(entry.Request);

            envelope.Id.Should().Be("test");
            envelope.Method.Should().Be("test");

            // Create Response & Respond
            var data = new InvokedResponse()
            {
                Name = "Look, I was invoked!"
            };

            SendResponse(data, entry);

            // Validate Response
            var invokedResponse = await task;

            invokedResponse.Name.Should().Be("Look, I was invoked!");
        }
예제 #11
0
        public async Task InvokeMethodGrpcAsync_WithReturnTypeAndData()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = CreateTestClientGrpc(httpClient);

            var invokeRequest = new Request()
            {
                RequestParameter = "Hello "
            };
            var invokedResponse = new Response {
                Name = "Look, I was invoked!"
            };

            var task = daprClient.InvokeMethodGrpcAsync <Request, Response>("test", "test", invokeRequest);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetRequestFromRequestMessageAsync <InvokeServiceRequest>(entry.Request);

            envelope.Id.Should().Be("test");
            envelope.Message.Method.Should().Be("test");
            envelope.Message.ContentType.Should().Be(Constants.ContentTypeApplicationGrpc);

            var actual = envelope.Message.Data.Unpack <Request>();

            Assert.Equal(invokeRequest.RequestParameter, actual.RequestParameter);

            await SendResponse(invokedResponse, entry);

            var response = await task;

            response.Name.Should().Be(invokedResponse.Name);
        }
예제 #12
0
        public async Task InvokeMethodAsync_CanInvokeMethodWithReturnTypeNoData_ThrowsExceptionNonSuccess()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var task = daprClient.InvokeMethodAsync <InvokedResponse>("test", "test");

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetEnvelopeFromRequestMessageAsync <InvokeServiceEnvelope>(entry.Request);

            envelope.Id.Should().Be("test");
            envelope.Method.Should().Be("test");

            // Create Response & Respond
            var response = GrpcUtils.CreateResponse(HttpStatusCode.NotAcceptable);

            entry.Completion.SetResult(response);

            //validate response
            await FluentActions.Awaiting(async() => await task).Should().ThrowAsync <RpcException>();
        }
예제 #13
0
        public async Task ExecuteStateTransactionAsync_ThrowsForNonSuccess()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var widget1 = new Widget()
            {
                Size = "small", Color = "yellow",
            };
            var state1 = new StateTransactionRequest("stateKey1", JsonSerializer.SerializeToUtf8Bytes(widget1), StateOperationType.Upsert);
            var states = new List <StateTransactionRequest>();

            states.Add(state1);
            var task = daprClient.ExecuteStateTransactionAsync("testStore", states);

            // Create Response & Respond
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var response = GrpcUtils.CreateResponse(HttpStatusCode.NotAcceptable);

            entry.Completion.SetResult(response);

            await FluentActions.Awaiting(async() => await task).Should().ThrowAsync <RpcException>();
        }
예제 #14
0
        public async Task TryDeleteStateAsync_ValidateOptions(
            ConsistencyMode consistencyMode,
            ConcurrencyMode concurrencyMode,
            StateConsistency expectedConsistency,
            StateConcurrency expectedConcurrency)
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var stateOptions = new StateOptions
            {
                Concurrency = concurrencyMode,
                Consistency = consistencyMode
            };

            var task = daprClient.TryDeleteStateAsync("testStore", "test", "Test_Etag", stateOptions);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <Autogenerated.DeleteStateRequest>(entry.Request);

            request.StoreName.Should().Be("testStore");
            request.Key.Should().Be("test");
            request.Etag.Should().Be("Test_Etag");
            request.Options.Concurrency.Should().Be(expectedConcurrency);
            request.Options.Consistency.Should().Be(expectedConsistency);
        }
        // [Test] // Integration Test
        public async Task Can_call_external_secure_service_using_remote_certificate()
        {
            try
            {
                // File.WriteAllBytes("grpc.crt", "https://todoworld.servicestack.net/grpc.crt".GetBytesFromUrl());
                // var cert = new X509Certificate2("grpc.crt");
                var cert = new X509Certificate2("https://todoworld.servicestack.net/grpc.crt".GetBytesFromUrl());

                var client = new GrpcServiceClient("https://todoworld.servicestack.net:50051",
                                                   cert, GrpcUtils.AllowSelfSignedCertificatesFrom("todoworld.servicestack.net"));

                var response = await client.GetAsync(new Hello { Name = "gRPC SSL C# 50051" });

                response.Result.Print();

                client = new GrpcServiceClient("https://todoworld.servicestack.net:5051",
                                               cert, GrpcUtils.AllowSelfSignedCertificatesFrom("todoworld.servicestack.net"));

                response = await client.GetAsync(new Hello { Name = "gRPC SSL C# 5051" });

                response.Result.Print();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
예제 #16
0
        public void AddDaprSecretStore_DuplicateSecret_ReportsError()
        {
            var httpClient = new TestHttpClient()
            {
                Handler = async(entry) =>
                {
                    var secrets = new Dictionary <string, string>()
                    {
                        { "secretName", "secret" }, { "SecretName", "secret" }
                    };
                    var secretResponse = new Autogenerated.GetSecretResponse();
                    secretResponse.Data.Add(secrets);

                    var streamContent = await GrpcUtils.CreateResponseContent(secretResponse);

                    var response = GrpcUtils.CreateResponse(HttpStatusCode.OK, streamContent);
                    entry.Completion.SetResult(response);
                }
            };

            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var ex = Assert.Throws <InvalidOperationException>(() =>
            {
                var config = CreateBuilder()
                             .AddDaprSecretStore("store", new DaprSecretDescriptor[] { new DaprSecretDescriptor("secretName") }, daprClient)
                             .Build();
            });

            Assert.Contains("Please remove any duplicates from your secret store.", ex.Message);
        }
        public async Task Triggering_all_validators_returns_right_ErrorCode_from_Headers()
        {
            var client = GetClient();

            try
            {
                var response = await client.PostTriggerValidatorsAsync(new TriggerValidators(),
                                                                       GrpcUtils.ToHeaders(new {
                    CreditCard         = "NotCreditCard",
                    Email              = "NotEmail",
                    Empty              = "NotEmpty",
                    Equal              = "NotEqual",
                    ExclusiveBetween   = 1,
                    GreaterThan        = 1,
                    GreaterThanOrEqual = 1,
                    InclusiveBetween   = 1,
                    Length             = "Length",
                    LessThan           = 20,
                    LessThanOrEqual    = 20,
                    NotEmpty           = "",
                    NotEqual           = "NotEqual",
                    Null = "NotNull",
                    RegularExpression = "FOO",
                    ScalePrecision    = 123.456m
                }));

                Assert.Fail("Should throw");
            }
            catch (WebServiceException ex)
            {
                //ex.ResponseStatus.PrintDump();
                AssertTriggerValidatorsResponse(ex);
            }
        }
예제 #18
0
        public async Task PublishEventAsync_CanPublishTopicWithNoContent_WithMetadata()
        {
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var metadata = new Dictionary <string, string>
            {
                { "key1", "value1" },
                { "key2", "value2" }
            };

            var task = daprClient.PublishEventAsync(TestPubsubName, "test", metadata);

            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <PublishEventRequest>(entry.Request);

            var jsonFromRequest = request.Data.ToStringUtf8();

            request.PubsubName.Should().Be(TestPubsubName);
            request.Topic.Should().Be("test");
            jsonFromRequest.Should().Be("\"\"");

            request.Metadata.Count.Should().Be(2);
            request.Metadata.Keys.Contains("key1").Should().BeTrue();
            request.Metadata.Keys.Contains("key2").Should().BeTrue();
            request.Metadata["key1"].Should().Be("value1");
            request.Metadata["key2"].Should().Be("value2");
        }
예제 #19
0
        public async Task InvokeMethodGrpcAsync_CanInvokeMethodWithReturnTypeAndData()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = CreateTestClientGrpc(httpClient);

            var task = daprClient.InvokeMethodGrpcAsync <Request, Response>("test", "test", new Request()
            {
                RequestParameter = "Hello "
            });

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetRequestFromRequestMessageAsync <InvokeServiceRequest>(entry.Request);

            envelope.Id.Should().Be("test");
            envelope.Message.Method.Should().Be("test");
            envelope.Message.ContentType.Should().Be(Constants.ContentTypeApplicationGrpc);

            // Create Response & Respond
            var data = new Response()
            {
                Name = "Look, I was invoked!"
            };

            await SendResponse(data, entry);

            // Validate Response
            var invokedResponse = await task;

            invokedResponse.Name.Should().Be("Look, I was invoked!");
        }
예제 #20
0
        public async Task PublishEventAsync_CanPublishTopicWithData()
        {
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var publishData = new PublishData()
            {
                PublishObjectParameter = "testparam"
            };
            var task = daprClient.PublishEventAsync <PublishData>(TestPubsubName, "test", publishData);

            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <PublishEventRequest>(entry.Request);

            var jsonFromRequest = request.Data.ToStringUtf8();

            request.PubsubName.Should().Be(TestPubsubName);
            request.Topic.Should().Be("test");
            jsonFromRequest.Should().Be(JsonSerializer.Serialize(publishData));
            request.Metadata.Count.Should().Be(0);
        }
        public void LoadSecrets_FromSecretStoreThatCanReturnsMultipleValues()
        {
            // Configure Client
            var httpClient = new TestHttpClient()
            {
                Handler = async(entry) =>
                {
                    var secrets = new Dictionary <string, string>()
                    {
                        { "first_secret", "secret1" },
                        { "second_secret", "secret2" }
                    };
                    var secretResponse = new Autogenerated.GetSecretResponse();
                    secretResponse.Data.Add(secrets);

                    var streamContent = await GrpcUtils.CreateResponseContent(secretResponse);

                    var response = GrpcUtils.CreateResponse(HttpStatusCode.OK, streamContent);
                    entry.Completion.SetResult(response);
                }
            };

            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var config = CreateBuilder()
                         .AddDaprSecretStore("store", new DaprSecretDescriptor[] { new DaprSecretDescriptor("secretName") }, daprClient)
                         .Build();

            config["first_secret"].Should().Be("secret1");
            config["second_secret"].Should().Be("secret2");
        }
예제 #22
0
        public async Task InvokeMethodAsync_ValidateRequest()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var metadata = new Dictionary <string, string>();

            metadata.Add("key1", "value1");
            metadata.Add("key2", "value2");
            var task = daprClient.InvokeMethodAsync <InvokedResponse>("test", "test", metadata);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetEnvelopeFromRequestMessageAsync <InvokeServiceEnvelope>(entry.Request);

            envelope.Id.Should().Be("test");
            envelope.Method.Should().Be("test");
            envelope.Metadata.Count.Should().Be(2);
            envelope.Metadata.Keys.Contains("key1").Should().BeTrue();
            envelope.Metadata.Keys.Contains("key2").Should().BeTrue();
            envelope.Metadata["key1"].Should().Be("value1");
            envelope.Metadata["key2"].Should().Be("value2");
        }
예제 #23
0
        public async Task GetStateAsync_ValidateRequest(ConsistencyMode consistencyMode, StateConsistency expectedConsistencyMode)
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var task = daprClient.GetStateAsync <Widget>("testStore", "test", consistencyMode);

            // Get Request & Validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <Autogenerated.GetStateRequest>(entry.Request);

            request.StoreName.Should().Be("testStore");
            request.Key.Should().Be("test");
            request.Consistency.Should().Be(expectedConsistencyMode);

            // Create Response & Respond
            SendResponseWithState <Widget>(null, entry);

            // Get response and validate
            var state = await task;

            state.Should().BeNull();
        }
예제 #24
0
        public async Task InvokeMethodAsync_WithNoReturnTypeAndData_UsesConfiguredJsonSerializerOptions()
        {
            // Configure Client
            var httpClient  = new TestHttpClient();
            var jsonOptions = new JsonSerializerOptions {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            };
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .UseJsonSerializationOptions(jsonOptions)
                             .Build();

            var invokeRequest = new InvokeRequest()
            {
                RequestParameter = "Hello"
            };
            var task = daprClient.InvokeMethodAsync <InvokeRequest, InvokedResponse>("test", "test", invokeRequest);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetEnvelopeFromRequestMessageAsync <InvokeServiceEnvelope>(entry.Request);

            envelope.Id.Should().Be("test");
            envelope.Method.Should().Be("test");
            var json = envelope.Data.Value.ToStringUtf8();

            json.Should().Be(JsonSerializer.Serialize(invokeRequest, jsonOptions));
        }
예제 #25
0
        public async Task GetStateAsync_WrapsJsonException()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            // Create Response & Respond
            var task = daprClient.GetStateAsync <Widget>("testStore", "test");

            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();

            var stateResponse = new Autogenerated.GetStateResponse()
            {
                // Totally NOT valid JSON
                Data = ByteString.CopyFrom(0x5b, 0x7b, 0x5b, 0x7b),
            };

            var streamContent = await GrpcUtils.CreateResponseContent(stateResponse);

            var response = GrpcUtils.CreateResponse(HttpStatusCode.OK, streamContent);

            entry.Completion.SetResult(response);

            var ex = await Assert.ThrowsAsync <DaprException>(async() => await task);

            Assert.IsType <JsonException>(ex.InnerException);
        }
예제 #26
0
        public async Task InvokeMethodAsync_CanInvokeMethodWithReturnTypeAndData_EmptyResponseReturnsNull()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var task = daprClient.InvokeMethodAsync <InvokeRequest, InvokedResponse>("test", "test", new InvokeRequest()
            {
                RequestParameter = "Hello "
            });

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetEnvelopeFromRequestMessageAsync <InvokeServiceEnvelope>(entry.Request);

            envelope.Id.Should().Be("test");
            envelope.Method.Should().Be("test");
            var json            = envelope.Data.Value.ToStringUtf8();
            var typeFromRequest = JsonSerializer.Deserialize <InvokeRequest>(json);

            typeFromRequest.RequestParameter.Should().Be("Hello ");

            // Create Response & Respond
            SendResponse <InvokedResponse>(null, entry);

            // Validate Response.
            var invokedResponse = await task;

            invokedResponse.Should().BeNull();
        }
예제 #27
0
        public async Task InvokeBindingAsync_ValidateRequest()
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var invokeRequest = new InvokeRequest()
            {
                RequestParameter = "Hello "
            };
            var task = daprClient.InvokeBindingAsync <InvokeRequest>("test", "create", invokeRequest);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <InvokeBindingRequest>(entry.Request);

            request.Name.Should().Be("test");
            request.Metadata.Count.Should().Be(0);
            var json            = request.Data.ToStringUtf8();
            var typeFromRequest = JsonSerializer.Deserialize <InvokeRequest>(json, daprClient.JsonSerializerOptions);

            typeFromRequest.RequestParameter.Should().Be("Hello ");
        }
예제 #28
0
        public async Task InvokeMethodAsync_WithReturnTypeAndData_WithNonDefaultVerb_WithQueryString_UsesConfiguredJsonSerializerOptions()
        {
            // Configure Client
            var httpClient  = new TestHttpClient();
            var jsonOptions = new JsonSerializerOptions {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase
            };
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .UseJsonSerializationOptions(jsonOptions)
                             .Build();

            var invokeRequest = new Request()
            {
                RequestParameter = "Hello "
            };
            var invokedResponse = new Response {
                Name = "Look, I was invoked!"
            };

            Dictionary <string, string> queryString = new Dictionary <string, string>();

            queryString.Add("key1", "value1");
            var httpExtension = new Http.HTTPExtension()
            {
                Verb        = HTTPVerb.Put,
                QueryString = queryString
            };

            var task = daprClient.InvokeMethodAsync <Request, Response>("test", "test1", invokeRequest, httpExtension);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var envelope = await GrpcUtils.GetRequestFromRequestMessageAsync <InvokeServiceRequest>(entry.Request);

            envelope.Id.Should().Be("test");
            envelope.Message.Method.Should().Be("test1");
            envelope.Message.ContentType.Should().Be(Constants.ContentTypeApplicationJson);
            envelope.Message.HttpExtension.Verb.Should().Be(Autogen.Grpc.v1.HTTPExtension.Types.Verb.Put);
            envelope.Message.HttpExtension.Querystring.Count.Should().Be(1);
            envelope.Message.HttpExtension.Querystring.ContainsKey("key1").Should().BeTrue();
            envelope.Message.HttpExtension.Querystring["key1"].Should().Be("value1");


            var json = envelope.Message.Data.Value.ToStringUtf8();

            json.Should().Be(JsonSerializer.Serialize(invokeRequest, jsonOptions));

            await SendResponse(invokedResponse, entry, jsonOptions);

            var response = await task;

            response.Name.Should().Be(invokedResponse.Name);
        }
예제 #29
0
        public async Task TrySaveStateAsync_ValidateOptions(
            ConsistencyMode consistencyMode,
            ConcurrencyMode concurrencyMode,
            StateConsistency expectedConsistency,
            StateConcurrency expectedConcurrency)
        {
            // Configure Client
            var httpClient = new TestHttpClient();
            var daprClient = new DaprClientBuilder()
                             .UseGrpcChannelOptions(new GrpcChannelOptions {
                HttpClient = httpClient
            })
                             .Build();

            var widget = new Widget()
            {
                Size = "small", Color = "yellow",
            };
            var stateOptions = new StateOptions
            {
                Concurrency = concurrencyMode,
                Consistency = consistencyMode
            };

            var metadata = new Dictionary <string, string>
            {
                { "key1", "value1" },
                { "key2", "value2" }
            };
            var task = daprClient.TrySaveStateAsync("testStore", "test", widget, "Test_Etag", stateOptions, metadata);

            // Get Request and validate
            httpClient.Requests.TryDequeue(out var entry).Should().BeTrue();
            var request = await GrpcUtils.GetRequestFromRequestMessageAsync <Autogenerated.SaveStateRequest>(entry.Request);

            request.StoreName.Should().Be("testStore");
            request.States.Count.Should().Be(1);
            var state = request.States[0];

            state.Key.Should().Be("test");
            state.Etag.Should().Be("Test_Etag");
            state.Metadata.Count.Should().Be(2);
            state.Metadata.Keys.Contains("key1").Should().BeTrue();
            state.Metadata.Keys.Contains("key2").Should().BeTrue();
            state.Metadata["key1"].Should().Be("value1");
            state.Metadata["key2"].Should().Be("value2");
            state.Options.Concurrency.Should().Be(expectedConcurrency);
            state.Options.Consistency.Should().Be(expectedConsistency);

            var stateJson        = state.Value.ToStringUtf8();
            var stateFromRequest = JsonSerializer.Deserialize <Widget>(stateJson);

            stateFromRequest.Size.Should().Be(widget.Size);
            stateFromRequest.Color.Should().Be(widget.Color);
        }
예제 #30
0
        private async Task SendResponseWithSecrets(Dictionary <string, string> secrets, TestHttpClient.Entry entry)
        {
            var secretResponse = new Autogenerated.GetSecretResponse();

            secretResponse.Data.Add(secrets);

            var streamContent = await GrpcUtils.CreateResponseContent(secretResponse);

            var response = GrpcUtils.CreateResponse(HttpStatusCode.OK, streamContent);

            entry.Completion.SetResult(response);
        }