Skip to content

Commit b5e0d4b

Browse files
chore(tests): re-enable cover tests (#17454)
The cover CI test was silently failing open. This PR re-enables it Fixes #17456
1 parent 0aff09d commit b5e0d4b

22 files changed

Lines changed: 562 additions & 12 deletions

File tree

.github/workflows/unittest.yml

Lines changed: 87 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636
python -m pip install nox
3737
- name: Run unit tests
3838
env:
39-
COVERAGE_FILE: .coverage-${{ matrix.python }}
39+
COVERAGE_FILE: ${{ github.workspace }}/.coverage-${{ matrix.python }}
4040
BUILD_TYPE: presubmit
4141
TARGET_BRANCH: ${{ github.base_ref || github.event.merge_group.base_ref }}
4242
TEST_TYPE: unit
@@ -46,8 +46,9 @@ jobs:
4646
- name: Upload coverage results
4747
uses: actions/upload-artifact@v4
4848
with:
49-
name: coverage-artifact-${{ '{{' }} matrix.python {{ '}}' }}
49+
name: coverage-artifact-${{ matrix.python }}
5050
path: .coverage-${{ matrix.python }}
51+
include-hidden-files: true
5152

5253
cover:
5354
runs-on: ubuntu-latest
@@ -67,20 +68,97 @@ jobs:
6768
python-version: "3.10"
6869
- name: Set number of files changes in packages directory
6970
id: packages
70-
run: echo "::set-output name=num_files_changed::$(git diff HEAD~1 -- packages | wc -l)"
71+
run: |
72+
git diff HEAD~1 -- packages > /dev/null
73+
num_files_changed=$(git diff HEAD~1 -- packages | wc -l | tr -d ' ')
74+
echo "num_files_changed=${num_files_changed}" >> "$GITHUB_OUTPUT"
7175
- name: Install coverage
72-
if: steps.packages.num_files_changed > 0
76+
if: ${{ steps.packages.outputs.num_files_changed > 0 }}
7377
run: |
7478
python -m pip install --upgrade setuptools pip wheel
7579
python -m pip install coverage
7680
- name: Download coverage results
77-
if: ${{ steps.date.packages.num_files_changed > 0 }}
81+
if: ${{ steps.packages.outputs.num_files_changed > 0 }}
7882
uses: actions/download-artifact@v4
7983
with:
8084
path: .coverage-results/
8185
- name: Report coverage results
82-
if: ${{ steps.date.packages.num_files_changed > 0 }}
86+
if: ${{ steps.packages.outputs.num_files_changed > 0 }}
87+
env:
88+
# TODO: default to 100% coverage after next gapic-generator release
89+
# https://github.com/googleapis/google-cloud-python/issues/17459
90+
DEFAULT_FAIL_UNDER: 99
8391
run: |
84-
find .coverage-results -type f -name '*.zip' -exec unzip {} \;
85-
coverage combine .coverage-results/**/.coverage*
86-
coverage report --show-missing --fail-under=100
92+
if [ -d .coverage-results ]; then
93+
# Unzip any zipped coverage results
94+
find .coverage-results -type f -name '*.zip' -exec unzip -o {} \;
95+
96+
# Find all coverage files and combine them.
97+
# We find files starting with .coverage (excluding .coveragerc files and templates)
98+
coverage_files=$(find .coverage-results . -type f -name '.coverage*' ! -name '.coveragerc*')
99+
if [ -n "${coverage_files}" ]; then
100+
coverage combine ${coverage_files}
101+
else
102+
echo "Error: No coverage files found to combine."
103+
exit 1
104+
fi
105+
106+
# Find all modified packages
107+
modified_packages=$(git diff --name-only HEAD~1 -- packages | cut -d/ -f1,2 | sort -u)
108+
109+
failed_packages=()
110+
passed_packages=()
111+
112+
for pkg in ${modified_packages}; do
113+
if [ -d "${pkg}" ]; then
114+
echo "============================================================"
115+
echo "Evaluating coverage for package: ${pkg}"
116+
echo "============================================================"
117+
118+
set +e
119+
if [ -f "${pkg}/.coveragerc" ]; then
120+
echo "Using package-specific configuration: ${pkg}/.coveragerc"
121+
# If fail_under is specified in the package-specific .coveragerc, coverage report
122+
# will automatically enforce it. Otherwise, we enforce the default.
123+
if grep -q "fail_under" "${pkg}/.coveragerc"; then
124+
coverage report --rcfile="${pkg}/.coveragerc" --include="${pkg}/**"
125+
else
126+
echo "No fail_under specified in ${pkg}/.coveragerc, enforcing default"
127+
coverage report --rcfile="${pkg}/.coveragerc" --include="${pkg}/**" --fail-under="${DEFAULT_FAIL_UNDER}"
128+
fi
129+
else
130+
echo "No .coveragerc found for ${pkg}, enforcing default"
131+
coverage report --include="${pkg}/**" --fail-under="${DEFAULT_FAIL_UNDER}"
132+
fi
133+
status=$?
134+
set -e
135+
136+
if [ ${status} -ne 0 ]; then
137+
failed_packages+=("${pkg}")
138+
else
139+
passed_packages+=("${pkg}")
140+
fi
141+
fi
142+
done
143+
144+
echo "============================================================"
145+
echo "Coverage Evaluation Summary"
146+
echo "============================================================"
147+
if [ ${#passed_packages[@]} -gt 0 ]; then
148+
echo "Passed packages:"
149+
for pkg in "${passed_packages[@]}"; do
150+
echo " - ${pkg}"
151+
done
152+
fi
153+
if [ ${#failed_packages[@]} -gt 0 ]; then
154+
echo "Failed packages:"
155+
for pkg in "${failed_packages[@]}"; do
156+
echo " - ${pkg}"
157+
done
158+
exit 1
159+
fi
160+
else
161+
echo "Error: No coverage results were downloaded from the unit test jobs."
162+
echo "This usually means the unit tests did not run or failed to upload their coverage files."
163+
exit 1
164+
fi

packages/gapic-generator/gapic/ads-templates/tests/unit/gapic/%name_%version/%sub/test_%service.py.j2

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -965,6 +965,9 @@ def test_{{ method_name }}_pager(transport_name: str = "grpc"):
965965
assert pager._retry == retry
966966
assert pager._timeout == timeout
967967

968+
assert pager.next_page_token == 'abc'
969+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
970+
968971
results = list(pager)
969972
assert len(results) == 6
970973
assert all(isinstance(i, {{ method.paged_result_field.type.ident }})
@@ -1738,6 +1741,9 @@ def test_{{ method_name }}_rest_pager(transport: str = 'rest'):
17381741

17391742
pager = client.{{ method_name }}(request=sample_request)
17401743

1744+
assert pager.next_page_token == 'abc'
1745+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
1746+
17411747
{% if method.paged_result_field.map %}
17421748
assert isinstance(pager.get('a'), {{ method.paged_result_field.type.fields.get('value').ident }})
17431749
assert pager.get('h') is None

packages/gapic-generator/gapic/templates/tests/unit/gapic/%name_%version/%sub/test_macros.j2

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,9 @@ def test_{{ method_name }}_pager(transport_name: str = "grpc"):
746746
assert pager._retry == retry
747747
assert pager._timeout == timeout
748748

749+
assert pager.next_page_token == 'abc'
750+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
751+
749752
results = list(pager)
750753
assert len(results) == 6
751754
{% if method.paged_result_field.type.ident|string == 'struct_pb2.ListValue' %}
@@ -902,6 +905,8 @@ async def test_{{ method_name }}_async_pager():
902905
)
903906
async_pager = await client.{{ method_name }}(request={},)
904907
assert async_pager.next_page_token == 'abc'
908+
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')
909+
905910
responses = []
906911
async for response in async_pager: # pragma: no branch
907912
responses.append(response)
@@ -1425,6 +1430,9 @@ def test_{{ method_name }}_rest_pager(transport: str = 'rest'):
14251430

14261431
pager = client.{{ method_name }}(request=sample_request)
14271432

1433+
assert pager.next_page_token == 'abc'
1434+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
1435+
14281436
{% if method.paged_result_field.map %}
14291437
assert isinstance(pager.get('a'), {{ method.paged_result_field.type.fields.get('value').ident }})
14301438
assert pager.get('h') is None

packages/gapic-generator/tests/integration/goldens/asset/tests/unit/gapic/asset_v1/test_asset_service.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1577,6 +1577,9 @@ def test_list_assets_pager(transport_name: str = "grpc"):
15771577
assert pager._retry == retry
15781578
assert pager._timeout == timeout
15791579

1580+
assert pager.next_page_token == 'abc'
1581+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
1582+
15801583
results = list(pager)
15811584
assert len(results) == 6
15821585
assert all(isinstance(i, assets.Asset)
@@ -1663,6 +1666,8 @@ async def test_list_assets_async_pager():
16631666
)
16641667
async_pager = await client.list_assets(request={},)
16651668
assert async_pager.next_page_token == 'abc'
1669+
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')
1670+
16661671
responses = []
16671672
async for response in async_pager: # pragma: no branch
16681673
responses.append(response)
@@ -3912,6 +3917,9 @@ def test_search_all_resources_pager(transport_name: str = "grpc"):
39123917
assert pager._retry == retry
39133918
assert pager._timeout == timeout
39143919

3920+
assert pager.next_page_token == 'abc'
3921+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
3922+
39153923
results = list(pager)
39163924
assert len(results) == 6
39173925
assert all(isinstance(i, assets.ResourceSearchResult)
@@ -3998,6 +4006,8 @@ async def test_search_all_resources_async_pager():
39984006
)
39994007
async_pager = await client.search_all_resources(request={},)
40004008
assert async_pager.next_page_token == 'abc'
4009+
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')
4010+
40014011
responses = []
40024012
async for response in async_pager: # pragma: no branch
40034013
responses.append(response)
@@ -4431,6 +4441,9 @@ def test_search_all_iam_policies_pager(transport_name: str = "grpc"):
44314441
assert pager._retry == retry
44324442
assert pager._timeout == timeout
44334443

4444+
assert pager.next_page_token == 'abc'
4445+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
4446+
44344447
results = list(pager)
44354448
assert len(results) == 6
44364449
assert all(isinstance(i, assets.IamPolicySearchResult)
@@ -4517,6 +4530,8 @@ async def test_search_all_iam_policies_async_pager():
45174530
)
45184531
async_pager = await client.search_all_iam_policies(request={},)
45194532
assert async_pager.next_page_token == 'abc'
4533+
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')
4534+
45204535
responses = []
45214536
async for response in async_pager: # pragma: no branch
45224537
responses.append(response)
@@ -6524,6 +6539,9 @@ def test_list_saved_queries_pager(transport_name: str = "grpc"):
65246539
assert pager._retry == retry
65256540
assert pager._timeout == timeout
65266541

6542+
assert pager.next_page_token == 'abc'
6543+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
6544+
65276545
results = list(pager)
65286546
assert len(results) == 6
65296547
assert all(isinstance(i, asset_service.SavedQuery)
@@ -6610,6 +6628,8 @@ async def test_list_saved_queries_async_pager():
66106628
)
66116629
async_pager = await client.list_saved_queries(request={},)
66126630
assert async_pager.next_page_token == 'abc'
6631+
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')
6632+
66136633
responses = []
66146634
async for response in async_pager: # pragma: no branch
66156635
responses.append(response)
@@ -7908,6 +7928,9 @@ def test_analyze_org_policies_pager(transport_name: str = "grpc"):
79087928
assert pager._retry == retry
79097929
assert pager._timeout == timeout
79107930

7931+
assert pager.next_page_token == 'abc'
7932+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
7933+
79117934
results = list(pager)
79127935
assert len(results) == 6
79137936
assert all(isinstance(i, asset_service.AnalyzeOrgPoliciesResponse.OrgPolicyResult)
@@ -7994,6 +8017,8 @@ async def test_analyze_org_policies_async_pager():
79948017
)
79958018
async_pager = await client.analyze_org_policies(request={},)
79968019
assert async_pager.next_page_token == 'abc'
8020+
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')
8021+
79978022
responses = []
79988023
async for response in async_pager: # pragma: no branch
79998024
responses.append(response)
@@ -8437,6 +8462,9 @@ def test_analyze_org_policy_governed_containers_pager(transport_name: str = "grp
84378462
assert pager._retry == retry
84388463
assert pager._timeout == timeout
84398464

8465+
assert pager.next_page_token == 'abc'
8466+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
8467+
84408468
results = list(pager)
84418469
assert len(results) == 6
84428470
assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedContainersResponse.GovernedContainer)
@@ -8523,6 +8551,8 @@ async def test_analyze_org_policy_governed_containers_async_pager():
85238551
)
85248552
async_pager = await client.analyze_org_policy_governed_containers(request={},)
85258553
assert async_pager.next_page_token == 'abc'
8554+
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')
8555+
85268556
responses = []
85278557
async for response in async_pager: # pragma: no branch
85288558
responses.append(response)
@@ -8966,6 +8996,9 @@ def test_analyze_org_policy_governed_assets_pager(transport_name: str = "grpc"):
89668996
assert pager._retry == retry
89678997
assert pager._timeout == timeout
89688998

8999+
assert pager.next_page_token == 'abc'
9000+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
9001+
89699002
results = list(pager)
89709003
assert len(results) == 6
89719004
assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedAssetsResponse.GovernedAsset)
@@ -9052,6 +9085,8 @@ async def test_analyze_org_policy_governed_assets_async_pager():
90529085
)
90539086
async_pager = await client.analyze_org_policy_governed_assets(request={},)
90549087
assert async_pager.next_page_token == 'abc'
9088+
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')
9089+
90559090
responses = []
90569091
async for response in async_pager: # pragma: no branch
90579092
responses.append(response)
@@ -9442,6 +9477,9 @@ def test_list_assets_rest_pager(transport: str = 'rest'):
94429477

94439478
pager = client.list_assets(request=sample_request)
94449479

9480+
assert pager.next_page_token == 'abc'
9481+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
9482+
94459483
results = list(pager)
94469484
assert len(results) == 6
94479485
assert all(isinstance(i, assets.Asset)
@@ -10616,6 +10654,9 @@ def test_search_all_resources_rest_pager(transport: str = 'rest'):
1061610654

1061710655
pager = client.search_all_resources(request=sample_request)
1061810656

10657+
assert pager.next_page_token == 'abc'
10658+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
10659+
1061910660
results = list(pager)
1062010661
assert len(results) == 6
1062110662
assert all(isinstance(i, assets.ResourceSearchResult)
@@ -10848,6 +10889,9 @@ def test_search_all_iam_policies_rest_pager(transport: str = 'rest'):
1084810889

1084910890
pager = client.search_all_iam_policies(request=sample_request)
1085010891

10892+
assert pager.next_page_token == 'abc'
10893+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
10894+
1085110895
results = list(pager)
1085210896
assert len(results) == 6
1085310897
assert all(isinstance(i, assets.IamPolicySearchResult)
@@ -11884,6 +11928,9 @@ def test_list_saved_queries_rest_pager(transport: str = 'rest'):
1188411928

1188511929
pager = client.list_saved_queries(request=sample_request)
1188611930

11931+
assert pager.next_page_token == 'abc'
11932+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
11933+
1188711934
results = list(pager)
1188811935
assert len(results) == 6
1188911936
assert all(isinstance(i, asset_service.SavedQuery)
@@ -12581,6 +12628,9 @@ def test_analyze_org_policies_rest_pager(transport: str = 'rest'):
1258112628

1258212629
pager = client.analyze_org_policies(request=sample_request)
1258312630

12631+
assert pager.next_page_token == 'abc'
12632+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
12633+
1258412634
results = list(pager)
1258512635
assert len(results) == 6
1258612636
assert all(isinstance(i, asset_service.AnalyzeOrgPoliciesResponse.OrgPolicyResult)
@@ -12826,6 +12876,9 @@ def test_analyze_org_policy_governed_containers_rest_pager(transport: str = 'res
1282612876

1282712877
pager = client.analyze_org_policy_governed_containers(request=sample_request)
1282812878

12879+
assert pager.next_page_token == 'abc'
12880+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
12881+
1282912882
results = list(pager)
1283012883
assert len(results) == 6
1283112884
assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedContainersResponse.GovernedContainer)
@@ -13071,6 +13124,9 @@ def test_analyze_org_policy_governed_assets_rest_pager(transport: str = 'rest'):
1307113124

1307213125
pager = client.analyze_org_policy_governed_assets(request=sample_request)
1307313126

13127+
assert pager.next_page_token == 'abc'
13128+
assert str(pager).startswith(f'{pager.__class__.__name__}<')
13129+
1307413130
results = list(pager)
1307513131
assert len(results) == 6
1307613132
assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedAssetsResponse.GovernedAsset)

0 commit comments

Comments
 (0)