From 44d2a5e9144f621b24a3858b707612f5b4027ca7 Mon Sep 17 00:00:00 2001 From: Emily Ball Date: Thu, 17 Mar 2022 14:35:33 -0700 Subject: [PATCH] chore: refactor sample composers - breakup class + renaming (#969) * chore: refactor sample composers - breakup class + renaming Not updating any of the code - just moving things around * include license headers --- .../ClientLibraryPackageInfoComposer.java | 4 +- .../AbstractServiceClientClassComposer.java | 22 +- ...tter.java => SampleBodyJavaFormatter.java} | 4 +- .../composer/samplecode/SampleCodeWriter.java | 2 +- ... ServiceClientCallableSampleComposer.java} | 643 +--- .../ServiceClientHeaderSampleComposer.java | 196 ++ .../ServiceClientMethodSampleComposer.java | 290 ++ .../samplecode/ServiceClientSampleUtil.java | 117 + .../SampleCodeJavaFormatterTest.java | 10 +- .../samplecode/SampleComposerTest.java | 1 + ...tCallableMethodSampleCodeComposerTest.java | 959 ++++++ ...iceClientHeaderSampleCodeComposerTest.java | 328 ++ ...iceClientMethodSampleCodeComposerTest.java | 810 +++++ .../ServiceClientSampleCodeComposerTest.java | 2640 ----------------- 14 files changed, 2797 insertions(+), 3229 deletions(-) rename src/main/java/com/google/api/generator/gapic/composer/samplecode/{SampleCodeBodyJavaFormatter.java => SampleBodyJavaFormatter.java} (96%) rename src/main/java/com/google/api/generator/gapic/composer/samplecode/{ServiceClientSampleCodeComposer.java => ServiceClientCallableSampleComposer.java} (63%) create mode 100644 src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java create mode 100644 src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposer.java create mode 100644 src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleUtil.java create mode 100644 src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleCodeComposerTest.java create mode 100644 src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleCodeComposerTest.java create mode 100644 src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleCodeComposerTest.java delete mode 100644 src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java diff --git a/src/main/java/com/google/api/generator/gapic/composer/ClientLibraryPackageInfoComposer.java b/src/main/java/com/google/api/generator/gapic/composer/ClientLibraryPackageInfoComposer.java index 9fe1ff6eca..302b6a8eca 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/ClientLibraryPackageInfoComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/ClientLibraryPackageInfoComposer.java @@ -21,7 +21,7 @@ import com.google.api.generator.engine.ast.PackageInfoDefinition; import com.google.api.generator.engine.ast.TypeNode; import com.google.api.generator.engine.ast.VaporReference; -import com.google.api.generator.gapic.composer.samplecode.ServiceClientSampleCodeComposer; +import com.google.api.generator.gapic.composer.samplecode.ServiceClientHeaderSampleComposer; import com.google.api.generator.gapic.composer.utils.ClassNames; import com.google.api.generator.gapic.model.GapicContext; import com.google.api.generator.gapic.model.GapicPackageInfo; @@ -120,7 +120,7 @@ private static CommentStatement createPackageInfoJavadoc(GapicContext context) { .setName(ClassNames.getServiceClientClassName(service)) .build()); String packageInfoSampleCode = - ServiceClientSampleCodeComposer.composeClassHeaderMethodSampleCode( + ServiceClientHeaderSampleComposer.composeClassHeaderMethodSampleCode( service, clientType, context.resourceNames(), context.messages()); javaDocCommentBuilder.addSampleCode(packageInfoSampleCode); } diff --git a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java index beb777f543..4aaa36a7ad 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java +++ b/src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientClassComposer.java @@ -55,7 +55,9 @@ import com.google.api.generator.engine.ast.Variable; import com.google.api.generator.engine.ast.VariableExpr; import com.google.api.generator.gapic.composer.comment.ServiceClientCommentComposer; -import com.google.api.generator.gapic.composer.samplecode.ServiceClientSampleCodeComposer; +import com.google.api.generator.gapic.composer.samplecode.ServiceClientCallableSampleComposer; +import com.google.api.generator.gapic.composer.samplecode.ServiceClientHeaderSampleComposer; +import com.google.api.generator.gapic.composer.samplecode.ServiceClientMethodSampleComposer; import com.google.api.generator.gapic.composer.store.TypeStore; import com.google.api.generator.gapic.composer.utils.ClassNames; import com.google.api.generator.gapic.composer.utils.PackageChecker; @@ -189,13 +191,13 @@ private static List createClassHeaderComments( TypeNode clientType = typeStore.get(ClassNames.getServiceClientClassName(service)); TypeNode settingsType = typeStore.get(ClassNames.getServiceSettingsClassName(service)); String classMethodSampleCode = - ServiceClientSampleCodeComposer.composeClassHeaderMethodSampleCode( + ServiceClientHeaderSampleComposer.composeClassHeaderMethodSampleCode( service, clientType, resourceNames, messageTypes); String credentialsSampleCode = - ServiceClientSampleCodeComposer.composeClassHeaderCredentialsSampleCode( + ServiceClientHeaderSampleComposer.composeClassHeaderCredentialsSampleCode( clientType, settingsType); String endpointSampleCode = - ServiceClientSampleCodeComposer.composeClassHeaderEndpointSampleCode( + ServiceClientHeaderSampleComposer.composeClassHeaderEndpointSampleCode( clientType, settingsType); return ServiceClientCommentComposer.createClassHeaderComments( service, classMethodSampleCode, credentialsSampleCode, endpointSampleCode); @@ -697,7 +699,7 @@ private static List createMethodVariants( Optional methodSampleCode = Optional.of( - ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode( + ServiceClientMethodSampleComposer.composeRpcMethodHeaderSampleCode( method, typeStore.get(clientName), signature, resourceNames, messageTypes)); MethodDefinition.Builder methodVariantBuilder = MethodDefinition.builder() @@ -777,7 +779,7 @@ private static MethodDefinition createMethodDefaultMethod( Optional defaultMethodSampleCode = Optional.of( - ServiceClientSampleCodeComposer.composeRpcDefaultMethodHeaderSampleCode( + ServiceClientMethodSampleComposer.composeRpcDefaultMethodHeaderSampleCode( method, typeStore.get(clientName), resourceNames, messageTypes)); MethodInvocationExpr callableMethodExpr = @@ -900,7 +902,7 @@ private static MethodDefinition createCallableMethod( if (callableMethodKind.equals(CallableMethodKind.LRO)) { sampleCodeOpt = Optional.of( - ServiceClientSampleCodeComposer.composeLroCallableMethodHeaderSampleCode( + ServiceClientCallableSampleComposer.composeLroCallableMethodHeaderSampleCode( method, typeStore.get(ClassNames.getServiceClientClassName(service)), resourceNames, @@ -908,7 +910,7 @@ private static MethodDefinition createCallableMethod( } else if (callableMethodKind.equals(CallableMethodKind.PAGED)) { sampleCodeOpt = Optional.of( - ServiceClientSampleCodeComposer.composePagedCallableMethodHeaderSampleCode( + ServiceClientCallableSampleComposer.composePagedCallableMethodHeaderSampleCode( method, typeStore.get(ClassNames.getServiceClientClassName(service)), resourceNames, @@ -917,7 +919,7 @@ private static MethodDefinition createCallableMethod( if (method.stream().equals(Stream.NONE)) { sampleCodeOpt = Optional.of( - ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode( + ServiceClientCallableSampleComposer.composeRegularCallableMethodHeaderSampleCode( method, typeStore.get(ClassNames.getServiceClientClassName(service)), resourceNames, @@ -925,7 +927,7 @@ private static MethodDefinition createCallableMethod( } else { sampleCodeOpt = Optional.of( - ServiceClientSampleCodeComposer.composeStreamCallableMethodHeaderSampleCode( + ServiceClientCallableSampleComposer.composeStreamCallableMethodHeaderSampleCode( method, typeStore.get(ClassNames.getServiceClientClassName(service)), resourceNames, diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeBodyJavaFormatter.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleBodyJavaFormatter.java similarity index 96% rename from src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeBodyJavaFormatter.java rename to src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleBodyJavaFormatter.java index cb3d9d0039..a5e81bd8b4 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeBodyJavaFormatter.java +++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleBodyJavaFormatter.java @@ -20,9 +20,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public final class SampleCodeBodyJavaFormatter { +public final class SampleBodyJavaFormatter { - private SampleCodeBodyJavaFormatter() {} + private SampleBodyJavaFormatter() {} private static final Formatter FORMATTER = new Formatter(); diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeWriter.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeWriter.java index 60a5092598..2c00debf35 100644 --- a/src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeWriter.java +++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeWriter.java @@ -38,7 +38,7 @@ public static String write(List statements) { for (Statement statement : statements) { statement.accept(visitor); } - String formattedSampleCode = SampleCodeBodyJavaFormatter.format(visitor.write()); + String formattedSampleCode = SampleBodyJavaFormatter.format(visitor.write()); // Escape character "@" in the markdown code block
{@code...} tags.
     return formattedSampleCode.replaceAll("@", "{@literal @}");
   }
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/ServiceClientCallableSampleComposer.java
similarity index 63%
rename from src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposer.java
rename to src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableSampleComposer.java
index 5ca7b573af..a84fb62a56 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/ServiceClientCallableSampleComposer.java
@@ -15,7 +15,6 @@
 package com.google.api.generator.gapic.composer.samplecode;
 
 import com.google.api.core.ApiFuture;
-import com.google.api.gax.core.FixedCredentialsProvider;
 import com.google.api.gax.longrunning.OperationFuture;
 import com.google.api.gax.rpc.ApiStreamObserver;
 import com.google.api.gax.rpc.BidiStream;
@@ -39,7 +38,6 @@
 import com.google.api.generator.engine.ast.TypeNode;
 import com.google.api.generator.engine.ast.UnaryOperationExpr;
 import com.google.api.generator.engine.ast.ValueExpr;
-import com.google.api.generator.engine.ast.VaporReference;
 import com.google.api.generator.engine.ast.Variable;
 import com.google.api.generator.engine.ast.VariableExpr;
 import com.google.api.generator.engine.ast.WhileStatement;
@@ -48,289 +46,18 @@
 import com.google.api.generator.gapic.model.Message;
 import com.google.api.generator.gapic.model.Method;
 import com.google.api.generator.gapic.model.Method.Stream;
-import com.google.api.generator.gapic.model.MethodArgument;
 import com.google.api.generator.gapic.model.ResourceName;
-import com.google.api.generator.gapic.model.Service;
 import com.google.api.generator.gapic.utils.JavaStyle;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
 import com.google.longrunning.Operation;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.function.Function;
 import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-public class ServiceClientSampleCodeComposer {
-
-  public static String composeClassHeaderMethodSampleCode(
-      Service service,
-      TypeNode clientType,
-      Map resourceNames,
-      Map messageTypes) {
-    // 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 =
-        service.methods().stream()
-            .filter(m -> m.stream() == Stream.NONE && !m.hasLro() && !m.isPaged())
-            .findFirst()
-            .orElse(service.methods().get(0));
-    if (method.stream() == Stream.NONE) {
-      if (method.methodSignatures().isEmpty()) {
-        return composeRpcDefaultMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-      }
-      return composeRpcMethodHeaderSampleCode(
-          method, clientType, method.methodSignatures().get(0), resourceNames, messageTypes);
-    }
-    return composeStreamCallableMethodHeaderSampleCode(
-        method, clientType, resourceNames, messageTypes);
-  }
-
-  public static String composeClassHeaderCredentialsSampleCode(
-      TypeNode clientType, TypeNode settingsType) {
-    // Initialize clientSettings with builder() method.
-    // e.g. EchoSettings echoSettings =
-    // EchoSettings.newBuilder().setCredentialsProvider(FixedCredentialsProvider.create("myCredentials")).build();
-    String settingsName = JavaStyle.toLowerCamelCase(settingsType.reference().name());
-    String clientName = JavaStyle.toLowerCamelCase(clientType.reference().name());
-    TypeNode myCredentialsType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("myCredentials")
-                .setPakkage(clientType.reference().pakkage())
-                .build());
-    VariableExpr settingsVarExpr =
-        VariableExpr.withVariable(
-            Variable.builder().setName(settingsName).setType(settingsType).build());
-    MethodInvocationExpr newBuilderMethodExpr =
-        MethodInvocationExpr.builder()
-            .setStaticReferenceType(settingsType)
-            .setMethodName("newBuilder")
-            .build();
-    TypeNode fixedCredentialProvideType =
-        TypeNode.withReference(ConcreteReference.withClazz(FixedCredentialsProvider.class));
-    MethodInvocationExpr credentialArgExpr =
-        MethodInvocationExpr.builder()
-            .setStaticReferenceType(fixedCredentialProvideType)
-            .setArguments(
-                VariableExpr.withVariable(
-                    Variable.builder().setName("myCredentials").setType(myCredentialsType).build()))
-            .setMethodName("create")
-            .build();
-    MethodInvocationExpr credentialsMethodExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(newBuilderMethodExpr)
-            .setArguments(credentialArgExpr)
-            .setMethodName("setCredentialsProvider")
-            .build();
-    MethodInvocationExpr buildMethodExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(credentialsMethodExpr)
-            .setReturnType(settingsType)
-            .setMethodName("build")
-            .build();
-    Expr initSettingsVarExpr =
-        AssignmentExpr.builder()
-            .setVariableExpr(settingsVarExpr.toBuilder().setIsDecl(true).build())
-            .setValueExpr(buildMethodExpr)
-            .build();
-
-    // Initialized client with create() method.
-    // e.g. EchoClient echoClient = EchoClient.create(echoSettings);
-    VariableExpr clientVarExpr =
-        VariableExpr.withVariable(
-            Variable.builder().setName(clientName).setType(clientType).build());
-    MethodInvocationExpr createMethodExpr =
-        MethodInvocationExpr.builder()
-            .setStaticReferenceType(clientType)
-            .setArguments(settingsVarExpr)
-            .setMethodName("create")
-            .setReturnType(clientType)
-            .build();
-    Expr initClientVarExpr =
-        AssignmentExpr.builder()
-            .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build())
-            .setValueExpr(createMethodExpr)
-            .build();
-    return SampleCodeWriter.write(
-        Arrays.asList(
-            ExprStatement.withExpr(initSettingsVarExpr),
-            ExprStatement.withExpr(initClientVarExpr)));
-  }
-
-  public static String composeClassHeaderEndpointSampleCode(
-      TypeNode clientType, TypeNode settingsType) {
-    // Initialize client settings with builder() method.
-    // e.g. EchoSettings echoSettings = EchoSettings.newBuilder().setEndpoint("myEndpoint").build();
-    String settingsName = JavaStyle.toLowerCamelCase(settingsType.reference().name());
-    String clientName = JavaStyle.toLowerCamelCase(clientType.reference().name());
-    TypeNode myEndpointType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("myEndpoint")
-                .setPakkage(clientType.reference().pakkage())
-                .build());
-    VariableExpr settingsVarExpr =
-        VariableExpr.withVariable(
-            Variable.builder().setName(settingsName).setType(settingsType).build());
-    MethodInvocationExpr newBuilderMethodExpr =
-        MethodInvocationExpr.builder()
-            .setStaticReferenceType(settingsType)
-            .setMethodName("newBuilder")
-            .build();
-    MethodInvocationExpr credentialsMethodExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(newBuilderMethodExpr)
-            .setArguments(
-                VariableExpr.withVariable(
-                    Variable.builder().setName("myEndpoint").setType(myEndpointType).build()))
-            .setMethodName("setEndpoint")
-            .build();
-    MethodInvocationExpr buildMethodExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(credentialsMethodExpr)
-            .setReturnType(settingsType)
-            .setMethodName("build")
-            .build();
-
-    Expr initSettingsVarExpr =
-        AssignmentExpr.builder()
-            .setVariableExpr(settingsVarExpr.toBuilder().setIsDecl(true).build())
-            .setValueExpr(buildMethodExpr)
-            .build();
-
-    // Initialize client with create() method.
-    // e.g. EchoClient echoClient = EchoClient.create(echoSettings);
-    VariableExpr clientVarExpr =
-        VariableExpr.withVariable(
-            Variable.builder().setName(clientName).setType(clientType).build());
-    MethodInvocationExpr createMethodExpr =
-        MethodInvocationExpr.builder()
-            .setStaticReferenceType(clientType)
-            .setArguments(settingsVarExpr)
-            .setMethodName("create")
-            .setReturnType(clientType)
-            .build();
-    Expr initClientVarExpr =
-        AssignmentExpr.builder()
-            .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build())
-            .setValueExpr(createMethodExpr)
-            .build();
-
-    return SampleCodeWriter.write(
-        Arrays.asList(
-            ExprStatement.withExpr(initSettingsVarExpr),
-            ExprStatement.withExpr(initClientVarExpr)));
-  }
-
-  public static String composeRpcMethodHeaderSampleCode(
-      Method method,
-      TypeNode clientType,
-      List arguments,
-      Map resourceNames,
-      Map messageTypes) {
-    VariableExpr clientVarExpr =
-        VariableExpr.withVariable(
-            Variable.builder()
-                .setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
-                .setType(clientType)
-                .build());
-
-    // Assign method's arguments variable with the default values.
-    List rpcMethodArgVarExprs = createRpcMethodArgumentVariableExprs(arguments);
-    List rpcMethodArgDefaultValueExprs =
-        createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
-    List rpcMethodArgAssignmentExprs =
-        createAssignmentsForVarExprsWithValueExprs(
-            rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
-
-    List bodyExprs = new ArrayList<>();
-    bodyExprs.addAll(rpcMethodArgAssignmentExprs);
-
-    List bodyStatements = new ArrayList<>();
-    if (method.isPaged()) {
-      bodyStatements.addAll(
-          composeUnaryPagedRpcMethodBodyStatements(
-              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes));
-    } else if (method.hasLro()) {
-      bodyStatements.addAll(
-          composeUnaryLroRpcMethodBodyStatements(
-              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
-    } else {
-      bodyStatements.addAll(
-          composeUnaryRpcMethodBodyStatements(
-              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
-    }
-
-    return SampleCodeWriter.write(
-        TryCatchStatement.builder()
-            .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
-            .setTryBody(bodyStatements)
-            .setIsSampleCode(true)
-            .build());
-  }
-
-  public static String composeRpcDefaultMethodHeaderSampleCode(
-      Method method,
-      TypeNode clientType,
-      Map resourceNames,
-      Map messageTypes) {
-    VariableExpr clientVarExpr =
-        VariableExpr.withVariable(
-            Variable.builder()
-                .setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
-                .setType(clientType)
-                .build());
-
-    // Create request variable expression and assign with its default value.
-    VariableExpr requestVarExpr =
-        VariableExpr.withVariable(
-            Variable.builder().setName("request").setType(method.inputType()).build());
-    List rpcMethodArgVarExprs = Arrays.asList(requestVarExpr);
-    Message requestMessage = messageTypes.get(method.inputType().reference().fullName());
-    Preconditions.checkNotNull(
-        requestMessage,
-        String.format(
-            "Could not find the message type %s.", method.inputType().reference().fullName()));
-    Expr requestBuilderExpr =
-        DefaultValueComposer.createSimpleMessageBuilderValue(
-            requestMessage, resourceNames, messageTypes);
-    AssignmentExpr requestAssignmentExpr =
-        AssignmentExpr.builder()
-            .setVariableExpr(requestVarExpr.toBuilder().setIsDecl(true).build())
-            .setValueExpr(requestBuilderExpr)
-            .build();
-
-    List bodyExprs = new ArrayList<>();
-    bodyExprs.add(requestAssignmentExpr);
-
-    List bodyStatements = new ArrayList<>();
-    if (method.isPaged()) {
-      bodyStatements.addAll(
-          composeUnaryPagedRpcMethodBodyStatements(
-              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes));
-    } else if (method.hasLro()) {
-      bodyStatements.addAll(
-          composeUnaryLroRpcMethodBodyStatements(
-              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
-    } else {
-      bodyStatements.addAll(
-          composeUnaryRpcMethodBodyStatements(
-              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
-    }
-
-    return SampleCodeWriter.write(
-        TryCatchStatement.builder()
-            .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
-            .setTryBody(bodyStatements)
-            .setIsSampleCode(true)
-            .build());
-  }
 
+public class ServiceClientCallableSampleComposer {
   // Compose sample code for the method where it is CallableMethodKind.LRO.
   public static String composeLroCallableMethodHeaderSampleCode(
       Method method,
@@ -412,7 +139,7 @@ public static String composeLroCallableMethodHeaderSampleCode(
             .setMethodName("get")
             .setReturnType(method.lro().responseType())
             .build();
-    boolean returnsVoid = isProtoEmptyType(method.lro().responseType());
+    boolean returnsVoid = ServiceClientSampleUtil.isProtoEmptyType(method.lro().responseType());
     if (returnsVoid) {
       bodyExprs.add(futureGetMethodExpr);
     } else {
@@ -437,7 +164,8 @@ public static String composeLroCallableMethodHeaderSampleCode(
 
     return SampleCodeWriter.write(
         TryCatchStatement.builder()
-            .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
+            .setTryResourceExpr(
+                ServiceClientSampleUtil.assignClientVariableWithCreateMethodExpr(clientVarExpr))
             .setTryBody(bodyStatements)
             .setIsSampleCode(true)
             .build());
@@ -556,7 +284,8 @@ public static String composePagedCallableMethodHeaderSampleCode(
 
     return SampleCodeWriter.write(
         TryCatchStatement.builder()
-            .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
+            .setTryResourceExpr(
+                ServiceClientSampleUtil.assignClientVariableWithCreateMethodExpr(clientVarExpr))
             .setTryBody(bodyStatements)
             .setIsSampleCode(true)
             .build());
@@ -606,7 +335,8 @@ public static String composeRegularCallableMethodHeaderSampleCode(
 
     return SampleCodeWriter.write(
         TryCatchStatement.builder()
-            .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
+            .setTryResourceExpr(
+                ServiceClientSampleUtil.assignClientVariableWithCreateMethodExpr(clientVarExpr))
             .setTryBody(bodyStatements)
             .setIsSampleCode(true)
             .build());
@@ -655,215 +385,13 @@ public static String composeStreamCallableMethodHeaderSampleCode(
 
     return SampleCodeWriter.write(
         TryCatchStatement.builder()
-            .setTryResourceExpr(assignClientVariableWithCreateMethodExpr(clientVarExpr))
+            .setTryResourceExpr(
+                ServiceClientSampleUtil.assignClientVariableWithCreateMethodExpr(clientVarExpr))
             .setTryBody(bodyStatements)
             .setIsSampleCode(true)
             .build());
   }
 
-  private static List composeUnaryRpcMethodBodyStatements(
-      Method method,
-      VariableExpr clientVarExpr,
-      List rpcMethodArgVarExprs,
-      List bodyExprs) {
-
-    // Invoke current method based on return type.
-    // e.g. if return void, echoClient.echo(..); or,
-    // e.g. if return other type, EchoResponse response = echoClient.echo(...);
-    boolean returnsVoid = isProtoEmptyType(method.outputType());
-    MethodInvocationExpr clientRpcMethodInvocationExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(clientVarExpr)
-            .setMethodName(JavaStyle.toLowerCamelCase(method.name()))
-            .setArguments(
-                rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
-            .setReturnType(method.outputType())
-            .build();
-    if (returnsVoid) {
-      bodyExprs.add(clientRpcMethodInvocationExpr);
-    } else {
-      VariableExpr responseVarExpr =
-          VariableExpr.withVariable(
-              Variable.builder().setName("response").setType(method.outputType()).build());
-      bodyExprs.add(
-          AssignmentExpr.builder()
-              .setVariableExpr(responseVarExpr.toBuilder().setIsDecl(true).build())
-              .setValueExpr(clientRpcMethodInvocationExpr)
-              .build());
-    }
-
-    return bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
-  }
-
-  private static List composeUnaryPagedRpcMethodBodyStatements(
-      Method method,
-      VariableExpr clientVarExpr,
-      List rpcMethodArgVarExprs,
-      List bodyExprs,
-      Map messageTypes) {
-
-    // Find the repeated field.
-    Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName());
-    Preconditions.checkNotNull(
-        methodOutputMessage,
-        "Output message %s not found, keys: ",
-        method.outputType().reference().fullName(),
-        messageTypes.keySet().toString());
-    Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapPaginatedRepeatedField();
-    Preconditions.checkNotNull(
-        repeatedPagedResultsField,
-        String.format(
-            "No repeated field found on message %s for method %s",
-            methodOutputMessage.name(), method.name()));
-    TypeNode repeatedResponseType = repeatedPagedResultsField.type();
-
-    // For loop paged response item on iterateAll method.
-    // e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) {
-    //          //doThingsWith(element);
-    //      }
-    MethodInvocationExpr clientMethodIterateAllExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(clientVarExpr)
-            .setMethodName(JavaStyle.toLowerCamelCase(method.name()))
-            .setArguments(
-                rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
-            .build();
-    clientMethodIterateAllExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(clientMethodIterateAllExpr)
-            .setMethodName("iterateAll")
-            .setReturnType(repeatedResponseType)
-            .build();
-    ForStatement loopIteratorStatement =
-        ForStatement.builder()
-            .setLocalVariableExpr(
-                VariableExpr.builder()
-                    .setVariable(
-                        Variable.builder().setName("element").setType(repeatedResponseType).build())
-                    .setIsDecl(true)
-                    .build())
-            .setCollectionExpr(clientMethodIterateAllExpr)
-            .setBody(
-                Arrays.asList(
-                    CommentStatement.withComment(
-                        LineComment.withComment("doThingsWith(element);"))))
-            .build();
-
-    List bodyStatements =
-        bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
-    bodyExprs.clear();
-    bodyStatements.add(loopIteratorStatement);
-
-    return bodyStatements;
-  }
-
-  private static List composeUnaryLroRpcMethodBodyStatements(
-      Method method,
-      VariableExpr clientVarExpr,
-      List rpcMethodArgVarExprs,
-      List bodyExprs) {
-    // Assign response variable with invoking client's LRO method.
-    // e.g. if return void, echoClient.waitAsync(ttl).get(); or,
-    // e.g. if return other type, WaitResponse response = echoClient.waitAsync(ttl).get();
-    Expr invokeLroGetMethodExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(clientVarExpr)
-            .setMethodName(String.format("%sAsync", JavaStyle.toLowerCamelCase(method.name())))
-            .setArguments(
-                rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
-            .build();
-    invokeLroGetMethodExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(invokeLroGetMethodExpr)
-            .setMethodName("get")
-            .setReturnType(method.lro().responseType())
-            .build();
-    boolean returnsVoid = isProtoEmptyType(method.lro().responseType());
-    if (returnsVoid) {
-      bodyExprs.add(invokeLroGetMethodExpr);
-    } else {
-      VariableExpr responseVarExpr =
-          VariableExpr.builder()
-              .setVariable(
-                  Variable.builder()
-                      .setName("response")
-                      .setType(method.lro().responseType())
-                      .build())
-              .setIsDecl(true)
-              .build();
-      bodyExprs.add(
-          AssignmentExpr.builder()
-              .setVariableExpr(responseVarExpr)
-              .setValueExpr(invokeLroGetMethodExpr)
-              .build());
-    }
-
-    return bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
-  }
-
-  private static List composeStreamServerBodyStatements(
-      Method method, VariableExpr clientVarExpr, AssignmentExpr requestAssignmentExpr) {
-    List bodyExprs = new ArrayList<>();
-    bodyExprs.add(requestAssignmentExpr);
-
-    // Create server stream variable expression, and assign it a value by invoking server stream
-    // method.
-    // e.g. ServerStream stream = echoClient.expandCallable().call(request)
-    TypeNode serverStreamType =
-        TypeNode.withReference(
-            ConcreteReference.builder()
-                .setClazz(ServerStream.class)
-                .setGenerics(method.outputType().reference())
-                .build());
-    VariableExpr serverStreamVarExpr =
-        VariableExpr.withVariable(
-            Variable.builder().setName("stream").setType(serverStreamType).build());
-    MethodInvocationExpr clientStreamCallMethodInvocationExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(clientVarExpr)
-            .setMethodName(JavaStyle.toLowerCamelCase(String.format("%sCallable", method.name())))
-            .build();
-    clientStreamCallMethodInvocationExpr =
-        MethodInvocationExpr.builder()
-            .setExprReferenceExpr(clientStreamCallMethodInvocationExpr)
-            .setMethodName("call")
-            .setArguments(requestAssignmentExpr.variableExpr().toBuilder().setIsDecl(false).build())
-            .setReturnType(serverStreamType)
-            .build();
-    AssignmentExpr streamAssignmentExpr =
-        AssignmentExpr.builder()
-            .setVariableExpr(serverStreamVarExpr.toBuilder().setIsDecl(true).build())
-            .setValueExpr(clientStreamCallMethodInvocationExpr)
-            .build();
-    bodyExprs.add(streamAssignmentExpr);
-
-    List bodyStatements =
-        bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
-
-    // For-loop on server stream variable expression.
-    // e.g. for (EchoResponse response : stream) {
-    //        // Do something when a response is received.
-    //      }
-    VariableExpr responseVarExpr =
-        VariableExpr.builder()
-            .setVariable(
-                Variable.builder().setName("response").setType(method.outputType()).build())
-            .setIsDecl(true)
-            .build();
-    ForStatement forStatement =
-        ForStatement.builder()
-            .setLocalVariableExpr(responseVarExpr)
-            .setCollectionExpr(serverStreamVarExpr)
-            .setBody(
-                Arrays.asList(
-                    CommentStatement.withComment(
-                        LineComment.withComment("Do something when a response is received."))))
-            .build();
-    bodyStatements.add(forStatement);
-
-    return bodyStatements;
-  }
-
   private static List composeStreamBidiBodyStatements(
       Method method, VariableExpr clientVarExpr, AssignmentExpr requestAssignmentExpr) {
     List bodyExprs = new ArrayList<>();
@@ -1063,6 +591,69 @@ private static List composeStreamClientBodyStatements(
     return bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
   }
 
+  private static List composeStreamServerBodyStatements(
+      Method method, VariableExpr clientVarExpr, AssignmentExpr requestAssignmentExpr) {
+    List bodyExprs = new ArrayList<>();
+    bodyExprs.add(requestAssignmentExpr);
+
+    // Create server stream variable expression, and assign it a value by invoking server stream
+    // method.
+    // e.g. ServerStream stream = echoClient.expandCallable().call(request)
+    TypeNode serverStreamType =
+        TypeNode.withReference(
+            ConcreteReference.builder()
+                .setClazz(ServerStream.class)
+                .setGenerics(method.outputType().reference())
+                .build());
+    VariableExpr serverStreamVarExpr =
+        VariableExpr.withVariable(
+            Variable.builder().setName("stream").setType(serverStreamType).build());
+    MethodInvocationExpr clientStreamCallMethodInvocationExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(clientVarExpr)
+            .setMethodName(JavaStyle.toLowerCamelCase(String.format("%sCallable", method.name())))
+            .build();
+    clientStreamCallMethodInvocationExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(clientStreamCallMethodInvocationExpr)
+            .setMethodName("call")
+            .setArguments(requestAssignmentExpr.variableExpr().toBuilder().setIsDecl(false).build())
+            .setReturnType(serverStreamType)
+            .build();
+    AssignmentExpr streamAssignmentExpr =
+        AssignmentExpr.builder()
+            .setVariableExpr(serverStreamVarExpr.toBuilder().setIsDecl(true).build())
+            .setValueExpr(clientStreamCallMethodInvocationExpr)
+            .build();
+    bodyExprs.add(streamAssignmentExpr);
+
+    List bodyStatements =
+        bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
+
+    // For-loop on server stream variable expression.
+    // e.g. for (EchoResponse response : stream) {
+    //        // Do something when a response is received.
+    //      }
+    VariableExpr responseVarExpr =
+        VariableExpr.builder()
+            .setVariable(
+                Variable.builder().setName("response").setType(method.outputType()).build())
+            .setIsDecl(true)
+            .build();
+    ForStatement forStatement =
+        ForStatement.builder()
+            .setLocalVariableExpr(responseVarExpr)
+            .setCollectionExpr(serverStreamVarExpr)
+            .setBody(
+                Arrays.asList(
+                    CommentStatement.withComment(
+                        LineComment.withComment("Do something when a response is received."))))
+            .build();
+    bodyStatements.add(forStatement);
+
+    return bodyStatements;
+  }
+
   private static List composeUnaryOrLroCallableBodyStatements(
       Method method, VariableExpr clientVarExpr, VariableExpr requestVarExpr) {
     List bodyStatements = new ArrayList<>();
@@ -1108,7 +699,7 @@ private static List composeUnaryOrLroCallableBodyStatements(
             .setReturnType(method.outputType())
             .build();
     TypeNode methodOutputType = method.hasLro() ? method.lro().responseType() : method.outputType();
-    boolean returnsVoid = isProtoEmptyType(methodOutputType);
+    boolean returnsVoid = ServiceClientSampleUtil.isProtoEmptyType(methodOutputType);
     if (returnsVoid) {
       bodyStatements.add(ExprStatement.withExpr(getMethodInvocationExpr));
     } else {
@@ -1266,90 +857,4 @@ private static List composePagedCallableBodyStatements(
             .build();
     return Arrays.asList(pagedWhileStatement);
   }
-
-  // ==================================Helpers===================================================//
-
-  // Create a list of RPC method arguments' variable expressions.
-  private static List createRpcMethodArgumentVariableExprs(
-      List arguments) {
-    return arguments.stream()
-        .map(
-            arg ->
-                VariableExpr.withVariable(
-                    Variable.builder()
-                        .setName(JavaStyle.toLowerCamelCase(arg.name()))
-                        .setType(arg.type())
-                        .build()))
-        .collect(Collectors.toList());
-  }
-
-  // Create a list of RPC method arguments' default value expression.
-  private static List createRpcMethodArgumentDefaultValueExprs(
-      List arguments, Map resourceNames) {
-    List resourceNameList =
-        resourceNames.values().stream().collect(Collectors.toList());
-    Function stringResourceNameDefaultValueExpr =
-        arg ->
-            MethodInvocationExpr.builder()
-                .setExprReferenceExpr(
-                    DefaultValueComposer.createResourceHelperValue(
-                        resourceNames.get(arg.field().resourceReference().resourceTypeString()),
-                        arg.field().resourceReference().isChildType(),
-                        resourceNameList,
-                        arg.field().name()))
-                .setMethodName("toString")
-                .setReturnType(TypeNode.STRING)
-                .build();
-    return arguments.stream()
-        .map(
-            arg ->
-                !isStringTypedResourceName(arg, resourceNames)
-                    ? DefaultValueComposer.createMethodArgValue(
-                        arg, resourceNames, Collections.emptyMap(), Collections.emptyMap())
-                    : stringResourceNameDefaultValueExpr.apply(arg))
-        .collect(Collectors.toList());
-  }
-
-  // Create a list of assignment expressions for variable expr with value expr.
-  private static List createAssignmentsForVarExprsWithValueExprs(
-      List variableExprs, List valueExprs) {
-    Preconditions.checkState(
-        variableExprs.size() == valueExprs.size(),
-        "Expected the number of method arguments to match the number of default values.");
-    return IntStream.range(0, variableExprs.size())
-        .mapToObj(
-            i ->
-                AssignmentExpr.builder()
-                    .setVariableExpr(variableExprs.get(i).toBuilder().setIsDecl(true).build())
-                    .setValueExpr(valueExprs.get(i))
-                    .build())
-        .collect(Collectors.toList());
-  }
-
-  // Assign client variable expr with create client.
-  // e.g EchoClient echoClient = EchoClient.create()
-  private static AssignmentExpr assignClientVariableWithCreateMethodExpr(
-      VariableExpr clientVarExpr) {
-    return AssignmentExpr.builder()
-        .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build())
-        .setValueExpr(
-            MethodInvocationExpr.builder()
-                .setStaticReferenceType(clientVarExpr.variable().type())
-                .setReturnType(clientVarExpr.variable().type())
-                .setMethodName("create")
-                .build())
-        .build();
-  }
-
-  private static boolean isStringTypedResourceName(
-      MethodArgument arg, Map resourceNames) {
-    return arg.type().equals(TypeNode.STRING)
-        && arg.field().hasResourceReference()
-        && resourceNames.containsKey(arg.field().resourceReference().resourceTypeString());
-  }
-
-  private static boolean isProtoEmptyType(TypeNode type) {
-    return type.reference().pakkage().equals("com.google.protobuf")
-        && type.reference().name().equals("Empty");
-  }
 }
diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java
new file mode 100644
index 0000000000..34bbb4f8d7
--- /dev/null
+++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleComposer.java
@@ -0,0 +1,196 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.api.generator.gapic.composer.samplecode;
+
+import com.google.api.gax.core.FixedCredentialsProvider;
+import com.google.api.generator.engine.ast.AssignmentExpr;
+import com.google.api.generator.engine.ast.ConcreteReference;
+import com.google.api.generator.engine.ast.Expr;
+import com.google.api.generator.engine.ast.ExprStatement;
+import com.google.api.generator.engine.ast.MethodInvocationExpr;
+import com.google.api.generator.engine.ast.TypeNode;
+import com.google.api.generator.engine.ast.VaporReference;
+import com.google.api.generator.engine.ast.Variable;
+import com.google.api.generator.engine.ast.VariableExpr;
+import com.google.api.generator.gapic.model.Message;
+import com.google.api.generator.gapic.model.Method;
+import com.google.api.generator.gapic.model.ResourceName;
+import com.google.api.generator.gapic.model.Service;
+import com.google.api.generator.gapic.utils.JavaStyle;
+import java.util.Arrays;
+import java.util.Map;
+
+public class ServiceClientHeaderSampleComposer {
+  public static String composeClassHeaderMethodSampleCode(
+      Service service,
+      TypeNode clientType,
+      Map resourceNames,
+      Map messageTypes) {
+    // 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 =
+        service.methods().stream()
+            .filter(m -> m.stream() == Method.Stream.NONE && !m.hasLro() && !m.isPaged())
+            .findFirst()
+            .orElse(service.methods().get(0));
+    if (method.stream() == Method.Stream.NONE) {
+      if (method.methodSignatures().isEmpty()) {
+        return ServiceClientMethodSampleComposer.composeRpcDefaultMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+      }
+      return ServiceClientMethodSampleComposer.composeRpcMethodHeaderSampleCode(
+          method, clientType, method.methodSignatures().get(0), resourceNames, messageTypes);
+    }
+    return ServiceClientCallableSampleComposer.composeStreamCallableMethodHeaderSampleCode(
+        method, clientType, resourceNames, messageTypes);
+  }
+
+  public static String composeClassHeaderCredentialsSampleCode(
+      TypeNode clientType, TypeNode settingsType) {
+    // Initialize clientSettings with builder() method.
+    // e.g. EchoSettings echoSettings =
+    // EchoSettings.newBuilder().setCredentialsProvider(FixedCredentialsProvider.create("myCredentials")).build();
+    String settingsName = JavaStyle.toLowerCamelCase(settingsType.reference().name());
+    String clientName = JavaStyle.toLowerCamelCase(clientType.reference().name());
+    TypeNode myCredentialsType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("myCredentials")
+                .setPakkage(clientType.reference().pakkage())
+                .build());
+    VariableExpr settingsVarExpr =
+        VariableExpr.withVariable(
+            Variable.builder().setName(settingsName).setType(settingsType).build());
+    MethodInvocationExpr newBuilderMethodExpr =
+        MethodInvocationExpr.builder()
+            .setStaticReferenceType(settingsType)
+            .setMethodName("newBuilder")
+            .build();
+    TypeNode fixedCredentialProvideType =
+        TypeNode.withReference(ConcreteReference.withClazz(FixedCredentialsProvider.class));
+    MethodInvocationExpr credentialArgExpr =
+        MethodInvocationExpr.builder()
+            .setStaticReferenceType(fixedCredentialProvideType)
+            .setArguments(
+                VariableExpr.withVariable(
+                    Variable.builder().setName("myCredentials").setType(myCredentialsType).build()))
+            .setMethodName("create")
+            .build();
+    MethodInvocationExpr credentialsMethodExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(newBuilderMethodExpr)
+            .setArguments(credentialArgExpr)
+            .setMethodName("setCredentialsProvider")
+            .build();
+    MethodInvocationExpr buildMethodExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(credentialsMethodExpr)
+            .setReturnType(settingsType)
+            .setMethodName("build")
+            .build();
+    Expr initSettingsVarExpr =
+        AssignmentExpr.builder()
+            .setVariableExpr(settingsVarExpr.toBuilder().setIsDecl(true).build())
+            .setValueExpr(buildMethodExpr)
+            .build();
+
+    // Initialized client with create() method.
+    // e.g. EchoClient echoClient = EchoClient.create(echoSettings);
+    VariableExpr clientVarExpr =
+        VariableExpr.withVariable(
+            Variable.builder().setName(clientName).setType(clientType).build());
+    MethodInvocationExpr createMethodExpr =
+        MethodInvocationExpr.builder()
+            .setStaticReferenceType(clientType)
+            .setArguments(settingsVarExpr)
+            .setMethodName("create")
+            .setReturnType(clientType)
+            .build();
+    Expr initClientVarExpr =
+        AssignmentExpr.builder()
+            .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build())
+            .setValueExpr(createMethodExpr)
+            .build();
+    return SampleCodeWriter.write(
+        Arrays.asList(
+            ExprStatement.withExpr(initSettingsVarExpr),
+            ExprStatement.withExpr(initClientVarExpr)));
+  }
+
+  public static String composeClassHeaderEndpointSampleCode(
+      TypeNode clientType, TypeNode settingsType) {
+    // Initialize client settings with builder() method.
+    // e.g. EchoSettings echoSettings = EchoSettings.newBuilder().setEndpoint("myEndpoint").build();
+    String settingsName = JavaStyle.toLowerCamelCase(settingsType.reference().name());
+    String clientName = JavaStyle.toLowerCamelCase(clientType.reference().name());
+    TypeNode myEndpointType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("myEndpoint")
+                .setPakkage(clientType.reference().pakkage())
+                .build());
+    VariableExpr settingsVarExpr =
+        VariableExpr.withVariable(
+            Variable.builder().setName(settingsName).setType(settingsType).build());
+    MethodInvocationExpr newBuilderMethodExpr =
+        MethodInvocationExpr.builder()
+            .setStaticReferenceType(settingsType)
+            .setMethodName("newBuilder")
+            .build();
+    MethodInvocationExpr credentialsMethodExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(newBuilderMethodExpr)
+            .setArguments(
+                VariableExpr.withVariable(
+                    Variable.builder().setName("myEndpoint").setType(myEndpointType).build()))
+            .setMethodName("setEndpoint")
+            .build();
+    MethodInvocationExpr buildMethodExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(credentialsMethodExpr)
+            .setReturnType(settingsType)
+            .setMethodName("build")
+            .build();
+
+    Expr initSettingsVarExpr =
+        AssignmentExpr.builder()
+            .setVariableExpr(settingsVarExpr.toBuilder().setIsDecl(true).build())
+            .setValueExpr(buildMethodExpr)
+            .build();
+
+    // Initialize client with create() method.
+    // e.g. EchoClient echoClient = EchoClient.create(echoSettings);
+    VariableExpr clientVarExpr =
+        VariableExpr.withVariable(
+            Variable.builder().setName(clientName).setType(clientType).build());
+    MethodInvocationExpr createMethodExpr =
+        MethodInvocationExpr.builder()
+            .setStaticReferenceType(clientType)
+            .setArguments(settingsVarExpr)
+            .setMethodName("create")
+            .setReturnType(clientType)
+            .build();
+    Expr initClientVarExpr =
+        AssignmentExpr.builder()
+            .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build())
+            .setValueExpr(createMethodExpr)
+            .build();
+
+    return SampleCodeWriter.write(
+        Arrays.asList(
+            ExprStatement.withExpr(initSettingsVarExpr),
+            ExprStatement.withExpr(initClientVarExpr)));
+  }
+}
diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposer.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposer.java
new file mode 100644
index 0000000000..0e167d5ec6
--- /dev/null
+++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleComposer.java
@@ -0,0 +1,290 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.api.generator.gapic.composer.samplecode;
+
+import com.google.api.generator.engine.ast.AssignmentExpr;
+import com.google.api.generator.engine.ast.CommentStatement;
+import com.google.api.generator.engine.ast.Expr;
+import com.google.api.generator.engine.ast.ExprStatement;
+import com.google.api.generator.engine.ast.ForStatement;
+import com.google.api.generator.engine.ast.LineComment;
+import com.google.api.generator.engine.ast.MethodInvocationExpr;
+import com.google.api.generator.engine.ast.Statement;
+import com.google.api.generator.engine.ast.TryCatchStatement;
+import com.google.api.generator.engine.ast.TypeNode;
+import com.google.api.generator.engine.ast.Variable;
+import com.google.api.generator.engine.ast.VariableExpr;
+import com.google.api.generator.gapic.composer.defaultvalue.DefaultValueComposer;
+import com.google.api.generator.gapic.model.Field;
+import com.google.api.generator.gapic.model.Message;
+import com.google.api.generator.gapic.model.Method;
+import com.google.api.generator.gapic.model.MethodArgument;
+import com.google.api.generator.gapic.model.ResourceName;
+import com.google.api.generator.gapic.utils.JavaStyle;
+import com.google.common.base.Preconditions;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class ServiceClientMethodSampleComposer {
+  public static String composeRpcMethodHeaderSampleCode(
+      Method method,
+      TypeNode clientType,
+      List arguments,
+      Map resourceNames,
+      Map messageTypes) {
+    VariableExpr clientVarExpr =
+        VariableExpr.withVariable(
+            Variable.builder()
+                .setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
+                .setType(clientType)
+                .build());
+
+    // Assign method's arguments variable with the default values.
+    List rpcMethodArgVarExprs =
+        ServiceClientSampleUtil.createRpcMethodArgumentVariableExprs(arguments);
+    List rpcMethodArgDefaultValueExprs =
+        ServiceClientSampleUtil.createRpcMethodArgumentDefaultValueExprs(arguments, resourceNames);
+    List rpcMethodArgAssignmentExprs =
+        ServiceClientSampleUtil.createAssignmentsForVarExprsWithValueExprs(
+            rpcMethodArgVarExprs, rpcMethodArgDefaultValueExprs);
+
+    List bodyExprs = new ArrayList<>();
+    bodyExprs.addAll(rpcMethodArgAssignmentExprs);
+
+    List bodyStatements = new ArrayList<>();
+    if (method.isPaged()) {
+      bodyStatements.addAll(
+          composeUnaryPagedRpcMethodBodyStatements(
+              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes));
+    } else if (method.hasLro()) {
+      bodyStatements.addAll(
+          composeUnaryLroRpcMethodBodyStatements(
+              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
+    } else {
+      bodyStatements.addAll(
+          composeUnaryRpcMethodBodyStatements(
+              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
+    }
+
+    return SampleCodeWriter.write(
+        TryCatchStatement.builder()
+            .setTryResourceExpr(
+                ServiceClientSampleUtil.assignClientVariableWithCreateMethodExpr(clientVarExpr))
+            .setTryBody(bodyStatements)
+            .setIsSampleCode(true)
+            .build());
+  }
+
+  public static String composeRpcDefaultMethodHeaderSampleCode(
+      Method method,
+      TypeNode clientType,
+      Map resourceNames,
+      Map messageTypes) {
+    VariableExpr clientVarExpr =
+        VariableExpr.withVariable(
+            Variable.builder()
+                .setName(JavaStyle.toLowerCamelCase(clientType.reference().name()))
+                .setType(clientType)
+                .build());
+
+    // Create request variable expression and assign with its default value.
+    VariableExpr requestVarExpr =
+        VariableExpr.withVariable(
+            Variable.builder().setName("request").setType(method.inputType()).build());
+    List rpcMethodArgVarExprs = Arrays.asList(requestVarExpr);
+    Message requestMessage = messageTypes.get(method.inputType().reference().fullName());
+    Preconditions.checkNotNull(
+        requestMessage,
+        String.format(
+            "Could not find the message type %s.", method.inputType().reference().fullName()));
+    Expr requestBuilderExpr =
+        DefaultValueComposer.createSimpleMessageBuilderValue(
+            requestMessage, resourceNames, messageTypes);
+    AssignmentExpr requestAssignmentExpr =
+        AssignmentExpr.builder()
+            .setVariableExpr(requestVarExpr.toBuilder().setIsDecl(true).build())
+            .setValueExpr(requestBuilderExpr)
+            .build();
+
+    List bodyExprs = new ArrayList<>();
+    bodyExprs.add(requestAssignmentExpr);
+
+    List bodyStatements = new ArrayList<>();
+    if (method.isPaged()) {
+      bodyStatements.addAll(
+          composeUnaryPagedRpcMethodBodyStatements(
+              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs, messageTypes));
+    } else if (method.hasLro()) {
+      bodyStatements.addAll(
+          composeUnaryLroRpcMethodBodyStatements(
+              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
+    } else {
+      bodyStatements.addAll(
+          composeUnaryRpcMethodBodyStatements(
+              method, clientVarExpr, rpcMethodArgVarExprs, bodyExprs));
+    }
+
+    return SampleCodeWriter.write(
+        TryCatchStatement.builder()
+            .setTryResourceExpr(
+                ServiceClientSampleUtil.assignClientVariableWithCreateMethodExpr(clientVarExpr))
+            .setTryBody(bodyStatements)
+            .setIsSampleCode(true)
+            .build());
+  }
+
+  private static List composeUnaryRpcMethodBodyStatements(
+      Method method,
+      VariableExpr clientVarExpr,
+      List rpcMethodArgVarExprs,
+      List bodyExprs) {
+
+    // Invoke current method based on return type.
+    // e.g. if return void, echoClient.echo(..); or,
+    // e.g. if return other type, EchoResponse response = echoClient.echo(...);
+    boolean returnsVoid = ServiceClientSampleUtil.isProtoEmptyType(method.outputType());
+    MethodInvocationExpr clientRpcMethodInvocationExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(clientVarExpr)
+            .setMethodName(JavaStyle.toLowerCamelCase(method.name()))
+            .setArguments(
+                rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
+            .setReturnType(method.outputType())
+            .build();
+    if (returnsVoid) {
+      bodyExprs.add(clientRpcMethodInvocationExpr);
+    } else {
+      VariableExpr responseVarExpr =
+          VariableExpr.withVariable(
+              Variable.builder().setName("response").setType(method.outputType()).build());
+      bodyExprs.add(
+          AssignmentExpr.builder()
+              .setVariableExpr(responseVarExpr.toBuilder().setIsDecl(true).build())
+              .setValueExpr(clientRpcMethodInvocationExpr)
+              .build());
+    }
+
+    return bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
+  }
+
+  private static List composeUnaryPagedRpcMethodBodyStatements(
+      Method method,
+      VariableExpr clientVarExpr,
+      List rpcMethodArgVarExprs,
+      List bodyExprs,
+      Map messageTypes) {
+
+    // Find the repeated field.
+    Message methodOutputMessage = messageTypes.get(method.outputType().reference().fullName());
+    Preconditions.checkNotNull(
+        methodOutputMessage,
+        "Output message %s not found, keys: ",
+        method.outputType().reference().fullName(),
+        messageTypes.keySet().toString());
+    Field repeatedPagedResultsField = methodOutputMessage.findAndUnwrapPaginatedRepeatedField();
+    Preconditions.checkNotNull(
+        repeatedPagedResultsField,
+        String.format(
+            "No repeated field found on message %s for method %s",
+            methodOutputMessage.name(), method.name()));
+    TypeNode repeatedResponseType = repeatedPagedResultsField.type();
+
+    // For loop paged response item on iterateAll method.
+    // e.g. for (LogEntry element : loggingServiceV2Client.ListLogs(parent).iterateAll()) {
+    //          //doThingsWith(element);
+    //      }
+    MethodInvocationExpr clientMethodIterateAllExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(clientVarExpr)
+            .setMethodName(JavaStyle.toLowerCamelCase(method.name()))
+            .setArguments(
+                rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
+            .build();
+    clientMethodIterateAllExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(clientMethodIterateAllExpr)
+            .setMethodName("iterateAll")
+            .setReturnType(repeatedResponseType)
+            .build();
+    ForStatement loopIteratorStatement =
+        ForStatement.builder()
+            .setLocalVariableExpr(
+                VariableExpr.builder()
+                    .setVariable(
+                        Variable.builder().setName("element").setType(repeatedResponseType).build())
+                    .setIsDecl(true)
+                    .build())
+            .setCollectionExpr(clientMethodIterateAllExpr)
+            .setBody(
+                Arrays.asList(
+                    CommentStatement.withComment(
+                        LineComment.withComment("doThingsWith(element);"))))
+            .build();
+
+    List bodyStatements =
+        bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
+    bodyExprs.clear();
+    bodyStatements.add(loopIteratorStatement);
+
+    return bodyStatements;
+  }
+
+  private static List composeUnaryLroRpcMethodBodyStatements(
+      Method method,
+      VariableExpr clientVarExpr,
+      List rpcMethodArgVarExprs,
+      List bodyExprs) {
+    // Assign response variable with invoking client's LRO method.
+    // e.g. if return void, echoClient.waitAsync(ttl).get(); or,
+    // e.g. if return other type, WaitResponse response = echoClient.waitAsync(ttl).get();
+    Expr invokeLroGetMethodExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(clientVarExpr)
+            .setMethodName(String.format("%sAsync", JavaStyle.toLowerCamelCase(method.name())))
+            .setArguments(
+                rpcMethodArgVarExprs.stream().map(e -> (Expr) e).collect(Collectors.toList()))
+            .build();
+    invokeLroGetMethodExpr =
+        MethodInvocationExpr.builder()
+            .setExprReferenceExpr(invokeLroGetMethodExpr)
+            .setMethodName("get")
+            .setReturnType(method.lro().responseType())
+            .build();
+    boolean returnsVoid = ServiceClientSampleUtil.isProtoEmptyType(method.lro().responseType());
+    if (returnsVoid) {
+      bodyExprs.add(invokeLroGetMethodExpr);
+    } else {
+      VariableExpr responseVarExpr =
+          VariableExpr.builder()
+              .setVariable(
+                  Variable.builder()
+                      .setName("response")
+                      .setType(method.lro().responseType())
+                      .build())
+              .setIsDecl(true)
+              .build();
+      bodyExprs.add(
+          AssignmentExpr.builder()
+              .setVariableExpr(responseVarExpr)
+              .setValueExpr(invokeLroGetMethodExpr)
+              .build());
+    }
+
+    return bodyExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList());
+  }
+}
diff --git a/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleUtil.java b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleUtil.java
new file mode 100644
index 0000000000..5203dcc12d
--- /dev/null
+++ b/src/main/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleUtil.java
@@ -0,0 +1,117 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.api.generator.gapic.composer.samplecode;
+
+import com.google.api.generator.engine.ast.AssignmentExpr;
+import com.google.api.generator.engine.ast.Expr;
+import com.google.api.generator.engine.ast.MethodInvocationExpr;
+import com.google.api.generator.engine.ast.TypeNode;
+import com.google.api.generator.engine.ast.Variable;
+import com.google.api.generator.engine.ast.VariableExpr;
+import com.google.api.generator.gapic.composer.defaultvalue.DefaultValueComposer;
+import com.google.api.generator.gapic.model.MethodArgument;
+import com.google.api.generator.gapic.model.ResourceName;
+import com.google.api.generator.gapic.utils.JavaStyle;
+import com.google.common.base.Preconditions;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class ServiceClientSampleUtil {
+  // Create a list of RPC method arguments' variable expressions.
+  static List createRpcMethodArgumentVariableExprs(List arguments) {
+    return arguments.stream()
+        .map(
+            arg ->
+                VariableExpr.withVariable(
+                    Variable.builder()
+                        .setName(JavaStyle.toLowerCamelCase(arg.name()))
+                        .setType(arg.type())
+                        .build()))
+        .collect(Collectors.toList());
+  }
+
+  // Create a list of RPC method arguments' default value expression.
+  static List createRpcMethodArgumentDefaultValueExprs(
+      List arguments, Map resourceNames) {
+    List resourceNameList =
+        resourceNames.values().stream().collect(Collectors.toList());
+    Function stringResourceNameDefaultValueExpr =
+        arg ->
+            MethodInvocationExpr.builder()
+                .setExprReferenceExpr(
+                    DefaultValueComposer.createResourceHelperValue(
+                        resourceNames.get(arg.field().resourceReference().resourceTypeString()),
+                        arg.field().resourceReference().isChildType(),
+                        resourceNameList,
+                        arg.field().name()))
+                .setMethodName("toString")
+                .setReturnType(TypeNode.STRING)
+                .build();
+    return arguments.stream()
+        .map(
+            arg ->
+                !isStringTypedResourceName(arg, resourceNames)
+                    ? DefaultValueComposer.createMethodArgValue(
+                        arg, resourceNames, Collections.emptyMap(), Collections.emptyMap())
+                    : stringResourceNameDefaultValueExpr.apply(arg))
+        .collect(Collectors.toList());
+  }
+
+  // Create a list of assignment expressions for variable expr with value expr.
+  static List createAssignmentsForVarExprsWithValueExprs(
+      List variableExprs, List valueExprs) {
+    Preconditions.checkState(
+        variableExprs.size() == valueExprs.size(),
+        "Expected the number of method arguments to match the number of default values.");
+    return IntStream.range(0, variableExprs.size())
+        .mapToObj(
+            i ->
+                AssignmentExpr.builder()
+                    .setVariableExpr(variableExprs.get(i).toBuilder().setIsDecl(true).build())
+                    .setValueExpr(valueExprs.get(i))
+                    .build())
+        .collect(Collectors.toList());
+  }
+
+  // Assign client variable expr with create client.
+  // e.g EchoClient echoClient = EchoClient.create()
+  static AssignmentExpr assignClientVariableWithCreateMethodExpr(VariableExpr clientVarExpr) {
+    return AssignmentExpr.builder()
+        .setVariableExpr(clientVarExpr.toBuilder().setIsDecl(true).build())
+        .setValueExpr(
+            MethodInvocationExpr.builder()
+                .setStaticReferenceType(clientVarExpr.variable().type())
+                .setReturnType(clientVarExpr.variable().type())
+                .setMethodName("create")
+                .build())
+        .build();
+  }
+
+  private static boolean isStringTypedResourceName(
+      MethodArgument arg, Map resourceNames) {
+    return arg.type().equals(TypeNode.STRING)
+        && arg.field().hasResourceReference()
+        && resourceNames.containsKey(arg.field().resourceReference().resourceTypeString());
+  }
+
+  static boolean isProtoEmptyType(TypeNode type) {
+    return type.reference().pakkage().equals("com.google.protobuf")
+        && type.reference().name().equals("Empty");
+  }
+}
diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeJavaFormatterTest.java b/src/test/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeJavaFormatterTest.java
index 44fe47158c..66dce3de40 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeJavaFormatterTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/samplecode/SampleCodeJavaFormatterTest.java
@@ -25,7 +25,7 @@ public class SampleCodeJavaFormatterTest {
   @Test
   public void validFormatSampleCode_tryCatchStatement() {
     String samplecode = LineFormatter.lines("try(boolean condition = false){", "int x = 3;", "}");
-    String result = SampleCodeBodyJavaFormatter.format(samplecode);
+    String result = SampleBodyJavaFormatter.format(samplecode);
     String expected =
         LineFormatter.lines("try (boolean condition = false) {\n", "  int x = 3;\n", "}");
     assertEquals(expected, result);
@@ -36,7 +36,7 @@ public void validFormatSampleCode_longLineStatement() {
     String sampleCode =
         "SubscriptionAdminSettings subscriptionAdminSettings = "
             + "SubscriptionAdminSettings.newBuilder().setEndpoint(myEndpoint).build();";
-    String result = SampleCodeBodyJavaFormatter.format(sampleCode);
+    String result = SampleBodyJavaFormatter.format(sampleCode);
     String expected =
         LineFormatter.lines(
             "SubscriptionAdminSettings subscriptionAdminSettings =\n",
@@ -50,7 +50,7 @@ public void validFormatSampleCode_longChainMethod() {
         "echoSettingsBuilder.echoSettings().setRetrySettings("
             + "echoSettingsBuilder.echoSettings().getRetrySettings().toBuilder()"
             + ".setTotalTimeout(Duration.ofSeconds(30)).build());";
-    String result = SampleCodeBodyJavaFormatter.format(sampleCode);
+    String result = SampleBodyJavaFormatter.format(sampleCode);
     String expected =
         LineFormatter.lines(
             "echoSettingsBuilder\n",
@@ -68,9 +68,9 @@ public void validFormatSampleCode_longChainMethod() {
   @Test
   public void invalidFormatSampleCode_nonStatement() {
     assertThrows(
-        SampleCodeBodyJavaFormatter.FormatException.class,
+        SampleBodyJavaFormatter.FormatException.class,
         () -> {
-          SampleCodeBodyJavaFormatter.format("abc");
+          SampleBodyJavaFormatter.format("abc");
         });
   }
 }
diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/SampleComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/samplecode/SampleComposerTest.java
index 72062753b5..d5e895e115 100644
--- a/src/test/java/com/google/api/generator/gapic/composer/samplecode/SampleComposerTest.java
+++ b/src/test/java/com/google/api/generator/gapic/composer/samplecode/SampleComposerTest.java
@@ -11,6 +11,7 @@
 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 // See the License for the specific language governing permissions and
 // limitations under the License.
+
 package com.google.api.generator.gapic.composer.samplecode;
 
 import static org.junit.Assert.assertEquals;
diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleCodeComposerTest.java
new file mode 100644
index 0000000000..92ad4ab22b
--- /dev/null
+++ b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientCallableMethodSampleCodeComposerTest.java
@@ -0,0 +1,959 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.api.generator.gapic.composer.samplecode;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+
+import com.google.api.generator.engine.ast.TypeNode;
+import com.google.api.generator.engine.ast.VaporReference;
+import com.google.api.generator.gapic.model.Field;
+import com.google.api.generator.gapic.model.LongrunningOperation;
+import com.google.api.generator.gapic.model.Message;
+import com.google.api.generator.gapic.model.Method;
+import com.google.api.generator.gapic.model.Method.Stream;
+import com.google.api.generator.gapic.model.ResourceName;
+import com.google.api.generator.gapic.protoparser.Parser;
+import com.google.api.generator.testutils.LineFormatter;
+import com.google.protobuf.Descriptors.FileDescriptor;
+import com.google.showcase.v1beta1.EchoOuterClass;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+import org.junit.Test;
+
+public class ServiceClientCallableMethodSampleCodeComposerTest {
+  private static final String SHOWCASE_PACKAGE_NAME = "com.google.showcase.v1beta1";
+  private static final String LRO_PACKAGE_NAME = "com.google.longrunning";
+  private static final String PROTO_PACKAGE_NAME = "com.google.protobuf";
+  private static final String PAGINATED_FIELD_NAME = "page_size";
+
+  // ================================LRO Callable Method Sample Code ====================//
+  @Test
+  public void validComposeLroCallableMethodHeaderSampleCode_withReturnResponse() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setLro(lro)
+            .build();
+    String results =
+        ServiceClientCallableSampleComposer.composeLroCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
+            "  OperationFuture future =\n",
+            "      echoClient.waitOperationCallable().futureCall(request);\n",
+            "  // Do something.\n",
+            "  WaitResponse response = future.get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeLroCallableMethodHeaderSampleCode_withReturnVoid() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setLro(lro)
+            .build();
+    String results =
+        ServiceClientCallableSampleComposer.composeLroCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
+            "  OperationFuture future =\n",
+            "      echoClient.waitOperationCallable().futureCall(request);\n",
+            "  // Do something.\n",
+            "  future.get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  // ================================Paged Callable Method Sample Code ====================//
+  @Test
+  public void validComposePagedCallableMethodHeaderSampleCode() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("PagedExpand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    String results =
+        ServiceClientCallableSampleComposer.composePagedCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  PagedExpandRequest request =\n",
+            "      PagedExpandRequest.newBuilder()\n",
+            "          .setContent(\"content951530617\")\n",
+            "          .setPageSize(883849137)\n",
+            "          .setPageToken(\"pageToken873572522\")\n",
+            "          .build();\n",
+            "  ApiFuture future ="
+                + " echoClient.pagedExpandPagedCallable().futureCall(request);\n",
+            "  // Do something.\n",
+            "  for (EchoResponse element : future.get().iterateAll()) {\n",
+            "    // doThingsWith(element);\n",
+            "  }\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void invalidComposePagedCallableMethodHeaderSampleCode_inputTypeNotExistInMessage() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NotExistRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("PagedExpand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientCallableSampleComposer.composePagedCallableMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+
+  @Test
+  public void invalidComposePagedCallableMethodHeaderSampleCode_noExistMethodResponse() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NoExistResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("PagedExpand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientCallableSampleComposer.composePagedCallableMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+
+  @Test
+  public void invalidComposePagedCallableMethodHeaderSampleCode_noRepeatedResponse() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NoRepeatedResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("PagedExpand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    Field responseField = Field.builder().setName("response").setType(TypeNode.STRING).build();
+    Message noRepeatedResponseMessage =
+        Message.builder()
+            .setName("NoRepeatedResponse")
+            .setFullProtoName("google.showcase.v1beta1.NoRepeatedResponse")
+            .setType(
+                TypeNode.withReference(
+                    VaporReference.builder()
+                        .setName("NoRepeatedResponse")
+                        .setPakkage(SHOWCASE_PACKAGE_NAME)
+                        .build()))
+            .setFields(Arrays.asList(responseField))
+            .build();
+    messageTypes.put("NoRepeatedResponse", noRepeatedResponseMessage);
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientCallableSampleComposer.composePagedCallableMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+
+  // ==============================Stream Callable Method Sample Code ====================//
+  @Test
+  public void validComposeStreamCallableMethodHeaderSampleCode_serverStream() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("ExpandRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("Expand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setStream(Stream.SERVER)
+            .build();
+    String results =
+        ServiceClientCallableSampleComposer.composeStreamCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  ExpandRequest request =\n",
+            "     "
+                + " ExpandRequest.newBuilder().setContent(\"content951530617\").setInfo(\"info3237038\").build();\n",
+            "  ServerStream stream = echoClient.expandCallable().call(request);\n",
+            "  for (EchoResponse response : stream) {\n",
+            "    // Do something when a response is received.\n",
+            "  }\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void invalidComposeStreamCallableMethodHeaderSampleCode_serverStreamNotExistRequest() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NotExistRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("Expand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setStream(Stream.SERVER)
+            .build();
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientCallableSampleComposer.composeStreamCallableMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+
+  @Test
+  public void validComposeStreamCallableMethodHeaderSampleCode_bidiStream() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("chat")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setStream(Stream.BIDI)
+            .build();
+    String results =
+        ServiceClientCallableSampleComposer.composeStreamCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  BidiStream bidiStream ="
+                + " echoClient.chatCallable().call();\n",
+            "  EchoRequest request =\n",
+            "      EchoRequest.newBuilder()\n",
+            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setSeverity(Severity.forNumber(0))\n",
+            "          .setFoobar(Foobar.newBuilder().build())\n",
+            "          .build();\n",
+            "  bidiStream.send(request);\n",
+            "  for (EchoResponse response : bidiStream) {\n",
+            "    // Do something when a response is received.\n",
+            "  }\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void invalidComposeStreamCallableMethodHeaderSampleCode_bidiStreamNotExistRequest() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NotExistRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("chat")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setStream(Stream.BIDI)
+            .build();
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientCallableSampleComposer.composeStreamCallableMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+
+  @Test
+  public void validComposeStreamCallableMethodHeaderSampleCode_clientStream() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("Collect")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setStream(Stream.CLIENT)
+            .build();
+    String results =
+        ServiceClientCallableSampleComposer.composeStreamCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  ApiStreamObserver responseObserver =\n",
+            "      new ApiStreamObserver() {\n",
+            "        {@literal @}Override\n",
+            "        public void onNext(EchoResponse response) {\n",
+            "          // Do something when a response is received.\n",
+            "        }\n",
+            "\n",
+            "        {@literal @}Override\n",
+            "        public void onError(Throwable t) {\n",
+            "          // Add error-handling\n",
+            "        }\n",
+            "\n",
+            "        {@literal @}Override\n",
+            "        public void onCompleted() {\n",
+            "          // Do something when complete.\n",
+            "        }\n",
+            "      };\n",
+            "  ApiStreamObserver requestObserver =\n",
+            "      echoClient.collect().clientStreamingCall(responseObserver);\n",
+            "  EchoRequest request =\n",
+            "      EchoRequest.newBuilder()\n",
+            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setSeverity(Severity.forNumber(0))\n",
+            "          .setFoobar(Foobar.newBuilder().build())\n",
+            "          .build();\n",
+            "  requestObserver.onNext(request);\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void invalidComposeStreamCallableMethodHeaderSampleCode_clientStreamNotExistRequest() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NotExistRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("Collect")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setStream(Stream.CLIENT)
+            .build();
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientCallableSampleComposer.composeStreamCallableMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+
+  // ================================Regular Callable Method Sample Code ====================//
+  @Test
+  public void validComposeRegularCallableMethodHeaderSampleCode_unaryRpc() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder().setName("Echo").setInputType(inputType).setOutputType(outputType).build();
+    String results =
+        ServiceClientCallableSampleComposer.composeRegularCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  EchoRequest request =\n",
+            "      EchoRequest.newBuilder()\n",
+            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setSeverity(Severity.forNumber(0))\n",
+            "          .setFoobar(Foobar.newBuilder().build())\n",
+            "          .build();\n",
+            "  ApiFuture future = echoClient.echoCallable().futureCall(request);\n",
+            "  // Do something.\n",
+            "  EchoResponse response = future.get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeRegularCallableMethodHeaderSampleCode_lroRpc() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setLro(lro)
+            .build();
+    String results =
+        ServiceClientCallableSampleComposer.composeRegularCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
+            "  ApiFuture future = echoClient.waitCallable().futureCall(request);\n",
+            "  // Do something.\n",
+            "  Operation response = future.get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeRegularCallableMethodHeaderSampleCode_lroRpcWithReturnVoid() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setLro(lro)
+            .build();
+    String results =
+        ServiceClientCallableSampleComposer.composeRegularCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
+            "  ApiFuture future = echoClient.waitCallable().futureCall(request);\n",
+            "  // Do something.\n",
+            "  future.get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeRegularCallableMethodHeaderSampleCode_pageRpc() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("PagedExpand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setMethodSignatures(Collections.emptyList())
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    String results =
+        ServiceClientCallableSampleComposer.composeRegularCallableMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  PagedExpandRequest request =\n",
+            "      PagedExpandRequest.newBuilder()\n",
+            "          .setContent(\"content951530617\")\n",
+            "          .setPageSize(883849137)\n",
+            "          .setPageToken(\"pageToken873572522\")\n",
+            "          .build();\n",
+            "  while (true) {\n",
+            "    PagedExpandResponse response = echoClient.pagedExpandCallable().call(request);\n",
+            "    for (EchoResponse element : response.getResponsesList()) {\n",
+            "      // doThingsWith(element);\n",
+            "    }\n",
+            "    String nextPageToken = response.getNextPageToken();\n",
+            "    if (!Strings.isNullOrEmpty(nextPageToken)) {\n",
+            "      request = request.toBuilder().setPageToken(nextPageToken).build();\n",
+            "    } else {\n",
+            "      break;\n",
+            "    }\n",
+            "  }\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void invalidComposeRegularCallableMethodHeaderSampleCode_noExistMethodRequest() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NoExistRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder().setName("Echo").setInputType(inputType).setOutputType(outputType).build();
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientCallableSampleComposer.composeRegularCallableMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+
+  @Test
+  public void invalidComposeRegularCallableMethodHeaderSampleCode_noExistMethodResponsePagedRpc() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NoExistResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("PagedExpand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientCallableSampleComposer.composeRegularCallableMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+
+  @Test
+  public void invalidComposeRegularCallableMethodHeaderSampleCode_noRepeatedResponsePagedRpc() {
+    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NoRepeatedResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("PagedExpand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    Field responseField = Field.builder().setName("response").setType(TypeNode.STRING).build();
+    Message noRepeatedResponseMessage =
+        Message.builder()
+            .setName("NoRepeatedResponse")
+            .setFullProtoName("google.showcase.v1beta1.NoRepeatedResponse")
+            .setType(
+                TypeNode.withReference(
+                    VaporReference.builder()
+                        .setName("NoRepeatedResponse")
+                        .setPakkage(SHOWCASE_PACKAGE_NAME)
+                        .build()))
+            .setFields(Arrays.asList(responseField))
+            .build();
+    messageTypes.put("NoRepeatedResponse", noRepeatedResponseMessage);
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientCallableSampleComposer.composeRegularCallableMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+}
diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleCodeComposerTest.java
new file mode 100644
index 0000000000..61a67a1da7
--- /dev/null
+++ b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientHeaderSampleCodeComposerTest.java
@@ -0,0 +1,328 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.api.generator.gapic.composer.samplecode;
+
+import static org.junit.Assert.assertEquals;
+
+import com.google.api.generator.engine.ast.TypeNode;
+import com.google.api.generator.engine.ast.VaporReference;
+import com.google.api.generator.gapic.model.Field;
+import com.google.api.generator.gapic.model.LongrunningOperation;
+import com.google.api.generator.gapic.model.Message;
+import com.google.api.generator.gapic.model.Method;
+import com.google.api.generator.gapic.model.MethodArgument;
+import com.google.api.generator.gapic.model.ResourceName;
+import com.google.api.generator.gapic.model.Service;
+import com.google.api.generator.gapic.protoparser.Parser;
+import com.google.api.generator.testutils.LineFormatter;
+import com.google.protobuf.Descriptors;
+import com.google.showcase.v1beta1.EchoOuterClass;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import org.junit.Test;
+
+public class ServiceClientHeaderSampleCodeComposerTest {
+  private static final String SHOWCASE_PACKAGE_NAME = "com.google.showcase.v1beta1";
+  private static final String LRO_PACKAGE_NAME = "com.google.longrunning";
+  private static final String PROTO_PACKAGE_NAME = "com.google.protobuf";
+  private static final String PAGINATED_FIELD_NAME = "page_size";
+
+  // =============================== Class Header Sample Code ===============================//
+  @Test
+  public void composeClassHeaderMethodSampleCode_unaryRpc() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    Set outputResourceNames = new HashSet<>();
+    List services =
+        Parser.parseService(
+            echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames);
+    Service echoProtoService = services.get(0);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    String results =
+        ServiceClientHeaderSampleComposer.composeClassHeaderMethodSampleCode(
+            echoProtoService, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  EchoResponse response = echoClient.echo();\n",
+            "}");
+    assertEquals(expected, results);
+  }
+
+  @Test
+  public void composeClassHeaderMethodSampleCode_firstMethodIsNotUnaryRpc() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    TypeNode ttlTypeNode =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build());
+    MethodArgument ttl =
+        MethodArgument.builder()
+            .setName("ttl")
+            .setType(ttlTypeNode)
+            .setField(
+                Field.builder()
+                    .setName("ttl")
+                    .setType(ttlTypeNode)
+                    .setIsMessage(true)
+                    .setIsContainedInOneof(true)
+                    .build())
+            .build();
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setLro(lro)
+            .setMethodSignatures(Arrays.asList(Arrays.asList(ttl)))
+            .build();
+    Service service =
+        Service.builder()
+            .setName("Echo")
+            .setDefaultHost("localhost:7469")
+            .setOauthScopes(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
+            .setPakkage(SHOWCASE_PACKAGE_NAME)
+            .setProtoPakkage(SHOWCASE_PACKAGE_NAME)
+            .setOriginalJavaPackage(SHOWCASE_PACKAGE_NAME)
+            .setOverriddenName("Echo")
+            .setMethods(Arrays.asList(method))
+            .build();
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    String results =
+        ServiceClientHeaderSampleComposer.composeClassHeaderMethodSampleCode(
+            service, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  Duration ttl = Duration.newBuilder().build();\n",
+            "  WaitResponse response = echoClient.waitAsync(ttl).get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void composeClassHeaderMethodSampleCode_firstMethodHasNoSignatures() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("Echo")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setMethodSignatures(Collections.emptyList())
+            .build();
+    Service service =
+        Service.builder()
+            .setName("Echo")
+            .setDefaultHost("localhost:7469")
+            .setOauthScopes(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
+            .setPakkage(SHOWCASE_PACKAGE_NAME)
+            .setProtoPakkage(SHOWCASE_PACKAGE_NAME)
+            .setOriginalJavaPackage(SHOWCASE_PACKAGE_NAME)
+            .setOverriddenName("Echo")
+            .setMethods(Arrays.asList(method))
+            .build();
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    String results =
+        ServiceClientHeaderSampleComposer.composeClassHeaderMethodSampleCode(
+            service, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  EchoRequest request =\n",
+            "      EchoRequest.newBuilder()\n",
+            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setSeverity(Severity.forNumber(0))\n",
+            "          .setFoobar(Foobar.newBuilder().build())\n",
+            "          .build();\n",
+            "  EchoResponse response = echoClient.echo(request);\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void composeClassHeaderMethodSampleCode_firstMethodIsStream() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("ExpandRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("Expand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setStream(Method.Stream.SERVER)
+            .build();
+    Service service =
+        Service.builder()
+            .setName("Echo")
+            .setDefaultHost("localhost:7469")
+            .setOauthScopes(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
+            .setPakkage(SHOWCASE_PACKAGE_NAME)
+            .setProtoPakkage(SHOWCASE_PACKAGE_NAME)
+            .setOriginalJavaPackage(SHOWCASE_PACKAGE_NAME)
+            .setOverriddenName("Echo")
+            .setMethods(Arrays.asList(method))
+            .build();
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    String results =
+        ServiceClientHeaderSampleComposer.composeClassHeaderMethodSampleCode(
+            service, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  ExpandRequest request =\n",
+            "     "
+                + " ExpandRequest.newBuilder().setContent(\"content951530617\").setInfo(\"info3237038\").build();\n",
+            "  ServerStream stream = echoClient.expandCallable().call(request);\n",
+            "  for (EchoResponse response : stream) {\n",
+            "    // Do something when a response is received.\n",
+            "  }\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void composeClassHeaderCredentialsSampleCode() {
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode settingsType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoSettings")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    String results =
+        ServiceClientHeaderSampleComposer.composeClassHeaderCredentialsSampleCode(
+            clientType, settingsType);
+    String expected =
+        LineFormatter.lines(
+            "EchoSettings echoSettings =\n",
+            "    EchoSettings.newBuilder()\n",
+            "        .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))\n",
+            "        .build();\n",
+            "EchoClient echoClient = EchoClient.create(echoSettings);");
+    assertEquals(expected, results);
+  }
+
+  @Test
+  public void composeClassHeaderEndpointSampleCode() {
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode settingsType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoSettings")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    String results =
+        ServiceClientHeaderSampleComposer.composeClassHeaderEndpointSampleCode(
+            clientType, settingsType);
+    String expected =
+        LineFormatter.lines(
+            "EchoSettings echoSettings ="
+                + " EchoSettings.newBuilder().setEndpoint(myEndpoint).build();\n",
+            "EchoClient echoClient = EchoClient.create(echoSettings);");
+    assertEquals(expected, results);
+  }
+}
diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleCodeComposerTest.java
new file mode 100644
index 0000000000..b82f706ef2
--- /dev/null
+++ b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientMethodSampleCodeComposerTest.java
@@ -0,0 +1,810 @@
+// Copyright 2022 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.api.generator.gapic.composer.samplecode;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThrows;
+
+import com.google.api.generator.engine.ast.ConcreteReference;
+import com.google.api.generator.engine.ast.Reference;
+import com.google.api.generator.engine.ast.TypeNode;
+import com.google.api.generator.engine.ast.VaporReference;
+import com.google.api.generator.gapic.model.Field;
+import com.google.api.generator.gapic.model.LongrunningOperation;
+import com.google.api.generator.gapic.model.Message;
+import com.google.api.generator.gapic.model.Method;
+import com.google.api.generator.gapic.model.MethodArgument;
+import com.google.api.generator.gapic.model.ResourceName;
+import com.google.api.generator.gapic.protoparser.Parser;
+import com.google.api.generator.testutils.LineFormatter;
+import com.google.protobuf.Descriptors;
+import com.google.showcase.v1beta1.EchoOuterClass;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import org.junit.Test;
+
+public class ServiceClientMethodSampleCodeComposerTest {
+  private static final String SHOWCASE_PACKAGE_NAME = "com.google.showcase.v1beta1";
+  private static final String LRO_PACKAGE_NAME = "com.google.longrunning";
+  private static final String PROTO_PACKAGE_NAME = "com.google.protobuf";
+  private static final String PAGINATED_FIELD_NAME = "page_size";
+
+  @Test
+  public void validComposeRpcMethodHeaderSampleCode_pagedRpcWithMultipleMethodArguments() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("ListContentRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("ListContentResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode resourceNameType =
+        TypeNode.withReference(
+            ConcreteReference.builder()
+                .setClazz(List.class)
+                .setGenerics(ConcreteReference.withClazz(String.class))
+                .build());
+    List arguments =
+        Arrays.asList(
+            MethodArgument.builder()
+                .setName("resourceName")
+                .setType(resourceNameType)
+                .setField(
+                    Field.builder()
+                        .setName("resourceName")
+                        .setType(resourceNameType)
+                        .setIsRepeated(true)
+                        .build())
+                .build(),
+            MethodArgument.builder()
+                .setName("filter")
+                .setType(TypeNode.STRING)
+                .setField(Field.builder().setName("filter").setType(TypeNode.STRING).build())
+                .build());
+    Method method =
+        Method.builder()
+            .setName("ListContent")
+            .setMethodSignatures(Arrays.asList(arguments))
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    Reference repeatedResponseReference =
+        VaporReference.builder().setName("Content").setPakkage(SHOWCASE_PACKAGE_NAME).build();
+    Field repeatedField =
+        Field.builder()
+            .setName("responses")
+            .setType(
+                TypeNode.withReference(
+                    ConcreteReference.builder()
+                        .setClazz(List.class)
+                        .setGenerics(repeatedResponseReference)
+                        .build()))
+            .setIsMessage(true)
+            .setIsRepeated(true)
+            .build();
+    Field nextPagedTokenField =
+        Field.builder().setName("next_page_token").setType(TypeNode.STRING).build();
+    Message listContentResponseMessage =
+        Message.builder()
+            .setName("ListContentResponse")
+            .setFullProtoName("google.showcase.v1beta1.ListContentResponse")
+            .setType(outputType)
+            .setFields(Arrays.asList(repeatedField, nextPagedTokenField))
+            .build();
+    messageTypes.put("com.google.showcase.v1beta1.ListContentResponse", listContentResponseMessage);
+
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcMethodHeaderSampleCode(
+            method, clientType, arguments, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  List resourceName = new ArrayList<>();\n",
+            "  String filter = \"filter-1274492040\";\n",
+            "  for (Content element : echoClient.listContent(resourceName, filter).iterateAll())"
+                + " {\n",
+            "    // doThingsWith(element);\n",
+            "  }\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeRpcMethodHeaderSampleCode_pagedRpcWithNoMethodArguments() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("ListContentRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("ListContentResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    List arguments = Collections.emptyList();
+    Method method =
+        Method.builder()
+            .setName("ListContent")
+            .setMethodSignatures(Arrays.asList(arguments))
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    Reference repeatedResponseReference =
+        VaporReference.builder().setName("Content").setPakkage(SHOWCASE_PACKAGE_NAME).build();
+    Field repeatedField =
+        Field.builder()
+            .setName("responses")
+            .setType(
+                TypeNode.withReference(
+                    ConcreteReference.builder()
+                        .setClazz(List.class)
+                        .setGenerics(repeatedResponseReference)
+                        .build()))
+            .setIsMessage(true)
+            .setIsRepeated(true)
+            .build();
+    Field nextPagedTokenField =
+        Field.builder().setName("next_page_token").setType(TypeNode.STRING).build();
+    Message listContentResponseMessage =
+        Message.builder()
+            .setName("ListContentResponse")
+            .setFullProtoName("google.showcase.v1beta1.ListContentResponse")
+            .setType(outputType)
+            .setFields(Arrays.asList(repeatedField, nextPagedTokenField))
+            .build();
+    messageTypes.put("com.google.showcase.v1beta1.ListContentResponse", listContentResponseMessage);
+
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcMethodHeaderSampleCode(
+            method, clientType, arguments, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  for (Content element : echoClient.listContent().iterateAll()) {\n",
+            "    // doThingsWith(element);\n",
+            "  }\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void invalidComposeRpcMethodHeaderSampleCode_noMatchedRepeatedResponseTypeInPagedMethod() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    List methodArguments = Collections.emptyList();
+    Method method =
+        Method.builder()
+            .setName("simplePagedMethod")
+            .setMethodSignatures(Arrays.asList(methodArguments))
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientMethodSampleComposer.composeRpcMethodHeaderSampleCode(
+                method, clientType, methodArguments, resourceNames, messageTypes));
+  }
+
+  @Test
+  public void invalidComposeRpcMethodHeaderSampleCode_noRepeatedResponseTypeInPagedMethod() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    List methodArguments = Collections.emptyList();
+    Method method =
+        Method.builder()
+            .setName("simplePagedMethod")
+            .setMethodSignatures(Arrays.asList(methodArguments))
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    Field responseField =
+        Field.builder()
+            .setName("response")
+            .setType(
+                TypeNode.withReference(
+                    ConcreteReference.builder()
+                        .setClazz(List.class)
+                        .setGenerics(ConcreteReference.withClazz(String.class))
+                        .build()))
+            .setIsMessage(true)
+            .setIsRepeated(false)
+            .build();
+    Field nextPageToken =
+        Field.builder().setName("next_page_token").setType(TypeNode.STRING).build();
+    Message noRepeatedFieldMessage =
+        Message.builder()
+            .setName("PagedResponse")
+            .setFullProtoName("google.showcase.v1beta1.PagedResponse")
+            .setType(outputType)
+            .setFields(Arrays.asList(responseField, nextPageToken))
+            .build();
+    messageTypes.put("PagedResponse", noRepeatedFieldMessage);
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientMethodSampleComposer.composeRpcMethodHeaderSampleCode(
+                method, clientType, methodArguments, resourceNames, messageTypes));
+  }
+
+  // ================================Unary RPC Default Method Sample Code ====================//
+  @Test
+  public void validComposeRpcDefaultMethodHeaderSampleCode_isPagedMethod() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("PagedExpand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setMethodSignatures(Collections.emptyList())
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcDefaultMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  PagedExpandRequest request =\n",
+            "      PagedExpandRequest.newBuilder()\n",
+            "          .setContent(\"content951530617\")\n",
+            "          .setPageSize(883849137)\n",
+            "          .setPageToken(\"pageToken873572522\")\n",
+            "          .build();\n",
+            "  for (EchoResponse element : echoClient.pagedExpand(request).iterateAll()) {\n",
+            "    // doThingsWith(element);\n",
+            "  }\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void invalidComposeRpcDefaultMethodHeaderSampleCode_isPagedMethod() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("NotExistRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("PagedExpandResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("PagedExpand")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setMethodSignatures(Collections.emptyList())
+            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
+            .build();
+    assertThrows(
+        NullPointerException.class,
+        () ->
+            ServiceClientMethodSampleComposer.composeRpcDefaultMethodHeaderSampleCode(
+                method, clientType, resourceNames, messageTypes));
+  }
+
+  @Test
+  public void validComposeRpcDefaultMethodHeaderSampleCode_hasLroMethodWithReturnResponse() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setMethodSignatures(Collections.emptyList())
+            .setLro(lro)
+            .build();
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcDefaultMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
+            "  echoClient.waitAsync(request).get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeRpcDefaultMethodHeaderSampleCode_hasLroMethodWithReturnVoid() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setMethodSignatures(Collections.emptyList())
+            .setLro(lro)
+            .build();
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcDefaultMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
+            "  WaitResponse response = echoClient.waitAsync(request).get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeRpcDefaultMethodHeaderSampleCode_pureUnaryReturnVoid() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
+    Method method =
+        Method.builder()
+            .setName("Echo")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setMethodSignatures(Collections.emptyList())
+            .build();
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcDefaultMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  EchoRequest request =\n",
+            "      EchoRequest.newBuilder()\n",
+            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setSeverity(Severity.forNumber(0))\n",
+            "          .setFoobar(Foobar.newBuilder().build())\n",
+            "          .build();\n",
+            "  echoClient.echo(request);\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeRpcDefaultMethodHeaderSampleCode_pureUnaryReturnResponse() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    Method method =
+        Method.builder()
+            .setName("Echo")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setMethodSignatures(Collections.emptyList())
+            .build();
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcDefaultMethodHeaderSampleCode(
+            method, clientType, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  EchoRequest request =\n",
+            "      EchoRequest.newBuilder()\n",
+            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
+                + " \"[FOOBAR]\").toString())\n",
+            "          .setSeverity(Severity.forNumber(0))\n",
+            "          .setFoobar(Foobar.newBuilder().build())\n",
+            "          .build();\n",
+            "  EchoResponse response = echoClient.echo(request);\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  // ===================================Unary LRO RPC Method Sample Code ======================//
+  @Test
+  public void validComposeRpcMethodHeaderSampleCode_lroUnaryRpcWithNoMethodArgument() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setLro(lro)
+            .setMethodSignatures(Collections.emptyList())
+            .build();
+
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcMethodHeaderSampleCode(
+            method, clientType, Collections.emptyList(), resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  WaitResponse response = echoClient.waitAsync().get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeRpcMethodHeaderSampleCode_lroRpcWithReturnResponseType() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitResponse")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    TypeNode ttlTypeNode =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build());
+    MethodArgument ttl =
+        MethodArgument.builder()
+            .setName("ttl")
+            .setType(ttlTypeNode)
+            .setField(
+                Field.builder()
+                    .setName("ttl")
+                    .setType(ttlTypeNode)
+                    .setIsMessage(true)
+                    .setIsContainedInOneof(true)
+                    .build())
+            .build();
+    List arguments = Arrays.asList(ttl);
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setLro(lro)
+            .setMethodSignatures(Arrays.asList(arguments))
+            .build();
+
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcMethodHeaderSampleCode(
+            method, clientType, arguments, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  Duration ttl = Duration.newBuilder().build();\n",
+            "  WaitResponse response = echoClient.waitAsync(ttl).get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+
+  @Test
+  public void validComposeRpcMethodHeaderSampleCode_lroRpcWithReturnVoid() {
+    Descriptors.FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
+    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
+    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
+    TypeNode clientType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("EchoClient")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode inputType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitRequest")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    TypeNode outputType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
+    TypeNode responseType =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
+    TypeNode metadataType =
+        TypeNode.withReference(
+            VaporReference.builder()
+                .setName("WaitMetadata")
+                .setPakkage(SHOWCASE_PACKAGE_NAME)
+                .build());
+    LongrunningOperation lro =
+        LongrunningOperation.builder()
+            .setResponseType(responseType)
+            .setMetadataType(metadataType)
+            .build();
+    TypeNode ttlTypeNode =
+        TypeNode.withReference(
+            VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build());
+    MethodArgument ttl =
+        MethodArgument.builder()
+            .setName("ttl")
+            .setType(ttlTypeNode)
+            .setField(
+                Field.builder()
+                    .setName("ttl")
+                    .setType(ttlTypeNode)
+                    .setIsMessage(true)
+                    .setIsContainedInOneof(true)
+                    .build())
+            .build();
+    List arguments = Arrays.asList(ttl);
+    Method method =
+        Method.builder()
+            .setName("Wait")
+            .setInputType(inputType)
+            .setOutputType(outputType)
+            .setLro(lro)
+            .setMethodSignatures(Arrays.asList(arguments))
+            .build();
+
+    String results =
+        ServiceClientMethodSampleComposer.composeRpcMethodHeaderSampleCode(
+            method, clientType, arguments, resourceNames, messageTypes);
+    String expected =
+        LineFormatter.lines(
+            "try (EchoClient echoClient = EchoClient.create()) {\n",
+            "  Duration ttl = Duration.newBuilder().build();\n",
+            "  echoClient.waitAsync(ttl).get();\n",
+            "}");
+    assertEquals(results, expected);
+  }
+}
diff --git a/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java b/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java
deleted file mode 100644
index 397e0ec2c2..0000000000
--- a/src/test/java/com/google/api/generator/gapic/composer/samplecode/ServiceClientSampleCodeComposerTest.java
+++ /dev/null
@@ -1,2640 +0,0 @@
-// Copyright 2020 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.api.generator.gapic.composer.samplecode;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
-
-import com.google.api.generator.engine.ast.ConcreteReference;
-import com.google.api.generator.engine.ast.Reference;
-import com.google.api.generator.engine.ast.TypeNode;
-import com.google.api.generator.engine.ast.VaporReference;
-import com.google.api.generator.gapic.model.Field;
-import com.google.api.generator.gapic.model.LongrunningOperation;
-import com.google.api.generator.gapic.model.Message;
-import com.google.api.generator.gapic.model.Method;
-import com.google.api.generator.gapic.model.Method.Stream;
-import com.google.api.generator.gapic.model.MethodArgument;
-import com.google.api.generator.gapic.model.ResourceName;
-import com.google.api.generator.gapic.model.Service;
-import com.google.api.generator.gapic.protoparser.Parser;
-import com.google.api.generator.testutils.LineFormatter;
-import com.google.protobuf.Descriptors.FileDescriptor;
-import com.google.showcase.v1beta1.EchoOuterClass;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import org.junit.Test;
-
-public class ServiceClientSampleCodeComposerTest {
-  private static final String SHOWCASE_PACKAGE_NAME = "com.google.showcase.v1beta1";
-  private static final String LRO_PACKAGE_NAME = "com.google.longrunning";
-  private static final String PROTO_PACKAGE_NAME = "com.google.protobuf";
-  private static final String PAGINATED_FIELD_NAME = "page_size";
-
-  // =============================== Class Header Sample Code ===============================//
-  @Test
-  public void composeClassHeaderMethodSampleCode_unaryRpc() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    Set outputResourceNames = new HashSet<>();
-    List services =
-        Parser.parseService(
-            echoFileDescriptor, messageTypes, resourceNames, Optional.empty(), outputResourceNames);
-    Service echoProtoService = services.get(0);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    String results =
-        ServiceClientSampleCodeComposer.composeClassHeaderMethodSampleCode(
-            echoProtoService, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  EchoResponse response = echoClient.echo();\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void composeClassHeaderMethodSampleCode_firstMethodIsNotUnaryRpc() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    TypeNode ttlTypeNode =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build());
-    MethodArgument ttl =
-        MethodArgument.builder()
-            .setName("ttl")
-            .setType(ttlTypeNode)
-            .setField(
-                Field.builder()
-                    .setName("ttl")
-                    .setType(ttlTypeNode)
-                    .setIsMessage(true)
-                    .setIsContainedInOneof(true)
-                    .build())
-            .build();
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setLro(lro)
-            .setMethodSignatures(Arrays.asList(Arrays.asList(ttl)))
-            .build();
-    Service service =
-        Service.builder()
-            .setName("Echo")
-            .setDefaultHost("localhost:7469")
-            .setOauthScopes(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
-            .setPakkage(SHOWCASE_PACKAGE_NAME)
-            .setProtoPakkage(SHOWCASE_PACKAGE_NAME)
-            .setOriginalJavaPackage(SHOWCASE_PACKAGE_NAME)
-            .setOverriddenName("Echo")
-            .setMethods(Arrays.asList(method))
-            .build();
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    String results =
-        ServiceClientSampleCodeComposer.composeClassHeaderMethodSampleCode(
-            service, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  Duration ttl = Duration.newBuilder().build();\n",
-            "  WaitResponse response = echoClient.waitAsync(ttl).get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void composeClassHeaderMethodSampleCode_firstMethodHasNoSignatures() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("Echo")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setMethodSignatures(Collections.emptyList())
-            .build();
-    Service service =
-        Service.builder()
-            .setName("Echo")
-            .setDefaultHost("localhost:7469")
-            .setOauthScopes(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
-            .setPakkage(SHOWCASE_PACKAGE_NAME)
-            .setProtoPakkage(SHOWCASE_PACKAGE_NAME)
-            .setOriginalJavaPackage(SHOWCASE_PACKAGE_NAME)
-            .setOverriddenName("Echo")
-            .setMethods(Arrays.asList(method))
-            .build();
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    String results =
-        ServiceClientSampleCodeComposer.composeClassHeaderMethodSampleCode(
-            service, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  EchoRequest request =\n",
-            "      EchoRequest.newBuilder()\n",
-            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setSeverity(Severity.forNumber(0))\n",
-            "          .setFoobar(Foobar.newBuilder().build())\n",
-            "          .build();\n",
-            "  EchoResponse response = echoClient.echo(request);\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void composeClassHeaderMethodSampleCode_firstMethodIsStream() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("ExpandRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("Expand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setStream(Stream.SERVER)
-            .build();
-    Service service =
-        Service.builder()
-            .setName("Echo")
-            .setDefaultHost("localhost:7469")
-            .setOauthScopes(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
-            .setPakkage(SHOWCASE_PACKAGE_NAME)
-            .setProtoPakkage(SHOWCASE_PACKAGE_NAME)
-            .setOriginalJavaPackage(SHOWCASE_PACKAGE_NAME)
-            .setOverriddenName("Echo")
-            .setMethods(Arrays.asList(method))
-            .build();
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    String results =
-        ServiceClientSampleCodeComposer.composeClassHeaderMethodSampleCode(
-            service, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  ExpandRequest request =\n",
-            "     "
-                + " ExpandRequest.newBuilder().setContent(\"content951530617\").setInfo(\"info3237038\").build();\n",
-            "  ServerStream stream = echoClient.expandCallable().call(request);\n",
-            "  for (EchoResponse response : stream) {\n",
-            "    // Do something when a response is received.\n",
-            "  }\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void composeClassHeaderCredentialsSampleCode() {
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode settingsType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoSettings")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    String results =
-        ServiceClientSampleCodeComposer.composeClassHeaderCredentialsSampleCode(
-            clientType, settingsType);
-    String expected =
-        LineFormatter.lines(
-            "EchoSettings echoSettings =\n",
-            "    EchoSettings.newBuilder()\n",
-            "        .setCredentialsProvider(FixedCredentialsProvider.create(myCredentials))\n",
-            "        .build();\n",
-            "EchoClient echoClient = EchoClient.create(echoSettings);");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void composeClassHeaderEndpointSampleCode() {
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode settingsType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoSettings")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    String results =
-        ServiceClientSampleCodeComposer.composeClassHeaderEndpointSampleCode(
-            clientType, settingsType);
-    String expected =
-        LineFormatter.lines(
-            "EchoSettings echoSettings ="
-                + " EchoSettings.newBuilder().setEndpoint(myEndpoint).build();\n",
-            "EchoClient echoClient = EchoClient.create(echoSettings);");
-    assertEquals(expected, results);
-  }
-
-  // =======================================Unary RPC Method Sample Code=======================//
-  /*
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpc() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    List methodArguments = Collections.emptyList();
-    Method method =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(Arrays.asList(methodArguments))
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            method, clientType, methodArguments, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  EchoResponse response = echoClient.echo();\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithResourceNameMethodArgument() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode resourceNameType =
-        TypeNode.withReference(
-            ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class));
-    MethodArgument arg =
-        MethodArgument.builder()
-            .setName("parent")
-            .setType(resourceNameType)
-            .setField(
-                Field.builder()
-                    .setName("parent")
-                    .setType(TypeNode.STRING)
-                    .setResourceReference(
-                        ResourceReference.withType("showcase.googleapis.com/AnythingGoes"))
-                    .build())
-            .setIsResourceNameHelper(true)
-            .build();
-    List> signatures = Arrays.asList(Arrays.asList(arg));
-    Method method =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(signatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            method, clientType, signatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  ResourceName parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\");\n",
-            "  EchoResponse response = echoClient.echo(parent);\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void
-      validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithSuperReferenceIsResourceNameMethodArgument() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode methodArgType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("FoobarName")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .setSupertypeReference(
-                    ConcreteReference.withClazz(com.google.api.resourcenames.ResourceName.class))
-                .build());
-    Field methodArgField =
-        Field.builder()
-            .setName("name")
-            .setType(TypeNode.STRING)
-            .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar"))
-            .build();
-    MethodArgument arg =
-        MethodArgument.builder()
-            .setName("name")
-            .setType(methodArgType)
-            .setField(methodArgField)
-            .setIsResourceNameHelper(true)
-            .build();
-    List> signatures = Arrays.asList(Arrays.asList(arg));
-    Method unaryMethod =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(signatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            unaryMethod, clientType, signatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  FoobarName name = FoobarName.ofProjectFoobarName(\"[PROJECT]\", \"[FOOBAR]\");\n",
-            "  EchoResponse response = echoClient.echo(name);\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void
-      validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithStringWithResourceReferenceMethodArgument() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Field methodArgField =
-        Field.builder()
-            .setName("name")
-            .setType(TypeNode.STRING)
-            .setResourceReference(ResourceReference.withType("showcase.googleapis.com/Foobar"))
-            .build();
-    MethodArgument arg =
-        MethodArgument.builder()
-            .setName("name")
-            .setType(TypeNode.STRING)
-            .setField(methodArgField)
-            .build();
-    List> signatures = Arrays.asList(Arrays.asList(arg));
-    Method unaryMethod =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(signatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            unaryMethod, clientType, signatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  String name = FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString();\n",
-            "  EchoResponse response = echoClient.echo(name);\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void
-      validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithStringWithParentResourceReferenceMethodArgument() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Field methodArgField =
-        Field.builder()
-            .setName("parent")
-            .setType(TypeNode.STRING)
-            .setResourceReference(
-                ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes"))
-            .build();
-    MethodArgument arg =
-        MethodArgument.builder()
-            .setName("parent")
-            .setType(TypeNode.STRING)
-            .setField(methodArgField)
-            .build();
-    List> signatures = Arrays.asList(Arrays.asList(arg));
-    Method unaryMethod =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(signatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            unaryMethod, clientType, signatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  String parent = FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString();\n",
-            "  EchoResponse response = echoClient.echo(parent);\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithIsMessageMethodArgument() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode methodArgType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Status").setPakkage("com.google.rpc").build());
-    Field methodArgField =
-        Field.builder()
-            .setName("error")
-            .setType(methodArgType)
-            .setIsMessage(true)
-            .setIsContainedInOneof(true)
-            .build();
-    MethodArgument arg =
-        MethodArgument.builder()
-            .setName("error")
-            .setType(methodArgType)
-            .setField(methodArgField)
-            .build();
-    List> signatures = Arrays.asList(Arrays.asList(arg));
-    Method unaryMethod =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(signatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            unaryMethod, clientType, signatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  Status error = Status.newBuilder().build();\n",
-            "  EchoResponse response = echoClient.echo(error);\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void
-      validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithMultipleWordNameMethodArgument() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Field methodArgField =
-        Field.builder()
-            .setName("display_name")
-            .setType(TypeNode.STRING)
-            .setResourceReference(
-                ResourceReference.withChildType("showcase.googleapis.com/AnythingGoes"))
-            .build();
-    Reference userRef =
-        VaporReference.builder().setName("User").setPakkage(SHOWCASE_PACKAGE_NAME).build();
-    Field nestFiled =
-        Field.builder()
-            .setName("user")
-            .setType(TypeNode.withReference(userRef))
-            .setIsMessage(true)
-            .build();
-    MethodArgument argDisplayName =
-        MethodArgument.builder()
-            .setName("display_name")
-            .setType(TypeNode.STRING)
-            .setField(methodArgField)
-            .setNestedFields(Arrays.asList(nestFiled))
-            .build();
-    MethodArgument argOtherName =
-        MethodArgument.builder()
-            .setName("other_name")
-            .setType(TypeNode.STRING)
-            .setField(Field.builder().setName("other_name").setType(TypeNode.STRING).build())
-            .setNestedFields(Arrays.asList(nestFiled))
-            .build();
-    List> signatures =
-        Arrays.asList(Arrays.asList(argDisplayName, argOtherName));
-    Method unaryMethod =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(signatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            unaryMethod, clientType, signatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  String displayName = FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString();\n",
-            "  String otherName = \"otherName-1946065477\";\n",
-            "  EchoResponse response = echoClient.echo(displayName, otherName);\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void
-      validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithStringIsContainedInOneOfMethodArgument() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Field methodArgField =
-        Field.builder()
-            .setName("content")
-            .setType(TypeNode.STRING)
-            .setIsContainedInOneof(true)
-            .build();
-    MethodArgument arg =
-        MethodArgument.builder()
-            .setName("content")
-            .setType(TypeNode.STRING)
-            .setField(methodArgField)
-            .build();
-    List> signatures = Arrays.asList(Arrays.asList(arg));
-    Method unaryMethod =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(signatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            unaryMethod, clientType, signatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  String content = \"content951530617\";\n",
-            "  EchoResponse response = echoClient.echo(content);\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithMultipleMethodArguments() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    MethodArgument arg1 =
-        MethodArgument.builder()
-            .setName("content")
-            .setType(TypeNode.STRING)
-            .setField(Field.builder().setName("content").setType(TypeNode.STRING).build())
-            .build();
-    TypeNode severityType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Severity").setPakkage(SHOWCASE_PACKAGE_NAME).build());
-    MethodArgument arg2 =
-        MethodArgument.builder()
-            .setName("severity")
-            .setType(severityType)
-            .setField(
-                Field.builder().setName("severity").setType(severityType).setIsEnum(true).build())
-            .build();
-    List> signatures = Arrays.asList(Arrays.asList(arg1, arg2));
-    Method unaryMethod =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(signatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            unaryMethod, clientType, signatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  String content = \"content951530617\";\n",
-            "  Severity severity = Severity.forNumber(0);\n",
-            "  EchoResponse response = echoClient.echo(content, severity);\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithNoMethodArguments() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    List> signatures = Arrays.asList(Collections.emptyList());
-    Method unaryMethod =
-        Method.builder()
-            .setName("echo")
-            .setMethodSignatures(signatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            unaryMethod, clientType, signatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  EchoResponse response = echoClient.echo();\n",
-            "}");
-    assertEquals(expected, results);
-  }
-
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_pureUnaryRpcWithMethodReturnVoid() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("DeleteUserRequest")
-                .setPakkage("com.google.showcase.v1beta1")
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
-    List> methodSignatures =
-        Arrays.asList(
-            Arrays.asList(
-                MethodArgument.builder()
-                    .setName("name")
-                    .setType(TypeNode.STRING)
-                    .setField(Field.builder().setName("name").setType(TypeNode.STRING).build())
-                    .build()));
-    Method unaryMethod =
-        Method.builder()
-            .setName("delete")
-            .setMethodSignatures(methodSignatures)
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            unaryMethod, clientType, methodSignatures.get(0), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  String name = \"name3373707\";\n",
-            "  echoClient.delete(name);\n",
-            "}");
-    assertEquals(results, expected);
-  }
-  */
-
-  // ===================================Unary Paged RPC Method Sample Code ======================//
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_pagedRpcWithMultipleMethodArguments() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("ListContentRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("ListContentResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode resourceNameType =
-        TypeNode.withReference(
-            ConcreteReference.builder()
-                .setClazz(List.class)
-                .setGenerics(ConcreteReference.withClazz(String.class))
-                .build());
-    List arguments =
-        Arrays.asList(
-            MethodArgument.builder()
-                .setName("resourceName")
-                .setType(resourceNameType)
-                .setField(
-                    Field.builder()
-                        .setName("resourceName")
-                        .setType(resourceNameType)
-                        .setIsRepeated(true)
-                        .build())
-                .build(),
-            MethodArgument.builder()
-                .setName("filter")
-                .setType(TypeNode.STRING)
-                .setField(Field.builder().setName("filter").setType(TypeNode.STRING).build())
-                .build());
-    Method method =
-        Method.builder()
-            .setName("ListContent")
-            .setMethodSignatures(Arrays.asList(arguments))
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    Reference repeatedResponseReference =
-        VaporReference.builder().setName("Content").setPakkage(SHOWCASE_PACKAGE_NAME).build();
-    Field repeatedField =
-        Field.builder()
-            .setName("responses")
-            .setType(
-                TypeNode.withReference(
-                    ConcreteReference.builder()
-                        .setClazz(List.class)
-                        .setGenerics(repeatedResponseReference)
-                        .build()))
-            .setIsMessage(true)
-            .setIsRepeated(true)
-            .build();
-    Field nextPagedTokenField =
-        Field.builder().setName("next_page_token").setType(TypeNode.STRING).build();
-    Message listContentResponseMessage =
-        Message.builder()
-            .setName("ListContentResponse")
-            .setFullProtoName("google.showcase.v1beta1.ListContentResponse")
-            .setType(outputType)
-            .setFields(Arrays.asList(repeatedField, nextPagedTokenField))
-            .build();
-    messageTypes.put("com.google.showcase.v1beta1.ListContentResponse", listContentResponseMessage);
-
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            method, clientType, arguments, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  List resourceName = new ArrayList<>();\n",
-            "  String filter = \"filter-1274492040\";\n",
-            "  for (Content element : echoClient.listContent(resourceName, filter).iterateAll())"
-                + " {\n",
-            "    // doThingsWith(element);\n",
-            "  }\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_pagedRpcWithNoMethodArguments() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("ListContentRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("ListContentResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    List arguments = Collections.emptyList();
-    Method method =
-        Method.builder()
-            .setName("ListContent")
-            .setMethodSignatures(Arrays.asList(arguments))
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    Reference repeatedResponseReference =
-        VaporReference.builder().setName("Content").setPakkage(SHOWCASE_PACKAGE_NAME).build();
-    Field repeatedField =
-        Field.builder()
-            .setName("responses")
-            .setType(
-                TypeNode.withReference(
-                    ConcreteReference.builder()
-                        .setClazz(List.class)
-                        .setGenerics(repeatedResponseReference)
-                        .build()))
-            .setIsMessage(true)
-            .setIsRepeated(true)
-            .build();
-    Field nextPagedTokenField =
-        Field.builder().setName("next_page_token").setType(TypeNode.STRING).build();
-    Message listContentResponseMessage =
-        Message.builder()
-            .setName("ListContentResponse")
-            .setFullProtoName("google.showcase.v1beta1.ListContentResponse")
-            .setType(outputType)
-            .setFields(Arrays.asList(repeatedField, nextPagedTokenField))
-            .build();
-    messageTypes.put("com.google.showcase.v1beta1.ListContentResponse", listContentResponseMessage);
-
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            method, clientType, arguments, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  for (Content element : echoClient.listContent().iterateAll()) {\n",
-            "    // doThingsWith(element);\n",
-            "  }\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void invalidComposeRpcMethodHeaderSampleCode_noMatchedRepeatedResponseTypeInPagedMethod() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    List methodArguments = Collections.emptyList();
-    Method method =
-        Method.builder()
-            .setName("simplePagedMethod")
-            .setMethodSignatures(Arrays.asList(methodArguments))
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-                method, clientType, methodArguments, resourceNames, messageTypes));
-  }
-
-  @Test
-  public void invalidComposeRpcMethodHeaderSampleCode_noRepeatedResponseTypeInPagedMethod() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    List methodArguments = Collections.emptyList();
-    Method method =
-        Method.builder()
-            .setName("simplePagedMethod")
-            .setMethodSignatures(Arrays.asList(methodArguments))
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    Field responseField =
-        Field.builder()
-            .setName("response")
-            .setType(
-                TypeNode.withReference(
-                    ConcreteReference.builder()
-                        .setClazz(List.class)
-                        .setGenerics(ConcreteReference.withClazz(String.class))
-                        .build()))
-            .setIsMessage(true)
-            .setIsRepeated(false)
-            .build();
-    Field nextPageToken =
-        Field.builder().setName("next_page_token").setType(TypeNode.STRING).build();
-    Message noRepeatedFieldMessage =
-        Message.builder()
-            .setName("PagedResponse")
-            .setFullProtoName("google.showcase.v1beta1.PagedResponse")
-            .setType(outputType)
-            .setFields(Arrays.asList(responseField, nextPageToken))
-            .build();
-    messageTypes.put("PagedResponse", noRepeatedFieldMessage);
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-                method, clientType, methodArguments, resourceNames, messageTypes));
-  }
-
-  // ===================================Unary LRO RPC Method Sample Code ======================//
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_lroUnaryRpcWithNoMethodArgument() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setLro(lro)
-            .setMethodSignatures(Collections.emptyList())
-            .build();
-
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            method, clientType, Collections.emptyList(), resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  WaitResponse response = echoClient.waitAsync().get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_lroRpcWithReturnResponseType() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    TypeNode ttlTypeNode =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build());
-    MethodArgument ttl =
-        MethodArgument.builder()
-            .setName("ttl")
-            .setType(ttlTypeNode)
-            .setField(
-                Field.builder()
-                    .setName("ttl")
-                    .setType(ttlTypeNode)
-                    .setIsMessage(true)
-                    .setIsContainedInOneof(true)
-                    .build())
-            .build();
-    List arguments = Arrays.asList(ttl);
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setLro(lro)
-            .setMethodSignatures(Arrays.asList(arguments))
-            .build();
-
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            method, clientType, arguments, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  Duration ttl = Duration.newBuilder().build();\n",
-            "  WaitResponse response = echoClient.waitAsync(ttl).get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeRpcMethodHeaderSampleCode_lroRpcWithReturnVoid() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    TypeNode ttlTypeNode =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Duration").setPakkage(PROTO_PACKAGE_NAME).build());
-    MethodArgument ttl =
-        MethodArgument.builder()
-            .setName("ttl")
-            .setType(ttlTypeNode)
-            .setField(
-                Field.builder()
-                    .setName("ttl")
-                    .setType(ttlTypeNode)
-                    .setIsMessage(true)
-                    .setIsContainedInOneof(true)
-                    .build())
-            .build();
-    List arguments = Arrays.asList(ttl);
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setLro(lro)
-            .setMethodSignatures(Arrays.asList(arguments))
-            .build();
-
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcMethodHeaderSampleCode(
-            method, clientType, arguments, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  Duration ttl = Duration.newBuilder().build();\n",
-            "  echoClient.waitAsync(ttl).get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  // ================================Unary RPC Default Method Sample Code ====================//
-  @Test
-  public void validComposeRpcDefaultMethodHeaderSampleCode_isPagedMethod() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedExpandRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedExpandResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("PagedExpand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setMethodSignatures(Collections.emptyList())
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcDefaultMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  PagedExpandRequest request =\n",
-            "      PagedExpandRequest.newBuilder()\n",
-            "          .setContent(\"content951530617\")\n",
-            "          .setPageSize(883849137)\n",
-            "          .setPageToken(\"pageToken873572522\")\n",
-            "          .build();\n",
-            "  for (EchoResponse element : echoClient.pagedExpand(request).iterateAll()) {\n",
-            "    // doThingsWith(element);\n",
-            "  }\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void invalidComposeRpcDefaultMethodHeaderSampleCode_isPagedMethod() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NotExistRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedExpandResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("PagedExpand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setMethodSignatures(Collections.emptyList())
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composeRpcDefaultMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-
-  @Test
-  public void validComposeRpcDefaultMethodHeaderSampleCode_hasLroMethodWithReturnResponse() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setMethodSignatures(Collections.emptyList())
-            .setLro(lro)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcDefaultMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
-            "  echoClient.waitAsync(request).get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeRpcDefaultMethodHeaderSampleCode_hasLroMethodWithReturnVoid() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setMethodSignatures(Collections.emptyList())
-            .setLro(lro)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcDefaultMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
-            "  WaitResponse response = echoClient.waitAsync(request).get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeRpcDefaultMethodHeaderSampleCode_pureUnaryReturnVoid() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
-    Method method =
-        Method.builder()
-            .setName("Echo")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setMethodSignatures(Collections.emptyList())
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcDefaultMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  EchoRequest request =\n",
-            "      EchoRequest.newBuilder()\n",
-            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setSeverity(Severity.forNumber(0))\n",
-            "          .setFoobar(Foobar.newBuilder().build())\n",
-            "          .build();\n",
-            "  echoClient.echo(request);\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeRpcDefaultMethodHeaderSampleCode_pureUnaryReturnResponse() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("Echo")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setMethodSignatures(Collections.emptyList())
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRpcDefaultMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  EchoRequest request =\n",
-            "      EchoRequest.newBuilder()\n",
-            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setSeverity(Severity.forNumber(0))\n",
-            "          .setFoobar(Foobar.newBuilder().build())\n",
-            "          .build();\n",
-            "  EchoResponse response = echoClient.echo(request);\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  // ================================LRO Callable Method Sample Code ====================//
-  @Test
-  public void validComposeLroCallableMethodHeaderSampleCode_withReturnResponse() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setLro(lro)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeLroCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
-            "  OperationFuture future =\n",
-            "      echoClient.waitOperationCallable().futureCall(request);\n",
-            "  // Do something.\n",
-            "  WaitResponse response = future.get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeLroCallableMethodHeaderSampleCode_withReturnVoid() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setLro(lro)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeLroCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
-            "  OperationFuture future =\n",
-            "      echoClient.waitOperationCallable().futureCall(request);\n",
-            "  // Do something.\n",
-            "  future.get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  // ================================Paged Callable Method Sample Code ====================//
-  @Test
-  public void validComposePagedCallableMethodHeaderSampleCode() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedExpandRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedExpandResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("PagedExpand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composePagedCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  PagedExpandRequest request =\n",
-            "      PagedExpandRequest.newBuilder()\n",
-            "          .setContent(\"content951530617\")\n",
-            "          .setPageSize(883849137)\n",
-            "          .setPageToken(\"pageToken873572522\")\n",
-            "          .build();\n",
-            "  ApiFuture future ="
-                + " echoClient.pagedExpandPagedCallable().futureCall(request);\n",
-            "  // Do something.\n",
-            "  for (EchoResponse element : future.get().iterateAll()) {\n",
-            "    // doThingsWith(element);\n",
-            "  }\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void invalidComposePagedCallableMethodHeaderSampleCode_inputTypeNotExistInMessage() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NotExistRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedExpandResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("PagedExpand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composePagedCallableMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-
-  @Test
-  public void invalidComposePagedCallableMethodHeaderSampleCode_noExistMethodResponse() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NoExistResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("PagedExpand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composePagedCallableMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-
-  @Test
-  public void invalidComposePagedCallableMethodHeaderSampleCode_noRepeatedResponse() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NoRepeatedResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("PagedExpand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    Field responseField = Field.builder().setName("response").setType(TypeNode.STRING).build();
-    Message noRepeatedResponseMessage =
-        Message.builder()
-            .setName("NoRepeatedResponse")
-            .setFullProtoName("google.showcase.v1beta1.NoRepeatedResponse")
-            .setType(
-                TypeNode.withReference(
-                    VaporReference.builder()
-                        .setName("NoRepeatedResponse")
-                        .setPakkage(SHOWCASE_PACKAGE_NAME)
-                        .build()))
-            .setFields(Arrays.asList(responseField))
-            .build();
-    messageTypes.put("NoRepeatedResponse", noRepeatedResponseMessage);
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composePagedCallableMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-
-  // ==============================Stream Callable Method Sample Code ====================//
-  @Test
-  public void validComposeStreamCallableMethodHeaderSampleCode_serverStream() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("ExpandRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("Expand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setStream(Stream.SERVER)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeStreamCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  ExpandRequest request =\n",
-            "     "
-                + " ExpandRequest.newBuilder().setContent(\"content951530617\").setInfo(\"info3237038\").build();\n",
-            "  ServerStream stream = echoClient.expandCallable().call(request);\n",
-            "  for (EchoResponse response : stream) {\n",
-            "    // Do something when a response is received.\n",
-            "  }\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void invalidComposeStreamCallableMethodHeaderSampleCode_serverStreamNotExistRequest() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NotExistRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("Expand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setStream(Stream.SERVER)
-            .build();
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composeStreamCallableMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-
-  @Test
-  public void validComposeStreamCallableMethodHeaderSampleCode_bidiStream() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("chat")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setStream(Stream.BIDI)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeStreamCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  BidiStream bidiStream ="
-                + " echoClient.chatCallable().call();\n",
-            "  EchoRequest request =\n",
-            "      EchoRequest.newBuilder()\n",
-            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setSeverity(Severity.forNumber(0))\n",
-            "          .setFoobar(Foobar.newBuilder().build())\n",
-            "          .build();\n",
-            "  bidiStream.send(request);\n",
-            "  for (EchoResponse response : bidiStream) {\n",
-            "    // Do something when a response is received.\n",
-            "  }\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void invalidComposeStreamCallableMethodHeaderSampleCode_bidiStreamNotExistRequest() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NotExistRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("chat")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setStream(Stream.BIDI)
-            .build();
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composeStreamCallableMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-
-  @Test
-  public void validComposeStreamCallableMethodHeaderSampleCode_clientStream() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("Collect")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setStream(Stream.CLIENT)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeStreamCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  ApiStreamObserver responseObserver =\n",
-            "      new ApiStreamObserver() {\n",
-            "        {@literal @}Override\n",
-            "        public void onNext(EchoResponse response) {\n",
-            "          // Do something when a response is received.\n",
-            "        }\n",
-            "\n",
-            "        {@literal @}Override\n",
-            "        public void onError(Throwable t) {\n",
-            "          // Add error-handling\n",
-            "        }\n",
-            "\n",
-            "        {@literal @}Override\n",
-            "        public void onCompleted() {\n",
-            "          // Do something when complete.\n",
-            "        }\n",
-            "      };\n",
-            "  ApiStreamObserver requestObserver =\n",
-            "      echoClient.collect().clientStreamingCall(responseObserver);\n",
-            "  EchoRequest request =\n",
-            "      EchoRequest.newBuilder()\n",
-            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setSeverity(Severity.forNumber(0))\n",
-            "          .setFoobar(Foobar.newBuilder().build())\n",
-            "          .build();\n",
-            "  requestObserver.onNext(request);\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void invalidComposeStreamCallableMethodHeaderSampleCode_clientStreamNotExistRequest() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NotExistRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("Collect")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setStream(Stream.CLIENT)
-            .build();
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composeStreamCallableMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-
-  // ================================Regular Callable Method Sample Code ====================//
-  @Test
-  public void validComposeRegularCallableMethodHeaderSampleCode_unaryRpc() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder().setName("Echo").setInputType(inputType).setOutputType(outputType).build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  EchoRequest request =\n",
-            "      EchoRequest.newBuilder()\n",
-            "          .setName(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setParent(FoobarName.ofProjectFoobarName(\"[PROJECT]\","
-                + " \"[FOOBAR]\").toString())\n",
-            "          .setSeverity(Severity.forNumber(0))\n",
-            "          .setFoobar(Foobar.newBuilder().build())\n",
-            "          .build();\n",
-            "  ApiFuture future = echoClient.echoCallable().futureCall(request);\n",
-            "  // Do something.\n",
-            "  EchoResponse response = future.get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeRegularCallableMethodHeaderSampleCode_lroRpc() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setLro(lro)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
-            "  ApiFuture future = echoClient.waitCallable().futureCall(request);\n",
-            "  // Do something.\n",
-            "  Operation response = future.get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeRegularCallableMethodHeaderSampleCode_lroRpcWithReturnVoid() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Operation").setPakkage(LRO_PACKAGE_NAME).build());
-    TypeNode responseType =
-        TypeNode.withReference(
-            VaporReference.builder().setName("Empty").setPakkage(PROTO_PACKAGE_NAME).build());
-    TypeNode metadataType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("WaitMetadata")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    LongrunningOperation lro =
-        LongrunningOperation.builder()
-            .setResponseType(responseType)
-            .setMetadataType(metadataType)
-            .build();
-    Method method =
-        Method.builder()
-            .setName("Wait")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setLro(lro)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  WaitRequest request = WaitRequest.newBuilder().build();\n",
-            "  ApiFuture future = echoClient.waitCallable().futureCall(request);\n",
-            "  // Do something.\n",
-            "  future.get();\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void validComposeRegularCallableMethodHeaderSampleCode_pageRpc() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedExpandRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("PagedExpandResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("PagedExpand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setMethodSignatures(Collections.emptyList())
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    String results =
-        ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
-            method, clientType, resourceNames, messageTypes);
-    String expected =
-        LineFormatter.lines(
-            "try (EchoClient echoClient = EchoClient.create()) {\n",
-            "  PagedExpandRequest request =\n",
-            "      PagedExpandRequest.newBuilder()\n",
-            "          .setContent(\"content951530617\")\n",
-            "          .setPageSize(883849137)\n",
-            "          .setPageToken(\"pageToken873572522\")\n",
-            "          .build();\n",
-            "  while (true) {\n",
-            "    PagedExpandResponse response = echoClient.pagedExpandCallable().call(request);\n",
-            "    for (EchoResponse element : response.getResponsesList()) {\n",
-            "      // doThingsWith(element);\n",
-            "    }\n",
-            "    String nextPageToken = response.getNextPageToken();\n",
-            "    if (!Strings.isNullOrEmpty(nextPageToken)) {\n",
-            "      request = request.toBuilder().setPageToken(nextPageToken).build();\n",
-            "    } else {\n",
-            "      break;\n",
-            "    }\n",
-            "  }\n",
-            "}");
-    assertEquals(results, expected);
-  }
-
-  @Test
-  public void invalidComposeRegularCallableMethodHeaderSampleCode_noExistMethodRequest() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NoExistRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder().setName("Echo").setInputType(inputType).setOutputType(outputType).build();
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-
-  @Test
-  public void invalidComposeRegularCallableMethodHeaderSampleCode_noExistMethodResponsePagedRpc() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NoExistResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("PagedExpand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-
-  @Test
-  public void invalidComposeRegularCallableMethodHeaderSampleCode_noRepeatedResponsePagedRpc() {
-    FileDescriptor echoFileDescriptor = EchoOuterClass.getDescriptor();
-    Map resourceNames = Parser.parseResourceNames(echoFileDescriptor);
-    Map messageTypes = Parser.parseMessages(echoFileDescriptor);
-    TypeNode clientType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoClient")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode inputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("EchoRequest")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    TypeNode outputType =
-        TypeNode.withReference(
-            VaporReference.builder()
-                .setName("NoRepeatedResponse")
-                .setPakkage(SHOWCASE_PACKAGE_NAME)
-                .build());
-    Method method =
-        Method.builder()
-            .setName("PagedExpand")
-            .setInputType(inputType)
-            .setOutputType(outputType)
-            .setPageSizeFieldName(PAGINATED_FIELD_NAME)
-            .build();
-    Field responseField = Field.builder().setName("response").setType(TypeNode.STRING).build();
-    Message noRepeatedResponseMessage =
-        Message.builder()
-            .setName("NoRepeatedResponse")
-            .setFullProtoName("google.showcase.v1beta1.NoRepeatedResponse")
-            .setType(
-                TypeNode.withReference(
-                    VaporReference.builder()
-                        .setName("NoRepeatedResponse")
-                        .setPakkage(SHOWCASE_PACKAGE_NAME)
-                        .build()))
-            .setFields(Arrays.asList(responseField))
-            .build();
-    messageTypes.put("NoRepeatedResponse", noRepeatedResponseMessage);
-    assertThrows(
-        NullPointerException.class,
-        () ->
-            ServiceClientSampleCodeComposer.composeRegularCallableMethodHeaderSampleCode(
-                method, clientType, resourceNames, messageTypes));
-  }
-}