diff --git a/google-cloud-clients/google-cloud-spanner/pom.xml b/google-cloud-clients/google-cloud-spanner/pom.xml
index da79b31493e7..3e630d51ab3e 100644
--- a/google-cloud-clients/google-cloud-spanner/pom.xml
+++ b/google-cloud-clients/google-cloud-spanner/pom.xml
@@ -18,9 +18,29 @@
google-cloud-spanner
+ true
+
+ org.jacoco
+ jacoco-maven-plugin
+ 0.8.2
+
+
+
+ prepare-agent
+
+
+
+ report
+ prepare-package
+
+ report
+
+
+
+
org.apache.maven.plugins
maven-surefire-plugin
diff --git a/google-cloud-clients/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerImplTest.java b/google-cloud-clients/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerImplTest.java
index 71b0a1569a2d..fe81f34fd0f6 100644
--- a/google-cloud-clients/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerImplTest.java
+++ b/google-cloud-clients/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerImplTest.java
@@ -17,9 +17,10 @@
package com.google.cloud.spanner;
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.fail;
+import com.google.cloud.grpc.GrpcTransportOptions;
import com.google.cloud.spanner.spi.v1.SpannerRpc;
-
import java.util.HashMap;
import java.util.Map;
import org.junit.Before;
@@ -70,4 +71,49 @@ public void createAndCloseSession() {
// The same channelHint is passed for deleteSession (contained in "options").
Mockito.verify(rpc).deleteSession(sessionName, options.getValue());
}
+
+ @Test
+ public void getDbclientAgainGivesSame() {
+ Map labels = new HashMap<>();
+ labels.put("env", "dev");
+ Mockito.when(spannerOptions.getSessionLabels()).thenReturn(labels);
+ String dbName = "projects/p1/instances/i1/databases/d1";
+ DatabaseId db = DatabaseId.of(dbName);
+
+ Mockito.when(spannerOptions.getTransportOptions())
+ .thenReturn(GrpcTransportOptions.newBuilder().build());
+ Mockito.when(spannerOptions.getSessionPoolOptions())
+ .thenReturn(SessionPoolOptions.newBuilder().build());
+
+ DatabaseClient databaseClient = impl.getDatabaseClient(db);
+
+ // Get db client again
+ DatabaseClient databaseClient1 = impl.getDatabaseClient(db);
+
+ assertThat(databaseClient1).isSameAs(databaseClient);
+ }
+
+ @Test
+ public void getDbclientAfterCloseThrows() {
+ SpannerImpl imp = new SpannerImpl(rpc, 1, spannerOptions);
+ Map labels = new HashMap<>();
+ labels.put("env", "dev");
+ Mockito.when(spannerOptions.getSessionLabels()).thenReturn(labels);
+ String dbName = "projects/p1/instances/i1/databases/d1";
+ DatabaseId db = DatabaseId.of(dbName);
+
+ Mockito.when(spannerOptions.getTransportOptions())
+ .thenReturn(GrpcTransportOptions.newBuilder().build());
+ Mockito.when(spannerOptions.getSessionPoolOptions())
+ .thenReturn(SessionPoolOptions.newBuilder().build());
+
+ imp.close();
+
+ try {
+ imp.getDatabaseClient(db);
+ fail("Expected exception");
+ } catch (IllegalStateException e) {
+ assertThat(e.getMessage()).contains("Cloud Spanner client has been closed");
+ }
+ }
}