public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
blob 5d9c01c921bc99335dacdb34a94e0d9a79a0ee13 3775 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
 
#! /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/ndp.py - Helpers for testing NDP
#
# Copyright Red Hat
# Author: David Gibson <david@gibson.dropbear.id.au>

import ipaddress
import os

from tasst import Tasst, TasstSubData
from tasst.address import IpiAllocator, TEST_NET6_TASST_A
from tasst.nstool import UnshareSite

class BaseNdpTasst(Tasst):
    """
    Test NDP behaviour.
    
    :avocado: disable
    """

    def subsetup(self, site, ifname, net, gw):
        Tasst.subsetup(self, BaseNdpTasst,
                       TasstSubData(site=site, ifname=ifname, net=net, gw=gw))

    def test_addr(self):
        sub = self.get_subsetup(BaseNdpTasst)

        # Wait for NDP to do its thing
        (addr,) = sub.site.addr_wait(sub.ifname, family='inet6', scope='global')

        # The SLAAC address is derived from the guest ns MAC, so
        # probably won't exactly match the host address (we need
        # DHCPv6 for that).  It should be in the right network though.
        self.assertEquals(addr.network, sub.net)

    def test_route(self):
        sub = self.get_subsetup(BaseNdpTasst)

        defroutes = sub.site.routes6(dst='default')
        while not defroutes:
            defroutes = sub.site.routes6(dst='default')

        self.assertEquals(len(defroutes), 1)
        gateway = ipaddress.ip_address(defroutes[0]['gateway'])
        self.assertEquals(gateway, sub.gw)


class MetaNdpTasst(BaseNdpTasst):
    """Ugly workaround for
    https://github.com/avocado-framework/avocado/issues/5680.
    Explicitly apply the "meta" tag to inherited tests

    :avocado: disable
    :avocado: tags=meta

    """

    def test_addr(self):
        super().test_addr()

    def test_route(self):
        super().test_route()


class RadvdNdpTasst(MetaNdpTasst):
    timeout = 15.0
    
    def setUp(self):
        super().setUp()

        ifname = 'clientif'
        router_ifname = 'routerif'
        prefix = TEST_NET6_TASST_A

        self.client = UnshareSite(self.__class__.__name__ + '.client', '-Un')
        self.router = UnshareSite(self.__class__.__name__ + '.router', '-n',
                                  parent=self.client, sudo=True)

        self.router.require_cmds('radvd')

        self.client.veth(ifname, router_ifname, self.router)

        # Configure the simulated router
        ipa = IpiAllocator(prefix)
        (router_ip6,) = ipa.next_ipis()

        confpath = os.path.join(self.workdir, 'radvd.conf')
        self.pidpath = os.path.join(self.workdir, 'radvd.pid')
        open(confpath, 'w').write(
        '''
        interface {} {{
            AdvSendAdvert on;
            prefix {} {{
            }};
        }};
        '''.format(router_ifname, prefix))

        self.router.ifup('lo')
        self.router.ifup('routerif', router_ip6)

        # Configure the client
        self.client.ifup('lo')
        self.client.ifup(ifname)

        # Get the router's link-local-address
        (self.router_ll,) = self.router.addr_wait(router_ifname,
                                                  family='inet6', scope='link')

        # Run radvd
        self.router.fg('radvd -c -C {}'.format(confpath))
        self.radvd = self.router.bg('radvd -C {} -p {} -n -d 5'.format(confpath, self.pidpath),
                                    sudo=True)

        BaseNdpTasst.subsetup(self, self.client, ifname, prefix, self.router_ll.ip)

    def tearDown(self):
        pid = int(open(self.pidpath).read())
        self.router.fg('kill {}'.format(pid))
        status = self.radvd.wait()
        self.assertEquals(status, 0)
        self.router.close()
        self.client.close()
        super().tearDown()

debug log:

solving 5d9c01c ...
found 5d9c01c in https://archives.passt.top/passt-dev/20230516020135.1901256-19-david@gibson.dropbear.id.au/

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

1:29: trailing whitespace.
    
1:79: trailing whitespace.
    
Checking patch avocado/tasst/ndp.py...
Applied patch avocado/tasst/ndp.py cleanly.
warning: 2 lines add whitespace errors.

index at:
100644 5d9c01c921bc99335dacdb34a94e0d9a79a0ee13	avocado/tasst/ndp.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).