Skip to content

Commit 12b0c79

Browse files
committed
[json] Avoid writing empty optional top-level fields
This is required to ensure that the CDP integration works as expected.
1 parent a4e4d85 commit 12b0c79

2 files changed

Lines changed: 53 additions & 27 deletions

File tree

java/client/src/org/openqa/selenium/json/JsonOutput.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public class JsonOutput implements Closeable {
130130
builder.put(File.class::isAssignableFrom, (obj, depth) -> append(((File) obj).getAbsolutePath()));
131131
builder.put(URI.class::isAssignableFrom, (obj, depth) -> append(asString((obj).toString())));
132132
builder.put(URL.class::isAssignableFrom, (obj, depth) -> append(asString(((URL) obj).toExternalForm())));
133-
builder.put(UUID.class::isAssignableFrom, (obj, depth) -> append(asString(((UUID) obj).toString())));
133+
builder.put(UUID.class::isAssignableFrom, (obj, depth) -> append(asString(obj.toString())));
134134
builder.put(Level.class::isAssignableFrom, (obj, depth) -> append(asString(LogLevelMapping.getName((Level) obj))));
135135
builder.put(
136136
GSON_ELEMENT,
@@ -374,8 +374,11 @@ private void mapObject(Object toConvert, int maxDepth) {
374374
continue;
375375
}
376376

377-
name(pd.getName());
378-
write(pd.getReadMethod().apply(toConvert), maxDepth - 1);
377+
Object value = pd.getReadMethod().apply(toConvert);
378+
if (!Optional.empty().equals(value)) {
379+
name(pd.getName());
380+
write(value, maxDepth - 1);
381+
}
379382
}
380383
endObject();
381384
}

java/client/test/org/openqa/selenium/json/JsonOutputTest.java

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -104,15 +104,15 @@ public void shouldConvertAMapIntoAJsonObject() {
104104

105105
String json = convert(toConvert);
106106

107-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
107+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
108108
assertThat(converted.get("cheese").getAsString()).isEqualTo("cheddar");
109109
}
110110

111111
@Test
112112
public void shouldConvertASimpleJavaBean() {
113113
String json = convert(new SimpleBean());
114114

115-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
115+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
116116
assertThat(converted.get("foo").getAsString()).isEqualTo("bar");
117117
assertThat(converted.get("simple").getAsBoolean()).isEqualTo(true);
118118
assertThat(converted.get("number").getAsDouble()).isEqualTo(123.456);
@@ -122,7 +122,7 @@ public void shouldConvertASimpleJavaBean() {
122122
public void shouldConvertArrays() {
123123
String json = convert(new BeanWithArray());
124124

125-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
125+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
126126
JsonArray allNames = converted.get("names").getAsJsonArray();
127127
assertThat(allNames).hasSize(3);
128128
}
@@ -131,7 +131,7 @@ public void shouldConvertArrays() {
131131
public void shouldConvertCollections() {
132132
String json = convert(new BeanWithCollection());
133133

134-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
134+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
135135
JsonArray allNames = converted.get("something").getAsJsonArray();
136136
assertThat(allNames).hasSize(2);
137137
}
@@ -182,7 +182,7 @@ public void shouldBeAbleToConvertAPoint() {
182182
public void shouldEncodeClassNameAsClassProperty() {
183183
String json = convert(new SimpleBean());
184184

185-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
185+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
186186

187187
assertThat(converted.get("class").getAsString()).isEqualTo(SimpleBean.class.getName());
188188
}
@@ -192,7 +192,7 @@ public void shouldBeAbleToConvertASessionId() {
192192
SessionId sessionId = new SessionId("some id");
193193
String json = convert(sessionId);
194194

195-
JsonPrimitive converted = new JsonParser().parse(json).getAsJsonPrimitive();
195+
JsonPrimitive converted = JsonParser.parseString(json).getAsJsonPrimitive();
196196

197197
assertThat(converted.getAsString()).isEqualTo("some id");
198198
}
@@ -203,7 +203,7 @@ public void shouldBeAbleToConvertAJsonObject() {
203203
obj.addProperty("key", "value");
204204
String json = convert(obj);
205205

206-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
206+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
207207

208208
assertThat(converted.get("key").getAsString()).isEqualTo("value");
209209
}
@@ -214,7 +214,7 @@ public void shouldBeAbleToConvertACapabilityObject() {
214214

215215
String json = convert(caps);
216216

217-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
217+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
218218

219219
assertThat(converted.get("key").getAsString()).isEqualTo("alpha");
220220
}
@@ -231,7 +231,7 @@ public void shouldConvertAProxyCorrectly() {
231231

232232
String json = convert(command.getParameters());
233233

234-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
234+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
235235
JsonObject capsAsMap = converted.get("desiredCapabilities").getAsJsonObject();
236236

237237
assertThat(capsAsMap.get(CapabilityType.PROXY).getAsJsonObject().get("httpProxy").getAsString())
@@ -260,7 +260,7 @@ public Map<String, Object> toJson() {
260260
}
261261

262262
String json = convert(new ToJsonReturnsMap());
263-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
263+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
264264

265265
assertThat(converted.entrySet()).hasSize(1);
266266
assertThat(converted.get("cheese").getAsString()).isEqualTo("peas");
@@ -276,7 +276,7 @@ public Set<String> toJson() {
276276
}
277277

278278
String json = convert(new ToJsonReturnsCollection());
279-
JsonArray converted = new JsonParser().parse(json).getAsJsonArray();
279+
JsonArray converted = JsonParser.parseString(json).getAsJsonArray();
280280

281281
assertThat(converted).hasSize(2);
282282
JsonArray expected = new JsonArray();
@@ -333,7 +333,7 @@ public void convertsToJsonMethodResultToPrimitiveIfItIsNotJson() {
333333
// The JSON spec says that we should encode the forward stroke ("solidus"). Decode the string
334334
assertThat(json.startsWith("\"")).isTrue();
335335
assertThat(json.endsWith("\"")).isTrue();
336-
json = new JsonParser().parse(json).getAsString();
336+
json = JsonParser.parseString(json).getAsString();
337337

338338
assertThat(json).isEqualTo("gnu/linux");
339339
}
@@ -373,7 +373,7 @@ public void shouldBeAbleToConvertAWebDriverException() {
373373
StackTraceElement[] stackTrace = clientError.getStackTrace();
374374
String raw = convert(clientError);
375375

376-
JsonObject converted = new JsonParser().parse(raw).getAsJsonObject();
376+
JsonObject converted = JsonParser.parseString(raw).getAsJsonObject();
377377

378378
assertThat(converted.has("buildInformation")).isTrue();
379379
assertThat(converted.has("systemInformation")).isTrue();
@@ -421,7 +421,7 @@ public Date getDate() {
421421
Bean bean = new Bean(date);
422422
String jsonStr = convert(bean);
423423

424-
JsonObject converted = new JsonParser().parse(jsonStr).getAsJsonObject();
424+
JsonObject converted = JsonParser.parseString(jsonStr).getAsJsonObject();
425425

426426
assertThat(converted.has("date")).isTrue();
427427
assertThat(converted.get("date").getAsLong()).isEqualTo(123456L);
@@ -434,7 +434,7 @@ public void shouldBeAbleToConvertACookie() {
434434

435435
String jsonStr = convert(cookie);
436436

437-
JsonObject converted = new JsonParser().parse(jsonStr).getAsJsonObject();
437+
JsonObject converted = JsonParser.parseString(jsonStr).getAsJsonObject();
438438

439439
assertThat(converted.get("name").getAsString()).isEqualTo("name");
440440
assertThat(converted.get("value").getAsString()).isEqualTo("value");
@@ -474,7 +474,7 @@ public void convertLoggingPreferencesToJson() {
474474

475475
String json = convert(prefs);
476476

477-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
477+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
478478

479479
assertThat(converted.get(BROWSER).getAsString()).isEqualTo("WARNING");
480480
assertThat(converted.get(CLIENT).getAsString()).isEqualTo("DEBUG");
@@ -486,7 +486,7 @@ public void convertLoggingPreferencesToJson() {
486486
public void convertsLogEntryToJson() {
487487
String raw = convert(new LogEntry(Level.OFF, 17, "foo"));
488488

489-
JsonObject converted = new JsonParser().parse(raw).getAsJsonObject();
489+
JsonObject converted = JsonParser.parseString(raw).getAsJsonObject();
490490

491491
assertThat(converted.get("message").getAsString()).isEqualTo("foo");
492492
assertThat(converted.get("timestamp").getAsLong()).isEqualTo(17);
@@ -502,7 +502,7 @@ public void convertLogEntriesToJson() {
502502

503503
String json = convert(entries);
504504

505-
JsonArray converted = new JsonParser().parse(json).getAsJsonArray();
505+
JsonArray converted = JsonParser.parseString(json).getAsJsonArray();
506506

507507
JsonObject obj1 = converted.get(0).getAsJsonObject();
508508
JsonObject obj2 = converted.get(1).getAsJsonObject();
@@ -525,7 +525,7 @@ public void shouldBeAbleToConvertACommand() {
525525

526526
String json = convert(command);
527527

528-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
528+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
529529

530530
assertThat(converted.has("sessionId")).isTrue();
531531
JsonPrimitive sid = converted.get("sessionId").getAsJsonPrimitive();
@@ -546,7 +546,7 @@ public void shouldConvertAUrlToAString() throws MalformedURLException {
546546
Map<String, URL> toConvert = ImmutableMap.of("url", url);
547547

548548
String seen = new Json().toJson(toConvert);
549-
JsonObject converted = new JsonParser().parse(seen).getAsJsonObject();
549+
JsonObject converted = JsonParser.parseString(seen).getAsJsonObject();
550550

551551
assertThat(converted.get("url").getAsString()).isEqualTo(url.toExternalForm());
552552
}
@@ -555,7 +555,7 @@ public void shouldConvertAUrlToAString() throws MalformedURLException {
555555
public void shouldNotIncludePropertiesFromJavaLangObjectOtherThanClass() {
556556
String json = convert(new SimpleBean());
557557

558-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
558+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
559559

560560
Stream.of(SimplePropertyDescriptor.getPropertyDescriptors(Object.class))
561561
.filter(pd -> !"class".equals(pd.getName()))
@@ -597,7 +597,7 @@ public void shouldAllowValuesToBeStreamedToAnObject() {
597597
public void whenConvertingObjectsContainingClassesDoNotBeNoisy() {
598598
String json = convert(ImmutableMap.of("thing", SimpleBean.class));
599599

600-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
600+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
601601

602602
assertThat(converted.size()).isEqualTo(1);
603603
assertThat(converted.getAsJsonPrimitive("thing").getAsString())
@@ -632,7 +632,7 @@ public void shouldEncodeLogLevelsAsStrings() {
632632
public void shouldNotWriteOptionalFieldsThatAreEmptyInAMap() {
633633
String json = convert(ImmutableMap.of("there", Optional.of("cheese"), "notThere", Optional.empty()));
634634

635-
JsonObject converted = new JsonParser().parse(json).getAsJsonObject();
635+
JsonObject converted = JsonParser.parseString(json).getAsJsonObject();
636636

637637
assertThat(converted.has("notThere")).isFalse();
638638
assertThat(converted.get("there").getAsString()).isEqualTo("cheese");
@@ -642,12 +642,35 @@ public void shouldNotWriteOptionalFieldsThatAreEmptyInAMap() {
642642
public void shouldNotWriteOptionalsThatAreNotPresentToAList() {
643643
String json = convert(Arrays.asList(Optional.of("cheese"), Optional.empty()));
644644

645-
JsonArray converted = new JsonParser().parse(json).getAsJsonArray();
645+
JsonArray converted = JsonParser.parseString(json).getAsJsonArray();
646646

647647
assertThat(converted.size()).isEqualTo(1);
648648
assertThat(converted.get(0).getAsString()).isEqualTo("cheese");
649649
}
650650

651+
@Test
652+
public void shouldNotWriteOptionalValuesIfOnAnInstanceAndEmpty() {
653+
class WithOptionals {
654+
private final Optional<String> value = Optional.of("Cheese");
655+
private final Optional<String> noValue = Optional.empty();
656+
657+
public Optional<String> getValue() {
658+
return value;
659+
}
660+
661+
public Optional<String> getNoValue() {
662+
return noValue;
663+
}
664+
}
665+
666+
String json = convert(new WithOptionals());
667+
668+
JsonObject obj = JsonParser.parseString(json).getAsJsonObject();
669+
670+
assertThat(obj.get("value").getAsString()).describedAs(json).isEqualTo("Cheese");
671+
assertThat(obj.has("noValue")).describedAs(json).isFalse();
672+
}
673+
651674
private String convert(Object toConvert) {
652675
try (Writer writer = new StringWriter();
653676
JsonOutput jsonOutput = new Json().newOutput(writer)) {

0 commit comments

Comments
 (0)