public async Task ShouldFailIfCommitFailsDueToBrokenConnectionAsync(string boltVersion)
            {
                using (BoltStubServer.Start($"connection_error_on_commit_{boltVersion}", 9001))
                {
                    using (var driver =
                               GraphDatabase.Driver("bolt://localhost:9001", AuthTokens.None, NoEncryptionAndShortRetry))
                    {
                        var session = driver.AsyncSession(AccessMode.Write);
                        try
                        {
                            var txc = await session.BeginTransactionAsync();

                            var result = await txc.RunAsync("CREATE (n {name: 'Bob'})");

                            var exc = await Record.ExceptionAsync(() => txc.CommitAsync());

                            exc.Should().BeOfType <ServiceUnavailableException>().Which
                            .HasCause <IOException>().Should().BeTrue();
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    }
                }
            }
Example #2
0
        public async Task WriteTransactionOnSessionShouldGoToWriter(AccessMode mode)
        {
            using (BoltStubServer.Start("accessmode_router", 9001))
            {
                using (BoltStubServer.Start("accessmode_writer_func", 9002))
                {
                    using (var driver =
                               GraphDatabase.Driver("bolt+routing://localhost:9001", AuthTokens.None, NoEncryption))
                    {
                        var session = driver.AsyncSession(mode);
                        try
                        {
                            var result = await session.WriteTransactionAsync(tx =>
                                                                             tx.RunAndSingleAsync("CREATE (n: { id: $x }) RETURN $x", new { x = 1 },
                                                                                                  r => r[0].As <int>()));

                            result.Should().Be(1);
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    }
                }
            }
        }
        public async Task InvokeProcedureGetRoutingTableWhenServerVersionPermits(string boltVersion)
        {
            using (BoltStubServer.Start($"{boltVersion}/get_routing_table", 9001))
            {
                var uri = new Uri("neo4j://127.0.0.1:9001");
                using (var driver = GraphDatabase.Driver(uri, SetupConfig))
                {
                    var session = driver.AsyncSession();
                    try
                    {
                        var cursor = await session.RunAsync("MATCH (n) RETURN n.name AS name");

                        var records = await cursor.ToListAsync();

                        records.Count.Should().Be(3);
                        records[0]["name"].As <string>().Should().Be("Alice");
                        records[1]["name"].As <string>().Should().Be("Bob");
                        records[2]["name"].As <string>().Should().Be("Eve");
                    }
                    finally
                    {
                        await session.CloseAsync();
                    }
                }
            }
        }
        public void ShouldThrowOnInvalidRoutingTable()
        {
            using (BoltStubServer.Start("V4/acquire_endpoints_aDatabase_no_servers", 9001))
            {
                using (var driver =
                           GraphDatabase.Driver("neo4j://127.0.0.1:9001", AuthTokens.None, _setupConfig))
                {
                    this.Awaiting(async _ =>
                    {
                        var session = driver.AsyncSession(o =>
                                                          o.WithDatabase("aDatabase").WithDefaultAccessMode(AccessMode.Read));
                        try
                        {
                            var cursor =
                                await session.RunAsync("MATCH (n) RETURN n.name");
                            var result = await cursor.ToListAsync(r => r[0].As <string>());

                            result.Should().BeEquivalentTo("Bob", "Alice", "Tina");
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    })
                    .Should()
                    .Throw <ServiceUnavailableException>()
                    .WithMessage("Failed to connect to any routing server.*");
                }
            }
        }
        public async Task ReadTransactionOnSessionShouldGoToReader(AccessMode mode)
        {
            using (BoltStubServer.Start("V4/accessmode_router", 9001))
            {
                using (BoltStubServer.Start("V4/accessmode_reader_func", 9003))
                {
                    using (var driver =
                               GraphDatabase.Driver("neo4j://127.0.0.1:9001", AuthTokens.None, NoEncryption))
                    {
                        var session = driver.AsyncSession(o => o.WithDefaultAccessMode(mode));
                        try
                        {
                            var result = await session.ReadTransactionAsync(tx =>
                                                                            tx.RunAndSingleAsync("RETURN $x", new { x = 1 }, r => r[0].As <int>()));

                            result.Should().Be(1);
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    }
                }
            }
        }
Example #6
0
            public async Task ShouldFailIfCommitFailsDueToBrokenConnectionAsync(string boltVersion)
            {
                using (BoltStubServer.Start($"{boltVersion}/connection_error_on_commit", 9001))
                {
                    using (var driver =
                               GraphDatabase.Driver("bolt://127.0.0.1:9001", AuthTokens.None, NoEncryptionAndShortRetry))
                    {
                        var session = driver.AsyncSession(o => o.WithDefaultAccessMode(AccessMode.Write));

                        try
                        {
                            var exc = await Record.ExceptionAsync(() =>
                            {
                                return(session.WriteTransactionAsync(
                                           txc => txc.RunAsync("CREATE (n {name: 'Bob'})")));
                            });

                            exc.Should().BeOfType <ServiceUnavailableException>().Which
                            .HasCause <IOException>().Should().BeTrue();
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    }
                }
            }
        public void ShouldThrowOnProcedureNotFound()
        {
            using (BoltStubServer.Start("V4/acquire_endpoints_db_not_found", 9001))
            {
                using (var driver =
                           GraphDatabase.Driver("neo4j://127.0.0.1:9001", AuthTokens.None, _setupConfig))
                {
                    this.Awaiting(async _ =>
                    {
                        var session = driver.AsyncSession(o =>
                                                          o.WithDatabase("aDatabase").WithDefaultAccessMode(AccessMode.Read));
                        try
                        {
                            var cursor =
                                await session.RunAsync("MATCH (n) RETURN n.name");
                            var result = await cursor.ToListAsync(r => r[0].As <string>());

                            result.Should().BeEquivalentTo("Bob", "Alice", "Tina");
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    })
                    .Should()
                    .Throw <FatalDiscoveryException>()
                    .WithMessage("database not found");
                }
            }
        }
        public async Task RunOnWriteModeTransactionShouldGoToWriter()
        {
            using (BoltStubServer.Start("V4/accessmode_router", 9001))
            {
                using (BoltStubServer.Start("V4/accessmode_writer_explicit", 9002))
                {
                    using (var driver =
                               GraphDatabase.Driver("neo4j://127.0.0.1:9001", AuthTokens.None, NoEncryption))
                    {
                        var session = driver.AsyncSession(o => o.WithDefaultAccessMode(AccessMode.Write));
                        try
                        {
                            var tx = await session.BeginTransactionAsync();

                            var result = await tx.RunAndSingleAsync("CREATE (n: { id: $x }) RETURN $x", new { x = 1 },
                                                                    r => r[0].As <int>());

                            result.Should().Be(1);

                            await tx.CommitAsync();
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    }
                }
            }
        }
        public async Task ShouldDiscoverEndpointsForADatabaseWithBookmarks()
        {
            using (BoltStubServer.Start("V4/acquire_endpoints_aDatabase_with_bookmark", 9001))
            {
                using (BoltStubServer.Start("V4/read_from_aDatabase_with_bookmark", 9005))
                {
                    var bookmark1 = Bookmark.From("system:1111");
                    var bookmark2 = Bookmark.From("aDatabase:5555");

                    using (var driver =
                               GraphDatabase.Driver("neo4j://127.0.0.1:9001", AuthTokens.None, _setupConfig))
                    {
                        var session = driver.AsyncSession(o =>
                                                          o.WithDatabase("aDatabase").WithDefaultAccessMode(AccessMode.Read)
                                                          .WithBookmarks(bookmark1, bookmark2));
                        try
                        {
                            var cursor =
                                await session.RunAsync("MATCH (n) RETURN n.name");

                            var result = await cursor.ToListAsync(r => r[0].As <string>());

                            result.Should().BeEquivalentTo("Bob", "Alice", "Tina");
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    }
                }
            }
        }
        public async Task SendRoutingContextToServer(string boltVersion)
        {
            using (BoltStubServer.Start($"{boltVersion}/get_routing_table_with_context", 9001))
            {
                var uri = new Uri("neo4j://127.0.0.1:9001/?policy=my_policy&region=china");
                using (var driver = GraphDatabase.Driver(uri, SetupConfig))
                {
                    var session = driver.AsyncSession();
                    try
                    {
                        var cursor = await session.RunAsync("MATCH (n) RETURN n.name AS name");

                        var records = await cursor.ToListAsync();

                        records.Count.Should().Be(2);
                        records[0]["name"].As <string>().Should().Be("Alice");
                        records[1]["name"].As <string>().Should().Be("Bob");
                    }
                    finally
                    {
                        await session.CloseAsync();
                    }
                }
            }
        }
        public async Task ShouldDiscoverEndpointsForDefaultDatabase()
        {
            using (BoltStubServer.Start("V4/acquire_endpoints_default_database", 9001))
            {
                using (BoltStubServer.Start("V4/read", 9005))
                {
                    using (var driver =
                               GraphDatabase.Driver("neo4j://127.0.0.1:9001", AuthTokens.None, _setupConfig))
                    {
                        var session = driver.AsyncSession(o => o.WithDefaultAccessMode(AccessMode.Read));
                        try
                        {
                            var cursor =
                                await session.RunAsync("MATCH (n) RETURN n.name");

                            var result = await cursor.ToListAsync(r => r[0].As <string>());

                            result.Should().BeEquivalentTo("Bob", "Alice", "Tina");
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    }
                }
            }
        }
Example #12
0
        public async Task RunOnReadModeTransactionShouldGoToReader()
        {
            using (BoltStubServer.Start("accessmode_router", 9001))
            {
                using (BoltStubServer.Start("accessmode_reader_explicit", 9003))
                {
                    using (var driver =
                               GraphDatabase.Driver("bolt+routing://localhost:9001", AuthTokens.None, NoEncryption))
                    {
                        var session = driver.AsyncSession(AccessMode.Read);
                        try
                        {
                            var tx = await session.BeginTransactionAsync();

                            var result = await tx.RunAndSingleAsync("RETURN $x", new { x = 1 }, r => r[0].As <int>());

                            result.Should().Be(1);

                            await tx.CommitAsync();
                        }
                        finally
                        {
                            await session.CloseAsync();
                        }
                    }
                }
            }
        }
Example #13
0
        public async Task ShouldOnlyResetAfterError(string boltVersion)
        {
            using (BoltStubServer.Start($"{boltVersion}/rollback_error", 9001))
            {
                var uri = new Uri("bolt://127.0.0.1:9001");
                using (var driver = GraphDatabase.Driver(uri, SetupConfig))
                {
                    var session = driver.AsyncSession();
                    try
                    {
                        var txc = await session.BeginTransactionAsync();

                        try
                        {
                            var result = await txc.RunAsync("CREATE (n {name:'Alice'}) RETURN n.name AS name");

                            var exception = await Record.ExceptionAsync(() => result.ConsumeAsync());

                            exception.Should().BeOfType <TransientException>();
                        }
                        finally
                        {
                            await txc.RollbackAsync();
                        }
                    }
                    finally
                    {
                        await session.CloseAsync();
                    }
                }
            }
        }
 public async Task ShouldVerifyConnectivity(string boltVersion)
 {
     using (BoltStubServer.Start($"{boltVersion}/verify_connectivity", 9001))
     {
         using (var driver = GraphDatabase.Driver("neo4j://localhost:9001", AuthTokens.None, SetupConfig))
         {
             await driver.VerifyConnectivityAsync();
         }
     }
 }
 public async Task ShouldVerifyConnectivity(string boltVersion)
 {
     using (BoltStubServer.Start($"{boltVersion}/supports_multidb", 9001))
     {
         using (var driver = GraphDatabase.Driver("bolt://127.0.0.1:9001", AuthTokens.None, SetupConfig))
         {
             await driver.VerifyConnectivityAsync();
         }
     }
 }
        public async Task ShouldThrowSecurityErrorWhenFailToHello(string boltVersion, string scheme)
        {
            using (BoltStubServer.Start($"{boltVersion}/fail_to_auth", 9001))
            {
                using (var driver = GraphDatabase.Driver($"{scheme}://127.0.0.1:9001", AuthTokens.None, _setupConfig))
                {
                    var error = await Record.ExceptionAsync(() => driver.SupportsMultiDbAsync());

                    error.Should().BeOfType <AuthenticationException>();
                    error.Message.Should().StartWith("blabla");
                }
            }
        }
        public async Task ShouldThrowSecurityErrorWhenFailedToHello(string boltVersion)
        {
            using (BoltStubServer.Start($"{boltVersion}/fail_to_auth", 9001))
            {
                using (var driver = GraphDatabase.Driver("neo4j://localhost:9001", AuthTokens.None, SetupConfig))
                {
                    var error = await Record.ExceptionAsync(() => driver.VerifyConnectivityAsync());

                    error.Should().BeOfType <AuthenticationException>();
                    error.Message.Should().StartWith("blabla");
                }
            }
        }
Example #18
0
 public void SendRoutingContextToServer()
 {
     using (BoltStubServer.Start("get_routing_table_with_context", 9001))
     {
         var uri = new Uri("bolt+routing://127.0.0.1:9001/?policy=my_policy&region=china");
         using (var driver = GraphDatabase.Driver(uri, BoltStubServer.Config))
             using (var session = driver.Session())
             {
                 var records = session.Run("MATCH (n) RETURN n.name AS name").ToList();
                 records.Count.Should().Be(2);
                 records[0]["name"].ValueAs <string>().Should().Be("Alice");
                 records[1]["name"].ValueAs <string>().Should().Be("Bob");
             }
     }
 }
Example #19
0
 public void InvokeProcedureGetRoutingTableWhenServerVersionPermits()
 {
     using (BoltStubServer.Start("get_routing_table", 9001))
     {
         var uri = new Uri("bolt+routing://127.0.0.1:9001");
         using (var driver = GraphDatabase.Driver(uri, BoltStubServer.Config))
             using (var session = driver.Session())
             {
                 var records = session.Run("MATCH (n) RETURN n.name AS name").ToList();
                 records.Count.Should().Be(3);
                 records[0]["name"].ValueAs <string>().Should().Be("Alice");
                 records[1]["name"].ValueAs <string>().Should().Be("Bob");
                 records[2]["name"].ValueAs <string>().Should().Be("Eve");
             }
     }
 }
Example #20
0
 public void ShouldOnlyResetAfterError()
 {
     using (BoltStubServer.Start("rollback_error", 9001))
     {
         var uri = new Uri("bolt://127.0.0.1:9001");
         using (var driver = GraphDatabase.Driver(uri, BoltStubServer.Config))
             using (var session = driver.Session())
             {
                 var tx        = session.BeginTransaction();
                 var result    = tx.Run("CREATE (n {name:'Alice'}) RETURN n.name AS name");
                 var exception = Record.Exception(() => result.Consume());
                 exception.Should().BeOfType <TransientException>();
                 tx.Dispose();
             }
     }
 }
        public async Task CanSendMultipleBookmarks()
        {
            var bookmarks = new[]
            {
                "neo4j:bookmark:v1:tx5", "neo4j:bookmark:v1:tx29",
                "neo4j:bookmark:v1:tx94", "neo4j:bookmark:v1:tx56",
                "neo4j:bookmark:v1:tx16", "neo4j:bookmark:v1:tx68"
            };

            using (BoltStubServer.Start("V4/multiple_bookmarks", 9001))
            {
                var uri = new Uri("bolt://127.0.0.1:9001");
                using (var driver = GraphDatabase.Driver(uri, SetupConfig))
                {
                    var session = driver.AsyncSession(o => o.WithBookmarks(Bookmark.From(bookmarks)));
                    try
                    {
                        var txc = await session.BeginTransactionAsync();

                        try
                        {
                            await txc.RunAsync("CREATE (n {name:'Bob'})");

                            await txc.CommitAsync();
                        }
                        catch
                        {
                            await txc.RollbackAsync();

                            throw;
                        }
                    }
                    catch (Exception ex)
                    {
                        string var = ex.Message;
                    }
                    finally
                    {
                        await session.CloseAsync();
                    }

                    session.LastBookmark.Should().Be(Bookmark.From("neo4j:bookmark:v1:tx95"));
                }
            }
        }
Example #22
0
        public void ShouldDiscardTxIfNotFinished()
        {
            using (BoltStubServer.Start("V4/discard_streaming_records_tx", 9001))
            {
                using (var driver = GraphDatabase.Driver("bolt://localhost:9001", AuthTokens.None,
                                                         o => o.WithLogger(TestLogger.Create(_output)).WithFetchSize(2)))
                {
                    var session = driver.RxSession();

                    session.ReadTransaction(tx => tx.Run("UNWIND [1,2,3,4] AS n RETURN n").Keys())
                    .WaitForCompletion()
                    .AssertEqual(
                        OnNext(0, Utils.MatchesKeys("n")),
                        OnCompleted <string[]>(0));
                    session.Close <string>().WaitForCompletion().AssertEqual(OnCompleted <string>(0));
                }
            }
        }
 [InlineData("V4_1")]    //Use same script on all versions after 4.1
 public async Task ShouldNotThrowOnNoopMessages(string boltVersion)
 {
     using (BoltStubServer.Start($"{boltVersion}/noop", 9001))
     {
         using (var driver = GraphDatabase.Driver("bolt://127.0.0.1:9001", AuthTokens.None, SetupConfig))
         {
             //await driver.VerifyConnectivityAsync();
             var session = driver.AsyncSession();
             try
             {
                 var cursor = await session.RunAsync("MATCH (N) RETURN n.name");
             }
             finally
             {
                 await session.CloseAsync();
             }
         }
     }
 }
Example #24
0
 public void TestCustomResolverExample()
 {
     using (var server1 = BoltStubServer.Start("V4/get_routing_table_only", 9001))
     {
         using (var server2 = BoltStubServer.Start("V4/return_1", 9002))
         {
             using (var driver =
                        CreateDriverWithCustomResolver("neo4j://x.example.com", AuthTokens.None,
                                                       ServerAddress.From("127.0.0.1", 9001)))
             {
                 using (var session = driver.Session(o => o.WithDefaultAccessMode(AccessMode.Read)))
                 {
                     // When & Then
                     session.Run("RETURN 1").Single()[0].As <int>().Should().Be(1);
                 }
             }
         }
     }
 }
        public async Task ShouldDetectMultiDatabasesFeature(string boltVersion, string scheme)
        {
            using (BoltStubServer.Start($"{boltVersion}/supports_multidb", 9001))
            {
                using (var driver = GraphDatabase.Driver($"{scheme}://127.0.0.1:9001", AuthTokens.None, _setupConfig))
                {
                    var support = await driver.SupportsMultiDbAsync();

                    if (boltVersion.Equals("V3"))
                    {
                        support.Should().BeFalse();
                    }
                    else
                    {
                        support.Should().BeTrue();
                    }
                }
            }
        }
Example #26
0
 public void TestCustomResolverExample()
 {
     using (var server1 = BoltStubServer.Start("get_routing_table_only", 9001))
     {
         using (var server2 = BoltStubServer.Start("return_1", 9002))
         {
             using (var driver =
                        CreateDriverWithCustomResolver("bolt+routing://x.acme.com", AuthTokens.None,
                                                       ServerAddress.From("localhost", 9001)))
             {
                 using (var session = driver.Session(AccessMode.Read))
                 {
                     // When & Then
                     session.Run("RETURN 1").Single()[0].As <int>().Should().Be(1);
                 }
             }
         }
     }
 }
Example #27
0
            public void ShouldFailIfCommitFailsDueToBrokenConnection(string boltVersion)
            {
                using (BoltStubServer.Start($"{boltVersion}/connection_error_on_commit", 9001))
                {
                    using (var driver =
                               GraphDatabase.Driver("bolt://127.0.0.1:9001", AuthTokens.None, NoEncryptionAndShortRetry))
                    {
                        using (var session = driver.Session(o => o.WithDefaultAccessMode(AccessMode.Write)))
                        {
                            var txc    = session.BeginTransaction();
                            var result = txc.Run("CREATE (n {name: 'Bob'})");

                            var exc = Record.Exception(() => txc.Commit());

                            exc.Should().BeOfType <ServiceUnavailableException>().Which
                            .HasCause <IOException>().Should().BeTrue();
                        }
                    }
                }
            }
Example #28
0
        public async Task ShouldLogServerAddress()
        {
            var logs = new List <string>();

            void SetupConfig(ConfigBuilder o)
            {
                o.WithEncryptionLevel(EncryptionLevel.None);
                o.WithLogger(new TestLogger(logs.Add, ExtendedLogLevel.Debug));
            }

            using (BoltStubServer.Start("V4/accessmode_reader_implicit", 9001))
            {
                using (var driver = GraphDatabase.Driver("bolt://localhost:9001", AuthTokens.None, SetupConfig))
                {
                    var session = driver.AsyncSession(o => o.WithDefaultAccessMode(AccessMode.Read));
                    try
                    {
                        var cursor = await session.RunAsync("RETURN $x", new { x = 1 });

                        var list = await cursor.ToListAsync(r => Convert.ToInt32(r[0]));

                        list.Should().HaveCount(1).And.Contain(1);
                    }
                    finally
                    {
                        await session.CloseAsync();
                    }
                }
            }

            foreach (var log in logs)
            {
                if (log.StartsWith("[Debug]:[conn-"))
                {
                    log.Should().Contain("localhost:9001");
                }
            }
        }
 public void ShouldFailIfCommitFailsDueToBrokenConnection(string boltVersion)
 {
     using (BoltStubServer.Start($"connection_error_on_commit_{boltVersion}", 9001))
     {
         using (var driver =
                    GraphDatabase.Driver("bolt://localhost:9001", AuthTokens.None, NoEncryptionAndShortRetry))
         {
             var session = driver.Session(AccessMode.Write);
             try
             {
                 var exc = Record.Exception(() =>
                                            session.WriteTransaction(txc => txc.Run("CREATE (n {name: 'Bob'})"))
                                            );
                 exc.Should().BeOfType <ServiceUnavailableException>().Which
                 .HasCause <IOException>().Should().BeTrue();
             }
             finally
             {
                 session.Dispose();
             }
         }
     }
 }
 public async Task ShouldDiscoverEndpointsForADatabaseAndWrite()
 {
     using (BoltStubServer.Start("V4/acquire_endpoints_aDatabase", 9001))
     {
         using (BoltStubServer.Start("V4/write_to_aDatabase", 9007))
         {
             using (var driver =
                        GraphDatabase.Driver("neo4j://127.0.0.1:9001", AuthTokens.None, _setupConfig))
             {
                 var session = driver.AsyncSession(o =>
                                                   o.WithDatabase("aDatabase").WithDefaultAccessMode(AccessMode.Write));
                 try
                 {
                     await session.RunAndConsumeAsync("CREATE (n {name:'Bob'})");
                 }
                 finally
                 {
                     await session.CloseAsync();
                 }
             }
         }
     }
 }