pmbootstrap/test/test_questions.py

175 lines
5.0 KiB
Python

"""
Copyright 2018 Oliver Smith
This file is part of pmbootstrap.
pmbootstrap is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pmbootstrap is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with pmbootstrap. If not, see <http://www.gnu.org/licenses/>.
"""
import logging
import os
import pytest
import sys
# Import from parent directory
pmb_src = os.path.realpath(os.path.join(os.path.dirname(__file__) + "/.."))
sys.path.append(pmb_src)
import pmb.aportgen.device
import pmb.config
import pmb.config.init
import pmb.helpers.logging
@pytest.fixture
def args(tmpdir, request):
import pmb.parse
sys.argv = ["pmbootstrap.py", "init"]
args = pmb.parse.arguments()
args.log = args.work + "/log_testsuite.txt"
pmb.helpers.logging.init(args)
request.addfinalizer(args.logfd.close)
return args
def test_questions(args, monkeypatch, tmpdir):
#
# PREPARATION
#
# Use prepared answers
def fake_ask(args, question="Continue?", choices=["y", "n"], default="n",
lowercase_answer=True, validation_regex=None):
answer = answers.pop(0)
logging.info("pmb.helpers.cli.ask: fake answer: " + answer)
return answer
monkeypatch.setattr(pmb.helpers.cli, "ask", fake_ask)
# Do not generate aports
def fake_generate(args, pkgname):
return
monkeypatch.setattr(pmb.aportgen, "generate", fake_generate)
# Self-test
answers = ["first", "second"]
assert pmb.helpers.cli.ask(args) == "first"
assert pmb.helpers.cli.ask(args) == "second"
assert len(answers) == 0
#
# SIMPLE QUESTIONS
#
# Booleans
functions = [pmb.aportgen.device.ask_for_keyboard,
pmb.aportgen.device.ask_for_external_storage]
for func in functions:
answers = ["y", "n"]
assert func(args) is True
assert func(args) is False
# Strings
functions = [pmb.aportgen.device.ask_for_manufacturer,
pmb.aportgen.device.ask_for_name]
for func in functions:
answers = ["Simple string answer"]
assert func(args) == "Simple string answer"
#
# QUESTIONS WITH ANSWER VERIFICATION
#
# Architecture
answers = ["invalid_arch", "aarch64"]
assert pmb.aportgen.device.ask_for_architecture(args) == "aarch64"
# Bootimg
func = pmb.aportgen.device.ask_for_bootimg
answers = ["invalid_path", ""]
assert func(args) is None
bootimg_path = pmb_src + "/test/testdata/bootimg/normal-boot.img"
answers = [bootimg_path]
output = {"base": "0x80000000",
"kernel_offset": "0x00008000",
"ramdisk_offset": "0x04000000",
"second_offset": "0x00f00000",
"tags_offset": "0x0e000000",
"pagesize": "2048",
"cmdline": "bootopt=64S3,32S1,32S1",
"qcdt": "false"}
assert func(args) == output
# Device
func = pmb.config.init.ask_for_device
answers = ["lg-mako"]
assert func(args) == ("lg-mako", True)
answers = ["whoops-typo", "n", "lg-mako"]
assert func(args) == ("lg-mako", True)
answers = ["new-device", "y"]
assert func(args) == ("new-device", False)
# Flash methods
func = pmb.aportgen.device.ask_for_flash_method
answers = ["invalid_flash_method", "fastboot"]
assert func(args) == "fastboot"
answers = ["0xffff"]
assert func(args) == "0xffff"
answers = ["heimdall", "invalid_type", "isorec"]
assert func(args) == "heimdall-isorec"
answers = ["heimdall", "bootimg"]
assert func(args) == "heimdall-bootimg"
# Keymaps
func = pmb.config.init.ask_for_keymaps
answers = ["invalid_keymap", "us/rx51_us"]
assert func(args, "nokia-rx51") == "us/rx51_us"
assert func(args, "lg-mako") == ""
# Qemu mesa driver
func = pmb.config.init.ask_for_qemu_mesa_driver
answers = ["invalid_driver", "dri-swrast"]
assert func(args) == "dri-swrast"
# UI
answers = ["invalid_UI", "weston"]
assert pmb.config.init.ask_for_ui(args) == "weston"
# Work path
tmpdir = str(tmpdir)
answers = ["/dev/null", os.path.dirname(__file__), pmb.config.pmb_src,
tmpdir]
assert pmb.config.init.ask_for_work_path(args) == tmpdir
#
# BUILD OPTIONS
#
func = pmb.config.init.ask_for_build_options
cfg = {"pmbootstrap": {}}
# Skip changing anything
answers = ["n"]
func(args, cfg)
assert cfg == {"pmbootstrap": {}}
# Answer everything
answers = ["y", "5", "2G", "n"]
func(args, cfg)
assert cfg == {"pmbootstrap": {"jobs": "5",
"ccache_size": "2G",
"timestamp_based_rebuild": "False"}}