def assertRunnerBehaviour( self, script, expected_finally_block, expected_stdout, expected_stderr, sig=signal.SIGINT ): with hp.a_temp_file() as fle: fle.write(script.encode()) fle.flush() with hp.a_temp_file() as out, hp.a_temp_file() as ss: out.close() ss.close() os.remove(out.name) os.remove(ss.name) s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) s.settimeout(2) s.bind(ss.name) s.listen(1) pipe = subprocess.PIPE p = subprocess.Popen( [sys.executable, fle.name, out.name, ss.name], stdout=pipe, stderr=pipe ) if sig is not None: try: s.accept() time.sleep(0.1) except socket.timeout: pass p.send_signal(sig) p.wait(timeout=2) got_stdout = p.stdout.read().decode() got_stderr = p.stderr.read().decode() print("=== STDOUT:") print(got_stdout) print("=== STDERR:") print(got_stderr) def assertOutput(out, regex): out = out.strip() regex = regex.strip() assert len(out.split("\n")) == len(regex.split("\n")) pytest.helpers.assert_regex(f"(?m){regex}", out) assertOutput(got_stdout, expected_stdout) assertOutput(got_stderr, expected_stderr) with open(out.name) as o: got = o.read() assert got.strip() == expected_finally_block.strip()
def __enter__(self): self.exit_stack = ExitStack() self.exit_stack.__enter__() self.fle = self.exit_stack.enter_context(hp.a_temp_file()) self.fle.write(self.script.encode()) self.fle.flush() self.out = self.exit_stack.enter_context(hp.a_temp_file()) self.out.close() os.remove(self.out.name) return self.run
def meta(self, config="", extra_prepare=None): with hp.a_temp_file() as fle: fle.write(dedent(config).encode()) fle.close() original = Collector.extra_prepare_after_activation class Prepare: def __enter__(s): if extra_prepare: def extra(*args, **kwargs): extra_prepare(*args, **kwargs) return original(*args, **kwargs) s.patch = mock.patch.object( Collector, "extra_prepare_after_activation", extra ) s.patch.start() def __exit__(s, exc_type, exc, tb): if hasattr(s, "patch"): s.patch.stop() with Prepare(), open(fle.name) as realfile: args_dict = {"photons_app": {"config": realfile}} app = App() logging_handler = mock.Mock(name="logging_handler") collector = app.setup_collector(args_dict, logging_handler, None) return Meta({"collector": collector}, [])
def from_config(self, config): with hp.a_temp_file() as fle: fle.write(dedent(config).encode()) fle.close() with open(fle.name) as realfile: args_dict = {"photons_app": {"config": realfile}} app = App() logging_handler = mock.Mock(name="logging_handler") collector = app.setup_collector(args_dict, logging_handler, None) return fle.name, args_dict, logging_handler, collector
def execute(self, args_obj, args_dict, extra_args, logging_handler): data = { "for_docs": True, "photons_app": { "addons": { "lifx.photons": ["__all__"] } } } with hp.a_temp_file() as fle: fle.write(json.dumps(data).encode()) fle.flush() return super(App, self).execute(args_obj, args_dict, extra_args, logging_handler, extra_files=[fle.name])
# coding: spec from photons_socket.target import SocketTarget from photons_app.test_helpers import TestCase from photons_app.collector import Collector from photons_app import helpers as hp from photons_messages import DiscoveryMessages from textwrap import dedent describe TestCase, "Addon": it "works": collector = Collector() with hp.a_temp_file() as fle: fle.write(dedent(""" --- photons_app: addons: lifx.photons: - socket targets: lan: type: lan """).encode()) fle.flush() collector.prepare(fle.name, {})