protected EventStoreGrpcFixture(
            Action <VNodeBuilder> configureVNode      = default,
            Action <IWebHostBuilder> configureWebHost = default,
            EventStoreClientSettings clientSettings   = default)
        {
            var webHostBuilder = new WebHostBuilder();

            configureWebHost?.Invoke(webHostBuilder);

            var vNodeBuilder = new TestVNodeBuilder();

            vNodeBuilder.RunInMemory().WithTfChunkSize(1024 * 1024);
            configureVNode?.Invoke(vNodeBuilder);

            Node         = vNodeBuilder.Build();
            _db          = vNodeBuilder.GetDb();
            _disposables = new List <IDisposable>();
            TestServer   = new TestServer(webHostBuilder.UseSerilog().UseStartup(new TestClusterVNodeStartup(Node)));

            var settings = clientSettings ?? new EventStoreClientSettings {
                CreateHttpMessageHandler = () => new ResponseVersionHandler {
                    InnerHandler = TestServer.CreateHandler()
                },
                OperationOptions = { TimeoutAfter = Debugger.IsAttached ? null : (TimeSpan?)TimeSpan.FromSeconds(30) }
            };

            Client = new EventStoreClient(settings);
        }
        protected EventStoreClientBase(EventStoreClientSettings?settings,
                                       IDictionary <string, Func <RpcException, Exception> > exceptionMap)
        {
            Settings     = settings ?? new EventStoreClientSettings();
            _httpHandler = Settings.CreateHttpMessageHandler?.Invoke() ?? new HttpClientHandler();

            var connectionName = Settings.ConnectionName ?? $"ES-{Guid.NewGuid()}";
            Action <Exception>?exceptionNotificationHook = null;

            if (Settings.ConnectivitySettings.GossipSeeds.Length > 0)
            {
                _httpHandler = ClusterAwareHttpHandler.Create(Settings, _httpHandler);
            }

            _channel = GrpcChannel.ForAddress(Settings.ConnectivitySettings.Address, new GrpcChannelOptions {
                HttpClient = new HttpClient(_httpHandler)
                {
                    Timeout = Timeout.InfiniteTimeSpan,
                    DefaultRequestVersion = new Version(2, 0),
                },
                LoggerFactory = Settings.LoggerFactory
            });

            CallInvoker = (Settings.Interceptors ?? Array.Empty <Interceptor>()).Aggregate(
                _channel.CreateCallInvoker()
                .Intercept(new TypedExceptionInterceptor(exceptionMap, exceptionNotificationHook))
                .Intercept(new ConnectionNameInterceptor(connectionName)),
                (invoker, interceptor) => invoker.Intercept(interceptor));
        }
        protected EventStoreGrpcFixture(
            Action <VNodeBuilder> configureVNode      = default,
            Action <IWebHostBuilder> configureWebHost = default,
            EventStoreClientSettings clientSettings   = default)
        {
            var webHostBuilder = new WebHostBuilder();

            configureWebHost?.Invoke(webHostBuilder);

            var vNodeBuilder = new TestVNodeBuilder();

            vNodeBuilder.RunInMemory().WithTfChunkSize(1024 * 1024);
            configureVNode?.Invoke(vNodeBuilder);

            Node = vNodeBuilder.Build();
            _db  = vNodeBuilder.GetDb();

            TestServer = new TestServer(
                webHostBuilder
                .UseStartup(new TestClusterVNodeStartup(Node)));

            var settings = clientSettings ?? new EventStoreClientSettings(new UriBuilder().Uri)
            {
                CreateHttpClient = () => new HttpClient(new ResponseVersionHandler {
                    InnerHandler = TestServer.CreateHandler()
                })
                {
                    Timeout = Timeout.InfiniteTimeSpan
                }
            };

            Client = new EventStoreClient(settings);
        }
        public void connection_string_with_invalid_settings_should_throw()
        {
            Assert.Throws <InvalidSettingException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?unknown=1234");
            });

            Assert.Throws <InvalidSettingException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?maxDiscoverAttempts=1234&hello=test");
            });

            Assert.Throws <InvalidSettingException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?maxDiscoverAttempts=abcd");
            });

            Assert.Throws <InvalidSettingException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?discoveryInterval=abcd");
            });

            Assert.Throws <InvalidSettingException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?gossipTimeout=defg");
            });

            Assert.Throws <InvalidSettingException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?tlsVerifyCert=truee");
            });

            Assert.Throws <InvalidSettingException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?nodePreference=blabla");
            });
        }
Exemple #5
0
        protected EventStoreClientFixtureBase(EventStoreClientSettings?clientSettings,
                                              IDictionary <string, string>?env = null)
        {
            _disposables = new List <IDisposable>();
            ServicePointManager.ServerCertificateValidationCallback = delegate { return(true); };
            Settings = clientSettings ?? new EventStoreClientSettings {
                CreateHttpMessageHandler = () => new SocketsHttpHandler {
                    SslOptions =
                    {
                        RemoteCertificateValidationCallback = delegate { return(true); }
                    }
                },
                OperationOptions =
                {
                    TimeoutAfter = Debugger.IsAttached
                                                ? new TimeSpan?()
                                                : TimeSpan.FromSeconds(30)
                },
                ConnectivitySettings =
                {
                    Address    = new UriBuilder {
                        Scheme = Uri.UriSchemeHttps,
                        Port   = 2113
                    }.Uri
                },
                LoggerFactory = new SerilogLoggerFactory()
            };

            TestServer = new EventStoreTestServer(Settings.ConnectivitySettings.Address, env);
        }
 public void connection_string_with_empty_path_after_host_should_not_throw()
 {
     EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1");
     EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1:1234");
     EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/");
     EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1?maxDiscoverAttempts=10");
     EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?maxDiscoverAttempts=10");
 }
        protected EventStoreClientBase(EventStoreClientSettings?settings,
                                       IDictionary <string, Func <RpcException, Exception> > exceptionMap)
        {
            Settings = settings ?? new EventStoreClientSettings();

            var connectionName = Settings.ConnectionName ?? $"ES-{Guid.NewGuid()}";

            if (Settings.ConnectivitySettings.Address.Scheme == Uri.UriSchemeHttp ||
                !Settings.ConnectivitySettings.GossipOverHttps)
            {
                //this must be switched on before creation of the HttpMessageHandler
                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
            }

#if NETCOREAPP3_1
            _innerHttpHandler = Settings.CreateHttpMessageHandler?.Invoke() ?? new SocketsHttpHandler();
#elif NETSTANDARD2_1
            _innerHttpHandler = Settings.CreateHttpMessageHandler?.Invoke() ?? new HttpClientHandler();
#endif

            _httpHandler = Settings.ConnectivitySettings.IsSingleNode
                                ? (HttpMessageHandler) new SingleNodeHttpHandler(Settings)
            {
                InnerHandler = _innerHttpHandler
            }
                                : ClusterAwareHttpHandler.Create(Settings, _innerHttpHandler);

#if NETSTANDARD2_1
            _httpHandler = new DefaultRequestVersionHandler(_httpHandler);
#endif

            _channel = GrpcChannel.ForAddress(new UriBuilder(Settings.ConnectivitySettings.Address)
            {
                Scheme = Uri.UriSchemeHttps
            }.Uri, new GrpcChannelOptions {
                HttpClient = new HttpClient(_httpHandler)
                {
                    Timeout = Timeout.InfiniteTimeSpan,
#if NETCOREAPP3_1
                    DefaultRequestVersion = new Version(2, 0),
#endif
                },
                LoggerFactory = Settings.LoggerFactory,
                Credentials   = Settings.ChannelCredentials
            });

            Action <Exception>?exceptionNotificationHook =
                _httpHandler is ClusterAwareHttpHandler h
                                        ? h.ExceptionOccurred
                                        : new Action <Exception>(ex => { });

            CallInvoker = (Settings.Interceptors ?? Array.Empty <Interceptor>()).Aggregate(
                _channel.CreateCallInvoker()
                .Intercept(new TypedExceptionInterceptor(exceptionMap, exceptionNotificationHook))
                .Intercept(new ConnectionNameInterceptor(connectionName)),
                (invoker, interceptor) => invoker.Intercept(interceptor));
        }
        public void connection_string_with_duplicate_key_should_throw()
        {
            Assert.Throws <DuplicateKeyException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?maxDiscoverAttempts=1234&MaxDiscoverAttempts=10");
            });

            Assert.Throws <DuplicateKeyException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?gossipTimeout=10&gossipTimeout=30");
            });
        }
        public void connection_string_with_invalid_key_value_pair_should_throw()
        {
            Assert.Throws <InvalidKeyValuePairException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?maxDiscoverAttempts=12=34");
            });

            Assert.Throws <InvalidKeyValuePairException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?maxDiscoverAttempts1234");
            });
        }
        protected EventStoreClientBase(EventStoreClientSettings?settings,
                                       IDictionary <string, Func <RpcException, Exception> > exceptionMap)
        {
            _exceptionMap = exceptionMap;
            Settings      = settings ?? new EventStoreClientSettings();

            ConnectionName = Settings.ConnectionName ?? $"ES-{Guid.NewGuid()}";

            _channels = new MultiChannel(Settings);
        }
        public void with_different_node_preferences()
        {
            Assert.Equal(NodePreference.Leader, EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?nodePreference=leader").ConnectivitySettings.NodePreference);
            Assert.Equal(NodePreference.Follower, EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?nodePreference=Follower").ConnectivitySettings.NodePreference);
            Assert.Equal(NodePreference.Random, EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?nodePreference=rAndom").ConnectivitySettings.NodePreference);
            Assert.Equal(NodePreference.ReadOnlyReplica, EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?nodePreference=ReadOnlyReplica").ConnectivitySettings.NodePreference);

            Assert.Throws <InvalidSettingException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?nodePreference=invalid");
            });
        }
 public static ClusterAwareHttpHandler Create(EventStoreClientSettings settings,
                                              HttpMessageHandler?httpMessageHandler = null) => new ClusterAwareHttpHandler(
     settings.ConnectivitySettings.NodePreference == NodePreference.Leader,
     new ClusterEndpointDiscoverer(
         settings.ConnectivitySettings.MaxDiscoverAttempts,
         settings.ConnectivitySettings.GossipSeeds,
         settings.ConnectivitySettings.GossipTimeout,
         settings.ConnectivitySettings.DiscoveryInterval,
         settings.ConnectivitySettings.NodePreference,
         httpMessageHandler))
 {
     InnerHandler = httpMessageHandler
 };
 public StreamAppender(EventStoreClientSettings settings,
                       Task <AsyncDuplexStreamingCall <BatchAppendReq, BatchAppendResp> > callTask, CancellationToken cancellationToken,
                       Action <Exception> onException)
 {
     _settings          = settings;
     _callTask          = callTask;
     _cancellationToken = cancellationToken;
     _onException       = onException;
     _channel           = System.Threading.Channels.Channel.CreateBounded <BatchAppendReq>(10000);
     _pendingRequests   = new ConcurrentDictionary <Uuid, TaskCompletionSource <IWriteResult> >();
     _ = Task.Factory.StartNew(Send, TaskCreationOptions.LongRunning);
     _ = Task.Factory.StartNew(Receive, TaskCreationOptions.LongRunning);
 }
        public EventStoreClient(EventStoreClientSettings settings = null)
        {
            _settings = settings ?? new EventStoreClientSettings();
            var connectionName = _settings.ConnectionName ?? $"ES-{Guid.NewGuid()}";
            Action <Exception> exceptionNotificationHook = null;
            var httpHandler = _settings.CreateHttpMessageHandler?.Invoke() ?? new HttpClientHandler();

            if (_settings.ConnectivitySettings.GossipSeeds.Length > 0)
            {
                ConfigureClusterAwareHandler();
            }

            _channel = GrpcChannel.ForAddress(_settings.ConnectivitySettings.Address, new GrpcChannelOptions {
                HttpClient = new HttpClient(httpHandler)
                {
                    Timeout = Timeout.InfiniteTimeSpan,
                    DefaultRequestVersion = new Version(2, 0),
                },
                LoggerFactory = _settings.LoggerFactory
            });
            var callInvoker = (_settings.Interceptors ?? Array.Empty <Interceptor>()).Aggregate(
                _channel.CreateCallInvoker()
                .Intercept(new TypedExceptionInterceptor(exceptionNotificationHook))
                .Intercept(new ConnectionNameInterceptor(connectionName)),
                (invoker, interceptor) => invoker.Intercept(interceptor));

            _client = new Streams.Streams.StreamsClient(callInvoker);
            PersistentSubscriptions = new EventStorePersistentSubscriptionsClient(callInvoker, _settings);
            ProjectionsManager      = new EventStoreProjectionManagerClient(callInvoker);
            UsersManager            = new EventStoreUserManagerClient(callInvoker);
            _log = _settings.LoggerFactory?.CreateLogger <EventStoreClient>() ?? new NullLogger <EventStoreClient>();

            void ConfigureClusterAwareHandler()
            {
                var clusterAwareHttpHandler = new ClusterAwareHttpHandler(
                    _settings.ConnectivitySettings.NodePreference == NodePreference.Leader,
                    new ClusterEndpointDiscoverer(
                        _settings.ConnectivitySettings.MaxDiscoverAttempts,
                        _settings.ConnectivitySettings.GossipSeeds,
                        _settings.ConnectivitySettings.GossipTimeout,
                        _settings.ConnectivitySettings.DiscoveryInterval,
                        _settings.ConnectivitySettings.NodePreference,
                        httpHandler))
                {
                    InnerHandler = httpHandler
                };

                exceptionNotificationHook = clusterAwareHttpHandler.ExceptionOccurred;
                httpHandler = clusterAwareHttpHandler;
            }
        }
        public void connection_string_with_invalid_scheme_should_throw()
        {
            Assert.Throws <InvalidSchemeException>(() => {
                EventStoreClientSettings.Create("esdbwrong://");
            });

            Assert.Throws <InvalidSchemeException>(() => {
                EventStoreClientSettings.Create("wrong://");
            });

            Assert.Throws <InvalidSchemeException>(() => {
                EventStoreClientSettings.Create("badesdb://");
            });
        }
Exemple #16
0
        protected EventStoreClientFixtureBase(EventStoreClientSettings?clientSettings,
                                              IDictionary <string, string>?env = null)
        {
            _disposables = new List <IDisposable>();
            ServicePointManager.ServerCertificateValidationCallback = delegate { return(true); };

            Settings = clientSettings ?? EventStoreClientSettings.Create(ConnectionString);

            Settings.OperationOptions.TimeoutAfter = Debugger.IsAttached
                                ? new TimeSpan?()
                                : TimeSpan.FromSeconds(30);

#if GRPC_CORE
            Settings.ChannelCredentials ??= GetServerCertificate();
        public void connection_string_with_non_empty_path_should_throw()
        {
            Assert.Throws <ConnectionStringParseException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/test");
            });

            Assert.Throws <ConnectionStringParseException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/maxDiscoverAttempts=10");
            });

            Assert.Throws <ConnectionStringParseException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/hello?maxDiscoverAttempts=10");
            });
        }
        public void connection_string_with_invalid_userinfo_should_throw()
        {
            Assert.Throws <InvalidUserCredentialsException>(() => {
                EventStoreClientSettings.Create("esdb://[email protected]/");
            });

            Assert.Throws <InvalidUserCredentialsException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/");
            });

            Assert.Throws <InvalidUserCredentialsException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/");
            });
        }
Exemple #19
0
        public MultiChannel(EventStoreClientSettings settings)
        {
            _settings           = settings;
            _endpointDiscoverer = settings.ConnectivitySettings.IsSingleNode
                                ? (IEndpointDiscoverer) new SingleNodeEndpointDiscoverer(settings.ConnectivitySettings.Address)
                                : new GossipBasedEndpointDiscoverer(settings.ConnectivitySettings, new GrpcGossipClient(settings));
            _channels = new ConcurrentDictionary <EndPoint, ChannelBase>();
            _log      = settings.LoggerFactory?.CreateLogger <MultiChannel>() ?? new NullLogger <MultiChannel>();

            if (settings.ConnectivitySettings.KeepAliveInterval < TimeSpan.FromSeconds(10))
            {
                _log.LogWarning("Specified KeepAliveInterval of {interval} is less than recommended 10_000 ms.",
                                settings.ConnectivitySettings.KeepAliveInterval);
            }
        }
        public static ChannelBase CreateChannel(EventStoreClientSettings settings, Uri?address)
        {
            address ??= settings.ConnectivitySettings.Address;

#if !GRPC_CORE
            if (address.Scheme == Uri.UriSchemeHttp || settings.ConnectivitySettings.Insecure)
            {
                //this must be switched on before creation of the HttpMessageHandler
                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
            }

            return(GrpcChannel.ForAddress(address, new GrpcChannelOptions {
                HttpClient = new HttpClient(CreateHandler(), true)
                {
                    Timeout = System.Threading.Timeout.InfiniteTimeSpan,
                    DefaultRequestVersion = new Version(2, 0),
                },
                LoggerFactory = settings.LoggerFactory,
                Credentials = settings.ChannelCredentials,
                DisposeHttpClient = true
            }));

            HttpMessageHandler CreateHandler()
            {
                if (settings.CreateHttpMessageHandler != null)
                {
                    return(settings.CreateHttpMessageHandler.Invoke());
                }

                return(new SocketsHttpHandler {
                    KeepAlivePingDelay = settings.ConnectivitySettings.KeepAliveInterval,
                    KeepAlivePingTimeout = settings.ConnectivitySettings.KeepAliveTimeout,
                    EnableMultipleHttp2Connections = true
                });
            }
#else
            return(new Channel(address.Host, address.Port, settings.ChannelCredentials ?? ChannelCredentials.Insecure,
                               GetChannelOptions()));

            IEnumerable <ChannelOption> GetChannelOptions()
            {
                yield return(new ChannelOption("grpc.keepalive_time_ms",
                                               GetValue((int)settings.ConnectivitySettings.KeepAliveInterval.TotalMilliseconds)));

                yield return(new ChannelOption("grpc.keepalive_timeout_ms",
                                               GetValue((int)settings.ConnectivitySettings.KeepAliveTimeout.TotalMilliseconds)));
            }
        public void with_default_settings()
        {
            EventStoreClientSettings settings;

            settings = EventStoreClientSettings.Create("esdb://hostname:4321/");

            Assert.Null(settings.ConnectionName);
            Assert.Equal(EventStoreClientConnectivitySettings.Default.Address.Scheme, settings.ConnectivitySettings.Address.Scheme);
            Assert.Equal(EventStoreClientConnectivitySettings.Default.DiscoveryInterval.TotalMilliseconds, settings.ConnectivitySettings.DiscoveryInterval.TotalMilliseconds);
            Assert.Null(EventStoreClientConnectivitySettings.Default.DnsGossipSeeds);
            Assert.Empty(EventStoreClientConnectivitySettings.Default.GossipSeeds);
            Assert.Equal(EventStoreClientConnectivitySettings.Default.GossipTimeout.TotalMilliseconds, settings.ConnectivitySettings.GossipTimeout.TotalMilliseconds);
            Assert.Null(EventStoreClientConnectivitySettings.Default.IpGossipSeeds);
            Assert.Equal(EventStoreClientConnectivitySettings.Default.MaxDiscoverAttempts, settings.ConnectivitySettings.MaxDiscoverAttempts);
            Assert.Equal(EventStoreClientConnectivitySettings.Default.NodePreference, settings.ConnectivitySettings.NodePreference);
            Assert.Equal(EventStoreClientConnectivitySettings.Default.GossipOverHttps, settings.ConnectivitySettings.GossipOverHttps);
            Assert.Equal(EventStoreClientOperationOptions.Default.TimeoutAfter.Value.TotalMilliseconds, settings.OperationOptions.TimeoutAfter.Value.TotalMilliseconds);
            Assert.Equal(EventStoreClientOperationOptions.Default.ThrowOnAppendFailure, settings.OperationOptions.ThrowOnAppendFailure);
        }
        public void with_valid_cluster_connection_string()
        {
            EventStoreClientSettings settings;

            settings = EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1,127.0.0.2:3321,127.0.0.3/?maxDiscoverAttempts=13&DiscoveryInterval=37&nOdEPrEfErence=FoLLoWer&tlsVerifyCert=false");
            Assert.Equal("user", settings.DefaultCredentials.Username);
            Assert.Equal("pass", settings.DefaultCredentials.Password);
            Assert.NotEmpty(settings.ConnectivitySettings.GossipSeeds);
            Assert.NotNull(settings.ConnectivitySettings.IpGossipSeeds);
            Assert.Null(settings.ConnectivitySettings.DnsGossipSeeds);
            Assert.True(settings.ConnectivitySettings.GossipOverHttps);
            Assert.True(settings.ConnectivitySettings.IpGossipSeeds.Length == 3 &&
                        Equals(settings.ConnectivitySettings.IpGossipSeeds[0].Address, IPAddress.Parse("127.0.0.1")) &&
                        Equals(settings.ConnectivitySettings.IpGossipSeeds[0].Port, 2113) &&
                        Equals(settings.ConnectivitySettings.IpGossipSeeds[1].Address, IPAddress.Parse("127.0.0.2")) &&
                        Equals(settings.ConnectivitySettings.IpGossipSeeds[1].Port, 3321) &&
                        Equals(settings.ConnectivitySettings.IpGossipSeeds[2].Address, IPAddress.Parse("127.0.0.3")) &&
                        Equals(settings.ConnectivitySettings.IpGossipSeeds[2].Port, 2113));
            Assert.Equal(13, settings.ConnectivitySettings.MaxDiscoverAttempts);
            Assert.Equal(37, settings.ConnectivitySettings.DiscoveryInterval.TotalMilliseconds);
            Assert.Equal(NodePreference.Follower, settings.ConnectivitySettings.NodePreference);
            Assert.NotNull(settings.CreateHttpMessageHandler);


            settings = EventStoreClientSettings.Create("esdb://*****:*****@host1,host2:3321,127.0.0.3/?tls=false&maxDiscoverAttempts=13&DiscoveryInterval=37&nOdEPrEfErence=FoLLoWer&tlsVerifyCert=false");
            Assert.Equal("user", settings.DefaultCredentials.Username);
            Assert.Equal("pass", settings.DefaultCredentials.Password);
            Assert.NotEmpty(settings.ConnectivitySettings.GossipSeeds);
            Assert.Null(settings.ConnectivitySettings.IpGossipSeeds);
            Assert.NotNull(settings.ConnectivitySettings.DnsGossipSeeds);
            Assert.False(settings.ConnectivitySettings.GossipOverHttps);
            Assert.True(settings.ConnectivitySettings.DnsGossipSeeds.Length == 3 &&
                        Equals(settings.ConnectivitySettings.DnsGossipSeeds[0].Host, "host1") &&
                        Equals(settings.ConnectivitySettings.DnsGossipSeeds[0].Port, 2113) &&
                        Equals(settings.ConnectivitySettings.DnsGossipSeeds[1].Host, "host2") &&
                        Equals(settings.ConnectivitySettings.DnsGossipSeeds[1].Port, 3321) &&
                        Equals(settings.ConnectivitySettings.DnsGossipSeeds[2].Host, "127.0.0.3") &&
                        Equals(settings.ConnectivitySettings.DnsGossipSeeds[2].Port, 2113));
            Assert.Equal(13, settings.ConnectivitySettings.MaxDiscoverAttempts);
            Assert.Equal(37, settings.ConnectivitySettings.DiscoveryInterval.TotalMilliseconds);
            Assert.Equal(NodePreference.Follower, settings.ConnectivitySettings.NodePreference);
            Assert.NotNull(settings.CreateHttpMessageHandler);
        }
        public void connection_string_with_invalid_host_should_throw()
        {
            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1:abc");
            });

            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1:abc/");
            });

            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1:1234,127.0.0.2:abc,127.0.0.3:4321");
            });

            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1:1234,127.0.0.2:abc,127.0.0.3:4321/");
            });

            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1:abc:def");
            });

            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1:abc:def/");
            });

            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@localhost:1234,127.0.0.2:abc:def,127.0.0.3:4321");
            });

            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@localhost:1234,127.0.0.2:abc:def,127.0.0.3:4321/");
            });

            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@localhost:1234,,127.0.0.3:4321");
            });

            Assert.Throws <InvalidHostException>(() => {
                EventStoreClientSettings.Create("esdb://*****:*****@localhost:1234,,127.0.0.3:4321/");
            });
        }
        public static CallOptions Create(EventStoreClientSettings settings,
                                         EventStoreClientOperationOptions operationOptions, UserCredentials?userCredentials,
                                         CancellationToken cancellationToken) => new CallOptions(
            cancellationToken: cancellationToken,
            deadline: DeadlineAfter(operationOptions.TimeoutAfter),
            headers: new Metadata(),
            credentials: CallCredentials.FromInterceptor(async(context, metadata) => {
            var credentials = settings.DefaultCredentials ?? userCredentials;

            if (credentials == null)
            {
                return;
            }

            var authorizationHeader = await settings.OperationOptions
                                      .GetAuthenticationHeaderValue(credentials, CancellationToken.None)
                                      .ConfigureAwait(false);
            metadata.Add(Constants.Headers.Authorization, authorizationHeader);
        })
            );
        public void with_valid_single_node_connection_string()
        {
            EventStoreClientSettings settings;

            settings = EventStoreClientSettings.Create("esdb://*****:*****@127.0.0.1/?maxDiscoverAttempts=13&DiscoveryInterval=37&gossipTimeout=33&nOdEPrEfErence=FoLLoWer&tlsVerifyCert=false");
            Assert.Equal("user", settings.DefaultCredentials.Username);
            Assert.Equal("pass", settings.DefaultCredentials.Password);
            Assert.Equal("https://127.0.0.1:2113/", settings.ConnectivitySettings.Address.ToString());
            Assert.Empty(settings.ConnectivitySettings.GossipSeeds);
            Assert.Null(settings.ConnectivitySettings.IpGossipSeeds);
            Assert.Null(settings.ConnectivitySettings.DnsGossipSeeds);
            Assert.Equal(13, settings.ConnectivitySettings.MaxDiscoverAttempts);
            Assert.Equal(37, settings.ConnectivitySettings.DiscoveryInterval.TotalMilliseconds);
            Assert.Equal(33, settings.ConnectivitySettings.GossipTimeout.TotalMilliseconds);
            Assert.Equal(NodePreference.Follower, settings.ConnectivitySettings.NodePreference);
            Assert.NotNull(settings.CreateHttpMessageHandler);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1?connectionName=test&maxDiscoverAttempts=13&DiscoveryInterval=37&nOdEPrEfErence=FoLLoWer&tls=true&tlsVerifyCert=true&operationTimeout=330&throwOnAppendFailure=faLse");
            Assert.Null(settings.DefaultCredentials);
            Assert.Equal("test", settings.ConnectionName);
            Assert.Equal("https://127.0.0.1:2113/", settings.ConnectivitySettings.Address.ToString());
            Assert.Empty(settings.ConnectivitySettings.GossipSeeds);
            Assert.Null(settings.ConnectivitySettings.IpGossipSeeds);
            Assert.Null(settings.ConnectivitySettings.DnsGossipSeeds);
            Assert.True(settings.ConnectivitySettings.GossipOverHttps);
            Assert.Equal(13, settings.ConnectivitySettings.MaxDiscoverAttempts);
            Assert.Equal(37, settings.ConnectivitySettings.DiscoveryInterval.TotalMilliseconds);
            Assert.Equal(NodePreference.Follower, settings.ConnectivitySettings.NodePreference);
            Assert.Null(settings.CreateHttpMessageHandler);
            Assert.Equal(330, settings.OperationOptions.TimeoutAfter.Value.TotalMilliseconds);
            Assert.False(settings.OperationOptions.ThrowOnAppendFailure);

            settings = EventStoreClientSettings.Create("esdb://hostname:4321/?tls=false");
            Assert.Null(settings.DefaultCredentials);
            Assert.Equal("http://hostname:4321/", settings.ConnectivitySettings.Address.ToString());
            Assert.Empty(settings.ConnectivitySettings.GossipSeeds);
            Assert.Null(settings.ConnectivitySettings.IpGossipSeeds);
            Assert.Null(settings.ConnectivitySettings.DnsGossipSeeds);
            Assert.True(settings.ConnectivitySettings.GossipOverHttps);
            Assert.Null(settings.CreateHttpMessageHandler);
        }
        protected EventStoreClientFixtureBase(EventStoreClientSettings?clientSettings,
                                              IDictionary <string, string>?env = null)
        {
            _disposables = new List <IDisposable>();

            Settings = clientSettings ?? new EventStoreClientSettings {
                OperationOptions =
                {
                    TimeoutAfter = Debugger.IsAttached
                                                ? new TimeSpan?()
                                                : TimeSpan.FromSeconds(30)
                },
                CreateHttpMessageHandler = () => new SocketsHttpHandler {
                    SslOptions = new SslClientAuthenticationOptions {
                        RemoteCertificateValidationCallback = delegate { return(true); }
                    }
                }
            };

            TestServer = new EventStoreTestServer(env);
        }
Exemple #27
0
        protected EventStoreClientFixtureBase(EventStoreClientSettings?clientSettings,
                                              IDictionary <string, string>?env = null)
        {
            _disposables = new List <IDisposable>();
            ServicePointManager.ServerCertificateValidationCallback = delegate { return(true); };

            var connectionString = GlobalEnvironment.UseCluster ? ConnectionStringCluster : ConnectionStringSingle;

            Settings = clientSettings ?? EventStoreClientSettings.Create(connectionString);

            Settings.OperationOptions.TimeoutAfter = Debugger.IsAttached
                                ? new TimeSpan?()
                                : TimeSpan.FromSeconds(30);

            var hostCertificatePath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory,
                                                                    "..", "..", "..", "..", GlobalEnvironment.UseCluster ? "certs-cluster" : "certs"));

#if GRPC_CORE
            Settings.ChannelCredentials ??= GetServerCertificate();

            SslCredentials GetServerCertificate() => new SslCredentials(
                File.ReadAllText(Path.Combine(hostCertificatePath, "ca", "ca.crt")), null, _ => true);
#endif

            Settings.LoggerFactory ??= new SerilogLoggerFactory();

            Settings.ConnectivitySettings.MaxDiscoverAttempts = 20;
            Settings.ConnectivitySettings.DiscoveryInterval   = TimeSpan.FromSeconds(1);

            if (GlobalEnvironment.UseExternalServer)
            {
                TestServer = new EventStoreTestServerExternal();
            }
            else
            {
                TestServer = GlobalEnvironment.UseCluster
                                        ? (IEventStoreTestServer) new EventStoreTestServerCluster(hostCertificatePath, Settings.ConnectivitySettings.Address, env)
                                        : new EventStoreTestServer(hostCertificatePath, Settings.ConnectivitySettings.Address, env);
            }
        }
Exemple #28
0
        public EventStoreClient(EventStoreClientSettings settings = null)
        {
            settings ??= new EventStoreClientSettings(new UriBuilder {
                Scheme = Uri.UriSchemeHttps,
                Port   = 2113
            }.Uri);
            _channel = GrpcChannel.ForAddress(settings.Address, new GrpcChannelOptions {
                HttpClient = settings.CreateHttpClient?.Invoke()
            });
            var connectionName = settings.ConnectionName ?? $"ES-{Guid.NewGuid()}";

            var callInvoker = settings.Interceptors.Aggregate(
                _channel.CreateCallInvoker()
                .Intercept(new TypedExceptionInterceptor())
                .Intercept(new ConnectionNameInterceptor(connectionName)),
                (invoker, interceptor) => invoker.Intercept(interceptor));

            _client = new Streams.Streams.StreamsClient(callInvoker);
            PersistentSubscriptions = new EventStorePersistentSubscriptionsClient(callInvoker);
            ProjectionsManager      = new EventStoreProjectionManagerClient(callInvoker);
            UsersManager            = new EventStoreUserManagerClient(callInvoker);
        }
        public void with_different_tls_settings()
        {
            EventStoreClientSettings settings;

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1/");
            Assert.Equal(Uri.UriSchemeHttps, settings.ConnectivitySettings.Address.Scheme);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1?tls=true");
            Assert.Equal(Uri.UriSchemeHttps, settings.ConnectivitySettings.Address.Scheme);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1/?tls=FaLsE");
            Assert.Equal(Uri.UriSchemeHttp, settings.ConnectivitySettings.Address.Scheme);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1,127.0.0.2:3321,127.0.0.3/");
            Assert.True(settings.ConnectivitySettings.GossipOverHttps);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1,127.0.0.2:3321,127.0.0.3?tls=true");
            Assert.True(settings.ConnectivitySettings.GossipOverHttps);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1,127.0.0.2:3321,127.0.0.3/?tls=fAlSe");
            Assert.False(settings.ConnectivitySettings.GossipOverHttps);
        }
        public void with_different_tls_verify_cert_settings()
        {
            EventStoreClientSettings settings;

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1/");
            Assert.Null(settings.CreateHttpMessageHandler);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1/?tlsVerifyCert=TrUe");
            Assert.Null(settings.CreateHttpMessageHandler);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1/?tlsVerifyCert=FaLsE");
            Assert.NotNull(settings.CreateHttpMessageHandler);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1,127.0.0.2:3321,127.0.0.3/");
            Assert.Null(settings.CreateHttpMessageHandler);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1,127.0.0.2:3321,127.0.0.3/?tlsVerifyCert=true");
            Assert.Null(settings.CreateHttpMessageHandler);

            settings = EventStoreClientSettings.Create("esdb://127.0.0.1,127.0.0.2:3321,127.0.0.3/?tlsVerifyCert=false");
            Assert.NotNull(settings.CreateHttpMessageHandler);
        }