public void ClientCreatedWithEmulatorDetection() { Mock <SpannerClient> spannerClientMock = SetupExecuteStreamingSql(); var spannerClient = spannerClientMock.Object; var sessionPoolOptions = new SessionPoolOptions { MaintenanceLoopDelay = TimeSpan.Zero }; var sessionPoolManager = new SessionPoolManager( sessionPoolOptions, spannerClient.Settings.Logger, (_o, _s, _l) => { Assert.True(_o.UsesEmulator); return(Task.FromResult(spannerClient)); }); SpannerConnectionStringBuilder builder = new SpannerConnectionStringBuilder { DataSource = DatabaseName.Format(SpannerClientHelpers.ProjectId, SpannerClientHelpers.Instance, SpannerClientHelpers.Database), SessionPoolManager = sessionPoolManager, EmulatorDetection = EmulatorDetection.EmulatorOrProduction, EnvironmentVariableProvider = key => key == "SPANNER_EMULATOR_HOST" ? "localhost" : null }; var connection = new SpannerConnection(builder); var command = connection.CreateSelectCommand("SELECT * FROM FOO"); using (var reader = command.ExecuteReader()) { // Do nothing. } }
public async Task <long> LogCommitStatsAsync(string projectId, string instanceId, string databaseId) { // Commit statistics are logged at level Info by the default logger. // This sample uses a custom logger to access the commit statistics. // See https://googleapis.github.io/google-cloud-dotnet/docs/Google.Cloud.Spanner.Data/logging.html // for more information on how to use loggers. var logger = new CommitStatsSampleLogger(); var options = new SessionPoolOptions(); var poolManager = SessionPoolManager.Create(options, logger); var connectionStringBuilder = new SpannerConnectionStringBuilder { ConnectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}", // Set LogCommitStats to true to enable logging commit statistics for all transactions on the connection. // LogCommitStats can also be enabled/disabled for individual Spanner transactions. LogCommitStats = true, SessionPoolManager = poolManager, }; using var connection = new SpannerConnection(connectionStringBuilder); await connection.OpenAsync(); using var cmd = connection.CreateDmlCommand("INSERT Singers (SingerId, FirstName, LastName) VALUES (110, 'Virginia', 'Watson')"); var rowCount = await cmd.ExecuteNonQueryAsync(); var mutationCount = logger._lastCommitResponse.CommitStats.MutationCount; Console.WriteLine($"{rowCount} row(s) inserted..."); Console.WriteLine($"{mutationCount} mutation(s) in transaction..."); return(mutationCount); }
public void CreateWithSettings_UsesLoggerInSettings() { var settings = new SpannerSettings { Logger = new DefaultLogger() }; var manager = SessionPoolManager.CreateWithSettings(new SessionPoolOptions(), settings); Assert.Same(settings.Logger, manager.Logger); }
public async Task UsesSpannerSettings() { ClientFactory factory = (options, settings, logger) => { return(Task.FromResult <SpannerClient>(new FailingSpannerClient(settings))); }; var customSettings = new SpannerSettings(); var manager = new SessionPoolManager(new SessionPoolOptions(), customSettings, Logger.DefaultLogger, factory); var pool = await manager.AcquireSessionPoolAsync(new SpannerClientCreationOptions(new SpannerConnectionStringBuilder(ConnectionString))); Assert.Same(customSettings, pool.Client.Settings); }
public async Task ReleaseDecreasesCount() { var manager = new SessionPoolManager(new SessionPoolOptions(), Logger.DefaultLogger, FailingSpannerClient.Factory); var options = new SpannerClientCreationOptions(new SpannerConnectionStringBuilder(ConnectionString)); var pool = await manager.AcquireSessionPoolAsync(options); var stats = manager.GetStatistics().Single(); Assert.Equal(1, stats.ActiveConnectionCount); manager.Release(pool); stats = manager.GetStatistics().Single(); Assert.Equal(0, stats.ActiveConnectionCount); }
public async Task EmulatorDetection_AlwaysUsesRegularOptions(string emulatorHost) { var regularOptions = new SessionPoolOptions(); var manager = new SessionPoolManager(regularOptions, SessionPoolManager.CreateDefaultSpannerSettings(), Logger.DefaultLogger, FailingSpannerClient.Factory); var builder = new SpannerConnectionStringBuilder(ConnectionString) { EmulatorDetection = EmulatorDetection.EmulatorOrProduction, // Effectively "there are no environment variables" EnvironmentVariableProvider = key => key == "SPANNER_EMULATOR_HOST" ? emulatorHost: null }; var clientCreationOptions = new SpannerClientCreationOptions(new SpannerConnectionStringBuilder(ConnectionString)); var pool = await manager.AcquireSessionPoolAsync(clientCreationOptions); Assert.Same(regularOptions, pool.Options); }
public void ClientCreatedWithEmulatorDetection() { Mock <SpannerClient> spannerClientMock = SpannerClientHelpers .CreateMockClient(Logger.DefaultLogger, MockBehavior.Strict); spannerClientMock .SetupBatchCreateSessionsAsync() .SetupExecuteStreamingSql(); var spannerClient = spannerClientMock.Object; var sessionPoolOptions = new SessionPoolOptions { MaintenanceLoopDelay = TimeSpan.Zero }; var sessionPoolManager = new SessionPoolManager( sessionPoolOptions, spannerClient.Settings.Logger, (_o, _s, _l) => { Assert.True(_o.UsesEmulator); return(Task.FromResult(spannerClient)); }); SpannerConnectionStringBuilder builder = new SpannerConnectionStringBuilder { DataSource = DatabaseName.Format(SpannerClientHelpers.ProjectId, SpannerClientHelpers.Instance, SpannerClientHelpers.Database), SessionPoolManager = sessionPoolManager, EmulatorDetection = EmulatorDetection.EmulatorOrProduction, EnvironmentVariableProvider = key => key == "SPANNER_EMULATOR_HOST" ? "localhost" : null }; var connection = new SpannerConnection(builder); var command = connection.CreateSelectCommand("SELECT * FROM FOO"); using (var reader = command.ExecuteReader()) { Assert.True(reader.HasRows); } spannerClientMock.Verify(client => client.ExecuteStreamingSql( It.IsAny <ExecuteSqlRequest>(), It.IsAny <CallSettings>()), Times.Once()); }
private SpannerConnection BuildSpannerConnection(Mock<SpannerClient> spannerClientMock) { var spannerClient = spannerClientMock.Object; var sessionPoolOptions = new SessionPoolOptions { MaintenanceLoopDelay = TimeSpan.Zero }; var sessionPoolManager = new SessionPoolManager(sessionPoolOptions, spannerClient.Settings.Logger, (_o, _s, _l) => Task.FromResult(spannerClient)); sessionPoolManager.SpannerSettings.Scheduler = spannerClient.Settings.Scheduler; sessionPoolManager.SpannerSettings.Clock = spannerClient.Settings.Clock; SpannerConnectionStringBuilder builder = new SpannerConnectionStringBuilder { DataSource = DatabaseName.Format(SpannerClientHelpers.ProjectId, SpannerClientHelpers.Instance, SpannerClientHelpers.Database), SessionPoolManager = sessionPoolManager }; return new SpannerConnection(builder); }
public async Task EqualOptions_SameSessionPool() { int factoryCalls = 0; ClientFactory factory = (options, settings, logger) => { factoryCalls++; return(Task.FromResult <SpannerClient>(new FailingSpannerClient())); }; var manager = new SessionPoolManager(new SessionPoolOptions(), Logger.DefaultLogger, factory); var options1 = new SpannerClientCreationOptions(new SpannerConnectionStringBuilder(ConnectionString)); var options2 = new SpannerClientCreationOptions(new SpannerConnectionStringBuilder(ConnectionString)); var pool1 = await manager.AcquireSessionPoolAsync(options1); var pool2 = await manager.AcquireSessionPoolAsync(options2); Assert.Same(pool1, pool2); Assert.Equal(1, factoryCalls); Assert.Equal(1, manager.GetStatistics().Count); }
public async Task DifferentOptions_DifferentSessionPools() { int factoryCalls = 0; ClientFactory factory = options => { factoryCalls++; return(Task.FromResult <SpannerClient>(new FailingSpannerClient())); }; var manager = new SessionPoolManager(new SessionPoolOptions(), Logger.DefaultLogger, factory); var options1 = new SpannerClientCreationOptions(new SpannerConnectionStringBuilder(ConnectionString)); var options2 = new SpannerClientCreationOptions(new SpannerConnectionStringBuilder(ConnectionString) { Port = 1234 }); var pool1 = await manager.AcquireSessionPoolAsync(options1); var pool2 = await manager.AcquireSessionPoolAsync(options2); Assert.NotSame(pool1, pool2); Assert.Equal(2, factoryCalls); Assert.Equal(2, manager.GetStatistics().Count); }
// Creates a SpannerConnection with a specific logger. public SpannerConnection GetConnection(Logger logger) => new SpannerConnection(new SpannerConnectionStringBuilder(ConnectionString) { SessionPoolManager = SessionPoolManager.Create(new V1.SessionPoolOptions(), logger) });
public void Create_UsesDefaultLogger() { var manager = SessionPoolManager.Create(new SessionPoolOptions()); Assert.Same(Logger.DefaultLogger, manager.Logger); }