Skip to content

Commit 720fa1e

Browse files
committed
Merge remote-tracking branch 'origin/main' into observability/tracing/attribute-coverage
2 parents cd93bbc + 0a46c0b commit 720fa1e

File tree

19 files changed

+530
-136
lines changed

19 files changed

+530
-136
lines changed

.github/workflows/ci.yaml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,33 @@ on:
2020
pull_request:
2121
name: ci
2222
jobs:
23+
# detect whether or note we should run "bulk" (non-handwritten) unit tests
24+
bulk-filter:
25+
runs-on: ubuntu-latest
26+
permissions:
27+
pull-requests: read
28+
# Set job outputs to values from filter step
29+
outputs:
30+
src: ${{ steps.filter.outputs.src }}
31+
ci: ${{ steps.filter.outputs.ci }}
32+
steps:
33+
- uses: actions/checkout@v4
34+
- uses: dorny/paths-filter@v3
35+
id: filter
36+
with:
37+
# we want to run tests if source code is changed or the scripts
38+
# used to run the unit tests
39+
filters: |
40+
src:
41+
- '**/*.java'
42+
- '**/pom.xml'
43+
ci:
44+
- '.github/workflows/ci.yaml'
45+
- '.kokoro/**'
46+
# these unit tests are "bulk" (non-handwritten) libraries
2347
units:
2448
runs-on: ubuntu-latest
49+
needs: bulk-filter
2550
strategy:
2651
fail-fast: false
2752
matrix:
@@ -42,11 +67,13 @@ jobs:
4267
path: ~/.m2/repository
4368
key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.week_of_year }}
4469
- run: .kokoro/build.sh
70+
if: ${{ needs.bulk-filter.outputs.src == 'true' || needs.bulk-filter.outputs.ci == 'true' }}
4571
env:
4672
JOB_TYPE: test
4773
JOB_NAME: units-${{matrix.java}}
4874
units-8-runtime:
4975
runs-on: ubuntu-latest
76+
needs: bulk-filter
5077
name: "units (8)"
5178
steps:
5279
- name: Get current week within the year
@@ -73,6 +100,7 @@ jobs:
73100
path: ~/.m2/repository
74101
key: ${{ runner.os }}-maven-unified-${{ steps.date.outputs.week_of_year }}
75102
- run: .kokoro/build.sh
103+
if: ${{ needs.bulk-filter.outputs.src == 'true' || needs.bulk-filter.outputs.ci == 'true' }}
76104
shell: bash
77105
env:
78106
JOB_TYPE: test

java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/BigQueryTelemetryTracer.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,8 @@ public final class BigQueryTelemetryTracer {
3232
private BigQueryTelemetryTracer() {}
3333

3434
public static final String BQ_GCP_CLIENT_SERVICE = "bigquery";
35-
public static final String BQ_GCP_CLIENT_REPO = "googleapis/java-bigquery";
35+
public static final String BQ_GCP_CLIENT_REPO = "googleapis/google-cloud-java";
3636
public static final String BQ_GCP_CLIENT_ARTIFACT = "google-cloud-bigquery";
37-
public static final String BQ_GCP_CLIENT_LANGUAGE = "java";
3837

3938
// TODO: migrate to use gax attributes keys
4039
// https://github.com/googleapis/google-cloud-java/issues/12099
@@ -47,8 +46,6 @@ private BigQueryTelemetryTracer() {}
4746
AttributeKey.stringKey("gcp.client.repo");
4847
public static final AttributeKey<String> GCP_CLIENT_ARTIFACT =
4948
AttributeKey.stringKey("gcp.client.artifact");
50-
public static final AttributeKey<String> GCP_CLIENT_LANGUAGE =
51-
AttributeKey.stringKey("gcp.client.language");
5249
public static final AttributeKey<String> GCP_RESOURCE_DESTINATION_ID =
5350
AttributeKey.stringKey("gcp.resource.destination.id");
5451
public static final AttributeKey<String> RPC_SYSTEM_NAME =
@@ -61,18 +58,13 @@ private BigQueryTelemetryTracer() {}
6158
public static final AttributeKey<String> STATUS_MESSAGE =
6259
AttributeKey.stringKey("status.message");
6360

64-
// Common Server Attributes
65-
public static final AttributeKey<String> SERVER_ADDRESS =
66-
AttributeKey.stringKey("server.address");
67-
public static final AttributeKey<Long> SERVER_PORT = AttributeKey.longKey("server.port");
6861
public static final AttributeKey<String> URL_TEMPLATE = AttributeKey.stringKey("url.template");
6962
public static final AttributeKey<String> URL_DOMAIN = AttributeKey.stringKey("url.domain");
7063

7164
public static void addCommonAttributeToSpan(Span span) {
7265
span.setAttribute(GCP_CLIENT_SERVICE, BQ_GCP_CLIENT_SERVICE)
7366
.setAttribute(GCP_CLIENT_REPO, BQ_GCP_CLIENT_REPO)
7467
.setAttribute(GCP_CLIENT_ARTIFACT, BQ_GCP_CLIENT_ARTIFACT)
75-
.setAttribute(GCP_CLIENT_LANGUAGE, BQ_GCP_CLIENT_LANGUAGE)
7668
.setAttribute(GCP_CLIENT_VERSION, Version.VERSION);
7769
}
7870

java-bigquery/google-cloud-bigquery/src/main/java/com/google/cloud/bigquery/telemetry/HttpTracingRequestInitializer.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public class HttpTracingRequestInitializer implements HttpRequestInitializer {
5151
AttributeKey.longKey("http.request.body.size");
5252
public static final AttributeKey<Long> HTTP_RESPONSE_BODY_SIZE =
5353
AttributeKey.longKey("http.response.body.size");
54+
public static final AttributeKey<String> SERVER_ADDRESS =
55+
AttributeKey.stringKey("server.address");
56+
public static final AttributeKey<Long> SERVER_PORT = AttributeKey.longKey("server.port");
5457

5558
@VisibleForTesting public static final String HTTP_RPC_SYSTEM_NAME = "http";
5659

@@ -119,10 +122,10 @@ private void addInitialHttpAttributesToSpan(Span span, HttpRequest request) {
119122
BigQueryTelemetryTracer.addCommonAttributeToSpan(span);
120123
span.setAttribute(BigQueryTelemetryTracer.RPC_SYSTEM_NAME, HTTP_RPC_SYSTEM_NAME);
121124
String host = request.getUrl().getHost();
122-
span.setAttribute(BigQueryTelemetryTracer.SERVER_ADDRESS, host);
125+
span.setAttribute(SERVER_ADDRESS, host);
123126
int port = request.getUrl().getPort();
124127
if (port > 0) {
125-
span.setAttribute(BigQueryTelemetryTracer.SERVER_PORT, (long) port);
128+
span.setAttribute(SERVER_PORT, (long) port);
126129
}
127130
span.setAttribute(URL_FULL, getSanitizedUrl(request));
128131
}

java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/it/ITOpenTelemetryTest.java

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static org.junit.jupiter.api.Assertions.assertEquals;
2020
import static org.junit.jupiter.api.Assertions.assertFalse;
2121
import static org.junit.jupiter.api.Assertions.assertNotNull;
22+
import static org.junit.jupiter.api.Assertions.assertNull;
2223
import static org.junit.jupiter.api.Assertions.assertTrue;
2324
import static org.junit.jupiter.api.Assertions.fail;
2425

@@ -30,11 +31,13 @@
3031
import com.google.cloud.bigquery.testing.RemoteBigQueryHelper;
3132
import io.opentelemetry.api.OpenTelemetry;
3233
import io.opentelemetry.api.common.AttributeKey;
34+
import io.opentelemetry.api.trace.SpanKind;
3335
import io.opentelemetry.api.trace.Tracer;
3436
import io.opentelemetry.sdk.OpenTelemetrySdk;
3537
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
3638
import io.opentelemetry.sdk.trace.SdkTracerProvider;
3739
import io.opentelemetry.sdk.trace.data.SpanData;
40+
import io.opentelemetry.sdk.trace.data.StatusData;
3841
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
3942
import java.io.IOException;
4043
import java.util.List;
@@ -86,12 +89,15 @@ public void testListDatasetsTraced() {
8689
for (SpanData span : spans) {
8790
if (span.getName().equals("com.google.cloud.bigquery.BigQueryRpc.listDatasets")) {
8891
foundRpcSpan = true;
92+
assertEquals(SpanKind.CLIENT, span.getKind());
93+
assertEquals(StatusData.unset(), span.getStatus());
8994
Map<AttributeKey<?>, Object> attrs = span.getAttributes().asMap();
9095
checkGeneralAttributes(attrs);
9196
assertEquals("GET", attrs.get(HttpTracingRequestInitializer.HTTP_REQUEST_METHOD));
9297
assertEquals("DatasetService", attrs.get(AttributeKey.stringKey("bq.rpc.service")));
9398
assertEquals("ListDatasets", attrs.get(AttributeKey.stringKey("bq.rpc.method")));
94-
assertEquals("bigquery.googleapis.com", attrs.get(BigQueryTelemetryTracer.SERVER_ADDRESS));
99+
assertEquals(
100+
"bigquery.googleapis.com", attrs.get(HttpTracingRequestInitializer.SERVER_ADDRESS));
95101
assertEquals(200L, attrs.get(HttpTracingRequestInitializer.HTTP_RESPONSE_STATUS_CODE));
96102
assertEquals("bigquery.googleapis.com", attrs.get(BigQueryTelemetryTracer.URL_DOMAIN));
97103
assertEquals(
@@ -102,6 +108,10 @@ public void testListDatasetsTraced() {
102108
attrs.get(BigQueryTelemetryTracer.GCP_RESOURCE_DESTINATION_ID));
103109
assertEquals(
104110
"projects/{+projectId}/datasets", attrs.get(BigQueryTelemetryTracer.URL_TEMPLATE));
111+
assertNull(attrs.get(BigQueryTelemetryTracer.STATUS_MESSAGE));
112+
assertNull(attrs.get(BigQueryTelemetryTracer.ERROR_TYPE));
113+
assertNull(attrs.get(BigQueryTelemetryTracer.EXCEPTION_TYPE));
114+
assertNull(attrs.get(HttpTracingRequestInitializer.HTTP_REQUEST_RESEND_COUNT));
105115
}
106116
}
107117
assertTrue(foundRpcSpan, "Expected to find BigQueryRpc.listDatasets span");
@@ -126,6 +136,8 @@ public void testGetDatasetNotFoundTraced() {
126136
for (SpanData span : spans) {
127137
if (span.getName().equals("com.google.cloud.bigquery.BigQueryRpc.getDataset")) {
128138
foundRpcSpan = true;
139+
assertEquals(SpanKind.CLIENT, span.getKind());
140+
assertEquals(StatusData.error(), span.getStatus());
129141
Map<AttributeKey<?>, Object> attrs = span.getAttributes().asMap();
130142
checkGeneralAttributes(attrs);
131143
assertEquals("GET", attrs.get(HttpTracingRequestInitializer.HTTP_REQUEST_METHOD));
@@ -138,7 +150,8 @@ public void testGetDatasetNotFoundTraced() {
138150
assertEquals(
139151
"https://bigquery.googleapis.com/bigquery/v2/projects/gcloud-devel/datasets/non_existent_dataset?prettyPrint=false",
140152
attrs.get(HttpTracingRequestInitializer.URL_FULL));
141-
assertEquals("bigquery.googleapis.com", attrs.get(BigQueryTelemetryTracer.SERVER_ADDRESS));
153+
assertEquals(
154+
"bigquery.googleapis.com", attrs.get(HttpTracingRequestInitializer.SERVER_ADDRESS));
142155
assertEquals("bigquery.googleapis.com", attrs.get(BigQueryTelemetryTracer.URL_DOMAIN));
143156
assertEquals(
144157
"//bigquery.googleapis.com/projects/gcloud-devel/datasets/non_existent_dataset",
@@ -155,7 +168,7 @@ public void testGetDatasetNotFoundTraced() {
155168
}
156169

157170
@Test
158-
public void testConnectionErrorRetriesTraced() {
171+
public void testClientErrorAndRetriesTraced() {
159172
// Pass invalid host to force connection error and retries
160173
BigQuery bq =
161174
bigqueryHelper.getOptions().toBuilder()
@@ -181,14 +194,16 @@ public void testConnectionErrorRetriesTraced() {
181194
for (SpanData span : spans) {
182195
if (span.getName().equals("com.google.cloud.bigquery.BigQueryRpc.listDatasets")) {
183196
rpcSpanCount++;
197+
assertEquals(SpanKind.CLIENT, span.getKind());
198+
assertEquals(StatusData.error().getStatusCode(), span.getStatus().getStatusCode());
184199
Map<AttributeKey<?>, Object> attrs = span.getAttributes().asMap();
185200
checkGeneralAttributes(attrs);
186201
assertEquals(
187202
"https://invalid-host-name-12345.com:8080/bigquery/v2/projects/gcloud-devel/datasets?prettyPrint=false",
188203
(String) attrs.get(HttpTracingRequestInitializer.URL_FULL));
189204
assertEquals(
190-
"invalid-host-name-12345.com", attrs.get(BigQueryTelemetryTracer.SERVER_ADDRESS));
191-
assertEquals(8080L, attrs.get(BigQueryTelemetryTracer.SERVER_PORT));
205+
"invalid-host-name-12345.com", attrs.get(HttpTracingRequestInitializer.SERVER_ADDRESS));
206+
assertEquals(8080L, attrs.get(HttpTracingRequestInitializer.SERVER_PORT));
192207
assertEquals("invalid-host-name-12345.com", attrs.get(BigQueryTelemetryTracer.URL_DOMAIN));
193208
assertEquals(
194209
"projects/{+projectId}/datasets", attrs.get(BigQueryTelemetryTracer.URL_TEMPLATE));
@@ -254,11 +269,26 @@ public void testSimultaneousCallsDoNotAffectResendCountForEachother() {
254269
assertEquals(5, cancelJobSpanCount, "Expected 5 attempts total for cancelJob call");
255270
}
256271

272+
@Test
273+
public void testTracingDisabledNoSpansCollected() {
274+
BigQuery bq =
275+
bigqueryHelper.getOptions().toBuilder()
276+
.setEnableOpenTelemetryTracing(false)
277+
.setOpenTelemetryTracer(tracer)
278+
.build()
279+
.getService();
280+
281+
bq.listDatasets();
282+
283+
List<SpanData> spans = memoryExporter.getFinishedSpanItems();
284+
assertTrue(spans.isEmpty(), "Expected no spans to be collected when tracing is disabled");
285+
}
286+
257287
private static void checkRetryAttribute(SpanData span, int listDataSpanCount) {
258288
Map<AttributeKey<?>, Object> attrs = span.getAttributes().asMap();
259289
Long resendCount = (Long) attrs.get(HttpTracingRequestInitializer.HTTP_REQUEST_RESEND_COUNT);
260290
if (listDataSpanCount == 1) {
261-
assertTrue(resendCount == null || resendCount == 0);
291+
assertNull(resendCount, "Expected no resend count for first attempt");
262292
} else {
263293
assertNotNull(resendCount, "Expected resend count for retry attempt " + listDataSpanCount);
264294
assertEquals((long) (listDataSpanCount - 1), resendCount.longValue());
@@ -275,9 +305,6 @@ private void checkGeneralAttributes(Map<AttributeKey<?>, Object> attrs) {
275305
assertEquals(
276306
BigQueryTelemetryTracer.BQ_GCP_CLIENT_REPO,
277307
attrs.get(BigQueryTelemetryTracer.GCP_CLIENT_REPO));
278-
assertEquals(
279-
BigQueryTelemetryTracer.BQ_GCP_CLIENT_LANGUAGE,
280-
attrs.get(BigQueryTelemetryTracer.GCP_CLIENT_LANGUAGE));
281308
assertEquals(
282309
BigQueryTelemetryTracer.BQ_GCP_CLIENT_ARTIFACT,
283310
attrs.get(BigQueryTelemetryTracer.GCP_CLIENT_ARTIFACT));

java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/telemetry/BigQueryTelemetryTracerTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,6 @@ public void testAddCommonAttributeToSpan() {
181181
assertEquals(
182182
BigQueryTelemetryTracer.BQ_GCP_CLIENT_ARTIFACT,
183183
spanData.getAttributes().get(BigQueryTelemetryTracer.GCP_CLIENT_ARTIFACT));
184-
assertEquals(
185-
BigQueryTelemetryTracer.BQ_GCP_CLIENT_LANGUAGE,
186-
spanData.getAttributes().get(BigQueryTelemetryTracer.GCP_CLIENT_LANGUAGE));
187184
assertEquals(
188185
Version.VERSION, spanData.getAttributes().get(BigQueryTelemetryTracer.GCP_CLIENT_VERSION));
189186
}

java-bigquery/google-cloud-bigquery/src/test/java/com/google/cloud/bigquery/telemetry/HttpTracingRequestInitializerTest.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -435,8 +435,9 @@ private void closeAndVerifySpanData(
435435
assertEquals(1, spans.size());
436436
SpanData span = spans.get(0);
437437
assertEquals(SPAN_NAME, span.getName());
438-
assertEquals(BIGQUERY_DOMAIN, span.getAttributes().get(BigQueryTelemetryTracer.SERVER_ADDRESS));
439-
assertEquals(443, span.getAttributes().get(BigQueryTelemetryTracer.SERVER_PORT));
438+
assertEquals(
439+
BIGQUERY_DOMAIN, span.getAttributes().get(HttpTracingRequestInitializer.SERVER_ADDRESS));
440+
assertEquals(443, span.getAttributes().get(HttpTracingRequestInitializer.SERVER_PORT));
440441
assertEquals(
441442
BigQueryTelemetryTracer.BQ_GCP_CLIENT_SERVICE,
442443
span.getAttributes().get(BigQueryTelemetryTracer.GCP_CLIENT_SERVICE));
@@ -446,9 +447,6 @@ private void closeAndVerifySpanData(
446447
assertEquals(
447448
BigQueryTelemetryTracer.BQ_GCP_CLIENT_ARTIFACT,
448449
span.getAttributes().get(BigQueryTelemetryTracer.GCP_CLIENT_ARTIFACT));
449-
assertEquals(
450-
BigQueryTelemetryTracer.BQ_GCP_CLIENT_LANGUAGE,
451-
span.getAttributes().get(BigQueryTelemetryTracer.GCP_CLIENT_LANGUAGE));
452450
assertEquals(
453451
HttpTracingRequestInitializer.HTTP_RPC_SYSTEM_NAME,
454452
span.getAttributes().get(BigQueryTelemetryTracer.RPC_SYSTEM_NAME));

release-please-config.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@
88
"packages": {
99
".": {
1010
"extra-files": [
11+
{
12+
"type": "generic",
13+
"path": "java-*/**/Version.java",
14+
"glob": true
15+
},
16+
{
17+
"type": "generic",
18+
"path": "sdk-platform-java/java-showcase*/Version.java",
19+
"glob": true
20+
},
1121
".github/workflows/generated_files_sync.yaml",
1222
".github/workflows/hermetic_library_generation.yaml",
1323
"sdk-platform-java/WORKSPACE",

sdk-platform-java/DEVELOPMENT.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Development Setup
2+
3+
You need Java 11 or higher to run the build. The build produces Java 8-compatible
4+
bytecode.
5+
6+
Install [`bazelisk`](https://github.com/bazelbuild/bazelisk) in your `PATH`
7+
for gapic-generator-java's Bazel build.
8+
9+
## Set Up
10+
11+
1. Clone this repo.
12+
13+
2. (OPTIONAL) Copy the Git pre-commit hooks. This will automatically check the build, run
14+
tests, and perform linting before each commit. (Symlinks don't seem to work,
15+
but if you find a way, please add it here!)
16+
17+
```sh
18+
cp .githooks/pre-commit .git/hooks/pre-commit
19+
```
20+
21+
## Run Tests for All Modules
22+
23+
- Run all unit tests in all modules.
24+
25+
```sh
26+
mvn install
27+
```
28+
29+
## Code Formatting
30+
31+
- Run linter checks without actually doing the formatting.
32+
33+
```sh
34+
mvn fmt:check
35+
```
36+
37+
- Format files.
38+
39+
```sh
40+
mvn fmt:format
41+
```
42+
43+
## Testing guide
44+
There are 4 layers of testing in this repo:
45+
1. Traditional unit tests. These tests usually focus on testing one very specific test case at a time. For example, [MethodTest](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/gapic-generator-java/src/test/java/com/google/api/generator/gapic/model/MethodTest.java)
46+
2. Golden unit tests. These tests start with a test proto, we create different test cases in the proto, load the proto in unit tests and save the generated file as golden files. For example, [routing header proto](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/gapic-generator-java/src/test/proto/explicit_dynamic_routing_header_testing.proto) -> Load in the [unit test](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/GrpcServiceStubClassComposerTest.java#L56-L64) -> Saved as [golden](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/gapic-generator-java/src/test/java/com/google/api/generator/gapic/composer/grpc/goldens/GrpcRoutingHeadersStub.golden)
47+
3. Showcase integration tests. They test the generated library's behavior against a mock server, see [README.md](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/java-showcase/README.md) of showcase module for details.
48+
4. Golden integration tests. These tests generate a full client library with real protos from googleapis, for example, golden integration tests for [compute](https://github.com/googleapis/sdk-platform-java/tree/main/test/integration/goldens/compute). However, we _should_ stop adding new ones, and rely on golden unit tests and showcase tests.
49+
50+
Based on where the code changes are, we should add different tests, in general
51+
52+
- If the changes are in `gax` or `api-common` only, you _must_ add traditional unit tests, you _may_ add showcase integration tests if you are modifying a public setting.
53+
- If the changes are in `gapic-generator-java` only, showcase integration tests are most likely not needed
54+
- If they are in the `composer` module, you _must_ add golden unit tests, you _may_ add traditional unit tests for better coverage and easier testing.
55+
- If they are in the `parser` module, you _should_ add traditional unit tests with a test proto if possible, you _may_ add golden unit tests to easily see the changes. For example, [routing_rule_parser_testing](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/gapic-generator-java/src/test/proto/routing_rule_parser_testing.proto) that is only used for testing [RoutingRuleParser](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/gapic-generator-java/src/main/java/com/google/api/generator/gapic/protoparser/RoutingRuleParser.java).
56+
- If they are in `other modules(ast, model, writer etc.)`, you _must_ add traditional unit tests, you _may_ add golden unit tests to easily see the changes.
57+
- If the changes are in both `gax` and `gapic-generator-java`, you _must_ add all test layers, including traditional unit tests, golden unit tests and showcase integration tests.
58+
59+
### How to run tests?
60+
61+
See the [Unit Tests](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/gapic-generator-java/DEVELOPMENT.md#unit-tests) section in gapic-generator-java/DEVELOPMENT.md for how to run traditional and golden unit tests.
62+
63+
See [Running the Integration Tests](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/java-showcase/README.md#running-the-integration-tests) and [Update the Golden Showcase Files](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/java-showcase/README.md#update-the-golden-showcase-files) sections in java-showcase/README.md for how to run and update showcase integration tests.
64+
65+
See the [Integration Tests](https://github.com/googleapis/google-cloud-java/blob/main/sdk-platform-java/gapic-generator-java/DEVELOPMENT.md#integration-tests) section in gapic-generator-java/DEVELOPMENT.md for how to run golden integration tests.
66+

0 commit comments

Comments
 (0)