Skip to content

Commit 926241a

Browse files
committed
Handle no project fields are selected on list
1 parent 5fea7ce commit 926241a

File tree

2 files changed

+35
-5
lines changed

2 files changed

+35
-5
lines changed

gcloud-java-resourcemanager/src/main/java/com/google/gcloud/resourcemanager/testing/LocalResourceManagerHelper.java

+18-5
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public class LocalResourceManagerHelper {
6060
ImmutableSet.of("gzip", "x-gzip");
6161
private static final Pattern LIST_FIELDS_PATTERN =
6262
Pattern.compile("(.*?)projects\\((.*?)\\)(.*?)");
63+
private static final String[] NO_FIELDS = {};
6364

6465
static {
6566
try {
@@ -245,6 +246,9 @@ private static Map<String, Object> parseListOptions(String query) throws IOExcep
245246
if (matcher.matches()) {
246247
options.put("projectFields", matcher.group(2).split(","));
247248
options.put("listFields", (matcher.group(1) + matcher.group(3)).split(","));
249+
} else {
250+
options.put("projectFields", NO_FIELDS);
251+
options.put("listFields", argEntry[1].split(","));
248252
}
249253
break;
250254
case "filter":
@@ -393,14 +397,23 @@ Response list(Map<String, Object> options) {
393397
}
394398
}
395399
}
396-
StringBuilder responseBody = new StringBuilder();
397-
responseBody.append("{\"projects\": [");
398-
Joiner.on(",").appendTo(responseBody, projectsSerialized);
399-
responseBody.append(']');
400400
String[] listFields = (String[]) options.get("listFields");
401+
StringBuilder responseBody = new StringBuilder();
402+
responseBody.append('{');
403+
boolean commaNeeded = false;
404+
// If fields parameter is set but no project field is selected we must return no projects.
405+
if (!(projectFields != null && projectFields.length == 0)) {
406+
responseBody.append("\"projects\": [");
407+
Joiner.on(",").appendTo(responseBody, projectsSerialized);
408+
responseBody.append(']');
409+
commaNeeded = true;
410+
}
401411
if (nextPageToken != null && (listFields == null
402412
|| ImmutableSet.copyOf(listFields).contains("nextPageToken"))) {
403-
responseBody.append(", \"nextPageToken\": \"");
413+
if (commaNeeded) {
414+
responseBody.append(",");
415+
}
416+
responseBody.append("\"nextPageToken\": \"");
404417
responseBody.append(nextPageToken);
405418
responseBody.append('"');
406419
}

gcloud-java-resourcemanager/src/test/java/com/google/gcloud/resourcemanager/LocalResourceManagerHelperTest.java

+17
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,23 @@ public void testListNoPageTokenFieldOptions() {
408408
assertFalse(iterator.hasNext());
409409
}
410410

411+
@Test
412+
public void testListPageTokenNoFieldsOptions() {
413+
Map<ResourceManagerRpc.Option, Object> rpcOptions = new HashMap<>();
414+
rpcOptions.put(ResourceManagerRpc.Option.PAGE_SIZE, 1);
415+
rpcOptions.put(ResourceManagerRpc.Option.FIELDS, "nextPageToken");
416+
rpc.create(PARTIAL_PROJECT);
417+
rpc.create(COMPLETE_PROJECT);
418+
Tuple<String, Iterable<com.google.api.services.cloudresourcemanager.model.Project>> projects =
419+
rpc.list(rpcOptions);
420+
assertNotNull(projects.x());
421+
assertNull(projects.y());
422+
rpcOptions.put(ResourceManagerRpc.Option.PAGE_TOKEN, projects.x());
423+
projects = rpc.list(rpcOptions);
424+
assertNull(projects.x());
425+
assertNull(projects.y());
426+
}
427+
411428
@Test
412429
public void testListFilterOptions() {
413430
Map<ResourceManagerRpc.Option, Object> rpcFilterOptions = new HashMap<>();

0 commit comments

Comments
 (0)