make test: refactor vcl test cases

- Reduce replicated code in test cases
- Configure separate namespace secrets for thru hoststack
  test case to validate namespace secret functionality.
- Pass per-instance environment variables to Worker class
  init function.

Change-Id: I3cd5d4538f105cbfb09671c4d761541b40714b8f
Signed-off-by: Dave Wallace <dwallacelf@gmail.com>
This commit is contained in:
Dave Wallace
2018-02-26 14:40:13 -05:00
committed by Keith Burns
parent 10e369986a
commit 42996c0fcd
2 changed files with 84 additions and 92 deletions

View File

@ -11,6 +11,7 @@ import time
import resource import resource
import faulthandler import faulthandler
import random import random
import copy
from collections import deque from collections import deque
from threading import Thread, Event from threading import Thread, Event
from inspect import getdoc, isclass from inspect import getdoc, isclass
@ -1126,11 +1127,11 @@ class VppTestRunner(unittest.TextTestRunner):
class Worker(Thread): class Worker(Thread):
def __init__(self, args, logger): def __init__(self, args, logger, env={}):
self.logger = logger self.logger = logger
self.args = args self.args = args
self.result = None self.result = None
self.env = {} self.env = copy.deepcopy(env)
super(Worker, self).__init__() super(Worker, self).__init__()
def run(self): def run(self):

View File

@ -4,23 +4,56 @@
import unittest import unittest
import os import os
import signal import signal
import subprocess from framework import VppTestCase, VppTestRunner, Worker
from threading import Thread
from log import single_line_delim
from framework import VppTestCase, running_extended_tests, \
running_on_centos, VppTestRunner, Worker
from vpp_ip_route import VppIpTable, VppIpRoute, VppRoutePath from vpp_ip_route import VppIpTable, VppIpRoute, VppRoutePath
class VCLCUTTHRUTestCase(VppTestCase): class VclAppWorker(Worker):
""" VCL Cut Thru Test """ """ VCL Test Application Worker """
def __init__(self, appname, args, logger, env={}):
var = "VPP_TEST_BUILD_DIR"
build_dir = os.getenv(var, None)
if build_dir is None:
raise Exception("Environment variable `%s' not set" % var)
vcl_app_dir = "%s/vpp/.libs" % build_dir
self.args = ["%s/%s" % (vcl_app_dir, appname)] + args
super(VclAppWorker, self).__init__(self.args, logger, env)
class VclTestCase(VppTestCase):
""" VCL Test Class """
def validateResults(self, worker_client, worker_server, timeout):
self.logger.info("Client worker result is `%s'" % worker_client.result)
error = False
if worker_client.result is None:
try:
error = True
self.logger.error(
"Timeout! Client worker did not finish in %ss" % timeout)
os.killpg(os.getpgid(worker_client.process.pid),
signal.SIGTERM)
worker_client.join()
except:
self.logger.debug(
"Couldn't kill client worker-spawned process")
raise
if error:
os.killpg(os.getpgid(worker_server.process.pid), signal.SIGTERM)
worker_server.join()
raise Exception(
"Timeout! Client worker did not finish in %ss" % timeout)
self.assert_equal(worker_client.result, 0, "Binary test return code")
class VCLCUTTHRUTestCase(VclTestCase):
""" VPP Communications Library Test """
server_addr = "127.0.0.1" server_addr = "127.0.0.1"
server_port = "22000" server_port = "22000"
timeout = 3
@classmethod echo_phrase = "Hello, world! Jenny is a friend of mine"
def setUpClass(cls):
super(VCLCUTTHRUTestCase, cls).setUpClass()
def setUp(self): def setUp(self):
super(VCLCUTTHRUTestCase, self).setUp() super(VCLCUTTHRUTestCase, self).setUp()
@ -34,53 +67,29 @@ class VCLCUTTHRUTestCase(VppTestCase):
def test_vcl_cutthru(self): def test_vcl_cutthru(self):
""" run VCL cut-thru test """ """ run VCL cut-thru test """
timeout = 5 self.env = {'VCL_API_PREFIX': self.shm_prefix,
var = "VPP_TEST_BUILD_DIR" 'VCL_APP_SCOPE_LOCAL': "true"}
build_dir = os.getenv(var, None)
self.assertIsNotNone(build_dir, worker_server = VclAppWorker("vcl_test_server",
"Environment variable `%s' not set" % var) [self.server_port],
vcl_exe_dir = "%s/vpp/.libs" % build_dir self.logger, self.env)
executable = "%s/vcl_test_server" % vcl_exe_dir
worker_server = Worker([executable, self.server_port], self.logger)
worker_server.env["VCL_API_PREFIX"] = self.shm_prefix
worker_server.env["VCL_APP_SCOPE_LOCAL"] = "true"
worker_server.start() worker_server.start()
executable = "%s/vcl_test_client" % vcl_exe_dir self.sleep(0.2)
worker_client = Worker( worker_client = VclAppWorker("vcl_test_client",
[executable, self.server_addr, self.server_port, [self.server_addr, self.server_port,
"-E", "Hello, world!", "-X"], self.logger) "-E", self.echo_phrase, "-X"],
worker_client.env["VCL_API_PREFIX"] = self.shm_prefix self.logger, self.env)
worker_client.env["VCL_APP_SCOPE_LOCAL"] = "true"
worker_client.start() worker_client.start()
worker_client.join(timeout) worker_client.join(self.timeout)
self.logger.info("Client worker result is `%s'" % worker_client.result) self.validateResults(worker_client, worker_server, self.timeout)
error = False
if worker_client.result is None:
try:
error = True
self.logger.error(
"Timeout! Client worker did not finish in %ss" % timeout)
os.killpg(os.getpgid(worker_client.process.pid),
signal.SIGTERM)
worker_client.join()
except:
raise Exception("Couldn't kill client worker-spawned process")
if error:
os.killpg(os.getpgid(worker_server.process.pid), signal.SIGTERM)
worker_server.join()
raise Exception(
"Timeout! Client worker did not finish in %ss" % timeout)
self.assert_equal(worker_client.result, 0, "Binary test return code")
class VCLTHRUHSTestcase(VppTestCase): class VCLTHRUHSTestcase(VclTestCase):
""" VCL Thru Hoststack Test """ """ VCL Thru Hoststack Test """
server_port = "22000" server_port = "22000"
timeout = 3
@classmethod echo_phrase = "Hello, world! Jenny is a friend of mine"
def setUpClass(cls):
super(VCLTHRUHSTestcase, cls).setUpClass()
def setUp(self): def setUp(self):
super(VCLTHRUHSTestcase, self).setUp() super(VCLTHRUHSTestcase, self).setUp()
@ -102,9 +111,9 @@ class VCLTHRUHSTestcase(VppTestCase):
table_id += 1 table_id += 1
# Configure namespaces # Configure namespaces
self.vapi.app_namespace_add(namespace_id="0", self.vapi.app_namespace_add(namespace_id="0", secret=1234,
sw_if_index=self.loop0.sw_if_index) sw_if_index=self.loop0.sw_if_index)
self.vapi.app_namespace_add(namespace_id="1", self.vapi.app_namespace_add(namespace_id="1", secret=5678,
sw_if_index=self.loop1.sw_if_index) sw_if_index=self.loop1.sw_if_index)
def tearDown(self): def tearDown(self):
@ -118,6 +127,9 @@ class VCLTHRUHSTestcase(VppTestCase):
def test_vcl_thru_hoststack(self): def test_vcl_thru_hoststack(self):
""" run VCL thru hoststack test """ """ run VCL thru hoststack test """
self.env = {'VCL_API_PREFIX': self.shm_prefix,
'VCL_APP_SCOPE_GLOBAL': "true"}
# Add inter-table routes # Add inter-table routes
ip_t01 = VppIpRoute(self, self.loop1.local_ip4, 32, ip_t01 = VppIpRoute(self, self.loop1.local_ip4, 32,
[VppRoutePath("0.0.0.0", [VppRoutePath("0.0.0.0",
@ -130,45 +142,24 @@ class VCLTHRUHSTestcase(VppTestCase):
ip_t01.add_vpp_config() ip_t01.add_vpp_config()
ip_t10.add_vpp_config() ip_t10.add_vpp_config()
timeout = 20 self.env.update({'VCL_APP_NAMESPACE_ID': "0",
var = "VPP_TEST_BUILD_DIR" 'VCL_APP_NAMESPACE_SECRET': "1234"})
build_dir = os.getenv(var, None) worker_server = VclAppWorker("vcl_test_server",
self.assertIsNotNone(build_dir, [self.server_port],
"Environment variable `%s' not set" % var) self.logger, self.env)
vcl_exe_dir = "%s/vpp/.libs" % build_dir
executable = "%s/vcl_test_server" % vcl_exe_dir
worker_server = Worker([executable, self.server_port], self.logger)
worker_server.env["VCL_API_PREFIX"] = self.shm_prefix
worker_server.env["VCL_APP_SCOPE_GLOBAL"] = "true"
worker_server.env["VCL_APP_NAMESPACE_ID"] = "0"
worker_server.start() worker_server.start()
executable = "%s/vcl_test_client" % vcl_exe_dir self.sleep(0.2)
worker_client = Worker(
[executable, self.loop0.local_ip4, self.server_port, self.env.update({'VCL_APP_NAMESPACE_ID': "1",
"-E", "Hello, world!", "-X"], self.logger) 'VCL_APP_NAMESPACE_SECRET': "5678"})
worker_client.env["VCL_API_PREFIX"] = self.shm_prefix worker_client = VclAppWorker("vcl_test_client",
worker_client.env["VCL_APP_SCOPE_GLOBAL"] = "true" [self.loop0.local_ip4, self.server_port,
worker_client.env["VCL_APP_NAMESPACE_ID"] = "1" "-E", self.echo_phrase, "-X"],
self.logger, self.env)
worker_client.start() worker_client.start()
worker_client.join(timeout) worker_client.join(self.timeout)
self.logger.info("Client worker result is `%s'" % worker_client.result)
error = False self.validateResults(worker_client, worker_server, self.timeout)
if worker_client.result is None:
try:
error = True
self.logger.error(
"Timeout! Client worker did not finish in %ss" % timeout)
os.killpg(os.getpgid(worker_client.process.pid),
signal.SIGTERM)
worker_client.join()
except:
raise Exception("Couldn't kill client worker-spawned process")
if error:
os.killpg(os.getpgid(worker_server.process.pid), signal.SIGTERM)
worker_server.join()
raise Exception(
"Timeout! Client worker did not finish in %ss" % timeout)
self.assert_equal(worker_client.result, 0, "Binary test return code")
if __name__ == '__main__': if __name__ == '__main__':
unittest.main(testRunner=VppTestRunner) unittest.main(testRunner=VppTestRunner)