From d16855ebec0871fdb625c11fa8a6ad32a0e87b72 Mon Sep 17 00:00:00 2001 From: Mira Leung Date: Tue, 27 Jul 2021 21:55:24 -0700 Subject: [PATCH] fix(resnames): ensure deterministic resname order for samplegen --- .../ServiceClientSampleCodeComposer.java | 20 +++++++++++++ .../google/cloud/asset/v1/package-info.java | 2 +- .../kms/v1/KeyManagementServiceClient.java | 29 ++++++++++++++----- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposer.java index 0e1b337670..ac8d805b59 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposer.java @@ -59,6 +59,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.TreeMap; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -70,6 +71,7 @@ public static String composeClassHeaderMethodSampleCode( TypeNode clientType, Map resourceNames, Map messageTypes) { + resourceNames = sortAlphabetically(resourceNames); // Use the first pure unary RPC method's sample code as showcase, if no such method exists, use // the first method in the service's methods list. Method method = @@ -232,6 +234,7 @@ public static String composeRpcMethodHeaderSampleCode( List arguments, Map resourceNames, Map messageTypes) { + resourceNames = sortAlphabetically(resourceNames); VariableExpr clientVarExpr = VariableExpr.withVariable( Variable.builder() @@ -278,6 +281,7 @@ public static String composeRpcDefaultMethodHeaderSampleCode( TypeNode clientType, Map resourceNames, Map messageTypes) { + resourceNames = sortAlphabetically(resourceNames); VariableExpr clientVarExpr = VariableExpr.withVariable( Variable.builder() @@ -336,6 +340,7 @@ public static String composeLroCallableMethodHeaderSampleCode( TypeNode clientType, Map resourceNames, Map messageTypes) { + resourceNames = sortAlphabetically(resourceNames); VariableExpr clientVarExpr = VariableExpr.withVariable( Variable.builder() @@ -448,6 +453,7 @@ public static String composePagedCallableMethodHeaderSampleCode( TypeNode clientType, Map resourceNames, Map messageTypes) { + resourceNames = sortAlphabetically(resourceNames); VariableExpr clientVarExpr = VariableExpr.withVariable( Variable.builder() @@ -567,6 +573,7 @@ public static String composeRegularCallableMethodHeaderSampleCode( TypeNode clientType, Map resourceNames, Map messageTypes) { + resourceNames = sortAlphabetically(resourceNames); VariableExpr clientVarExpr = VariableExpr.withVariable( Variable.builder() @@ -616,6 +623,7 @@ public static String composeStreamCallableMethodHeaderSampleCode( TypeNode clientType, Map resourceNames, Map messageTypes) { + resourceNames = sortAlphabetically(resourceNames); VariableExpr clientVarExpr = VariableExpr.withVariable( Variable.builder() @@ -1349,4 +1357,16 @@ private static boolean isProtoEmptyType(TypeNode type) { return type.reference().pakkage().equals("com.google.protobuf") && type.reference().name().equals("Empty"); } + + /** + * Returns the same "resource type name" to "resource name" key-value map as given, but sorted in + * alphabetical order. This prevents resource name flip-flopping between executions on the various + * machines used for client library publication. + */ + private static TreeMap sortAlphabetically( + Map unsorted) { + // This simple wrapper is not redundant because it hides implementation details from the + // callers. + return new TreeMap<>(unsorted); + } } diff --git a/test/integration/goldens/asset/com/google/cloud/asset/v1/package-info.java b/test/integration/goldens/asset/com/google/cloud/asset/v1/package-info.java index e4032e3df0..27db247ed3 100644 --- a/test/integration/goldens/asset/com/google/cloud/asset/v1/package-info.java +++ b/test/integration/goldens/asset/com/google/cloud/asset/v1/package-info.java @@ -27,7 +27,7 @@ * try (AssetServiceClient assetServiceClient = AssetServiceClient.create()) { * BatchGetAssetsHistoryRequest request = * BatchGetAssetsHistoryRequest.newBuilder() - * .setParent(ProjectName.of("[PROJECT]").toString()) + * .setParent(FeedName.ofProjectFeedName("[PROJECT]", "[FEED]").toString()) * .addAllAssetNames(new ArrayList()) * .setContentType(ContentType.forNumber(0)) * .setReadTimeWindow(TimeWindow.newBuilder().build()) diff --git a/test/integration/goldens/kms/com/google/cloud/kms/v1/KeyManagementServiceClient.java b/test/integration/goldens/kms/com/google/cloud/kms/v1/KeyManagementServiceClient.java index cc3e563cff..6986d1977a 100644 --- a/test/integration/goldens/kms/com/google/cloud/kms/v1/KeyManagementServiceClient.java +++ b/test/integration/goldens/kms/com/google/cloud/kms/v1/KeyManagementServiceClient.java @@ -2148,7 +2148,7 @@ public final CryptoKeyVersion updateCryptoKeyVersion(UpdateCryptoKeyVersionReque *
{@code
    * try (KeyManagementServiceClient keyManagementServiceClient =
    *     KeyManagementServiceClient.create()) {
-   *   ResourceName name = KeyRingName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]");
+   *   ResourceName name = CryptoKeyName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]", "[CRYPTO_KEY]");
    *   ByteString plaintext = ByteString.EMPTY;
    *   EncryptResponse response = keyManagementServiceClient.encrypt(name, plaintext);
    * }
@@ -2188,7 +2188,8 @@ public final EncryptResponse encrypt(ResourceName name, ByteString plaintext) {
    * 
{@code
    * try (KeyManagementServiceClient keyManagementServiceClient =
    *     KeyManagementServiceClient.create()) {
-   *   String name = KeyRingName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]").toString();
+   *   String name =
+   *       CryptoKeyName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]", "[CRYPTO_KEY]").toString();
    *   ByteString plaintext = ByteString.EMPTY;
    *   EncryptResponse response = keyManagementServiceClient.encrypt(name, plaintext);
    * }
@@ -2227,7 +2228,9 @@ public final EncryptResponse encrypt(String name, ByteString plaintext) {
    *     KeyManagementServiceClient.create()) {
    *   EncryptRequest request =
    *       EncryptRequest.newBuilder()
-   *           .setName(KeyRingName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]").toString())
+   *           .setName(
+   *               CryptoKeyName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]", "[CRYPTO_KEY]")
+   *                   .toString())
    *           .setPlaintext(ByteString.EMPTY)
    *           .setAdditionalAuthenticatedData(ByteString.EMPTY)
    *           .setPlaintextCrc32C(Int64Value.newBuilder().build())
@@ -2258,7 +2261,9 @@ public final EncryptResponse encrypt(EncryptRequest request) {
    *     KeyManagementServiceClient.create()) {
    *   EncryptRequest request =
    *       EncryptRequest.newBuilder()
-   *           .setName(KeyRingName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]").toString())
+   *           .setName(
+   *               CryptoKeyName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]", "[CRYPTO_KEY]")
+   *                   .toString())
    *           .setPlaintext(ByteString.EMPTY)
    *           .setAdditionalAuthenticatedData(ByteString.EMPTY)
    *           .setPlaintextCrc32C(Int64Value.newBuilder().build())
@@ -3154,7 +3159,9 @@ public final CryptoKeyVersion restoreCryptoKeyVersion(RestoreCryptoKeyVersionReq
    *     KeyManagementServiceClient.create()) {
    *   GetIamPolicyRequest request =
    *       GetIamPolicyRequest.newBuilder()
-   *           .setResource(KeyRingName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]").toString())
+   *           .setResource(
+   *               CryptoKeyName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]", "[CRYPTO_KEY]")
+   *                   .toString())
    *           .setOptions(GetPolicyOptions.newBuilder().build())
    *           .build();
    *   Policy response = keyManagementServiceClient.getIamPolicy(request);
@@ -3180,7 +3187,9 @@ public final Policy getIamPolicy(GetIamPolicyRequest request) {
    *     KeyManagementServiceClient.create()) {
    *   GetIamPolicyRequest request =
    *       GetIamPolicyRequest.newBuilder()
-   *           .setResource(KeyRingName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]").toString())
+   *           .setResource(
+   *               CryptoKeyName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]", "[CRYPTO_KEY]")
+   *                   .toString())
    *           .setOptions(GetPolicyOptions.newBuilder().build())
    *           .build();
    *   ApiFuture future =
@@ -3343,7 +3352,9 @@ public final UnaryCallable getLocationCallable() {
    *     KeyManagementServiceClient.create()) {
    *   TestIamPermissionsRequest request =
    *       TestIamPermissionsRequest.newBuilder()
-   *           .setResource(KeyRingName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]").toString())
+   *           .setResource(
+   *               CryptoKeyName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]", "[CRYPTO_KEY]")
+   *                   .toString())
    *           .addAllPermissions(new ArrayList())
    *           .build();
    *   TestIamPermissionsResponse response = keyManagementServiceClient.testIamPermissions(request);
@@ -3369,7 +3380,9 @@ public final TestIamPermissionsResponse testIamPermissions(TestIamPermissionsReq
    *     KeyManagementServiceClient.create()) {
    *   TestIamPermissionsRequest request =
    *       TestIamPermissionsRequest.newBuilder()
-   *           .setResource(KeyRingName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]").toString())
+   *           .setResource(
+   *               CryptoKeyName.of("[PROJECT]", "[LOCATION]", "[KEY_RING]", "[CRYPTO_KEY]")
+   *                   .toString())
    *           .addAllPermissions(new ArrayList())
    *           .build();
    *   ApiFuture future =