blob: a751a43d1d6cd3a74813e99153c713c67c962aef [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2018, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""
Unit tests for the query_compiler_filter.py script.
Install:
$> sudo apt-get install python3-pytest ## OR
$> pip install -U pytest
See also https://docs.pytest.org/en/latest/getting-started.html
Usage:
$> ./query_compiler_filter.py
$> pytest query_compiler_filter.py
$> python -m pytest query_compiler_filter.py
See also https://docs.pytest.org/en/latest/usage.html
"""
# global imports
from contextlib import contextmanager
import io
import shlex
import sys
import typing
# pip imports
import pytest
# local imports
import query_compiler_filter as qcf
@contextmanager
def redirect_stdout_stderr():
"""Redirect stdout/stderr to a new StringIO for duration of context."""
old_stdout = sys.stdout
old_stderr = sys.stderr
new_stdout = io.StringIO()
sys.stdout = new_stdout
new_stderr = io.StringIO()
sys.stderr = new_stderr
try:
yield (new_stdout, new_stderr)
finally:
sys.stdout = old_stdout
sys.stderr = old_stderr
# Seek back to the beginning so we can read whatever was written into it.
new_stdout.seek(0)
new_stderr.seek(0)
@contextmanager
def replace_argv(argv):
""" Temporarily replace argv for duration of this context."""
old_argv = sys.argv
sys.argv = [sys.argv[0]] + argv
try:
yield
finally:
sys.argv = old_argv
def exec_main(argv):
"""Run the query_compiler_filter main function with the provided arguments.
Returns the stdout result when successful, assertion failure otherwise.
"""
try:
with redirect_stdout_stderr() as (the_stdout, the_stderr):
with replace_argv(argv):
code = qcf.main()
assert 0 == code, the_stderr.readlines()
all_lines = the_stdout.readlines()
return "".join(all_lines)
finally:
the_stdout.close()
the_stderr.close()
def test_query_compiler_filter():
# no --instruction-set specified: provide whatever was the 'first' filter.
assert exec_main(['--simulate',
'--package', 'com.google.android.apps.maps']) == \
"speed-profile unknown arm64\n"
# specifying an instruction set finds the exact compiler filter match.
assert exec_main(['--simulate',
'--package', 'com.google.android.apps.maps',
'--instruction-set', 'arm64']) == \
"speed-profile unknown arm64\n"
assert exec_main(['--simulate',
'--package', 'com.google.android.apps.maps',
'--instruction-set', 'arm']) == \
"speed first-boot arm\n"
assert exec_main(['--simulate',
'--debug',
'--package', 'com.google.android.apps.maps',
'--instruction-set', 'x86']) == \
"quicken install x86\n"
if __name__ == '__main__':
pytest.main()