public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
blob 682baee68b9665ed7af56d6bd40d91f6e42ee26e 3033 bytes (raw)

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
 
#! /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 <david@gibson.dropbear.id.au>

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)

debug log:

solving 682baee ...
found 682baee in https://archives.passt.top/passt-dev/20230516020135.1901256-7-david@gibson.dropbear.id.au/

applying [1/1] https://archives.passt.top/passt-dev/20230516020135.1901256-7-david@gibson.dropbear.id.au/
diff --git a/avocado/tasst/site.py b/avocado/tasst/site.py
new file mode 100644
index 0000000..682baee

Checking patch avocado/tasst/site.py...
Applied patch avocado/tasst/site.py cleanly.

index at:
100644 682baee68b9665ed7af56d6bd40d91f6e42ee26e	avocado/tasst/site.py

Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).