public static Builder builder() {
    return new Builder();
  }
@Test
  public void testRoundTripSerDe() throws JsonProcessingException {
    // Full request
    String fullJson = "{\"removals\":[\"foo\",\"bar\"],\"updates\":{\"owner\":\"Hank\"}}";
    assertRoundTripSerializesEquallyFrom(
        fullJson,
        UpdateNamespacePropertiesRequest.builder().updateAll(UPDATES).removeAll(REMOVALS).build());

    // Only updates
    String emptyRemoval = "{\"removals\":[],\"updates\":{\"owner\":\"Hank\"}}";
    assertRoundTripSerializesEquallyFrom(
        emptyRemoval,
        UpdateNamespacePropertiesRequest.builder()
            .updateAll(UPDATES)
            .removeAll(EMPTY_REMOVALS)
            .build());

    assertRoundTripSerializesEquallyFrom(
        emptyRemoval, UpdateNamespacePropertiesRequest.builder().update("owner", "Hank").build());

    // Only removals
    String emptyUpdates = "{\"removals\":[\"foo\",\"bar\"],\"updates\":{}}";
    assertRoundTripSerializesEquallyFrom(
        emptyUpdates,
        UpdateNamespacePropertiesRequest.builder()
            .removeAll(REMOVALS)
            .updateAll(EMPTY_UPDATES)
            .build());

    assertRoundTripSerializesEquallyFrom(
        emptyUpdates,
        UpdateNamespacePropertiesRequest.builder().remove("foo").remove("bar").build());

    // All empty
    String jsonAllFieldsEmpty = "{\"removals\":[],\"updates\":{}}";
    assertRoundTripSerializesEquallyFrom(
        jsonAllFieldsEmpty, UpdateNamespacePropertiesRequest.builder().build());
  }