Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
9cbd233b9This file is pinned to the selected release. Download the original to open it in your design tool.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import shutil
import pytest
import subprocess
from copy import deepcopy
CLI_DIR = os.path.dirname(__file__)
TESTS_DIR = os.path.dirname(CLI_DIR)
REPO_DIR = os.path.dirname(TESTS_DIR)
DATA_DIR = os.path.join(TESTS_DIR, "data")
def pytest_addoption(parser):
parser.addoption(
"--librepcb-executable",
action="store",
help="Path to librepcb-cli executable to test",
)
class CliExecutor(object):
def __init__(self, config, tmpdir):
super(CliExecutor, self).__init__()
self.executable = os.path.abspath(config.getoption("--librepcb-executable"))
if not os.path.exists(self.executable):
raise Exception(
"Executable '{}' not found. Please pass it with "
"'--librepcb-executable'.".format(self.executable)
)
self.tmpdir = tmpdir
self.suppress_deprecation_warnings = False
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
pass
def abspath(self, relpath):
return os.path.normpath(os.path.join(self.tmpdir, relpath))
def add_library(self, library):
src = os.path.join(DATA_DIR, "libraries", library)
dst = os.path.join(self.tmpdir, library)
shutil.copytree(src, dst)
def add_project(self, project, as_lppz=False):
src = os.path.join(DATA_DIR, "projects", project)
dst = os.path.join(self.tmpdir, project)
if as_lppz:
shutil.make_archive(dst, "zip", src)
shutil.move(dst + ".zip", dst + ".lppz")
else:
shutil.copytree(src, dst)
def add_file(self, relpath):
src = os.path.join(DATA_DIR, relpath)
dst = os.path.join(self.tmpdir, os.path.basename(relpath))
shutil.copyfile(src, dst)
return dst
def run(self, *args):
p = subprocess.Popen(
[self.executable] + list(args),
cwd=self.tmpdir,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
env=self._env(),
)
stdout, stderr = p.communicate()
# output to stdout/stderr because it helps debugging failed tests
sys.stdout.write(stdout)
sys.stderr.write(stderr)
return p.returncode, stdout, stderr
def _env(self):
# Important: Use deepcopy to avoid propagating these changes to following runs!
env = deepcopy(os.environ)
# Make output independent from the system's language
env["LC_ALL"] = "C"
# Override configuration location to make tests independent of existing configs
env["LIBREPCB_CONFIG_DIR"] = os.path.join(self.tmpdir, "config")
# Use a neutral username
env["USERNAME"] = "testuser"
# Disable warning about unstable file format, since tests are run also
# on the (unstable) master branch
env["LIBREPCB_DISABLE_UNSTABLE_WARNING"] = "1"
# Disable deprecation warnings for specific tests
if self.suppress_deprecation_warnings:
env["LIBREPCB_SUPPRESS_DEPRECATION_WARNINGS"] = "1"
return env
@pytest.fixture
def cli(request, tmpdir):
"""
Fixture to start the LibrePCB CLI
"""
with CliExecutor(request.config, str(tmpdir)) as executor:
yield executor