blob: 60cb2e01a606f9c4d765c37aa132577c9da31fe7 [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')
Brad Bishop64c979e2019-11-04 13:55:29 -0500183 if distro and distro == 'centos-7':
184 self.skipTest('virgl isn\'t working with Centos 7')
Andrew Geissler82c905d2020-04-13 13:39:40 -0500185 if distro and distro == 'opensuseleap-15.0':
186 self.skipTest('virgl isn\'t working with Opensuse 15.0')
Brad Bishop19323692019-04-05 15:28:33 -0400187
188 qemu_packageconfig = get_bb_var('PACKAGECONFIG', 'qemu-system-native')
Andrew Geissler82c905d2020-04-13 13:39:40 -0500189 sdl_packageconfig = get_bb_var('PACKAGECONFIG', 'libsdl2-native')
Brad Bishop19323692019-04-05 15:28:33 -0400190 features = 'INHERIT += "testimage"\n'
191 if 'gtk+' not in qemu_packageconfig:
192 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " gtk+"\n'
Andrew Geissler82c905d2020-04-13 13:39:40 -0500193 if 'sdl' not in qemu_packageconfig:
194 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " sdl"\n'
Brad Bishop19323692019-04-05 15:28:33 -0400195 if 'virglrenderer' not in qemu_packageconfig:
196 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " virglrenderer"\n'
197 if 'glx' not in qemu_packageconfig:
198 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " glx"\n'
Andrew Geissler82c905d2020-04-13 13:39:40 -0500199 if 'opengl' not in sdl_packageconfig:
200 features += 'PACKAGECONFIG_append_pn-libsdl2-native = " opengl"\n'
Brad Bishop19323692019-04-05 15:28:33 -0400201 features += 'TEST_SUITES = "ping ssh virgl"\n'
202 features += 'IMAGE_FEATURES_append = " ssh-server-dropbear"\n'
203 features += 'IMAGE_INSTALL_append = " kmscube"\n'
Andrew Geissler82c905d2020-04-13 13:39:40 -0500204 features_gtk = features + 'TEST_RUNQEMUPARAMS = "gtk gl"\n'
205 self.write_config(features_gtk)
206 bitbake('core-image-minimal')
207 bitbake('-c testimage core-image-minimal')
208 features_sdl = features + 'TEST_RUNQEMUPARAMS = "sdl gl"\n'
209 self.write_config(features_sdl)
Brad Bishop19323692019-04-05 15:28:33 -0400210 bitbake('core-image-minimal')
211 bitbake('-c testimage core-image-minimal')
212
Brad Bishop19323692019-04-05 15:28:33 -0400213 def test_testimage_virgl_headless(self):
214 """
215 Summary: Check host-assisted accelerate OpenGL functionality in qemu with egl-headless frontend
216 Expected: 1. Check that virgl kernel driver is loaded and 3d acceleration is enabled
217 2. Check that kmscube demo runs without crashing.
218 Product: oe-core
219 Author: Alexander Kanavin <alex.kanavin@gmail.com>
220 """
221 import subprocess, os
222 try:
223 content = os.listdir("/dev/dri")
224 if len([i for i in content if i.startswith('render')]) == 0:
225 self.skipTest("No render nodes found in /dev/dri: %s" %(content))
226 except FileNotFoundError:
227 self.skipTest("/dev/dri directory does not exist; no render nodes available on this machine.")
228 try:
229 dripath = subprocess.check_output("pkg-config --variable=dridriverdir dri", shell=True)
230 except subprocess.CalledProcessError as e:
231 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.")
232 qemu_packageconfig = get_bb_var('PACKAGECONFIG', 'qemu-system-native')
233 features = 'INHERIT += "testimage"\n'
234 if 'virglrenderer' not in qemu_packageconfig:
235 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " virglrenderer"\n'
236 if 'glx' not in qemu_packageconfig:
237 features += 'PACKAGECONFIG_append_pn-qemu-system-native = " glx"\n'
238 features += 'TEST_SUITES = "ping ssh virgl"\n'
239 features += 'IMAGE_FEATURES_append = " ssh-server-dropbear"\n'
240 features += 'IMAGE_INSTALL_append = " kmscube"\n'
241 features += 'TEST_RUNQEMUPARAMS = "egl-headless"\n'
242 self.write_config(features)
243 bitbake('core-image-minimal')
244 bitbake('-c testimage core-image-minimal')
245
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500246class Postinst(OESelftestTestCase):
Andrew Geissler82c905d2020-04-13 13:39:40 -0500247
248 def init_manager_loop(self, init_manager):
249 import oe.path
250
251 vars = get_bb_vars(("IMAGE_ROOTFS", "sysconfdir"), "core-image-minimal")
252 rootfs = vars["IMAGE_ROOTFS"]
253 self.assertIsNotNone(rootfs)
254 sysconfdir = vars["sysconfdir"]
255 self.assertIsNotNone(sysconfdir)
256 # Need to use oe.path here as sysconfdir starts with /
257 hosttestdir = oe.path.join(rootfs, sysconfdir, "postinst-test")
258 targettestdir = os.path.join(sysconfdir, "postinst-test")
259
260 for classes in ("package_rpm", "package_deb", "package_ipk"):
261 with self.subTest(init_manager=init_manager, package_class=classes):
262 features = 'CORE_IMAGE_EXTRA_INSTALL = "postinst-delayed-b"\n'
263 features += 'IMAGE_FEATURES += "package-management empty-root-password"\n'
264 features += 'PACKAGE_CLASSES = "%s"\n' % classes
265 if init_manager == "systemd":
266 features += 'DISTRO_FEATURES_append = " systemd"\n'
267 features += 'VIRTUAL-RUNTIME_init_manager = "systemd"\n'
268 features += 'DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"\n'
269 features += 'VIRTUAL-RUNTIME_initscripts = ""\n'
270 self.write_config(features)
271
272 bitbake('core-image-minimal')
273
274 self.assertTrue(os.path.isfile(os.path.join(hosttestdir, "rootfs")),
275 "rootfs state file was not created")
276
277 with runqemu('core-image-minimal') as qemu:
278 # Make the test echo a string and search for that as
279 # run_serial()'s status code is useless.'
280 for filename in ("rootfs", "delayed-a", "delayed-b"):
281 status, output = qemu.run_serial("test -f %s && echo found" % os.path.join(targettestdir, filename))
282 self.assertEqual(output, "found", "%s was not present on boot" % filename)
283
284
285
286 @skipIfNotQemu('qemuall', 'Test only runs in qemu')
287 def test_postinst_rootfs_and_boot_sysvinit(self):
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500288 """
289 Summary: The purpose of this test case is to verify Post-installation
290 scripts are called when rootfs is created and also test
291 that script can be delayed to run at first boot.
292 Dependencies: NA
293 Steps: 1. Add proper configuration to local.conf file
294 2. Build a "core-image-minimal" image
295 3. Verify that file created by postinst_rootfs recipe is
296 present on rootfs dir.
297 4. Boot the image created on qemu and verify that the file
298 created by postinst_boot recipe is present on image.
299 Expected: The files are successfully created during rootfs and boot
300 time for 3 different package managers: rpm,ipk,deb and
Andrew Geissler82c905d2020-04-13 13:39:40 -0500301 for initialization managers: sysvinit.
302
303 """
304 self.init_manager_loop("sysvinit")
305
306
307 @skipIfNotQemu('qemuall', 'Test only runs in qemu')
308 def test_postinst_rootfs_and_boot_systemd(self):
309 """
310 Summary: The purpose of this test case is to verify Post-installation
311 scripts are called when rootfs is created and also test
312 that script can be delayed to run at first boot.
313 Dependencies: NA
314 Steps: 1. Add proper configuration to local.conf file
315 2. Build a "core-image-minimal" image
316 3. Verify that file created by postinst_rootfs recipe is
317 present on rootfs dir.
318 4. Boot the image created on qemu and verify that the file
319 created by postinst_boot recipe is present on image.
320 Expected: The files are successfully created during rootfs and boot
321 time for 3 different package managers: rpm,ipk,deb and
322 for initialization managers: systemd.
Brad Bishopd7bf8c12018-02-25 22:55:05 -0500323
324 """
Brad Bishop316dfdd2018-06-25 12:45:53 -0400325
Andrew Geissler82c905d2020-04-13 13:39:40 -0500326 self.init_manager_loop("systemd")
Brad Bishop316dfdd2018-06-25 12:45:53 -0400327
328
329 def test_failing_postinst(self):
330 """
331 Summary: The purpose of this test case is to verify that post-installation
332 scripts that contain errors are properly reported.
333 Expected: The scriptlet failure is properly reported.
334 The file that is created after the error in the scriptlet is not present.
335 Product: oe-core
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800336 Author: Alexander Kanavin <alex.kanavin@gmail.com>
Brad Bishop316dfdd2018-06-25 12:45:53 -0400337 """
338
339 import oe.path
340
341 vars = get_bb_vars(("IMAGE_ROOTFS", "sysconfdir"), "core-image-minimal")
342 rootfs = vars["IMAGE_ROOTFS"]
343 self.assertIsNotNone(rootfs)
344 sysconfdir = vars["sysconfdir"]
345 self.assertIsNotNone(sysconfdir)
346 # Need to use oe.path here as sysconfdir starts with /
347 hosttestdir = oe.path.join(rootfs, sysconfdir, "postinst-test")
348
349 for classes in ("package_rpm", "package_deb", "package_ipk"):
350 with self.subTest(package_class=classes):
351 features = 'CORE_IMAGE_EXTRA_INSTALL = "postinst-rootfs-failing"\n'
352 features += 'PACKAGE_CLASSES = "%s"\n' % classes
353 self.write_config(features)
Brad Bishop1a4b7ee2018-12-16 17:11:34 -0800354 bb_result = bitbake('core-image-minimal', ignore_status=True)
355 self.assertGreaterEqual(bb_result.output.find("Postinstall scriptlets of ['postinst-rootfs-failing'] have failed."), 0,
Brad Bishop316dfdd2018-06-25 12:45:53 -0400356 "Warning about a failed scriptlet not found in bitbake output: %s" %(bb_result.output))
357
358 self.assertTrue(os.path.isfile(os.path.join(hosttestdir, "rootfs-before-failure")),
359 "rootfs-before-failure file was not created")
360 self.assertFalse(os.path.isfile(os.path.join(hosttestdir, "rootfs-after-failure")),
361 "rootfs-after-failure file was created")
362
Brad Bishop1d80a2e2019-11-15 16:35:03 -0500363class SystemTap(OESelftestTestCase):
364 """
365 Summary: The purpose of this test case is to verify native crosstap
366 works while talking to a target.
367 Expected: The script should successfully connect to the qemu machine
368 and run some systemtap examples on a qemu machine.
369 """
370
371 @classmethod
372 def setUpClass(cls):
373 super(SystemTap, cls).setUpClass()
374 cls.image = "core-image-minimal"
375
376 def default_config(self):
377 return """
378# These aren't the actual IP addresses but testexport class needs something defined
379TEST_SERVER_IP = "192.168.7.1"
380TEST_TARGET_IP = "192.168.7.2"
381
382EXTRA_IMAGE_FEATURES += "tools-profile dbg-pkgs"
383IMAGE_FEATURES_append = " ssh-server-dropbear"
384
385# enables kernel debug symbols
386KERNEL_EXTRA_FEATURES_append = " features/debug/debug-kernel.scc"
387KERNEL_EXTRA_FEATURES_append = " features/systemtap/systemtap.scc"
388
389# add systemtap run-time into target image if it is not there yet
390IMAGE_INSTALL_append = " systemtap"
391"""
392
393 def test_crosstap_helloworld(self):
394 self.write_config(self.default_config())
395 bitbake('systemtap-native')
396 systemtap_examples = os.path.join(get_bb_var("WORKDIR","systemtap-native"), "usr/share/systemtap/examples")
397 bitbake(self.image)
398
399 with runqemu(self.image) as qemu:
400 cmd = "crosstap -r root@192.168.7.2 -s %s/general/helloworld.stp " % systemtap_examples
401 result = runCmd(cmd)
402 self.assertEqual(0, result.status, 'crosstap helloworld returned a non 0 status:%s' % result.output)
403
404 def test_crosstap_pstree(self):
405 self.write_config(self.default_config())
406
407 bitbake('systemtap-native')
408 systemtap_examples = os.path.join(get_bb_var("WORKDIR","systemtap-native"), "usr/share/systemtap/examples")
409 bitbake(self.image)
410
411 with runqemu(self.image) as qemu:
412 cmd = "crosstap -r root@192.168.7.2 -s %s/process/pstree.stp" % systemtap_examples
413 result = runCmd(cmd)
414 self.assertEqual(0, result.status, 'crosstap pstree returned a non 0 status:%s' % result.output)
415
416 def test_crosstap_syscalls_by_proc(self):
417 self.write_config(self.default_config())
418
419 bitbake('systemtap-native')
420 systemtap_examples = os.path.join(get_bb_var("WORKDIR","systemtap-native"), "usr/share/systemtap/examples")
421 bitbake(self.image)
422
423 with runqemu(self.image) as qemu:
424 cmd = "crosstap -r root@192.168.7.2 -s %s/process/ syscalls_by_proc.stp" % systemtap_examples
425 result = runCmd(cmd)
426 self.assertEqual(0, result.status, 'crosstap syscalls_by_proc returned a non 0 status:%s' % result.output)
427
428 def test_crosstap_syscalls_by_pid(self):
429 self.write_config(self.default_config())
430
431 bitbake('systemtap-native')
432 systemtap_examples = os.path.join(get_bb_var("WORKDIR","systemtap-native"), "usr/share/systemtap/examples")
433 bitbake(self.image)
434
435 with runqemu(self.image) as qemu:
436 cmd = "crosstap -r root@192.168.7.2 -s %s/process/ syscalls_by_pid.stp" % systemtap_examples
437 result = runCmd(cmd)
438 self.assertEqual(0, result.status, 'crosstap syscalls_by_pid returned a non 0 status:%s' % result.output)
439