Skip to content

Commit f322ad3

Browse files
authored
Fix azure-sdk-tools tests bitrot, add tools gh action check (#37580)
* encode the fact that azure-eventhub does not support pypy machines * add azure-sdk-tools test workflow * update cspell to account for new workflow * fix matrix generation when no direct packages are present * fix a test relying on folder ordering to NOT depend on that folder ordering
1 parent 9e1164a commit f322ad3

File tree

13 files changed

+76
-38
lines changed

13 files changed

+76
-38
lines changed

.github/workflows/azure-sdk-tools.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: Test Azure SDK Tools
2+
3+
on:
4+
workflow_dispatch:
5+
pull_request:
6+
branches: [ main ]
7+
8+
jobs:
9+
build-and-test:
10+
runs-on: ubuntu-latest
11+
steps:
12+
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
13+
- uses: actions/checkout@v2
14+
15+
# todo before checkin: multiplex to include running tests on py38 -> 312
16+
- name: Set up Python 3.11
17+
uses: actions/setup-python@v4
18+
with:
19+
python-version: 3.11
20+
21+
- name: Install azure-sdk-tools
22+
run: |
23+
python -m pip install -e tools/azure-sdk-tools[build,ghtools]
24+
python -m pip freeze
25+
shell: bash
26+
27+
- name: Run tests
28+
run: |
29+
pytest ./tests
30+
shell: bash
31+
working-directory: tools/azure-sdk-tools

.vscode/cspell.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,8 @@
135135
"conda/conda-recipes/msal-extensions/meta.yaml",
136136
"conda/conda-recipes/msrest/meta.yaml",
137137
"conda/conda-recipes/uamqp/meta.yaml",
138-
"conda/conda-releaselogs/azure-mgmt.md"
138+
"conda/conda-releaselogs/azure-mgmt.md",
139+
".github/workflows/azure-sdk-tools.yml"
139140
],
140141
"words": [
141142
"msedge",

eng/pipelines/templates/jobs/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ jobs:
138138
parameters:
139139
BuildTargetingString: ${{ parameters.BuildTargetingString }}
140140
PackagePropertiesFolder: $(Build.ArtifactStagingDirectory)/PackageInfo
141-
IncludeIndirect: false
141+
IncludeIndirect: true
142142

143143
- template: /eng/pipelines/templates/steps/build-extended-artifacts.yml
144144
parameters:
@@ -170,7 +170,7 @@ jobs:
170170
parameters:
171171
BuildTargetingString: ${{ parameters.BuildTargetingString }}
172172
PackagePropertiesFolder: $(Build.ArtifactStagingDirectory)/PackageInfo
173-
IncludeIndirect: false
173+
IncludeIndirect: true
174174

175175
- template: ../steps/build-extended-artifacts.yml
176176
parameters:

eng/scripts/distribute-packages-to-matrix.ps1

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ function Update-Matrix {
151151

152152
# we need to ensure the presence of TargetingString in the matrix object
153153
if ($matrixUpdate) {
154-
if ($directBatches) {
154+
if ($directBatches -or $indirectBatches) {
155155
if (-not $Matrix.matrix.PSObject.Properties["TargetingString"]) {
156156
$Matrix.matrix | Add-Member -Force -MemberType NoteProperty -Name TargetingString -Value @()
157157
}
@@ -217,7 +217,11 @@ $indirectIncludedPackages = $packageProperties | Where-Object { $_.IncludedForVa
217217

218218
# I will assign all the direct included packages first. our goal is to get full coverage of the direct included packages
219219
# then, for the indirect packages, we will add them as sparse TargetingString bundles to the matrix
220-
$directBatches = Split-ArrayIntoBatches -InputArray $directIncludedPackages -BatchSize $BATCHSIZE
220+
$directBatches = @()
221+
if ($directIncludedPackages) {
222+
$directBatches = Split-ArrayIntoBatches -InputArray $directIncludedPackages -BatchSize $BATCHSIZE
223+
}
224+
221225
$indirectBatches = @()
222226
if ($indirectIncludedPackages) {
223227
$indirectBatches = Split-ArrayIntoBatches -InputArray $indirectIncludedPackages -BatchSize $BATCHSIZE

scripts/devops_tasks/tox_harness.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ def prep_and_run_tox(targeted_packages: List[str], parsed_args: Namespace) -> No
318318
if check not in skipped_tox_checks:
319319
skipped_tox_checks[check] = []
320320

321-
skipped_tox_checks[check].append(parsed_package)
321+
skipped_tox_checks[check].append(parsed_package)
322322

323323
if not filtered_tox_environment_set:
324324
logging.info(
@@ -330,7 +330,6 @@ def prep_and_run_tox(targeted_packages: List[str], parsed_args: Namespace) -> No
330330

331331
tox_execution_array.extend(["-e", filtered_tox_environment_set])
332332

333-
334333
if parsed_args.tox_env == "apistub":
335334
local_options_array = []
336335
if parsed_args.dest_dir:

tools/azure-sdk-tools/.env

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
PROXY_URL=http://localhost:5000

tools/azure-sdk-tools/ci_tools/functions.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@
4343

4444
TEST_COMPATIBILITY_MAP = {}
4545
TEST_PYTHON_DISTRO_INCOMPATIBILITY_MAP = {
46-
"azure-storage-blob": "pypy"
46+
"azure-storage-blob": "pypy",
47+
"azure-eventhub": "pypy"
4748
}
4849

4950
omit_regression = (

tools/azure-sdk-tools/setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"PyYAML",
1818
"urllib3",
1919
"tomli-w==1.0.0",
20+
"azure-core",
2021
# Perf/Build
2122
"ConfigArgParse>=0.12.0",
2223
]

tools/azure-sdk-tools/tests/integration/test_package_discovery.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ def test_discovery():
1212
results = discover_targeted_packages("azure*", core_service_root)
1313

1414
# if in a set, this should be empty
15-
non_empty_results = discover_targeted_packages("azure-servicemanagement-legacy", core_service_root)
15+
non_empty_results = discover_targeted_packages("azure-core", core_service_root)
1616

1717
assert len(results) > 1
1818
assert len(non_empty_results) == 1
@@ -23,52 +23,56 @@ def test_discovery_omit_mgmt():
2323
assert [os.path.basename(result) for result in results] == [
2424
"azure-storage-blob",
2525
"azure-storage-blob-changefeed",
26+
"azure-storage-extensions",
2627
"azure-storage-file-datalake",
2728
"azure-storage-file-share",
2829
"azure-storage-queue"
2930
]
3031

3132
def test_discovery_omit_build():
32-
results = discover_targeted_packages("azure*", core_service_root, filter_type="Build")
33+
results = discover_targeted_packages("*", core_service_root, filter_type="Build")
3334

3435
assert [os.path.basename(result) for result in results] == [
3536
"azure-core",
3637
"azure-core-experimental",
3738
"azure-core-tracing-opencensus",
3839
"azure-core-tracing-opentelemetry",
3940
"azure-mgmt-core",
41+
"corehttp"
4042
]
4143

4244
def test_discovery_single_package():
43-
results = discover_targeted_packages("azure-servicemanagement-legacy", core_service_root, filter_type="Build")
45+
results = discover_targeted_packages("azure-core", core_service_root, filter_type="Build")
4446

4547
assert [os.path.basename(result) for result in results] == [
46-
"azure-servicemanagement-legacy",
48+
"azure-core",
4749
]
4850

4951
def test_discovery_omit_regression():
50-
results = discover_targeted_packages("azure*", core_service_root, filter_type="Regression")
52+
results = discover_targeted_packages("*", core_service_root, filter_type="Regression")
5153

5254
assert [os.path.basename(result) for result in results] == [
5355
"azure-core",
5456
"azure-core-experimental",
5557
"azure-core-tracing-opencensus",
56-
"azure-core-tracing-opentelemetry"
58+
"azure-core-tracing-opentelemetry",
59+
"corehttp"
5760
]
5861

5962
storage_results = discover_targeted_packages("azure*", storage_service_root, filter_type="Regression")
6063

6164
assert [os.path.basename(result) for result in storage_results] == [
6265
"azure-storage-blob",
6366
"azure-storage-blob-changefeed",
67+
"azure-storage-extensions",
6468
"azure-storage-file-datalake",
6569
"azure-storage-file-share",
6670
"azure-storage-queue"
6771
]
6872

6973

7074
def test_discovery_honors_contains_filter():
71-
75+
7276
storage_results = discover_targeted_packages("azure*", storage_service_root, "file", filter_type="Regression")
7377

7478
assert [os.path.basename(result) for result in storage_results] == [
@@ -92,4 +96,3 @@ def test_discovery_honors_override():
9296
"azure-core-tracing-opentelemetry",
9397
"azure-mgmt-core",
9498
]
95-

tools/azure-sdk-tools/tests/test_optional_functionality.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
from ci_tools.parsing import ParsedSetup
55
from ci_tools.functions import get_config_setting
6-
from ci_tools.scenario.generation import create_scenario_file
76

87
integration_folder = os.path.join(os.path.dirname(__file__), 'integration')
98

@@ -27,17 +26,17 @@ def test_toml_result():
2726
'additional_pytest_args': ['-k', '*_async.py']
2827
},
2928
{
30-
'name': 'no_aiohttp',
31-
'install': [],
32-
'uninstall': ['aiohttp'],
29+
'name': 'no_aiohttp',
30+
'install': [],
31+
'uninstall': ['aiohttp'],
3332
'additional_pytest_args': ['-k', 'not *_async.py']
3433
}
3534
]
3635
}
3736

3837
assert actual == expected
3938

40-
39+
4140
def test_optional_specific_get():
4241
package_with_toml = os.path.join(integration_folder, 'scenarios', 'optional_environment_two_options')
4342
actual = get_config_setting(package_with_toml, 'optional')
@@ -49,9 +48,9 @@ def test_optional_specific_get():
4948
'additional_pytest_args': ['-k', '*_async.py']
5049
},
5150
{
52-
'name': 'no_aiohttp',
53-
'install': [],
54-
'uninstall': ['aiohttp'],
51+
'name': 'no_aiohttp',
52+
'install': [],
53+
'uninstall': ['aiohttp'],
5554
'additional_pytest_args': ['-k', 'not *_async.py']
5655
}
5756
]

tools/azure-sdk-tools/tests/test_parse_functionality.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ def test_sdk_sample_setup(test_patch):
111111
assert result.requires == ["requests>=2.18.4", "six>=1.11.0", "typing-extensions>=4.0.1"]
112112
assert result.is_new_sdk == True
113113
assert result.setup_filename == os.path.join(package_root, "setup.py")
114-
assert result.namespace == "ci_tools"
115114
assert "pytyped" in result.package_data
116115
assert result.include_package_data == True
117116
assert result.folder == package_root
@@ -191,7 +190,6 @@ def test_parse_recognizes_extensions(test_patch):
191190
assert result.requires == ["requests>=2.18.4", "six>=1.11.0", "typing-extensions>=4.0.1"]
192191
# todo resolve this conflict assert result.is_new_sdk == True
193192
assert result.setup_filename == os.path.join(package_root, "setup.py")
194-
assert result.namespace == "ci_tools"
195193
assert "pytyped" in result.package_data
196194
assert result.include_package_data == True
197195
assert result.folder == package_root

tools/azure-sdk-tools/tests/test_requirements_parse.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def test_replace_dev_reqs_specifiers(tmp_directory_create):
4545
requirements_file = create_temporary_scenario(tmp_directory_create, target_file)
4646

4747
requirements_before = get_requirements_from_file(requirements_file)
48-
replace_dev_reqs(requirements_file, core_location)
48+
replace_dev_reqs(requirements_file, core_location, None)
4949
requirements_after = get_requirements_from_file(requirements_file)
5050

5151
assert requirements_before == requirements_after
@@ -63,18 +63,18 @@ def test_replace_dev_reqs_relative(tmp_directory_create):
6363
expected_results = [
6464
os.path.join(expected_output_folder, "coretestserver-1.0.0b1-py3-none-any.whl"),
6565
os.path.join(expected_output_folder, "coretestserver-1.0.0b1-py3-none-any.whl"),
66-
os.path.join(expected_output_folder, "azure_identity-1.16.0b3-py3-none-any.whl"),
67-
os.path.join(expected_output_folder, "azure_identity-1.16.0b3-py3-none-any.whl"),
66+
os.path.join(expected_output_folder, "azure_identity-1.18.1-py3-none-any.whl"),
67+
os.path.join(expected_output_folder, "azure_identity-1.18.1-py3-none-any.whl"),
6868
os.path.join(expected_output_folder, "azure_mgmt_core-1.4.0-py3-none-any.whl"),
6969
os.path.join(expected_output_folder, "azure_mgmt_core-1.4.0-py3-none-any.whl"),
7070
os.path.join(expected_output_folder, "azure_sdk_tools-0.0.0-py3-none-any.whl[build]"),
7171
os.path.join(expected_output_folder, "azure_sdk_tools-0.0.0-py3-none-any.whl[build]"),
72-
os.path.join(expected_output_folder, "azure_core-1.30.2-py3-none-any.whl"),
73-
os.path.join(expected_output_folder, "azure_core-1.30.2-py3-none-any.whl"),
72+
os.path.join(expected_output_folder, "azure_core-1.31.1-py3-none-any.whl"),
73+
os.path.join(expected_output_folder, "azure_core-1.31.1-py3-none-any.whl"),
7474
]
7575

7676
requirements_before = get_requirements_from_file(requirements_file)
77-
replace_dev_reqs(requirements_file, core_location)
77+
replace_dev_reqs(requirements_file, core_location, None)
7878
requirements_after = get_requirements_from_file(requirements_file)
7979

8080
assert requirements_before != requirements_after
@@ -93,7 +93,7 @@ def test_replace_dev_reqs_remote(tmp_directory_create):
9393
requirements_file = create_temporary_scenario(tmp_directory_create, target_file)
9494

9595
requirements_before = get_requirements_from_file(requirements_file)
96-
replace_dev_reqs(requirements_file, core_location)
96+
replace_dev_reqs(requirements_file, core_location, None)
9797
requirements_after = get_requirements_from_file(requirements_file)
9898
assert requirements_before == requirements_after
9999

tools/azure-sdk-tools/tests/test_whl_discovery.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
tags_folder = os.path.join(integration_folder, "scenarios", "sample_interpreter_tags")
1313

1414

15-
def create_basic_temp_dir(tmp_directory_create) -> TemporaryDirectory:
15+
def create_basic_temp_dir(tmp_directory_create) -> str:
1616
tmp_dir = tmp_directory_create(
1717
[
1818
os.path.join("azure-common", "azure_common-1.1.29-py3-none-any.whl"),
@@ -37,13 +37,13 @@ def test_find_discovers_standard_whls(test_patch, tmp_directory_create):
3737
test_patch.return_value = ["py3-none-any"]
3838

3939
# basic positive cases
40-
found_core = find_whl(tmp_dir.name, "azure-core", "1.26.5")
41-
found_legacy = find_whl(tmp_dir.name, "azure-servicemanagement-legacy", "0.20.7")
40+
found_core = find_whl(tmp_dir, "azure-core", "1.26.5")
41+
found_legacy = find_whl(tmp_dir, "azure-servicemanagement-legacy", "0.20.7")
4242
assert found_core is not None
4343
assert found_legacy is not None
4444

4545
# basic negative cases
46-
not_found_core = find_whl(tmp_dir.name, "azure-core", "1.26.4")
46+
not_found_core = find_whl(tmp_dir, "azure-core", "1.26.4")
4747
assert not_found_core is None
4848

4949

@@ -52,7 +52,7 @@ def test_find_whl_fails_on_incompatible_interpreter(test_patch, tmp_directory_cr
5252
tmp_dir = create_basic_temp_dir(tmp_directory_create)
5353
test_patch.return_value = []
5454

55-
found = find_whl(tmp_dir.name, "azure-core", "1.26.5")
55+
found = find_whl(tmp_dir, "azure-core", "1.26.5")
5656
assert found is None
5757

5858

0 commit comments

Comments
 (0)