From 2b5a64697f0b76bf3115687a61b3cdbb04f313a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20Barc=C3=A9los?= Date: Mon, 14 Dec 2020 15:02:41 +0100 Subject: [PATCH 1/3] teskit: Fine tunning stress tests to run in testkit Fix the way the url is generated during the stress test enabling to use configurations came from the test environment. Skipping the non-cluster-safe stress test commands to avoid unstable behaviours and flaky tests. --- test/internal/shared-neo4j.js | 9 ++++++- test/stress.test.js | 50 +++++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/test/internal/shared-neo4j.js b/test/internal/shared-neo4j.js index 8e55888e5..0c7e56cc4 100644 --- a/test/internal/shared-neo4j.js +++ b/test/internal/shared-neo4j.js @@ -123,6 +123,11 @@ const env = global.__karma__ ? global.__karma__.config.env : process.env const username = env.TEST_NEO4J_USER || 'neo4j' const password = env.TEST_NEO4J_PASS || 'password' const hostname = env.TEST_NEO4J_HOST || 'localhost' +const scheme = env.TEST_NEO4J_SCHEME || 'bolt' +const cluster = + env.TEST_NEO4J_IS_CLUSTER !== undefined + ? env.TEST_NEO4J_IS_CLUSTER === '1' + : false const edition = env.TEST_NEO4J_EDITION || 'enterprise' const ipv6Enabled = env.TEST_NEO4J_IPV6_ENABLED !== undefined @@ -369,5 +374,7 @@ export default { getEdition: getEdition, hostname: hostname, ipv6Enabled: ipv6Enabled, - edition: edition + edition: edition, + scheme: scheme, + cluster: cluster } diff --git a/test/stress.test.js b/test/stress.test.js index 34a7e8254..8c95d925a 100644 --- a/test/stress.test.js +++ b/test/stress.test.js @@ -25,6 +25,11 @@ import sharedNeo4j from './internal/shared-neo4j' describe('#integration stress tests', () => { const TEST_MODES = { + fastest: { + commandsCount: 10000, + parallelism: 24, + maxRunTimeMs: 3 * 60000 // 3 minutes + }, fast: { commandsCount: 5000, parallelism: 8, @@ -44,7 +49,7 @@ describe('#integration stress tests', () => { const TEST_MODE = modeFromEnvOrDefault('STRESS_TEST_MODE') const DATABASE_URI = fromEnvOrDefault( 'STRESS_TEST_DATABASE_URI', - `bolt://${sharedNeo4j.hostname}` + `${sharedNeo4j.scheme}://${sharedNeo4j.hostname}:${sharedNeo4j.port}` ) const USERNAME = fromEnvOrDefault( @@ -57,10 +62,11 @@ describe('#integration stress tests', () => { ) function isRemoteCluster () { - return ( - fromEnvOrDefault('STRESS_TEST_DATABASE_URI') !== undefined && - fromEnvOrDefault('STRESS_TEST_DATABASE_URI') !== undefined - ) + return fromEnvOrDefault('STRESS_TEST_DATABASE_URI') !== undefined + } + + function isCluster () { + return sharedNeo4j.cluster || isRemoteCluster() } const LOGGING_ENABLED = fromEnvOrDefault('STRESS_TEST_LOGGING_ENABLED', false) @@ -128,19 +134,27 @@ describe('#integration stress tests', () => { } function createUniqueCommands (context) { + const clusterSafeCommands = [ + readQueryInTxFunctionCommand(context), + readQueryInTxFunctionWithBookmarkCommand(context), + writeQueryInTxFunctionWithBookmarkCommand(context), + writeQueryInTxFunctionCommand(context) + ] + + if (isCluster()) { + return clusterSafeCommands + } + return [ + ...clusterSafeCommands, readQueryCommand(context), readQueryWithBookmarkCommand(context), readQueryInTxCommand(context), - readQueryInTxFunctionCommand(context), readQueryInTxWithBookmarkCommand(context), - readQueryInTxFunctionWithBookmarkCommand(context), writeQueryCommand(context), writeQueryWithBookmarkCommand(context), writeQueryInTxCommand(context), - writeQueryInTxFunctionCommand(context), - writeQueryInTxWithBookmarkCommand(context), - writeQueryInTxFunctionWithBookmarkCommand(context) + writeQueryInTxWithBookmarkCommand(context) ] } @@ -243,6 +257,13 @@ describe('#integration stress tests', () => { ) { return callback => { const commandId = context.nextCommandId() + if (isCluster()) { + console.log( + 'SKIPPED: session.run is not safe to in clusters environments' + ) + callback() + return + } const session = newSession(context, accessMode, useBookmark) const params = paramsSupplier() @@ -319,6 +340,13 @@ describe('#integration stress tests', () => { ) { return callback => { const commandId = context.nextCommandId() + if (isCluster()) { + console.log( + 'SKIPPED: session.begintTransaction is not safe to in clusters environments' + ) + callback() + return + } const session = newSession(context, accessMode, useBookmark) const tx = session.beginTransaction() const params = paramsSupplier() @@ -415,7 +443,7 @@ describe('#integration stress tests', () => { function verifyServers (context) { const routing = DATABASE_URI.indexOf('neo4j') === 0 - if (routing) { + if (routing && isCluster()) { return verifyCausalClusterMembers(context) } return verifySingleInstance(context) From 7dc5d08f1684e907931abfb8b96c6203fe4e4088 Mon Sep 17 00:00:00 2001 From: Antonio Barcelos Date: Mon, 14 Dec 2020 15:22:49 +0100 Subject: [PATCH 2/3] testkit: fix node count verification --- test/stress.test.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/test/stress.test.js b/test/stress.test.js index 8c95d925a..3e4509bd9 100644 --- a/test/stress.test.js +++ b/test/stress.test.js @@ -428,16 +428,18 @@ describe('#integration stress tests', () => { const expectedNodeCount = context.createdNodesCount const session = context.driver.session() - return session.run('MATCH (n) RETURN count(n)').then(result => { - const record = result.records[0] - const count = record.get(0).toNumber() - - if (count !== expectedNodeCount) { - throw new Error( - `Unexpected node count: ${count}, expected: ${expectedNodeCount}` - ) - } - }) + return session + .readTransaction(tx => tx.run('MATCH (n) RETURN count(n)')) + .then(result => { + const record = result.records[0] + const count = record.get(0).toNumber() + + if (count !== expectedNodeCount) { + throw new Error( + `Unexpected node count: ${count}, expected: ${expectedNodeCount}` + ) + } + }) } function verifyServers (context) { From 56c702a05e50431c5b5aabe599cfcfeb93362fd1 Mon Sep 17 00:00:00 2001 From: Antonio Barcelos Date: Mon, 14 Dec 2020 15:43:46 +0100 Subject: [PATCH 3/3] define null as the default database --- src/internal/connection-provider-routing.js | 2 +- src/internal/stream-observers.js | 1 - .../connection-provider-routing.test.js | 318 +++++++++--------- 3 files changed, 160 insertions(+), 161 deletions(-) diff --git a/src/internal/connection-provider-routing.js b/src/internal/connection-provider-routing.js index 19b96f439..1acb56736 100644 --- a/src/internal/connection-provider-routing.js +++ b/src/internal/connection-provider-routing.js @@ -37,7 +37,7 @@ const UNAUTHORIZED_ERROR_CODE = 'Neo.ClientError.Security.Unauthorized' const DATABASE_NOT_FOUND_ERROR_CODE = 'Neo.ClientError.Database.DatabaseNotFound' const SYSTEM_DB_NAME = 'system' -const DEFAULT_DB_NAME = '' +const DEFAULT_DB_NAME = null const DEFAULT_ROUTING_TABLE_PURGE_DELAY = int(30000) export default class RoutingConnectionProvider extends PooledConnectionProvider { diff --git a/src/internal/stream-observers.js b/src/internal/stream-observers.js index 69b86b07b..b54e318a8 100644 --- a/src/internal/stream-observers.js +++ b/src/internal/stream-observers.js @@ -554,7 +554,6 @@ class ProcedureRouteObserver extends StreamObserver { } if (this._onCompleted) { - console.log('onCompeled exsits', this._records[0]) this._onCompleted(RawRoutingTable.ofRecord(this._records[0])) } } diff --git a/test/internal/connection-provider-routing.test.js b/test/internal/connection-provider-routing.test.js index 3dd45938e..390bbf592 100644 --- a/test/internal/connection-provider-routing.test.js +++ b/test/internal/connection-provider-routing.test.js @@ -75,7 +75,7 @@ describe('#unit RoutingConnectionProvider', () => { it('can forget address', () => { const connectionProvider = newRoutingConnectionProvider([ newRoutingTable( - '', + null, [server1, server2], [server3, server2], [server2, server4] @@ -86,7 +86,7 @@ describe('#unit RoutingConnectionProvider', () => { expectRoutingTable( connectionProvider, - '', + null, [server1, server2], [server3], [server4] @@ -96,7 +96,7 @@ describe('#unit RoutingConnectionProvider', () => { it('can not forget unknown address', () => { const connectionProvider = newRoutingConnectionProvider([ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6] @@ -107,7 +107,7 @@ describe('#unit RoutingConnectionProvider', () => { expectRoutingTable( connectionProvider, - '', + null, [server1, server2], [server3, server4], [server5, server6] @@ -125,7 +125,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server2], [server2, server4] @@ -144,7 +144,7 @@ describe('#unit RoutingConnectionProvider', () => { it('can forget writer address', () => { const connectionProvider = newRoutingConnectionProvider([ newRoutingTable( - '', + null, [server1, server2], [server3, server2], [server2, server4] @@ -155,7 +155,7 @@ describe('#unit RoutingConnectionProvider', () => { expectRoutingTable( connectionProvider, - '', + null, [server1, server2], [server3, server2], [server4] @@ -165,7 +165,7 @@ describe('#unit RoutingConnectionProvider', () => { it('can not forget unknown writer address', () => { const connectionProvider = newRoutingConnectionProvider([ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6] @@ -176,7 +176,7 @@ describe('#unit RoutingConnectionProvider', () => { expectRoutingTable( connectionProvider, - '', + null, [server1, server2], [server3, server4], [server5, server6] @@ -188,7 +188,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6] @@ -199,13 +199,13 @@ describe('#unit RoutingConnectionProvider', () => { const conn1 = await connectionProvider.acquireConnection({ accessMode: READ, - database: '' + database: null }) expect(conn1 instanceof DelegateConnection).toBeTruthy() const conn2 = await connectionProvider.acquireConnection({ accessMode: WRITE, - database: '' + database: null }) expect(conn2 instanceof DelegateConnection).toBeTruthy() }) @@ -215,7 +215,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6] @@ -225,13 +225,13 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection => { expect(connection.address).toEqual(server3) expect(pool.has(server3)).toBeTruthy() connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection => { expect(connection.address).toEqual(server4) expect(pool.has(server4)).toBeTruthy() @@ -246,7 +246,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6] @@ -256,13 +256,13 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection => { expect(connection.address).toEqual(server5) expect(pool.has(server5)).toBeTruthy() connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection => { expect(connection.address).toEqual(server6) expect(pool.has(server6)).toBeTruthy() @@ -275,7 +275,7 @@ describe('#unit RoutingConnectionProvider', () => { it('throws for illegal access mode', done => { const connectionProvider = newRoutingConnectionProvider([ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6] @@ -283,7 +283,7 @@ describe('#unit RoutingConnectionProvider', () => { ]) connectionProvider - .acquireConnection({ accessMode: 'WRONG', database: '' }) + .acquireConnection({ accessMode: 'WRONG', database: null }) .catch(error => { expect(error.message).toEqual('Illegal mode WRONG') done() @@ -293,7 +293,7 @@ describe('#unit RoutingConnectionProvider', () => { it('refreshes stale routing table to get read connection', done => { const pool = newPool() const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -301,7 +301,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -309,17 +309,17 @@ describe('#unit RoutingConnectionProvider', () => { ) ], pool, - { '': { 'server1:7687': updatedRoutingTable } } + { null: { 'server1:7687': updatedRoutingTable } } ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection => { expect(connection.address).toEqual(serverC) expect(pool.has(serverC)).toBeTruthy() connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection => { expect(connection.address).toEqual(serverD) expect(pool.has(serverD)).toBeTruthy() @@ -332,7 +332,7 @@ describe('#unit RoutingConnectionProvider', () => { it('refreshes stale routing table to get write connection', done => { const pool = newPool() const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -340,7 +340,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -348,17 +348,17 @@ describe('#unit RoutingConnectionProvider', () => { ) ], pool, - { '': { 'server1:7687': updatedRoutingTable } } + { null: { 'server1:7687': updatedRoutingTable } } ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection => { expect(connection.address).toEqual(serverE) expect(pool.has(serverE)).toBeTruthy() connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection => { expect(connection.address).toEqual(serverF) expect(pool.has(serverF)).toBeTruthy() @@ -371,7 +371,7 @@ describe('#unit RoutingConnectionProvider', () => { it('refreshes stale routing table to get read connection when one router fails', done => { const pool = newPool() const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -379,7 +379,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -388,7 +388,7 @@ describe('#unit RoutingConnectionProvider', () => { ], pool, { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': updatedRoutingTable } @@ -396,13 +396,13 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection => { expect(connection.address).toEqual(serverC) expect(pool.has(serverC)).toBeTruthy() connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection => { expect(connection.address).toEqual(serverD) expect(pool.has(serverD)).toBeTruthy() @@ -415,7 +415,7 @@ describe('#unit RoutingConnectionProvider', () => { it('refreshes stale routing table to get write connection when one router fails', done => { const pool = newPool() const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -423,7 +423,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -432,7 +432,7 @@ describe('#unit RoutingConnectionProvider', () => { ], pool, { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': updatedRoutingTable } @@ -440,13 +440,13 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection => { expect(connection.address).toEqual(serverE) expect(pool.has(serverE)).toBeTruthy() connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection => { expect(connection.address).toEqual(serverF) expect(pool.has(serverF)).toBeTruthy() @@ -459,7 +459,7 @@ describe('#unit RoutingConnectionProvider', () => { it('refreshes routing table without readers to get read connection', done => { const pool = newPool() const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -467,7 +467,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [], // no readers [server3, server4], @@ -476,7 +476,7 @@ describe('#unit RoutingConnectionProvider', () => { ], pool, { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': updatedRoutingTable } @@ -484,13 +484,13 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection => { expect(connection.address).toEqual(serverC) expect(pool.has(serverC)).toBeTruthy() connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection => { expect(connection.address).toEqual(serverD) expect(pool.has(serverD)).toBeTruthy() @@ -503,7 +503,7 @@ describe('#unit RoutingConnectionProvider', () => { it('refreshes routing table without writers to get write connection', done => { const pool = newPool() const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -511,7 +511,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [], // no writers @@ -520,7 +520,7 @@ describe('#unit RoutingConnectionProvider', () => { ], pool, { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': updatedRoutingTable } @@ -528,13 +528,13 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection => { expect(connection.address).toEqual(serverE) expect(pool.has(serverE)).toBeTruthy() connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection => { expect(connection.address).toEqual(serverF) expect(pool.has(serverF)).toBeTruthy() @@ -548,7 +548,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -557,7 +557,7 @@ describe('#unit RoutingConnectionProvider', () => { ], newPool(), { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': null // returns no routing table } @@ -565,7 +565,7 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) done() @@ -576,7 +576,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -585,7 +585,7 @@ describe('#unit RoutingConnectionProvider', () => { ], newPool(), { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': null // returns no routing table } @@ -593,7 +593,7 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) done() @@ -602,7 +602,7 @@ describe('#unit RoutingConnectionProvider', () => { it('throws when all routers return routing tables without readers while getting read connection', done => { const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [], // no readers - table can't satisfy connection requirement [serverC, serverD] @@ -610,7 +610,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -619,7 +619,7 @@ describe('#unit RoutingConnectionProvider', () => { ], newPool(), { - '': { + null: { 'server1:7687': updatedRoutingTable, 'server2:7687': updatedRoutingTable } @@ -627,7 +627,7 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .catch(error => { expect(error.code).toEqual(SESSION_EXPIRED) done() @@ -636,7 +636,7 @@ describe('#unit RoutingConnectionProvider', () => { it('throws when all routers return routing tables without writers while getting write connection', done => { const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [] // no writers - table can't satisfy connection requirement @@ -644,7 +644,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -653,7 +653,7 @@ describe('#unit RoutingConnectionProvider', () => { ], newPool(), { - '': { + null: { 'server1:7687': updatedRoutingTable, 'server2:7687': updatedRoutingTable } @@ -661,7 +661,7 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .catch(error => { expect(error.code).toEqual(SESSION_EXPIRED) done() @@ -672,7 +672,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [], // no routers [server3, server4], [server5, server6], @@ -683,7 +683,7 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) done() @@ -694,7 +694,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [], // no routers [server3, server4], [server5, server6], @@ -705,7 +705,7 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) done() @@ -715,7 +715,7 @@ describe('#unit RoutingConnectionProvider', () => { it('updates routing table after refresh', done => { const pool = newPool() const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -723,7 +723,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -732,18 +732,18 @@ describe('#unit RoutingConnectionProvider', () => { ], pool, { - '': { + null: { 'server1:7687': updatedRoutingTable } } ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(() => { expectRoutingTable( connectionProvider, - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -764,7 +764,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2, server3], [server4, server5], [server6, server7], @@ -775,12 +775,12 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) expectRoutingTable( connectionProvider, - '', + null, [], [server4, server5], [server6, server7] @@ -793,7 +793,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2, server3], [server4, server5], [server6, server7], @@ -804,12 +804,12 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) expectRoutingTable( connectionProvider, - '', + null, [], [server4, server5], [server6, server7] @@ -820,7 +820,7 @@ describe('#unit RoutingConnectionProvider', () => { it('uses seed router address when all existing routers fail', done => { const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB, serverC], [serverD, serverE], [serverF, serverG] @@ -831,7 +831,7 @@ describe('#unit RoutingConnectionProvider', () => { [server0], // seed router address resolves just to itself [ newRoutingTable( - '', + null, [server1, server2, server3], [server4, server5], [server6, server7], @@ -839,7 +839,7 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': null, // returns no routing table 'server3:7687': null, // returns no routing table @@ -849,18 +849,18 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection1 => { expect(connection1.address).toEqual(serverD) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection2 => { expect(connection2.address).toEqual(serverF) expectRoutingTable( connectionProvider, - '', + null, [serverA, serverB, serverC], [serverD, serverE], [serverF, serverG] @@ -872,7 +872,7 @@ describe('#unit RoutingConnectionProvider', () => { it('uses resolved seed router address when all existing routers fail', done => { const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -883,7 +883,7 @@ describe('#unit RoutingConnectionProvider', () => { [server01], // seed router address resolves to a different one [ newRoutingTable( - '', + null, [server1, server2, server3], [server4, server5], [server6, server7], @@ -891,7 +891,7 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': null, // returns no routing table 'server3:7687': null, // returns no routing table @@ -901,18 +901,18 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection1 => { expect(connection1.address).toEqual(serverE) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection2 => { expect(connection2.address).toEqual(serverC) expectRoutingTable( connectionProvider, - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -924,7 +924,7 @@ describe('#unit RoutingConnectionProvider', () => { it('uses resolved seed router address that returns correct routing table when all existing routers fail', done => { const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC], [serverD, serverE] @@ -935,7 +935,7 @@ describe('#unit RoutingConnectionProvider', () => { [server01, server02, server03], // seed router address resolves to 3 different addresses [ newRoutingTable( - '', + null, [server1], [server2], [server3], @@ -943,7 +943,7 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server1:7687': null, // returns no routing table 'server01:7687': null, // returns no routing table 'server02:7687': null, // returns no routing table @@ -953,18 +953,18 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection1 => { expect(connection1.address).toEqual(serverD) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection2 => { expect(connection2.address).toEqual(serverE) expectRoutingTable( connectionProvider, - '', + null, [serverA, serverB], [serverC], [serverD, serverE] @@ -980,7 +980,7 @@ describe('#unit RoutingConnectionProvider', () => { [server0], // seed router address resolves just to itself [ newRoutingTable( - '', + null, [server1, server2, server3], [server4, server5], [server6], @@ -988,7 +988,7 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': null, // returns no routing table 'server3:7687': null, // returns no routing table @@ -998,26 +998,26 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) expectRoutingTable( connectionProvider, - '', + null, [], // all routers were forgotten because they failed [server4, server5], [server6] ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) expectRoutingTable( connectionProvider, - '', + null, [], // all routers were forgotten because they failed [server4, server5], [server6] @@ -1034,7 +1034,7 @@ describe('#unit RoutingConnectionProvider', () => { [server01], // seed router address resolves to a different one [ newRoutingTable( - '', + null, [server1, server2], [server3], [server4], @@ -1042,7 +1042,7 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': null, // returns no routing table 'server01:7687': null // returns no routing table @@ -1051,26 +1051,26 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) expectRoutingTable( connectionProvider, - '', + null, [], // all routers were forgotten because they failed [server3], [server4] ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) expectRoutingTable( connectionProvider, - '', + null, [], // all routers were forgotten because they failed [server3], [server4] @@ -1087,7 +1087,7 @@ describe('#unit RoutingConnectionProvider', () => { [server02, server01], // seed router address resolves to 2 different addresses [ newRoutingTable( - '', + null, [server1, server2, server3], [server4], [server5], @@ -1095,7 +1095,7 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server1:7687': null, // returns no routing table 'server2:7687': null, // returns no routing table 'server3:7687': null, // returns no routing table @@ -1106,26 +1106,26 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) expectRoutingTable( connectionProvider, - '', + null, [], // all known seed servers failed to return routing tables and were forgotten [server4], [server5] ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .catch(error => { expect(error.code).toEqual(SERVICE_UNAVAILABLE) expectRoutingTable( connectionProvider, - '', + null, [], // all known seed servers failed to return routing tables and were forgotten [server4], [server5] @@ -1138,7 +1138,7 @@ describe('#unit RoutingConnectionProvider', () => { it('uses seed router when no existing routers', done => { const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC], [serverD] @@ -1149,7 +1149,7 @@ describe('#unit RoutingConnectionProvider', () => { [server0], // seed router address resolves just to itself [ newRoutingTable( - '', + null, [], // no routers in the known routing table [server1, server2], [server3], @@ -1157,25 +1157,25 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server0:7687': updatedRoutingTable } } ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection1 => { expect(connection1.address).toEqual(serverD) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection2 => { expect(connection2.address).toEqual(serverC) expectRoutingTable( connectionProvider, - '', + null, [serverA, serverB], [serverC], [serverD] @@ -1187,7 +1187,7 @@ describe('#unit RoutingConnectionProvider', () => { it('uses resolved seed router when no existing routers', done => { const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverF, serverE] @@ -1198,7 +1198,7 @@ describe('#unit RoutingConnectionProvider', () => { [server01], // seed router address resolves to a different one [ newRoutingTable( - '', + null, [], // no routers in the known routing table [server1, server2], [server3, server4], @@ -1206,25 +1206,25 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server01:7687': updatedRoutingTable } } ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection1 => { expect(connection1.address).toEqual(serverC) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection2 => { expect(connection2.address).toEqual(serverF) expectRoutingTable( connectionProvider, - '', + null, [serverA, serverB], [serverC, serverD], [serverF, serverE] @@ -1236,7 +1236,7 @@ describe('#unit RoutingConnectionProvider', () => { it('uses resolved seed router that returns routing table when no existing routers exist', done => { const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB, serverC], [serverD, serverE], [serverF] @@ -1247,7 +1247,7 @@ describe('#unit RoutingConnectionProvider', () => { [server02, server01, server03], // seed router address resolves to 3 different addresses [ newRoutingTable( - '', + null, [], // no routers in the known routing table [server1], [server2, server3], @@ -1255,7 +1255,7 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server01:7687': null, // returns no routing table 'server02:7687': null, // returns no routing table 'server03:7687': updatedRoutingTable @@ -1264,18 +1264,18 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection1 => { expect(connection1.address).toEqual(serverF) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection2 => { expect(connection2.address).toEqual(serverD) expectRoutingTable( connectionProvider, - '', + null, [serverA, serverB, serverC], [serverD, serverE], [serverF] @@ -1287,7 +1287,7 @@ describe('#unit RoutingConnectionProvider', () => { it('ignores already probed routers after seed router resolution', done => { const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -1298,7 +1298,7 @@ describe('#unit RoutingConnectionProvider', () => { [server1, server01, server2, server02], // seed router address resolves to 4 different addresses [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -1306,7 +1306,7 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server1:7687': null, // returns no routing table 'server01:7687': null, // returns no routing table 'server2:7687': null, // returns no routing table @@ -1324,12 +1324,12 @@ describe('#unit RoutingConnectionProvider', () => { ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection1 => { expect(connection1.address).toEqual(serverC) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection2 => { expect(connection2.address).toEqual(serverE) @@ -1342,7 +1342,7 @@ describe('#unit RoutingConnectionProvider', () => { expectRoutingTable( connectionProvider, - '', + null, [serverA, serverB], [serverC, serverD], [serverE, serverF] @@ -1355,7 +1355,7 @@ describe('#unit RoutingConnectionProvider', () => { it('throws session expired when refreshed routing table has no readers', done => { const pool = newPool() const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [], // no readers [serverC, serverD] @@ -1363,7 +1363,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -1372,14 +1372,14 @@ describe('#unit RoutingConnectionProvider', () => { ], pool, { - '': { + null: { 'server1:7687': updatedRoutingTable } } ) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .catch(error => { expect(error.code).toEqual(SESSION_EXPIRED) done() @@ -1389,7 +1389,7 @@ describe('#unit RoutingConnectionProvider', () => { it('throws session expired when refreshed routing table has no writers', done => { const pool = newPool() const updatedRoutingTable = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [] // no writers @@ -1397,7 +1397,7 @@ describe('#unit RoutingConnectionProvider', () => { const connectionProvider = newRoutingConnectionProvider( [ newRoutingTable( - '', + null, [server1, server2], [server3, server4], [server5, server6], @@ -1406,14 +1406,14 @@ describe('#unit RoutingConnectionProvider', () => { ], pool, { - '': { + null: { 'server1:7687': updatedRoutingTable } } ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .catch(error => { expect(error.code).toEqual(SESSION_EXPIRED) done() @@ -1422,13 +1422,13 @@ describe('#unit RoutingConnectionProvider', () => { it('should use resolved seed router after accepting table with no writers', done => { const routingTable1 = newRoutingTable( - '', + null, [serverA, serverB], [serverC, serverD], [] // no writers ) const routingTable2 = newRoutingTable( - '', + null, [serverAA, serverBB], [serverCC, serverDD], [serverEE] @@ -1439,7 +1439,7 @@ describe('#unit RoutingConnectionProvider', () => { [server02, server01], // seed router address resolves to 2 different addresses [ newRoutingTable( - '', + null, [server1], [server2, server3], [server4, server5], @@ -1447,7 +1447,7 @@ describe('#unit RoutingConnectionProvider', () => { ) ], { - '': { + null: { 'server1:7687': routingTable1, 'serverA:7687': routingTable1, 'serverB:7687': routingTable1, @@ -1460,31 +1460,31 @@ describe('#unit RoutingConnectionProvider', () => { connectionProvider._useSeedRouter = false connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection1 => { expect(connection1.address).toEqual(serverC) connectionProvider - .acquireConnection({ accessMode: READ, database: '' }) + .acquireConnection({ accessMode: READ, database: null }) .then(connection2 => { expect(connection2.address).toEqual(serverD) expectRoutingTable( connectionProvider, - '', + null, [serverA, serverB], [serverC, serverD], [] ) connectionProvider - .acquireConnection({ accessMode: WRITE, database: '' }) + .acquireConnection({ accessMode: WRITE, database: null }) .then(connection3 => { expect(connection3.address).toEqual(serverEE) expectRoutingTable( connectionProvider, - '', + null, [serverAA, serverBB], [serverCC, serverDD], [serverEE] @@ -1815,7 +1815,7 @@ describe('#unit RoutingConnectionProvider', () => { function newRoutingConnectionProvider ( routingTables, pool = null, - routerToRoutingTable = { '': {} } + routerToRoutingTable = { null: {} } ) { const seedRouter = ServerAddress.fromUrl('server-non-existing-seed-router') return newRoutingConnectionProviderWithSeedRouter( @@ -1831,7 +1831,7 @@ function newRoutingConnectionProviderWithSeedRouter ( seedRouter, seedRouterResolved, routingTables, - routerToRoutingTable = { '': {} }, + routerToRoutingTable = { null: {} }, connectionPool = null, routingTablePurgeDelay = null ) { @@ -1956,7 +1956,7 @@ class FakeRediscovery { } lookupRoutingTableOnRouter (ignored, database, router) { - const table = this._routerToRoutingTable[database || ''] + const table = this._routerToRoutingTable[database || null] if (table) { return Promise.resolve(table[router.asKey()]) }