public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
blob 415a9533a079873cd97f09031448f5c81c6c288b 2756 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
105
106
 
#! /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 contextlib

import avocado
from avocado.utils.process import CmdError

from tasst import Tasst


class Site(contextlib.AbstractContextManager):
    """
    A (usually virtual or simulated) location where we can execute
    commands and configure networks.

    """

    def __init__(self, name):
        self.name = name # For debugging

    def __enter__(self):
        raise NotImplementedError

    def __exit__(self, *exc_details):
        raise NotImplementedError

    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 SiteTasst(Tasst):
    """
    Basic tests for executing commands on sites

    :avocado: disable
    :avocado: tags=meta
    """
    timeout = 1.0

    # Derived classes must redefine this
    def setup_site(self):
        raise NotImplementedError("{} must implement setup_site() method".format(type(self).__name__))

    def test_true(self):
        with self.setup_site() as site:
            site.fg('true')

    def test_false(self):
        with self.setup_site() as site:
            self.assertRaises(CmdError, site.fg, 'false')

    def test_echo(self):
        with self.setup_site() as site:
            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 __enter__(self):
        return self

    def __exit__(self, *exc_details):
        pass

    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(SiteTasst):
    def setup_site(self):
        return REAL_HOST


debug log:

solving 415a953 ...
found 415a953 in https://archives.passt.top/passt-dev/20230531015849.3229596-5-david@gibson.dropbear.id.au/

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

Checking patch avocado/tasst/site.py...
1:112: new blank line at EOF.
+
Applied patch avocado/tasst/site.py cleanly.
warning: 1 line adds whitespace errors.

index at:
100644 415a9533a079873cd97f09031448f5c81c6c288b	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).