#! /usr/bin/python3 # SPDX-License-Identifier: GPL-2.0-or-later # # tasst - Test A Simple Socket Transport # library of test helpers for passt & pasta # # tasst/site.py - Manage simulated network sites for testing # # Copyright Red Hat # Author: David Gibson import avocado from avocado.utils.process import CmdError from tasst import Tasst class Site: """ A (usually virtual or simulated) location where we can execute commands and configure networks. """ def __init__(self, name): self.name = name # For debugging # Shut down the site and release any resources it's using. We # can't use __del__() for this (RAII like), because Python doesn't # guarantee that will get called, and that's pretty easy to hit in # practice. The modern Pythonic way of doing this is 'with' and # ContextManagers, but that doesn't work with Avocado's jUnit # derived format for setUp() and tearDown(). Oh well, do it # manually. def close(self): pass def output(self, cmd, **kwargs): raise NotImplementedError def fg(self, cmd, **kwargs): self.output(cmd, **kwargs) def require_cmds(self, *cmds): missing = [c for c in cmds if self.fg('type {}'.format(c), ignore_status=True) != 0] if missing: raise avocado.TestCancel("Missing commands {} on {}" .format(', '.join(missing), self.name)) class BaseSiteTasst(Tasst): """ Basic tests for executing commands on sites :avocado: disable :avocado: tags=meta """ timeout = 1.0 # Derived classes must call this from setUp() def subsetup(self, site): assert isinstance(site, Site) site.require_cmds('true', 'false', 'echo') Tasst.subsetup(self, BaseSiteTasst, site) def test_true(self): site = self.get_subsetup(BaseSiteTasst) site.fg('true') def test_false(self): site = self.get_subsetup(BaseSiteTasst) self.assertRaises(CmdError, site.fg, 'false') def test_echo(self): site = self.get_subsetup(BaseSiteTasst) s = 'Hello tasst' out = site.output('echo {}'.format(s)) self.assertEquals(out, s.encode('utf-8')) # Represents the host on which the tests are running, as opposed to # some simulated host created by the tests class RealHost(Site): def __init__(self): super().__init__('REAL_HOST') def output(self, cmd, sudo=False, **kwargs): assert not sudo, "BUG: Shouldn't run commands with privilege on host" return avocado.utils.process.system_output(cmd, **kwargs) def fg(self, cmd, sudo=False, **kwargs): assert not sudo, "BUG: Shouldn't run commands with privilege on host" return avocado.utils.process.system(cmd, **kwargs) REAL_HOST = RealHost() class RealHostTasst(BaseSiteTasst): def setUp(self): super().setUp() BaseSiteTasst.subsetup(self, REAL_HOST)