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"); }); }
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://"); }); }
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/"); }); }
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); }
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); } }
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); }