Skip to content

Commit

Permalink
Integration test for aws_cpu_has_feature()
Browse files Browse the repository at this point in the history
  • Loading branch information
graebm committed Jan 24, 2025
1 parent 396cef3 commit b192bff
Show file tree
Hide file tree
Showing 3 changed files with 110 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -69,3 +69,6 @@ cmake-build*
# CBMC files
*.goto
*.log

# source code for system_info and other test apps
!bin
102 changes: 102 additions & 0 deletions bin/system_info/test-print-system-info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
#!/usr/bin/env python3
import argparse
import os
from pathlib import Path
import platform
import re
from subprocess import run
from typing import Dict, List, Optional

PARSER = argparse.ArgumentParser(
description="Run print-sys-info to detect CPU features. Fail if the results seem wrong.")
PARSER.add_argument("print-sys-info-path",
help="Path to print-sys-info app")


def main():
args = PARSER.parse_args()

if args.print_sys_info:
app = Path(args.print_sys_info_path)
if not app.exists:
exit("FAILED: file not found: {app}")
else:
app = find_app()

app_features_yesno: Dict[str, bool] = detect_features_from_app(app)

os_features_list = detect_features_from_os()


def find_app(build_dir: Optional[str]) -> Path:
build_dir = find_build_dir()

app_name = 'print-sys-info'
if os.name == 'nt':
app_name = app_name + '.exe'

for file in build_dir.glob(f"**/{app_name}"):
return file

exit("FAILED: Can't find print-sys-info. Pass location as argument")


def find_build_dir() -> Path:
dir = Path(__file__).parent
while dir is not None:
for build_dir in dir.glob('build'):
return build_dir
dir = dir.parent

exit("FAILED: Can't find print-sys-info. Pass location as argument")


def detect_features_from_app(app_path: Path) -> Dict[str, bool]:
result = run([str(app_path)],
capture_output=True,
text=True)
print(result.stderr)
print(result.stdout)
if result.returncode != 0:
exit(f"FAILED: {app_path.name} exited with {result.returncode}")

lines = result.stdout.splitlines()

machine = platform.machine().lower()
if machine in ['x86_64', 'amd64']:
machine = 'amd'
elif machine.startswith('arm') or machine == 'aarch64':
machine = 'arm'
else:
print(f"SKIP TEST: unknown platform.machine(): {machine}")
exit(0)

# looking for lines like:
# 'arm_crypto': true,
# 'amd_sse4_1': false
features = {}
for line in lines:
if m := re.search(f"'{machine}_(.+)': (false|true)", line):
name = m.group(1)
is_present = m.group(2) == 'true'
features[name] = is_present
if not features:
raise RuntimeError("Cannot find features text in stdout ???")

return features


def detect_features_from_os() -> List[str]:
features = []

try:
with open('/proc/cpuinfo') as f:
cpuinfo_text = f.read()
except:
exit("SKIP TEST: currently, this test only works on machines with /proc/cpuinfo")

# for line in cpuinfo_text:


if __name__ == '__main__':
main()
6 changes: 5 additions & 1 deletion builder.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,9 @@
["dir", "/s", "/b"]
]
}
}
},
"test_steps": [
"test",
["python3", "{source_dir}/bin/system_info/test-print-system-info.py", "{install_dir}/bin/print-sys-info{exe}"]
]
}

0 comments on commit b192bff

Please sign in to comment.