blob: 09d3de7aeaedfe50187065ff17797534883e2322 [file] [log] [blame]
Brad Bishopc342db32019-05-15 21:57:59 -04001#
2# SPDX-License-Identifier: MIT
3#
4
Brad Bishopd7bf8c12018-02-25 22:55:05 -05005from oeqa.selftest.case import OESelftestTestCase
6from oeqa.utils.commands import runCmd, bitbake, get_bb_var, get_bb_vars, runqemu
7from oeqa.utils.sshcontrol import SSHControl
Brad Bishopd7bf8c12018-02-25 22:55:05 -05008import os
9import re
10import tempfile
11import shutil
Brad Bishop19323692019-04-05 15:28:33 -040012import oe.lsb
Andrew Geissler82c905d2020-04-13 13:39:40 -050013from oeqa.core.decorator.data import skipIfNotQemu
Brad Bishopd7bf8c12018-02-25 22:55:05 -050014
15class TestExport(OESelftestTestCase):
16
17 @classmethod
18 def tearDownClass(cls):
19 runCmd("rm -rf /tmp/sdk")
20 super(TestExport, cls).tearDownClass()
21
Brad Bishopd7bf8c12018-02-25 22:55:05 -050022 def test_testexport_basic(self):
23 """
24 Summary: Check basic testexport functionality with only ping test enabled.
25 Expected: 1. testexport directory must be created.
26 2. runexported.py must run without any error/exception.
27 3. ping test must succeed.
28 Product: oe-core
29 Author: Mariano Lopez <mariano.lopez@intel.com>
30 """
31
32 features = 'INHERIT += "testexport"\n'
33 # These aren't the actual IP addresses but testexport class needs something defined
34 features += 'TEST_SERVER_IP = "192.168.7.1"\n'
35 features += 'TEST_TARGET_IP = "192.168.7.1"\n'
36 features += 'TEST_SUITES = "ping"\n'
37 self.write_config(features)
38
39 # Build tesexport for core-image-minimal
40 bitbake('core-image-minimal')
41 bitbake('-c testexport core-image-minimal')
42
43 testexport_dir = get_bb_var('TEST_EXPORT_DIR', 'core-image-minimal')
44
45 # Verify if TEST_EXPORT_DIR was created
46 isdir = os.path.isdir(testexport_dir)
47 self.assertEqual(True, isdir, 'Failed to create testexport dir: %s' % testexport_dir)
48
49 with runqemu('core-image-minimal') as qemu:
50 # Attempt to run runexported.py to perform ping test
51 test_path = os.path.join(testexport_dir, "oe-test")
52 data_file = os.path.join(testexport_dir, 'data', 'testdata.json')
53 manifest = os.path.join(testexport_dir, 'data', 'manifest')
54 cmd = ("%s runtime --test-data-file %s --packages-manifest %s "
55 "--target-ip %s --server-ip %s --quiet"
56 % (test_path, data_file, manifest, qemu.ip, qemu.server_ip))
57 result = runCmd(cmd)
58 # Verify ping test was succesful
59 self.assertEqual(0, result.status, 'oe-test runtime returned a non 0 status')
60
Brad Bishopd7bf8c12018-02-25 22:55:05 -050061 def test_testexport_sdk(self):
62 """
63 Summary: Check sdk functionality for testexport.
64 Expected: 1. testexport directory must be created.
65 2. SDK tarball must exists.
66 3. Uncompressing of tarball must succeed.
67 4. Check if the SDK directory is added to PATH.
68 5. Run tar from the SDK directory.
69 Product: oe-core
70 Author: Mariano Lopez <mariano.lopez@intel.com>
71 """
72
73 features = 'INHERIT += "testexport"\n'
74 # These aren't the actual IP addresses but testexport class needs something defined
75 features += 'TEST_SERVER_IP = "192.168.7.1"\n'
76 features += 'TEST_TARGET_IP = "192.168.7.1"\n'
77 features += 'TEST_SUITES = "ping"\n'
78 features += 'TEST_EXPORT_SDK_ENABLED = "1"\n'
79 features += 'TEST_EXPORT_SDK_PACKAGES = "nativesdk-tar"\n'
80 self.write_config(features)
81
82 # Build tesexport for core-image-minimal
83 bitbake('core-image-minimal')
84 bitbake('-c testexport core-image-minimal')
85
86 needed_vars = ['TEST_EXPORT_DIR', 'TEST_EXPORT_SDK_DIR', 'TEST_EXPORT_SDK_NAME']
87 bb_vars = get_bb_vars(needed_vars, 'core-image-minimal')
88 testexport_dir = bb_vars['TEST_EXPORT_DIR']
89 sdk_dir = bb_vars['TEST_EXPORT_SDK_DIR']
90 sdk_name = bb_vars['TEST_EXPORT_SDK_NAME']
91
92 # Check for SDK
93 tarball_name = "%s.sh" % sdk_name
94 tarball_path = os.path.join(testexport_dir, sdk_dir, tarball_name)
95 msg = "Couldn't find SDK tarball: %s" % tarball_path
96 self.assertEqual(os.path.isfile(tarball_path), True, msg)
97
98 # Extract SDK and run tar from SDK
99 result = runCmd("%s -y -d /tmp/sdk" % tarball_path)
100 self.assertEqual(0, result.status, "Couldn't extract SDK")
101
102 env_script = result.output.split()[-1]
103 result = runCmd(". %s; which tar" % env_script, shell=True)
104 self.assertEqual(0, result.status, "Couldn't setup SDK environment")
105 is_sdk_tar = True if "/tmp/sdk" in result.output else False
106 self.assertTrue(is_sdk_tar, "Couldn't setup SDK environment")
107
108 tar_sdk = result.output
109 result = runCmd("%s --version" % tar_sdk)
110 self.assertEqual(0, result.status, "Couldn't run tar from SDK")
111
112
113class TestImage(OESelftestTestCase):
114
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500115 def test_testimage_install(self):
116 """
117 Summary: Check install packages functionality for testimage/testexport.
118 Expected: 1. Import tests from a directory other than meta.
119 2. Check install/uninstall of socat.
120 Product: oe-core
121 Author: Mariano Lopez <mariano.lopez@intel.com>
122 """
123 if get_bb_var('DISTRO') == 'poky-tiny':
124 self.skipTest('core-image-full-cmdline not buildable for poky-tiny')
125
126 features = 'INHERIT += "testimage"\n'
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800127 features += 'IMAGE_INSTALL_append = " libssl"\n'
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500128 features += 'TEST_SUITES = "ping ssh selftest"\n'
129 self.write_config(features)
130
131 # Build core-image-sato and testimage
132 bitbake('core-image-full-cmdline socat')
133 bitbake('-c testimage core-image-full-cmdline')
134
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500135 def test_testimage_dnf(self):
136 """
137 Summary: Check package feeds functionality for dnf
138 Expected: 1. Check that remote package feeds can be accessed
139 Product: oe-core
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800140 Author: Alexander Kanavin <alex.kanavin@gmail.com>
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500141 """
142 if get_bb_var('DISTRO') == 'poky-tiny':
143 self.skipTest('core-image-full-cmdline not buildable for poky-tiny')
144
145 features = 'INHERIT += "testimage"\n'
146 features += 'TEST_SUITES = "ping ssh dnf_runtime dnf.DnfBasicTest.test_dnf_help"\n'
147 # We don't yet know what the server ip and port will be - they will be patched
148 # in at the start of the on-image test
149 features += 'PACKAGE_FEED_URIS = "http://bogus_ip:bogus_port"\n'
150 features += 'EXTRA_IMAGE_FEATURES += "package-management"\n'
151 features += 'PACKAGE_CLASSES = "package_rpm"\n'
152
Brad Bishop6f8dcde2018-10-16 10:47:12 +0800153 bitbake('gnupg-native -c addto_recipe_sysroot')
154
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500155 # Enable package feed signing
156 self.gpg_home = tempfile.mkdtemp(prefix="oeqa-feed-sign-")
Brad Bishop96ff1982019-08-19 13:50:42 -0400157 self.track_for_cleanup(self.gpg_home)
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500158 signing_key_dir = os.path.join(self.testlayer_path, 'files', 'signing')
Brad Bishop6f8dcde2018-10-16 10:47:12 +0800159 runCmd('gpg --batch --homedir %s --import %s' % (self.gpg_home, os.path.join(signing_key_dir, 'key.secret')), native_sysroot=get_bb_var("RECIPE_SYSROOT_NATIVE", "gnupg-native"))
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500160 features += 'INHERIT += "sign_package_feed"\n'
161 features += 'PACKAGE_FEED_GPG_NAME = "testuser"\n'
162 features += 'PACKAGE_FEED_GPG_PASSPHRASE_FILE = "%s"\n' % os.path.join(signing_key_dir, 'key.passphrase')
163 features += 'GPG_PATH = "%s"\n' % self.gpg_home
164 self.write_config(features)
165
166 # Build core-image-sato and testimage
167 bitbake('core-image-full-cmdline socat')
168 bitbake('-c testimage core-image-full-cmdline')
169
Andrew Geissler82c905d2020-04-13 13:39:40 -0500170 def test_testimage_virgl_gtk_sdl(self):
Brad Bishop19323692019-04-05 15:28:33 -0400171 """
Andrew Geissler82c905d2020-04-13 13:39:40 -0500172 Summary: Check host-assisted accelerate OpenGL functionality in qemu with gtk and SDL frontends
Brad Bishop19323692019-04-05 15:28:33 -0400173 Expected: 1. Check that virgl kernel driver is loaded and 3d acceleration is enabled
174 2. Check that kmscube demo runs without crashing.
175 Product: oe-core
176 Author: Alexander Kanavin <alex.kanavin@gmail.com>
177 """
178 if "DISPLAY" not in os.environ:
179 self.skipTest("virgl gtk test must be run inside a X session")
180 distro = oe.lsb.distro_identifier()
181 if distro and distro == 'debian-8':
182 self.skipTest('virgl isn\'t working with Debian 8')
Andrew Geisslerc182c622020-05-15 14:13:32 -0500183 if distro and distro == 'debian-9':
184 self.skipTest('virgl isn\'t working with Debian 9')
Brad Bishop64c979e2019-11-04 13:55:29 -0500185 if distro and distro == 'centos-7':
186 self.skipTest('virgl isn\'t working with Centos 7')
Andrew Geissler82c905d2020-04-13 13:39:40 -0500187 if distro and distro == 'opensuseleap-15.0':
188 self.skipTest('virgl isn\'t working with Opensuse 15.0')
Brad Bishop19323692019-04-05 15:28:33 -0400189
190 qemu_packageconfig = get_bb_var('PACKAGECONFIG', 'qemu-system-native')
Andrew Geissler82c905d2020-04-13 13:39:40 -0500191 sdl_packageconfig = get_bb_var('PACKAGECONFIG', 'libsdl2-native')
Brad Bishop19323692019-04-05 15:28:33 -0400192 features = 'INHERIT += "testimage"\n'
193 if 'gtk+' not in qemu_packageconfig:
194 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " gtk+"\n'
Andrew Geissler82c905d2020-04-13 13:39:40 -0500195 if 'sdl' not in qemu_packageconfig:
196 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " sdl"\n'
Brad Bishop19323692019-04-05 15:28:33 -0400197 if 'virglrenderer' not in qemu_packageconfig:
198 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " virglrenderer"\n'
199 if 'glx' not in qemu_packageconfig:
200 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " glx"\n'
Andrew Geissler82c905d2020-04-13 13:39:40 -0500201 if 'opengl' not in sdl_packageconfig:
202 features += 'PACKAGECONFIG_append_pn-libsdl2-native = " opengl"\n'
Brad Bishop19323692019-04-05 15:28:33 -0400203 features += 'TEST_SUITES = "ping ssh virgl"\n'
204 features += 'IMAGE_FEATURES_append = " ssh-server-dropbear"\n'
205 features += 'IMAGE_INSTALL_append = " kmscube"\n'
Andrew Geissler82c905d2020-04-13 13:39:40 -0500206 features_gtk = features + 'TEST_RUNQEMUPARAMS = "gtk gl"\n'
207 self.write_config(features_gtk)
208 bitbake('core-image-minimal')
209 bitbake('-c testimage core-image-minimal')
210 features_sdl = features + 'TEST_RUNQEMUPARAMS = "sdl gl"\n'
211 self.write_config(features_sdl)
Brad Bishop19323692019-04-05 15:28:33 -0400212 bitbake('core-image-minimal')
213 bitbake('-c testimage core-image-minimal')
214
Brad Bishop19323692019-04-05 15:28:33 -0400215 def test_testimage_virgl_headless(self):
216 """
217 Summary: Check host-assisted accelerate OpenGL functionality in qemu with egl-headless frontend
218 Expected: 1. Check that virgl kernel driver is loaded and 3d acceleration is enabled
219 2. Check that kmscube demo runs without crashing.
220 Product: oe-core
221 Author: Alexander Kanavin <alex.kanavin@gmail.com>
222 """
223 import subprocess, os
224 try:
225 content = os.listdir("/dev/dri")
226 if len([i for i in content if i.startswith('render')]) == 0:
227 self.skipTest("No render nodes found in /dev/dri: %s" %(content))
228 except FileNotFoundError:
229 self.skipTest("/dev/dri directory does not exist; no render nodes available on this machine.")
230 try:
231 dripath = subprocess.check_output("pkg-config --variable=dridriverdir dri", shell=True)
232 except subprocess.CalledProcessError as e:
233 self.skipTest("Could not determine the path to dri drivers on the host via pkg-config.\nPlease install Mesa development files (particularly, dri.pc) on the host machine.")
234 qemu_packageconfig = get_bb_var('PACKAGECONFIG', 'qemu-system-native')
235 features = 'INHERIT += "testimage"\n'
236 if 'virglrenderer' not in qemu_packageconfig:
237 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " virglrenderer"\n'
238 if 'glx' not in qemu_packageconfig:
239 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " glx"\n'
240 features += 'TEST_SUITES = "ping ssh virgl"\n'
241 features += 'IMAGE_FEATURES_append = " ssh-server-dropbear"\n'
242 features += 'IMAGE_INSTALL_append = " kmscube"\n'
243 features += 'TEST_RUNQEMUPARAMS = "egl-headless"\n'
244 self.write_config(features)
245 bitbake('core-image-minimal')
246 bitbake('-c testimage core-image-minimal')
247
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500248class Postinst(OESelftestTestCase):
Andrew Geissler82c905d2020-04-13 13:39:40 -0500249
250 def init_manager_loop(self, init_manager):
251 import oe.path
252
253 vars = get_bb_vars(("IMAGE_ROOTFS", "sysconfdir"), "core-image-minimal")
254 rootfs = vars["IMAGE_ROOTFS"]
255 self.assertIsNotNone(rootfs)
256 sysconfdir = vars["sysconfdir"]
257 self.assertIsNotNone(sysconfdir)
258 # Need to use oe.path here as sysconfdir starts with /
259 hosttestdir = oe.path.join(rootfs, sysconfdir, "postinst-test")
260 targettestdir = os.path.join(sysconfdir, "postinst-test")
261
262 for classes in ("package_rpm", "package_deb", "package_ipk"):
263 with self.subTest(init_manager=init_manager, package_class=classes):
264 features = 'CORE_IMAGE_EXTRA_INSTALL = "postinst-delayed-b"\n'
265 features += 'IMAGE_FEATURES += "package-management empty-root-password"\n'
266 features += 'PACKAGE_CLASSES = "%s"\n' % classes
267 if init_manager == "systemd":
268 features += 'DISTRO_FEATURES_append = " systemd"\n'
269 features += 'VIRTUAL-RUNTIME_init_manager = "systemd"\n'
270 features += 'DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"\n'
271 features += 'VIRTUAL-RUNTIME_initscripts = ""\n'
272 self.write_config(features)
273
274 bitbake('core-image-minimal')
275
276 self.assertTrue(os.path.isfile(os.path.join(hosttestdir, "rootfs")),
277 "rootfs state file was not created")
278
279 with runqemu('core-image-minimal') as qemu:
280 # Make the test echo a string and search for that as
281 # run_serial()'s status code is useless.'
282 for filename in ("rootfs", "delayed-a", "delayed-b"):
283 status, output = qemu.run_serial("test -f %s && echo found" % os.path.join(targettestdir, filename))
284 self.assertEqual(output, "found", "%s was not present on boot" % filename)
285
286
287
288 @skipIfNotQemu('qemuall', 'Test only runs in qemu')
289 def test_postinst_rootfs_and_boot_sysvinit(self):
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500290 """
291 Summary: The purpose of this test case is to verify Post-installation
292 scripts are called when rootfs is created and also test
293 that script can be delayed to run at first boot.
294 Dependencies: NA
295 Steps: 1. Add proper configuration to local.conf file
296 2. Build a "core-image-minimal" image
297 3. Verify that file created by postinst_rootfs recipe is
298 present on rootfs dir.
299 4. Boot the image created on qemu and verify that the file
300 created by postinst_boot recipe is present on image.
301 Expected: The files are successfully created during rootfs and boot
302 time for 3 different package managers: rpm,ipk,deb and
Andrew Geissler82c905d2020-04-13 13:39:40 -0500303 for initialization managers: sysvinit.
304
305 """
306 self.init_manager_loop("sysvinit")
307
308
309 @skipIfNotQemu('qemuall', 'Test only runs in qemu')
310 def test_postinst_rootfs_and_boot_systemd(self):
311 """
312 Summary: The purpose of this test case is to verify Post-installation
313 scripts are called when rootfs is created and also test
314 that script can be delayed to run at first boot.
315 Dependencies: NA
316 Steps: 1. Add proper configuration to local.conf file
317 2. Build a "core-image-minimal" image
318 3. Verify that file created by postinst_rootfs recipe is
319 present on rootfs dir.
320 4. Boot the image created on qemu and verify that the file
321 created by postinst_boot recipe is present on image.
322 Expected: The files are successfully created during rootfs and boot
323 time for 3 different package managers: rpm,ipk,deb and
324 for initialization managers: systemd.
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500325
326 """
Brad Bishop316dfdd2018-06-25 12:45:53 -0400327
Andrew Geissler82c905d2020-04-13 13:39:40 -0500328 self.init_manager_loop("systemd")
Brad Bishop316dfdd2018-06-25 12:45:53 -0400329
330
331 def test_failing_postinst(self):
332 """
333 Summary: The purpose of this test case is to verify that post-installation
334 scripts that contain errors are properly reported.
335 Expected: The scriptlet failure is properly reported.
336 The file that is created after the error in the scriptlet is not present.
337 Product: oe-core
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800338 Author: Alexander Kanavin <alex.kanavin@gmail.com>
Brad Bishop316dfdd2018-06-25 12:45:53 -0400339 """
340
341 import oe.path
342
343 vars = get_bb_vars(("IMAGE_ROOTFS", "sysconfdir"), "core-image-minimal")
344 rootfs = vars["IMAGE_ROOTFS"]
345 self.assertIsNotNone(rootfs)
346 sysconfdir = vars["sysconfdir"]
347 self.assertIsNotNone(sysconfdir)
348 # Need to use oe.path here as sysconfdir starts with /
349 hosttestdir = oe.path.join(rootfs, sysconfdir, "postinst-test")
350
351 for classes in ("package_rpm", "package_deb", "package_ipk"):
352 with self.subTest(package_class=classes):
353 features = 'CORE_IMAGE_EXTRA_INSTALL = "postinst-rootfs-failing"\n'
354 features += 'PACKAGE_CLASSES = "%s"\n' % classes
355 self.write_config(features)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800356 bb_result = bitbake('core-image-minimal', ignore_status=True)
357 self.assertGreaterEqual(bb_result.output.find("Postinstall scriptlets of ['postinst-rootfs-failing'] have failed."), 0,
Brad Bishop316dfdd2018-06-25 12:45:53 -0400358 "Warning about a failed scriptlet not found in bitbake output: %s" %(bb_result.output))
359
360 self.assertTrue(os.path.isfile(os.path.join(hosttestdir, "rootfs-before-failure")),
361 "rootfs-before-failure file was not created")
362 self.assertFalse(os.path.isfile(os.path.join(hosttestdir, "rootfs-after-failure")),
363 "rootfs-after-failure file was created")
364
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500365class SystemTap(OESelftestTestCase):
366 """
367 Summary: The purpose of this test case is to verify native crosstap
368 works while talking to a target.
369 Expected: The script should successfully connect to the qemu machine
370 and run some systemtap examples on a qemu machine.
371 """
372
373 @classmethod
374 def setUpClass(cls):
375 super(SystemTap, cls).setUpClass()
376 cls.image = "core-image-minimal"
377
378 def default_config(self):
379 return """
380# These aren't the actual IP addresses but testexport class needs something defined
381TEST_SERVER_IP = "192.168.7.1"
382TEST_TARGET_IP = "192.168.7.2"
383
384EXTRA_IMAGE_FEATURES += "tools-profile dbg-pkgs"
385IMAGE_FEATURES_append = " ssh-server-dropbear"
386
387# enables kernel debug symbols
388KERNEL_EXTRA_FEATURES_append = " features/debug/debug-kernel.scc"
389KERNEL_EXTRA_FEATURES_append = " features/systemtap/systemtap.scc"
390
391# add systemtap run-time into target image if it is not there yet
392IMAGE_INSTALL_append = " systemtap"
393"""
394
395 def test_crosstap_helloworld(self):
396 self.write_config(self.default_config())
397 bitbake('systemtap-native')
398 systemtap_examples = os.path.join(get_bb_var("WORKDIR","systemtap-native"), "usr/share/systemtap/examples")
399 bitbake(self.image)
400
401 with runqemu(self.image) as qemu:
402 cmd = "crosstap -r root@192.168.7.2 -s %s/general/helloworld.stp " % systemtap_examples
403 result = runCmd(cmd)
404 self.assertEqual(0, result.status, 'crosstap helloworld returned a non 0 status:%s' % result.output)
405
406 def test_crosstap_pstree(self):
407 self.write_config(self.default_config())
408
409 bitbake('systemtap-native')
410 systemtap_examples = os.path.join(get_bb_var("WORKDIR","systemtap-native"), "usr/share/systemtap/examples")
411 bitbake(self.image)
412
413 with runqemu(self.image) as qemu:
414 cmd = "crosstap -r root@192.168.7.2 -s %s/process/pstree.stp" % systemtap_examples
415 result = runCmd(cmd)
416 self.assertEqual(0, result.status, 'crosstap pstree returned a non 0 status:%s' % result.output)
417
418 def test_crosstap_syscalls_by_proc(self):
419 self.write_config(self.default_config())
420
421 bitbake('systemtap-native')
422 systemtap_examples = os.path.join(get_bb_var("WORKDIR","systemtap-native"), "usr/share/systemtap/examples")
423 bitbake(self.image)
424
425 with runqemu(self.image) as qemu:
426 cmd = "crosstap -r root@192.168.7.2 -s %s/process/ syscalls_by_proc.stp" % systemtap_examples
427 result = runCmd(cmd)
428 self.assertEqual(0, result.status, 'crosstap syscalls_by_proc returned a non 0 status:%s' % result.output)
429
430 def test_crosstap_syscalls_by_pid(self):
431 self.write_config(self.default_config())
432
433 bitbake('systemtap-native')
434 systemtap_examples = os.path.join(get_bb_var("WORKDIR","systemtap-native"), "usr/share/systemtap/examples")
435 bitbake(self.image)
436
437 with runqemu(self.image) as qemu:
438 cmd = "crosstap -r root@192.168.7.2 -s %s/process/ syscalls_by_pid.stp" % systemtap_examples
439 result = runCmd(cmd)
440 self.assertEqual(0, result.status, 'crosstap syscalls_by_pid returned a non 0 status:%s' % result.output)
441