public GetEventStoreAggregateRepositoryTests()
        {
            _id = "aggregate-" + Guid.NewGuid().ToString("n");
            var source = new TaskCompletionSource<bool>();
            _eventStoreInitialized = source.Task;
            var notListening = new IPEndPoint(IPAddress.None, 0);
            _node = EmbeddedVNodeBuilder
                .AsSingleNode()
                .WithExternalTcpOn(notListening)
                .WithInternalTcpOn(notListening)
                .WithExternalHttpOn(notListening)
                .WithInternalHttpOn(notListening)
                .RunProjections(ProjectionsMode.All);
            _node.NodeStatusChanged += (_, e) =>
            {
                if (e.NewVNodeState != VNodeState.Master)
                {
                    return;
                }
                source.SetResult(true);
            };
            _connection = EmbeddedEventStoreConnection.Create(_node);
            _sut = new GetEventStoreAggregateRepository(_connection, new DefaultGetEventStoreJsonSerializer());

            _node.Start();
        }
        public static void Start()
        {
            var node = EmbeddedVNodeBuilder.
                AsSingleNode().
                OnDefaultEndpoints().
                RunInMemory().
                Build();
            node.Start();
            var tcs = new TaskCompletionSource<object>();
            node.NodeStatusChanged += (sender, args) =>
            {
                if (args.NewVNodeState == VNodeState.Master)
                    tcs.SetResult(null);
            };
            tcs.Task.Wait();
            Node = node;
            Credentials = new UserCredentials("admin", "changeit");
            var connection = EmbeddedEventStoreConnection.Create(Node);

            // This does not work, because ... ††† JEZUS †††
            //var connection = EventStoreConnection.Create(
            //    ConnectionSettings.Create().SetDefaultUserCredentials(Credentials).UseDebugLogger(),
            //    new IPEndPoint(Opts.InternalIpDefault, Opts.ExternalTcpPortDefault));
            connection.ConnectAsync().Wait();
            Connection = connection;
        }
 public static void Stop()
 {
     var connection = Connection;
     if (connection != null)
     {
         connection.Close();
         connection.Dispose();
         Connection = null;
     }
     var node = Node;
     if (node != null)
     {
         node.Stop();
         Node = null;
     }
     Credentials = null;
 }
        public ResolvedEventtDispatcherTests()
        {
            var source = new TaskCompletionSource<bool>();
            _nodeStarted = source.Task;

            var notListening = new IPEndPoint(IPAddress.None, 0);
            
            _node = EmbeddedVNodeBuilder.AsSingleNode()
                .WithInternalTcpOn(notListening)
                .WithExternalTcpOn(notListening)
                .WithInternalHttpOn(notListening)
                .WithExternalHttpOn(notListening);

            _node.NodeStatusChanged += (_, e) =>
            {
                if(e.NewVNodeState != VNodeState.Master) return;

                source.SetResult(true);
            };

            _node.Start();

            _connection = EmbeddedEventStoreConnection.Create(_node);
        }
        public EmbeddedEventStoreConnectionFactory()
        {
            var noIp = new IPEndPoint(IPAddress.None, 0);

            _vnode = EmbeddedVNodeBuilder.AsSingleNode()
                .RunInMemory()
                .WithExternalTcpOn(noIp)
                .WithInternalTcpOn(noIp)
                .WithExternalHttpOn(noIp)
                .WithInternalHttpOn(noIp)
                .Build();

            _status = Observable.FromEventPattern<VNodeStatusChangeArgs>(
                h => _vnode.NodeStatusChanged += h,
                h => _vnode.NodeStatusChanged -= h)
                .Select(e => e.EventArgs.NewVNodeState)
                .Log(new ConsoleLogger(), "VNode.State")
                .Publish(VNodeState.Unknown);

            _statusSubscription.Disposable = _status.Connect();

            _vnode.Start();
            _conn = EmbeddedEventStoreConnection.Create(_vnode);
        }
        public ProcessManagerHandlerTests()
        {
            TestLogger.Configure();

            var source = new TaskCompletionSource<bool>();
            _nodeStarted = source.Task;

            var notListening = new IPEndPoint(IPAddress.None, 0);

            _node = EmbeddedVNodeBuilder.AsSingleNode()
                .WithInternalTcpOn(notListening)
                .WithExternalTcpOn(notListening)
                .WithInternalHttpOn(notListening)
                .WithExternalHttpOn(notListening);

            _node.NodeStatusChanged += (_, e) =>
            {
                if(e.NewVNodeState != VNodeState.Master)
                {
                    return;
                }

                source.SetResult(true);
            };

            _node.Start();

            _connection = EmbeddedEventStoreConnection.Create(_node);

            _commands = new List<object>();

            _serializer = new DefaultGetEventStoreJsonSerializer();

            var commandHandlerModule = new CommandHandlerModule();
            commandHandlerModule.For<ShipOrder>()
                .Handle((message, _) =>
                {
                    _commands.Add(message.Command);
                    return Task.FromResult(0);
                });
            commandHandlerModule.For<BillCustomer>()
                .Handle((message, _) =>
                {
                    _commands.Add(message.Command);
                    return Task.FromResult(0);
                });

            var resolver = new CommandHandlerResolver(commandHandlerModule);
            var commandHandlingMiddleware =
                CommandHandlingMiddleware.HandleCommands(new CommandHandlingSettings(resolver));
            var embeddedClient = commandHandlingMiddleware.CreateEmbeddedClient();

            var processHandler = ProcessHandler.For<OrderFulfillment, CompareablePosition>(
                (command, token) => embeddedClient.PutCommand(command, Guid.NewGuid()),
                new EventStoreClientProcessManagerCheckpointRepository(_connection, _serializer))
                .CorrelateBy<OrderPlaced>(e => e.DomainEvent.OrderId.ToString())
                .CorrelateBy<OrderShipped>(e => e.DomainEvent.OrderId.ToString())
                .CorrelateBy<BillingSucceeded>(e => e.DomainEvent.OrderId.ToString())
                .CorrelateBy<BillingFailed>(e => e.DomainEvent.OrderId.ToString());


            _dispatcher = new ResolvedEventDispatcher(_connection,
                new DefaultGetEventStoreJsonSerializer(),
                new InMemoryCheckpointRepository(),
                processHandler.BuildHandlerResolver(),
                () => { });

            _orderId = Guid.NewGuid();
            _streamId = ("orders-" + _orderId.ToString("n")).FormatStreamIdWithBucket();
            _correlationId = _orderId.ToString();
        }
 /// <summary>
 /// Creates a new embedded <see cref="IEventStoreConnection"/> to single node using specific <see cref="ConnectionSettings"/>
 /// </summary>
 /// <param name="eventStore">The <see cref="ClusterVNode" /> to connect to. The node must already be running.</param>
 /// <param name="connectionSettings">The <see cref="ConnectionSettings"/> to apply to the new connection</param>
 /// <param name="connectionName">Optional name of connection (will be generated automatically, if not provided)</param>
 /// <returns></returns>
 public static IEventStoreConnection Create(ClusterVNode eventStore, ConnectionSettings connectionSettings, string connectionName = null)
 {
     return Create(eventStore.MainQueue, eventStore.MainBus, eventStore.InternalAuthenticationProvider, connectionSettings, connectionName);
 }
 /// <summary>
 /// Creates a new embedded <see cref="IEventStoreConnection"/> to single node with default connection settings
 /// </summary>
 /// <param name="eventStore">The <see cref="ClusterVNode" /> to connect to. The node must already be running.</param>
 /// <param name="connectionName">Optional name of connection (will be generated automatically, if not provided)</param>
 /// <returns></returns>
 public static IEventStoreConnection Create(ClusterVNode eventStore, string connectionName = null)
 {
     return Create(eventStore, ConnectionSettings.Default, connectionName);
 }