Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 87 additions & 9 deletions .github/workflows/unittest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
python -m pip install nox
- name: Run unit tests
env:
COVERAGE_FILE: .coverage-${{ matrix.python }}
COVERAGE_FILE: ${{ github.workspace }}/.coverage-${{ matrix.python }}
BUILD_TYPE: presubmit
TARGET_BRANCH: ${{ github.base_ref || github.event.merge_group.base_ref }}
TEST_TYPE: unit
Expand All @@ -46,8 +46,9 @@ jobs:
- name: Upload coverage results
uses: actions/upload-artifact@v4
with:
name: coverage-artifact-${{ '{{' }} matrix.python {{ '}}' }}
name: coverage-artifact-${{ matrix.python }}
path: .coverage-${{ matrix.python }}
include-hidden-files: true

cover:
runs-on: ubuntu-latest
Expand All @@ -67,20 +68,97 @@ jobs:
python-version: "3.10"
- name: Set number of files changes in packages directory
id: packages
run: echo "::set-output name=num_files_changed::$(git diff HEAD~1 -- packages | wc -l)"
run: |
git diff HEAD~1 -- packages > /dev/null
num_files_changed=$(git diff HEAD~1 -- packages | wc -l | tr -d ' ')
echo "num_files_changed=${num_files_changed}" >> "$GITHUB_OUTPUT"
- name: Install coverage
if: steps.packages.num_files_changed > 0
if: ${{ steps.packages.outputs.num_files_changed > 0 }}
run: |
python -m pip install --upgrade setuptools pip wheel
python -m pip install coverage
- name: Download coverage results
if: ${{ steps.date.packages.num_files_changed > 0 }}
if: ${{ steps.packages.outputs.num_files_changed > 0 }}
uses: actions/download-artifact@v4
with:
path: .coverage-results/
- name: Report coverage results
if: ${{ steps.date.packages.num_files_changed > 0 }}
if: ${{ steps.packages.outputs.num_files_changed > 0 }}
env:
# TODO: default to 100% coverage after next gapic-generator release
# https://github.com/googleapis/google-cloud-python/issues/17459
DEFAULT_FAIL_UNDER: 99
run: |
find .coverage-results -type f -name '*.zip' -exec unzip {} \;
coverage combine .coverage-results/**/.coverage*
coverage report --show-missing --fail-under=100
if [ -d .coverage-results ]; then
# Unzip any zipped coverage results
find .coverage-results -type f -name '*.zip' -exec unzip -o {} \;

# Find all coverage files and combine them.
# We find files starting with .coverage (excluding .coveragerc files and templates)
coverage_files=$(find .coverage-results . -type f -name '.coverage*' ! -name '.coveragerc*')
if [ -n "${coverage_files}" ]; then
coverage combine ${coverage_files}
else
echo "Error: No coverage files found to combine."
exit 1
fi

# Find all modified packages
modified_packages=$(git diff --name-only HEAD~1 -- packages | cut -d/ -f1,2 | sort -u)

failed_packages=()
passed_packages=()

for pkg in ${modified_packages}; do
if [ -d "${pkg}" ]; then
echo "============================================================"
echo "Evaluating coverage for package: ${pkg}"
echo "============================================================"

set +e
if [ -f "${pkg}/.coveragerc" ]; then
echo "Using package-specific configuration: ${pkg}/.coveragerc"
# If fail_under is specified in the package-specific .coveragerc, coverage report
# will automatically enforce it. Otherwise, we enforce the default.
if grep -q "fail_under" "${pkg}/.coveragerc"; then
coverage report --rcfile="${pkg}/.coveragerc" --include="${pkg}/**"
else
echo "No fail_under specified in ${pkg}/.coveragerc, enforcing default"
coverage report --rcfile="${pkg}/.coveragerc" --include="${pkg}/**" --fail-under="${DEFAULT_FAIL_UNDER}"
fi
else
echo "No .coveragerc found for ${pkg}, enforcing default"
coverage report --include="${pkg}/**" --fail-under="${DEFAULT_FAIL_UNDER}"
fi
status=$?
set -e

if [ ${status} -ne 0 ]; then
failed_packages+=("${pkg}")
else
passed_packages+=("${pkg}")
fi
fi
done

echo "============================================================"
echo "Coverage Evaluation Summary"
echo "============================================================"
if [ ${#passed_packages[@]} -gt 0 ]; then
echo "Passed packages:"
for pkg in "${passed_packages[@]}"; do
echo " - ${pkg}"
done
fi
if [ ${#failed_packages[@]} -gt 0 ]; then
echo "Failed packages:"
for pkg in "${failed_packages[@]}"; do
echo " - ${pkg}"
done
exit 1
fi
else
echo "Error: No coverage results were downloaded from the unit test jobs."
echo "This usually means the unit tests did not run or failed to upload their coverage files."
exit 1
fi
Original file line number Diff line number Diff line change
Expand Up @@ -965,6 +965,9 @@ def test_{{ method_name }}_pager(transport_name: str = "grpc"):
assert pager._retry == retry
assert pager._timeout == timeout

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, {{ method.paged_result_field.type.ident }})
Expand Down Expand Up @@ -1738,6 +1741,9 @@ def test_{{ method_name }}_rest_pager(transport: str = 'rest'):

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

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

{% if method.paged_result_field.map %}
assert isinstance(pager.get('a'), {{ method.paged_result_field.type.fields.get('value').ident }})
assert pager.get('h') is None
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -746,6 +746,9 @@ def test_{{ method_name }}_pager(transport_name: str = "grpc"):
assert pager._retry == retry
assert pager._timeout == timeout

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
{% if method.paged_result_field.type.ident|string == 'struct_pb2.ListValue' %}
Expand Down Expand Up @@ -902,6 +905,8 @@ async def test_{{ method_name }}_async_pager():
)
async_pager = await client.{{ method_name }}(request={},)
assert async_pager.next_page_token == 'abc'
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')

responses = []
async for response in async_pager: # pragma: no branch
responses.append(response)
Expand Down Expand Up @@ -1425,6 +1430,9 @@ def test_{{ method_name }}_rest_pager(transport: str = 'rest'):

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

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

{% if method.paged_result_field.map %}
assert isinstance(pager.get('a'), {{ method.paged_result_field.type.fields.get('value').ident }})
assert pager.get('h') is None
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1577,6 +1577,9 @@ def test_list_assets_pager(transport_name: str = "grpc"):
assert pager._retry == retry
assert pager._timeout == timeout

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, assets.Asset)
Expand Down Expand Up @@ -1663,6 +1666,8 @@ async def test_list_assets_async_pager():
)
async_pager = await client.list_assets(request={},)
assert async_pager.next_page_token == 'abc'
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')

responses = []
async for response in async_pager: # pragma: no branch
responses.append(response)
Expand Down Expand Up @@ -3912,6 +3917,9 @@ def test_search_all_resources_pager(transport_name: str = "grpc"):
assert pager._retry == retry
assert pager._timeout == timeout

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, assets.ResourceSearchResult)
Expand Down Expand Up @@ -3998,6 +4006,8 @@ async def test_search_all_resources_async_pager():
)
async_pager = await client.search_all_resources(request={},)
assert async_pager.next_page_token == 'abc'
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')

responses = []
async for response in async_pager: # pragma: no branch
responses.append(response)
Expand Down Expand Up @@ -4431,6 +4441,9 @@ def test_search_all_iam_policies_pager(transport_name: str = "grpc"):
assert pager._retry == retry
assert pager._timeout == timeout

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, assets.IamPolicySearchResult)
Expand Down Expand Up @@ -4517,6 +4530,8 @@ async def test_search_all_iam_policies_async_pager():
)
async_pager = await client.search_all_iam_policies(request={},)
assert async_pager.next_page_token == 'abc'
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')

responses = []
async for response in async_pager: # pragma: no branch
responses.append(response)
Expand Down Expand Up @@ -6524,6 +6539,9 @@ def test_list_saved_queries_pager(transport_name: str = "grpc"):
assert pager._retry == retry
assert pager._timeout == timeout

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, asset_service.SavedQuery)
Expand Down Expand Up @@ -6610,6 +6628,8 @@ async def test_list_saved_queries_async_pager():
)
async_pager = await client.list_saved_queries(request={},)
assert async_pager.next_page_token == 'abc'
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')

responses = []
async for response in async_pager: # pragma: no branch
responses.append(response)
Expand Down Expand Up @@ -7908,6 +7928,9 @@ def test_analyze_org_policies_pager(transport_name: str = "grpc"):
assert pager._retry == retry
assert pager._timeout == timeout

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, asset_service.AnalyzeOrgPoliciesResponse.OrgPolicyResult)
Expand Down Expand Up @@ -7994,6 +8017,8 @@ async def test_analyze_org_policies_async_pager():
)
async_pager = await client.analyze_org_policies(request={},)
assert async_pager.next_page_token == 'abc'
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')

responses = []
async for response in async_pager: # pragma: no branch
responses.append(response)
Expand Down Expand Up @@ -8437,6 +8462,9 @@ def test_analyze_org_policy_governed_containers_pager(transport_name: str = "grp
assert pager._retry == retry
assert pager._timeout == timeout

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedContainersResponse.GovernedContainer)
Expand Down Expand Up @@ -8523,6 +8551,8 @@ async def test_analyze_org_policy_governed_containers_async_pager():
)
async_pager = await client.analyze_org_policy_governed_containers(request={},)
assert async_pager.next_page_token == 'abc'
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')

responses = []
async for response in async_pager: # pragma: no branch
responses.append(response)
Expand Down Expand Up @@ -8966,6 +8996,9 @@ def test_analyze_org_policy_governed_assets_pager(transport_name: str = "grpc"):
assert pager._retry == retry
assert pager._timeout == timeout

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedAssetsResponse.GovernedAsset)
Expand Down Expand Up @@ -9052,6 +9085,8 @@ async def test_analyze_org_policy_governed_assets_async_pager():
)
async_pager = await client.analyze_org_policy_governed_assets(request={},)
assert async_pager.next_page_token == 'abc'
assert str(async_pager).startswith(f'{async_pager.__class__.__name__}<')

responses = []
async for response in async_pager: # pragma: no branch
responses.append(response)
Expand Down Expand Up @@ -9442,6 +9477,9 @@ def test_list_assets_rest_pager(transport: str = 'rest'):

pager = client.list_assets(request=sample_request)

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, assets.Asset)
Expand Down Expand Up @@ -10616,6 +10654,9 @@ def test_search_all_resources_rest_pager(transport: str = 'rest'):

pager = client.search_all_resources(request=sample_request)

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, assets.ResourceSearchResult)
Expand Down Expand Up @@ -10848,6 +10889,9 @@ def test_search_all_iam_policies_rest_pager(transport: str = 'rest'):

pager = client.search_all_iam_policies(request=sample_request)

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, assets.IamPolicySearchResult)
Expand Down Expand Up @@ -11884,6 +11928,9 @@ def test_list_saved_queries_rest_pager(transport: str = 'rest'):

pager = client.list_saved_queries(request=sample_request)

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, asset_service.SavedQuery)
Expand Down Expand Up @@ -12581,6 +12628,9 @@ def test_analyze_org_policies_rest_pager(transport: str = 'rest'):

pager = client.analyze_org_policies(request=sample_request)

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, asset_service.AnalyzeOrgPoliciesResponse.OrgPolicyResult)
Expand Down Expand Up @@ -12826,6 +12876,9 @@ def test_analyze_org_policy_governed_containers_rest_pager(transport: str = 'res

pager = client.analyze_org_policy_governed_containers(request=sample_request)

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedContainersResponse.GovernedContainer)
Expand Down Expand Up @@ -13071,6 +13124,9 @@ def test_analyze_org_policy_governed_assets_rest_pager(transport: str = 'rest'):

pager = client.analyze_org_policy_governed_assets(request=sample_request)

assert pager.next_page_token == 'abc'
assert str(pager).startswith(f'{pager.__class__.__name__}<')

results = list(pager)
assert len(results) == 6
assert all(isinstance(i, asset_service.AnalyzeOrgPolicyGovernedAssetsResponse.GovernedAsset)
Expand Down
Loading
Loading