Skip to content
This repository was archived by the owner on Apr 7, 2026. It is now read-only.

Commit 89d4789

Browse files
committed
provide default scopes constructor
1 parent 9c4b12b commit 89d4789

3 files changed

Lines changed: 42 additions & 43 deletions

File tree

google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/MutableCredentials.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import com.google.auth.Credentials;
2020
import com.google.auth.RequestMetadataCallback;
2121
import com.google.auth.oauth2.ServiceAccountCredentials;
22+
import com.google.cloud.spanner.SpannerOptions;
2223
import java.io.IOException;
2324
import java.net.URI;
24-
import java.util.Collections;
2525
import java.util.List;
2626
import java.util.Map;
27+
import java.util.Set;
2728
import java.util.concurrent.Executor;
29+
import javax.annotation.Nonnull;
2830

2931
/**
3032
* A mutable {@link Credentials} implementation that delegates authentication behavior to a scoped
@@ -41,14 +43,17 @@
4143
*/
4244
public class MutableCredentials extends Credentials {
4345
private volatile ServiceAccountCredentials delegate;
44-
private final List<String> scopes;
46+
private final Set<String> scopes;
4547

46-
public MutableCredentials(ServiceAccountCredentials credentials, List<String> scopes) {
47-
if (scopes != null) {
48-
this.scopes = new java.util.ArrayList<>(scopes);
49-
} else {
50-
this.scopes = Collections.emptyList();
48+
public MutableCredentials(ServiceAccountCredentials credentials) {
49+
this(credentials, SpannerOptions.getDefaultInstance().getScopes());
50+
}
51+
52+
public MutableCredentials(ServiceAccountCredentials credentials, @Nonnull Set<String> scopes) {
53+
if (scopes.isEmpty()) {
54+
throw new IllegalArgumentException("Scopes must not be empty");
5155
}
56+
this.scopes = new java.util.HashSet<>(scopes);
5257
delegate = (ServiceAccountCredentials) credentials.createScoped(this.scopes);
5358
}
5459

google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/MutableCredentialsTest.java

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@
3131
import com.google.auth.oauth2.ServiceAccountCredentials;
3232
import java.io.IOException;
3333
import java.net.URI;
34-
import java.util.Arrays;
35-
import java.util.Collections;
36-
import java.util.List;
37-
import java.util.Map;
34+
import java.util.*;
3835
import java.util.concurrent.Executor;
3936
import org.junit.Test;
4037
import org.junit.runner.RunWith;
@@ -46,7 +43,7 @@ public class MutableCredentialsTest {
4643
ServiceAccountCredentials initialScopedCredentials = mock(ServiceAccountCredentials.class);
4744
ServiceAccountCredentials updatedCredentials = mock(ServiceAccountCredentials.class);
4845
ServiceAccountCredentials updatedScopedCredentials = mock(ServiceAccountCredentials.class);
49-
List<String> scopes = Arrays.asList("scope-a", "scope-b");
46+
Set<String> scopes = new HashSet<>(Arrays.asList("scope-a", "scope-b"));
5047
Map<String, List<String>> initialMetadata =
5148
Collections.singletonMap("Authorization", Collections.singletonList("v1"));
5249
Map<String, List<String>> updatedMetadata =
@@ -108,14 +105,9 @@ public void testUpdateMutableCredentials() throws IOException {
108105
verify(updatedScopedCredentials, times(1)).refresh();
109106
}
110107

111-
@Test
112-
public void testCreateMutableCredentialsNullScopes() throws IOException {
113-
setupInitialCredentials();
114-
115-
MutableCredentials credentials = new MutableCredentials(initialCredentials, null);
116-
URI testUri = URI.create("https://spanner.googleapis.com");
117-
118-
validateInitialDelegatedCredentialsAreSet(credentials, testUri);
108+
@Test(expected = IllegalArgumentException.class)
109+
public void testCreateMutableCredentialsEmptyScopes() {
110+
new MutableCredentials(initialCredentials, Collections.emptySet());
119111
}
120112

121113
private void validateInitialDelegatedCredentialsAreSet(

google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/it/ITMutableCredentialsTest.java

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@
1818

1919
import static org.junit.Assert.*;
2020

21+
import com.google.api.gax.core.FixedCredentialsProvider;
2122
import com.google.auth.oauth2.GoogleCredentials;
2223
import com.google.auth.oauth2.ServiceAccountCredentials;
2324
import com.google.cloud.spanner.*;
24-
import com.google.cloud.spanner.admin.database.v1.DatabaseAdminClient;
25+
import com.google.cloud.spanner.admin.instance.v1.InstanceAdminClient;
2526
import com.google.cloud.spanner.connection.MutableCredentials;
26-
import com.google.spanner.admin.database.v1.Database;
27-
import com.google.spanner.admin.database.v1.InstanceName;
27+
import com.google.spanner.admin.instance.v1.ProjectName;
2828
import java.io.IOException;
2929
import java.io.InputStream;
30-
import java.util.Collections;
31-
import java.util.List;
30+
import java.nio.file.Files;
31+
import java.nio.file.Paths;
3232
import org.junit.Test;
3333
import org.junit.experimental.categories.Category;
3434
import org.junit.runner.RunWith;
@@ -44,29 +44,33 @@ public class ITMutableCredentialsTest {
4444

4545
@Test
4646
public void testMutableCredentialsUpdateAuthorizationForRunningClient() throws IOException {
47-
47+
System.out.println("property" + System.getenv("GOOGLE_ACCOUNT_CREDENTIALS"));
4848
GoogleCredentials missingPermissionCredentials;
4949
try (InputStream stream =
50-
ITMutableCredentialsTest.class.getResourceAsStream(MISSING_PERM_KEY)) {
50+
Files.newInputStream(Paths.get(System.getenv("GOOGLE_ACCOUNT_CREDENTIALS")))) {
5151
missingPermissionCredentials = GoogleCredentials.fromStream(stream);
5252
}
5353
ServiceAccountCredentials invalidCredentials;
5454
try (InputStream stream = ITMutableCredentialsTest.class.getResourceAsStream(INVALID_KEY)) {
5555
invalidCredentials = ServiceAccountCredentials.fromStream(stream);
5656
}
57-
List<String> scopes =
58-
Collections.singletonList("https://www.googleapis.com/auth/cloud-platform");
59-
// create MutableCredentials first with missing permissions
57+
58+
// create MutableCredentials first default account credentials
6059
MutableCredentials mutableCredentials =
61-
new MutableCredentials((ServiceAccountCredentials) missingPermissionCredentials, scopes);
60+
new MutableCredentials((ServiceAccountCredentials) missingPermissionCredentials);
6261

63-
SpannerOptions options = SpannerOptions.newBuilder().setCredentials(mutableCredentials).build();
62+
SpannerOptions options =
63+
SpannerOptions.newBuilder()
64+
.setCredentials(FixedCredentialsProvider.create(mutableCredentials).getCredentials())
65+
.build();
66+
System.out.println("initial credentials " + options.getCredentials());
67+
System.out.println("default projecct" + options.getProjectId());
6468
try (Spanner spanner = options.getService();
65-
DatabaseAdminClient databaseAdminClient = spanner.createDatabaseAdminClient()) {
69+
InstanceAdminClient instanceAdminClient = spanner.createInstanceAdminClient()) {
6670
String project = "gcloud-devel";
6771
String instance = "java-client-integration-tests";
6872
try {
69-
listDatabases(databaseAdminClient, project, instance);
73+
listInstances(instanceAdminClient, options.getProjectId(), instance);
7074
fail("Expected PERMISSION_DENIED");
7175
} catch (Exception e) {
7276
// specifically validate the permission denied error message
@@ -78,7 +82,7 @@ public void testMutableCredentialsUpdateAuthorizationForRunningClient() throws I
7882
// update mutableCredentials now to use an invalid credential
7983
mutableCredentials.updateCredentials(invalidCredentials);
8084
try {
81-
listDatabases(databaseAdminClient, project, instance);
85+
listInstances(instanceAdminClient, options.getProjectId(), instance);
8286
fail("Expected UNAUTHENTICATED after switching to invalid credentials");
8387
} catch (Exception e) {
8488
assertTrue(e.getMessage().contains("UNAUTHENTICATED"));
@@ -87,15 +91,13 @@ public void testMutableCredentialsUpdateAuthorizationForRunningClient() throws I
8791
}
8892
}
8993

90-
private static void listDatabases(
91-
DatabaseAdminClient databaseAdminClient, String projectId, String instanceId) {
92-
DatabaseAdminClient.ListDatabasesPagedResponse response =
93-
databaseAdminClient.listDatabases(InstanceName.of(projectId, instanceId));
94+
private static void listInstances(
95+
InstanceAdminClient instanceAdminClient, String projectId, String instanceId) {
96+
InstanceAdminClient.ListInstancesPagedResponse response =
97+
instanceAdminClient.listInstances(ProjectName.of(projectId));
9498

95-
for (DatabaseAdminClient.ListDatabasesPage page : response.iteratePages()) {
96-
for (Database database : page.iterateAll()) {
97-
// no-op
98-
}
99+
for (InstanceAdminClient.ListInstancesPage page : response.iteratePages()) {
100+
// no-op
99101
}
100102
}
101103
}

0 commit comments

Comments
 (0)