diff options
Diffstat (limited to 'meta/lib/oeqa/runtime')
20 files changed, 232 insertions, 68 deletions
diff --git a/meta/lib/oeqa/runtime/case.py b/meta/lib/oeqa/runtime/case.py index f036982e1f..2a47771a3d 100644 --- a/meta/lib/oeqa/runtime/case.py +++ b/meta/lib/oeqa/runtime/case.py | |||
@@ -4,6 +4,9 @@ | |||
4 | # SPDX-License-Identifier: MIT | 4 | # SPDX-License-Identifier: MIT |
5 | # | 5 | # |
6 | 6 | ||
7 | import os | ||
8 | import subprocess | ||
9 | import time | ||
7 | from oeqa.core.case import OETestCase | 10 | from oeqa.core.case import OETestCase |
8 | from oeqa.utils.package_manager import install_package, uninstall_package | 11 | from oeqa.utils.package_manager import install_package, uninstall_package |
9 | 12 | ||
@@ -18,3 +21,18 @@ class OERuntimeTestCase(OETestCase): | |||
18 | def tearDown(self): | 21 | def tearDown(self): |
19 | super(OERuntimeTestCase, self).tearDown() | 22 | super(OERuntimeTestCase, self).tearDown() |
20 | uninstall_package(self) | 23 | uninstall_package(self) |
24 | |||
25 | def run_network_serialdebug(runner): | ||
26 | if not runner: | ||
27 | return | ||
28 | status, output = runner.run_serial("ip addr") | ||
29 | print("ip addr on target: %s %s" % (output, status)) | ||
30 | status, output = runner.run_serial("ping -c 1 %s" % self.target.server_ip) | ||
31 | print("ping on target for %s: %s %s" % (self.target.server_ip, output, status)) | ||
32 | status, output = runner.run_serial("ping -c 1 %s" % self.target.ip) | ||
33 | print("ping on target for %s: %s %s" % (self.target.ip, output, status)) | ||
34 | # Have to use a full path for netstat which isn't in HOSTTOOLS | ||
35 | subprocess.call(["/usr/bin/netstat", "-tunape"]) | ||
36 | subprocess.call(["/usr/bin/netstat", "-ei"]) | ||
37 | subprocess.call(["ps", "-awx"], shell=True) | ||
38 | print("PID: %s %s" % (str(os.getpid()), time.time())) | ||
diff --git a/meta/lib/oeqa/runtime/cases/apt.py b/meta/lib/oeqa/runtime/cases/apt.py index 8000645843..c6b62987f1 100644 --- a/meta/lib/oeqa/runtime/cases/apt.py +++ b/meta/lib/oeqa/runtime/cases/apt.py | |||
@@ -54,7 +54,14 @@ class AptRepoTest(AptTest): | |||
54 | def setup_key(self): | 54 | def setup_key(self): |
55 | # the key is found on the target /etc/pki/packagefeed-gpg/ | 55 | # the key is found on the target /etc/pki/packagefeed-gpg/ |
56 | # named PACKAGEFEED-GPG-KEY-poky-branch | 56 | # named PACKAGEFEED-GPG-KEY-poky-branch |
57 | self.target.run('cd %s; apt-key add P*' % ('/etc/pki/packagefeed-gpg')) | 57 | # copy it to /etc/apt/keyrings/PACKAGEFEED-GPG-KEY-poky-branch.asc, and |
58 | # set it as the signing key for the repos | ||
59 | cmd = "KEY_FILE_PATH=`realpath /etc/pki/packagefeed-gpg/P*`; " | ||
60 | cmd += "KEY_FILE_NAME=`basename $KEY_FILE_PATH`; " | ||
61 | cmd += "mkdir -p /etc/apt/keyrings; " | ||
62 | cmd += "cp $KEY_FILE_PATH /etc/apt/keyrings/${KEY_FILE_NAME}.asc; " | ||
63 | cmd += 'sed -i "s|^deb |deb \[signed-by=/etc/apt/keyrings/${KEY_FILE_NAME}.asc\] |g" /etc/apt/sources.list' | ||
64 | self.target.run(cmd) | ||
58 | 65 | ||
59 | @skipIfNotFeature('package-management', | 66 | @skipIfNotFeature('package-management', |
60 | 'Test requires package-management to be in IMAGE_FEATURES') | 67 | 'Test requires package-management to be in IMAGE_FEATURES') |
diff --git a/meta/lib/oeqa/runtime/cases/buildcpio.py b/meta/lib/oeqa/runtime/cases/buildcpio.py index 7be734cb4f..0c9c57a3cb 100644 --- a/meta/lib/oeqa/runtime/cases/buildcpio.py +++ b/meta/lib/oeqa/runtime/cases/buildcpio.py | |||
@@ -29,6 +29,6 @@ class BuildCpioTest(OERuntimeTestCase): | |||
29 | @OEHasPackage(['autoconf']) | 29 | @OEHasPackage(['autoconf']) |
30 | def test_cpio(self): | 30 | def test_cpio(self): |
31 | self.project.download_archive() | 31 | self.project.download_archive() |
32 | self.project.run_configure() | 32 | self.project.run_configure(configure_args="CFLAGS='-std=gnu17 -Dbool=int -Dtrue=1 -Dfalse=0 -Wno-error=implicit-function-declaration'") |
33 | self.project.run_make() | 33 | self.project.run_make(make_args="CFLAGS='-std=gnu17 -Dbool=int -Dtrue=1 -Dfalse=0 -Wno-error=implicit-function-declaration'") |
34 | self.project.run_install() | 34 | self.project.run_install() |
diff --git a/meta/lib/oeqa/runtime/cases/buildlzip.py b/meta/lib/oeqa/runtime/cases/buildlzip.py index 44f4f1be71..921a0bca61 100644 --- a/meta/lib/oeqa/runtime/cases/buildlzip.py +++ b/meta/lib/oeqa/runtime/cases/buildlzip.py | |||
@@ -15,7 +15,7 @@ class BuildLzipTest(OERuntimeTestCase): | |||
15 | @classmethod | 15 | @classmethod |
16 | def setUpClass(cls): | 16 | def setUpClass(cls): |
17 | uri = 'http://downloads.yoctoproject.org/mirror/sources' | 17 | uri = 'http://downloads.yoctoproject.org/mirror/sources' |
18 | uri = '%s/lzip-1.19.tar.gz' % uri | 18 | uri = '%s/lzip-1.25.tar.gz' % uri |
19 | cls.project = TargetBuildProject(cls.tc.target, | 19 | cls.project = TargetBuildProject(cls.tc.target, |
20 | uri, | 20 | uri, |
21 | dl_dir = cls.tc.td['DL_DIR']) | 21 | dl_dir = cls.tc.td['DL_DIR']) |
diff --git a/meta/lib/oeqa/runtime/cases/ethernet_ip_connman.py b/meta/lib/oeqa/runtime/cases/ethernet_ip_connman.py index eac8f2d082..c3be60f006 100644 --- a/meta/lib/oeqa/runtime/cases/ethernet_ip_connman.py +++ b/meta/lib/oeqa/runtime/cases/ethernet_ip_connman.py | |||
@@ -9,26 +9,7 @@ from oeqa.core.decorator.data import skipIfQemu | |||
9 | 9 | ||
10 | class Ethernet_Test(OERuntimeTestCase): | 10 | class Ethernet_Test(OERuntimeTestCase): |
11 | 11 | ||
12 | def set_ip(self, x): | ||
13 | x = x.split(".") | ||
14 | sample_host_address = '150' | ||
15 | x[3] = sample_host_address | ||
16 | x = '.'.join(x) | ||
17 | return x | ||
18 | |||
19 | @skipIfQemu() | 12 | @skipIfQemu() |
20 | @OETestDepends(['ssh.SSHTest.test_ssh']) | ||
21 | def test_set_virtual_ip(self): | ||
22 | (status, output) = self.target.run("ifconfig eth0 | grep 'inet ' | awk '{print $2}'") | ||
23 | self.assertEqual(status, 0, msg='Failed to get ip address. Make sure you have an ethernet connection on your device, output: %s' % output) | ||
24 | original_ip = output | ||
25 | virtual_ip = self.set_ip(original_ip) | ||
26 | |||
27 | (status, output) = self.target.run("ifconfig eth0:1 %s netmask 255.255.255.0 && sleep 2 && ping -c 5 %s && ifconfig eth0:1 down" % (virtual_ip,virtual_ip)) | ||
28 | self.assertEqual(status, 0, msg='Failed to create virtual ip address, output: %s' % output) | ||
29 | |||
30 | @skipIfQemu() | ||
31 | @OETestDepends(['ethernet_ip_connman.Ethernet_Test.test_set_virtual_ip']) | ||
32 | def test_get_ip_from_dhcp(self): | 13 | def test_get_ip_from_dhcp(self): |
33 | (status, output) = self.target.run("connmanctl services | grep -E '*AO Wired|*AR Wired' | awk '{print $3}'") | 14 | (status, output) = self.target.run("connmanctl services | grep -E '*AO Wired|*AR Wired' | awk '{print $3}'") |
34 | self.assertEqual(status, 0, msg='No wired interfaces are detected, output: %s' % output) | 15 | self.assertEqual(status, 0, msg='No wired interfaces are detected, output: %s' % output) |
@@ -39,4 +20,4 @@ class Ethernet_Test(OERuntimeTestCase): | |||
39 | default_gateway = output | 20 | default_gateway = output |
40 | 21 | ||
41 | (status, output) = self.target.run("connmanctl config %s --ipv4 dhcp && sleep 2 && ping -c 5 %s" % (wired_interfaces,default_gateway)) | 22 | (status, output) = self.target.run("connmanctl config %s --ipv4 dhcp && sleep 2 && ping -c 5 %s" % (wired_interfaces,default_gateway)) |
42 | self.assertEqual(status, 0, msg='Failed to get dynamic IP address via DHCP in connmand, output: %s' % output) \ No newline at end of file | 23 | self.assertEqual(status, 0, msg='Failed to get dynamic IP address via DHCP in connmand, output: %s' % output) |
diff --git a/meta/lib/oeqa/runtime/cases/go.py b/meta/lib/oeqa/runtime/cases/go.py index 39a80f4dca..fc7959b5f4 100644 --- a/meta/lib/oeqa/runtime/cases/go.py +++ b/meta/lib/oeqa/runtime/cases/go.py | |||
@@ -4,10 +4,78 @@ | |||
4 | # SPDX-License-Identifier: MIT | 4 | # SPDX-License-Identifier: MIT |
5 | # | 5 | # |
6 | 6 | ||
7 | import os | ||
7 | from oeqa.runtime.case import OERuntimeTestCase | 8 | from oeqa.runtime.case import OERuntimeTestCase |
8 | from oeqa.core.decorator.depends import OETestDepends | 9 | from oeqa.core.decorator.depends import OETestDepends |
9 | from oeqa.runtime.decorator.package import OEHasPackage | 10 | from oeqa.runtime.decorator.package import OEHasPackage |
10 | 11 | ||
12 | class GoCompileTest(OERuntimeTestCase): | ||
13 | |||
14 | @classmethod | ||
15 | def setUp(cls): | ||
16 | dst = '/tmp/' | ||
17 | src = os.path.join(cls.tc.files_dir, 'test.go') | ||
18 | cls.tc.target.copyTo(src, dst) | ||
19 | |||
20 | @classmethod | ||
21 | def tearDown(cls): | ||
22 | files = '/tmp/test.go /tmp/test' | ||
23 | cls.tc.target.run('rm %s' % files) | ||
24 | dirs = '/tmp/hello-go' | ||
25 | cls.tc.target.run('rm -r %s' % dirs) | ||
26 | |||
27 | @OETestDepends(['ssh.SSHTest.test_ssh']) | ||
28 | @OEHasPackage('go') | ||
29 | @OEHasPackage('go-runtime') | ||
30 | @OEHasPackage('go-runtime-dev') | ||
31 | @OEHasPackage('openssh-scp') | ||
32 | def test_go_compile(self): | ||
33 | # Check if go is available | ||
34 | status, output = self.target.run('which go') | ||
35 | if status != 0: | ||
36 | self.skipTest('go command not found, output: %s' % output) | ||
37 | |||
38 | # Compile the simple Go program | ||
39 | status, output = self.target.run('go build -o /tmp/test /tmp/test.go') | ||
40 | msg = 'go compile failed, output: %s' % output | ||
41 | self.assertEqual(status, 0, msg=msg) | ||
42 | |||
43 | # Run the compiled program | ||
44 | status, output = self.target.run('/tmp/test') | ||
45 | msg = 'running compiled file failed, output: %s' % output | ||
46 | self.assertEqual(status, 0, msg=msg) | ||
47 | |||
48 | @OETestDepends(['ssh.SSHTest.test_ssh']) | ||
49 | @OEHasPackage('go') | ||
50 | @OEHasPackage('go-runtime') | ||
51 | @OEHasPackage('go-runtime-dev') | ||
52 | @OEHasPackage('openssh-scp') | ||
53 | def test_go_module(self): | ||
54 | # Check if go is available | ||
55 | status, output = self.target.run('which go') | ||
56 | if status != 0: | ||
57 | self.skipTest('go command not found, output: %s' % output) | ||
58 | |||
59 | # Create a simple Go module | ||
60 | status, output = self.target.run('mkdir -p /tmp/hello-go') | ||
61 | msg = 'mkdir failed, output: %s' % output | ||
62 | self.assertEqual(status, 0, msg=msg) | ||
63 | |||
64 | # Copy the existing test.go file to the module | ||
65 | status, output = self.target.run('cp /tmp/test.go /tmp/hello-go/main.go') | ||
66 | msg = 'copying test.go failed, output: %s' % output | ||
67 | self.assertEqual(status, 0, msg=msg) | ||
68 | |||
69 | # Build the module | ||
70 | status, output = self.target.run('cd /tmp/hello-go && go build -o hello main.go') | ||
71 | msg = 'go build failed, output: %s' % output | ||
72 | self.assertEqual(status, 0, msg=msg) | ||
73 | |||
74 | # Run the module | ||
75 | status, output = self.target.run('cd /tmp/hello-go && ./hello') | ||
76 | msg = 'running go module failed, output: %s' % output | ||
77 | self.assertEqual(status, 0, msg=msg) | ||
78 | |||
11 | class GoHelloworldTest(OERuntimeTestCase): | 79 | class GoHelloworldTest(OERuntimeTestCase): |
12 | @OETestDepends(['ssh.SSHTest.test_ssh']) | 80 | @OETestDepends(['ssh.SSHTest.test_ssh']) |
13 | @OEHasPackage(['go-helloworld']) | 81 | @OEHasPackage(['go-helloworld']) |
diff --git a/meta/lib/oeqa/runtime/cases/logrotate.py b/meta/lib/oeqa/runtime/cases/logrotate.py index 6ad980cb6a..0d4b9ac60b 100644 --- a/meta/lib/oeqa/runtime/cases/logrotate.py +++ b/meta/lib/oeqa/runtime/cases/logrotate.py | |||
@@ -15,59 +15,61 @@ class LogrotateTest(OERuntimeTestCase): | |||
15 | 15 | ||
16 | @classmethod | 16 | @classmethod |
17 | def setUpClass(cls): | 17 | def setUpClass(cls): |
18 | cls.tc.target.run('cp /etc/logrotate.d/wtmp $HOME/wtmp.oeqabak') | 18 | cls.tc.target.run('cp /etc/logrotate.d/wtmp $HOME/wtmp.oeqabak', |
19 | ignore_ssh_fails=True) | ||
19 | 20 | ||
20 | @classmethod | 21 | @classmethod |
21 | def tearDownClass(cls): | 22 | def tearDownClass(cls): |
22 | cls.tc.target.run('mv -f $HOME/wtmp.oeqabak /etc/logrotate.d/wtmp && rm -rf /var/log//logrotate_dir') | 23 | cls.tc.target.run('mv -f $HOME/wtmp.oeqabak /etc/logrotate.d/wtmp && rm -rf /var/log/logrotate_dir', ignore_ssh_fails=True) |
23 | cls.tc.target.run('rm -rf /var/log/logrotate_testfile && rm -rf /etc/logrotate.d/logrotate_testfile') | 24 | cls.tc.target.run('rm -rf /var/log/logrotate_testfile && rm -rf /etc/logrotate.d/logrotate_testfile', ignore_ssh_fails=True) |
24 | 25 | ||
25 | @OETestDepends(['ssh.SSHTest.test_ssh']) | 26 | @OETestDepends(['ssh.SSHTest.test_ssh']) |
26 | @OEHasPackage(['logrotate']) | 27 | @OEHasPackage(['logrotate']) |
27 | def test_logrotate_wtmp(self): | 28 | def test_logrotate_wtmp(self): |
28 | |||
29 | # /var/log/wtmp may not always exist initially, so use touch to ensure it is present | 29 | # /var/log/wtmp may not always exist initially, so use touch to ensure it is present |
30 | status, output = self.target.run('touch /var/log/wtmp') | 30 | status, output = self.target.run('touch /var/log/wtmp') |
31 | msg = ('Could not create/update /var/log/wtmp with touch') | 31 | msg = ('Could not create/update /var/log/wtmp with touch') |
32 | self.assertEqual(status, 0, msg = msg) | 32 | self.assertEqual(status, 0, msg = msg) |
33 | 33 | ||
34 | status, output = self.target.run('mkdir /var/log//logrotate_dir') | 34 | # Create a folder to store rotated file and add the corresponding |
35 | # configuration option | ||
36 | status, output = self.target.run('mkdir /var/log/logrotate_dir') | ||
35 | msg = ('Could not create logrotate_dir. Output: %s' % output) | 37 | msg = ('Could not create logrotate_dir. Output: %s' % output) |
36 | self.assertEqual(status, 0, msg = msg) | 38 | self.assertEqual(status, 0, msg = msg) |
37 | 39 | ||
38 | status, output = self.target.run('echo "create \n olddir /var/log//logrotate_dir \n include /etc/logrotate.d/wtmp" > /tmp/logrotate-test.conf') | 40 | status, output = self.target.run('echo "create \n olddir /var/log/logrotate_dir \n include /etc/logrotate.d/wtmp" > /tmp/logrotate-test.conf') |
39 | msg = ('Could not write to /tmp/logrotate-test.conf') | 41 | msg = ('Could not write to /tmp/logrotate-test.conf') |
40 | self.assertEqual(status, 0, msg = msg) | 42 | self.assertEqual(status, 0, msg = msg) |
41 | 43 | ||
44 | # Call logrotate -f to force the rotation immediately | ||
42 | # If logrotate fails to rotate the log, view the verbose output of logrotate to see what prevented it | 45 | # If logrotate fails to rotate the log, view the verbose output of logrotate to see what prevented it |
43 | _, logrotate_output = self.target.run('logrotate -vf /tmp/logrotate-test.conf') | 46 | _, logrotate_output = self.target.run('logrotate -vf /tmp/logrotate-test.conf') |
44 | status, _ = self.target.run('find /var/log//logrotate_dir -type f | grep wtmp.1') | 47 | status, _ = self.target.run('find /var/log/logrotate_dir -type f | grep wtmp.1') |
45 | msg = ("logrotate did not successfully rotate the wtmp log. Output from logrotate -vf: \n%s" % (logrotate_output)) | 48 | msg = ("logrotate did not successfully rotate the wtmp log. Output from logrotate -vf: \n%s" % (logrotate_output)) |
46 | self.assertEqual(status, 0, msg = msg) | 49 | self.assertEqual(status, 0, msg = msg) |
47 | 50 | ||
48 | @OETestDepends(['logrotate.LogrotateTest.test_logrotate_wtmp']) | 51 | @OETestDepends(['logrotate.LogrotateTest.test_logrotate_wtmp']) |
49 | def test_logrotate_newlog(self): | 52 | def test_logrotate_newlog(self): |
50 | |||
51 | status, output = self.target.run('echo "oeqa logrotate test file" > /var/log/logrotate_testfile') | 53 | status, output = self.target.run('echo "oeqa logrotate test file" > /var/log/logrotate_testfile') |
52 | msg = ('Could not create logrotate test file in /var/log') | 54 | msg = ('Could not create logrotate test file in /var/log') |
53 | self.assertEqual(status, 0, msg = msg) | 55 | self.assertEqual(status, 0, msg = msg) |
54 | 56 | ||
55 | status, output = self.target.run('echo "/var/log/logrotate_testfile {\n missingok \n monthly \n rotate 1" > /etc/logrotate.d/logrotate_testfile') | 57 | # Create a new configuration file dedicated to a /var/log/logrotate_testfile |
58 | status, output = self.target.run('echo "/var/log/logrotate_testfile {\n missingok \n monthly \n rotate 1}" > /etc/logrotate.d/logrotate_testfile') | ||
56 | msg = ('Could not write to /etc/logrotate.d/logrotate_testfile') | 59 | msg = ('Could not write to /etc/logrotate.d/logrotate_testfile') |
57 | self.assertEqual(status, 0, msg = msg) | 60 | self.assertEqual(status, 0, msg = msg) |
58 | 61 | ||
59 | status, output = self.target.run('echo "create \n olddir /var/log//logrotate_dir \n include /etc/logrotate.d/logrotate_testfile" > /tmp/logrotate-test2.conf') | 62 | status, output = self.target.run('echo "create \n olddir /var/log/logrotate_dir \n include /etc/logrotate.d/logrotate_testfile" > /tmp/logrotate-test2.conf') |
60 | msg = ('Could not write to /tmp/logrotate_test2.conf') | 63 | msg = ('Could not write to /tmp/logrotate_test2.conf') |
61 | self.assertEqual(status, 0, msg = msg) | 64 | self.assertEqual(status, 0, msg = msg) |
62 | 65 | ||
63 | status, output = self.target.run('find /var/log//logrotate_dir -type f | grep logrotate_testfile.1') | 66 | status, output = self.target.run('find /var/log/logrotate_dir -type f | grep logrotate_testfile.1') |
64 | msg = ('A rotated log for logrotate_testfile is already present in logrotate_dir') | 67 | msg = ('A rotated log for logrotate_testfile is already present in logrotate_dir') |
65 | self.assertEqual(status, 1, msg = msg) | 68 | self.assertEqual(status, 1, msg = msg) |
66 | 69 | ||
70 | # Call logrotate -f to force the rotation immediately | ||
67 | # If logrotate fails to rotate the log, view the verbose output of logrotate instead of just listing the files in olddir | 71 | # If logrotate fails to rotate the log, view the verbose output of logrotate instead of just listing the files in olddir |
68 | _, logrotate_output = self.target.run('logrotate -vf /tmp/logrotate-test2.conf') | 72 | _, logrotate_output = self.target.run('logrotate -vf /tmp/logrotate-test2.conf') |
69 | status, _ = self.target.run('find /var/log//logrotate_dir -type f | grep logrotate_testfile.1') | 73 | status, _ = self.target.run('find /var/log/logrotate_dir -type f | grep logrotate_testfile.1') |
70 | msg = ('logrotate did not successfully rotate the logrotate_test log. Output from logrotate -vf: \n%s' % (logrotate_output)) | 74 | msg = ('logrotate did not successfully rotate the logrotate_test log. Output from logrotate -vf: \n%s' % (logrotate_output)) |
71 | self.assertEqual(status, 0, msg = msg) | 75 | self.assertEqual(status, 0, msg = msg) |
72 | |||
73 | |||
diff --git a/meta/lib/oeqa/runtime/cases/ltp.py b/meta/lib/oeqa/runtime/cases/ltp.py index f588a93200..0ffdbe23e4 100644 --- a/meta/lib/oeqa/runtime/cases/ltp.py +++ b/meta/lib/oeqa/runtime/cases/ltp.py | |||
@@ -57,7 +57,7 @@ class LtpTestBase(OERuntimeTestCase): | |||
57 | 57 | ||
58 | class LtpTest(LtpTestBase): | 58 | class LtpTest(LtpTestBase): |
59 | 59 | ||
60 | ltp_groups = ["math", "syscalls", "dio", "io", "mm", "ipc", "sched", "nptl", "pty", "containers", "controllers", "filecaps", "cap_bounds", "fcntl-locktests", "commands", "net.ipv6_lib", "input","fs_perms_simple", "cve", "crypto", "ima", "net.nfs", "net_stress.ipsec_icmp", "net.ipv6", "numa", "uevent", "ltp-aiodio.part1", "ltp-aiodio.part2", "ltp-aiodio.part3", "ltp-aiodio.part4"] | 60 | ltp_groups = ["math", "syscalls", "dio", "mm", "sched", "nptl", "pty", "containers", "controllers", "fcntl-locktests", "commands", "net.ipv6_lib", "input","fs_perms_simple", "cve", "crypto", "ima", "net.nfs", "net_stress.ipsec_icmp", "net.ipv6", "numa", "uevent", "ltp-aiodio.part1", "ltp-aiodio.part2", "ltp-aiodio.part3", "ltp-aiodio.part4"] |
61 | 61 | ||
62 | ltp_fs = ["fs", "fs_bind"] | 62 | ltp_fs = ["fs", "fs_bind"] |
63 | # skip kernel cpuhotplug | 63 | # skip kernel cpuhotplug |
diff --git a/meta/lib/oeqa/runtime/cases/parselogs-ignores-mipsarch.txt b/meta/lib/oeqa/runtime/cases/parselogs-ignores-mipsarch.txt index 2c0bd9a247..156b0f9c10 100644 --- a/meta/lib/oeqa/runtime/cases/parselogs-ignores-mipsarch.txt +++ b/meta/lib/oeqa/runtime/cases/parselogs-ignores-mipsarch.txt | |||
@@ -1,2 +1,19 @@ | |||
1 | # These should be reviewed to see if they are still needed | 1 | # These should be reviewed to see if they are still needed |
2 | cacheinfo: Failed to find cpu0 device node | 2 | cacheinfo: Failed to find cpu0 device node |
3 | |||
4 | # 6.10 restructures sysctl registration such that mips | ||
5 | # registers an empty table and generates harmless warnings: | ||
6 | # failed when register_sysctl_sz sched_fair_sysctls to kernel | ||
7 | # failed when register_sysctl_sz sched_core_sysctls to kernel | ||
8 | failed when register_sysctl_sz sched | ||
9 | |||
10 | # With qemu 9.1.0 | ||
11 | # pci 0000:00:00.0: BAR 2: can't handle BAR above 4GB (bus address 0x1f00000010) | ||
12 | # pci 0000:00:00.0: BAR 5: error updating (0x1105d034 != 0x0100d034) | ||
13 | BAR 0: error updating | ||
14 | BAR 1: error updating | ||
15 | BAR 2: error updating | ||
16 | BAR 3: error updating | ||
17 | BAR 4: error updating | ||
18 | BAR 5: error updating | ||
19 | : can't handle BAR above 4GB | ||
diff --git a/meta/lib/oeqa/runtime/cases/parselogs-ignores-qemuall.txt b/meta/lib/oeqa/runtime/cases/parselogs-ignores-qemuall.txt index b0c0fc9ddf..143db40d63 100644 --- a/meta/lib/oeqa/runtime/cases/parselogs-ignores-qemuall.txt +++ b/meta/lib/oeqa/runtime/cases/parselogs-ignores-qemuall.txt | |||
@@ -13,6 +13,14 @@ FBIOPUT_VSCREENINFO failed, double buffering disabled | |||
13 | # pci 0000:00:00.0: [Firmware Bug]: reg 0x20: invalid BAR (can't size) | 13 | # pci 0000:00:00.0: [Firmware Bug]: reg 0x20: invalid BAR (can't size) |
14 | # pci 0000:00:00.0: [Firmware Bug]: reg 0x24: invalid BAR (can't size) | 14 | # pci 0000:00:00.0: [Firmware Bug]: reg 0x24: invalid BAR (can't size) |
15 | invalid BAR (can't size) | 15 | invalid BAR (can't size) |
16 | # 6.10+ the invalid BAR warnings are of this format: | ||
17 | # pci 0000:00:00.0: [Firmware Bug]: BAR 0: invalid; can't size | ||
18 | # pci 0000:00:00.0: [Firmware Bug]: BAR 1: invalid; can't size | ||
19 | # pci 0000:00:00.0: [Firmware Bug]: BAR 2: invalid; can't size | ||
20 | # pci 0000:00:00.0: [Firmware Bug]: BAR 3: invalid; can't size | ||
21 | # pci 0000:00:00.0: [Firmware Bug]: BAR 4: invalid; can't size | ||
22 | # pci 0000:00:00.0: [Firmware Bug]: BAR 5: invalid; can't size | ||
23 | invalid; can't size | ||
16 | 24 | ||
17 | # These should be reviewed to see if they are still needed | 25 | # These should be reviewed to see if they are still needed |
18 | wrong ELF class | 26 | wrong ELF class |
diff --git a/meta/lib/oeqa/runtime/cases/parselogs.py b/meta/lib/oeqa/runtime/cases/parselogs.py index 6966923c94..47c77fccd5 100644 --- a/meta/lib/oeqa/runtime/cases/parselogs.py +++ b/meta/lib/oeqa/runtime/cases/parselogs.py | |||
@@ -34,7 +34,7 @@ class ParseLogsTest(OERuntimeTestCase): | |||
34 | log_locations = ["/var/log/", "/var/log/dmesg", "/tmp/dmesg_output.log"] | 34 | log_locations = ["/var/log/", "/var/log/dmesg", "/tmp/dmesg_output.log"] |
35 | 35 | ||
36 | # The keywords that identify error messages in the log files | 36 | # The keywords that identify error messages in the log files |
37 | errors = ["error", "cannot", "can't", "failed"] | 37 | errors = ["error", "cannot", "can't", "failed", "---[ cut here ]---", "No irq handler for vector"] |
38 | 38 | ||
39 | # A list of error messages that should be ignored | 39 | # A list of error messages that should be ignored |
40 | ignore_errors = [] | 40 | ignore_errors = [] |
diff --git a/meta/lib/oeqa/runtime/cases/ping.py b/meta/lib/oeqa/runtime/cases/ping.py index f72460e7f3..efb91d4cc9 100644 --- a/meta/lib/oeqa/runtime/cases/ping.py +++ b/meta/lib/oeqa/runtime/cases/ping.py | |||
@@ -7,7 +7,7 @@ | |||
7 | from subprocess import Popen, PIPE | 7 | from subprocess import Popen, PIPE |
8 | from time import sleep | 8 | from time import sleep |
9 | 9 | ||
10 | from oeqa.runtime.case import OERuntimeTestCase | 10 | from oeqa.runtime.case import OERuntimeTestCase, run_network_serialdebug |
11 | from oeqa.core.decorator.oetimeout import OETimeout | 11 | from oeqa.core.decorator.oetimeout import OETimeout |
12 | from oeqa.core.exception import OEQATimeoutError | 12 | from oeqa.core.exception import OEQATimeoutError |
13 | 13 | ||
@@ -18,6 +18,13 @@ class PingTest(OERuntimeTestCase): | |||
18 | output = '' | 18 | output = '' |
19 | count = 0 | 19 | count = 0 |
20 | self.assertNotEqual(len(self.target.ip), 0, msg="No target IP address set") | 20 | self.assertNotEqual(len(self.target.ip), 0, msg="No target IP address set") |
21 | |||
22 | # If the target IP is localhost (because user-space networking is being used), | ||
23 | # then there's no point in pinging it. | ||
24 | if self.target.ip.startswith("127.0.0.") or self.target.ip in ("localhost", "::1"): | ||
25 | print("runtime/ping: localhost detected, not pinging") | ||
26 | return | ||
27 | |||
21 | try: | 28 | try: |
22 | while count < 5: | 29 | while count < 5: |
23 | cmd = 'ping -c 1 %s' % self.target.ip | 30 | cmd = 'ping -c 1 %s' % self.target.ip |
@@ -29,6 +36,7 @@ class PingTest(OERuntimeTestCase): | |||
29 | count = 0 | 36 | count = 0 |
30 | sleep(1) | 37 | sleep(1) |
31 | except OEQATimeoutError: | 38 | except OEQATimeoutError: |
39 | run_network_serialdebug(self.target.runner) | ||
32 | self.fail("Ping timeout error for address %s, count %s, output: %s" % (self.target.ip, count, output)) | 40 | self.fail("Ping timeout error for address %s, count %s, output: %s" % (self.target.ip, count, output)) |
33 | msg = ('Expected 5 consecutive, got %d.\n' | 41 | msg = ('Expected 5 consecutive, got %d.\n' |
34 | 'ping output is:\n%s' % (count,output)) | 42 | 'ping output is:\n%s' % (count,output)) |
diff --git a/meta/lib/oeqa/runtime/cases/scp.py b/meta/lib/oeqa/runtime/cases/scp.py index ee97b8ef66..364264369a 100644 --- a/meta/lib/oeqa/runtime/cases/scp.py +++ b/meta/lib/oeqa/runtime/cases/scp.py | |||
@@ -25,7 +25,7 @@ class ScpTest(OERuntimeTestCase): | |||
25 | os.remove(cls.tmp_path) | 25 | os.remove(cls.tmp_path) |
26 | 26 | ||
27 | @OETestDepends(['ssh.SSHTest.test_ssh']) | 27 | @OETestDepends(['ssh.SSHTest.test_ssh']) |
28 | @OEHasPackage(['openssh-scp']) | 28 | @OEHasPackage({'openssh-scp', 'openssh-sftp-server'}) |
29 | def test_scp_file(self): | 29 | def test_scp_file(self): |
30 | dst = '/tmp/test_scp_file' | 30 | dst = '/tmp/test_scp_file' |
31 | 31 | ||
diff --git a/meta/lib/oeqa/runtime/cases/skeletoninit.py b/meta/lib/oeqa/runtime/cases/skeletoninit.py index d0fdcbded9..be7b39a9a3 100644 --- a/meta/lib/oeqa/runtime/cases/skeletoninit.py +++ b/meta/lib/oeqa/runtime/cases/skeletoninit.py | |||
@@ -4,8 +4,7 @@ | |||
4 | # SPDX-License-Identifier: MIT | 4 | # SPDX-License-Identifier: MIT |
5 | # | 5 | # |
6 | 6 | ||
7 | # This test should cover https://bugzilla.yoctoproject.org/tr_show_case.cgi?case_id=284 | 7 | # Image under test must have meta-skeleton layer in bblayers and |
8 | # testcase. Image under test must have meta-skeleton layer in bblayers and | ||
9 | # IMAGE_INSTALL:append = " service" in local.conf | 8 | # IMAGE_INSTALL:append = " service" in local.conf |
10 | from oeqa.runtime.case import OERuntimeTestCase | 9 | from oeqa.runtime.case import OERuntimeTestCase |
11 | from oeqa.core.decorator.depends import OETestDepends | 10 | from oeqa.core.decorator.depends import OETestDepends |
diff --git a/meta/lib/oeqa/runtime/cases/ssh.py b/meta/lib/oeqa/runtime/cases/ssh.py index cdbef59500..3e9503277e 100644 --- a/meta/lib/oeqa/runtime/cases/ssh.py +++ b/meta/lib/oeqa/runtime/cases/ssh.py | |||
@@ -4,7 +4,10 @@ | |||
4 | # SPDX-License-Identifier: MIT | 4 | # SPDX-License-Identifier: MIT |
5 | # | 5 | # |
6 | 6 | ||
7 | from oeqa.runtime.case import OERuntimeTestCase | 7 | import time |
8 | import signal | ||
9 | |||
10 | from oeqa.runtime.case import OERuntimeTestCase, run_network_serialdebug | ||
8 | from oeqa.core.decorator.depends import OETestDepends | 11 | from oeqa.core.decorator.depends import OETestDepends |
9 | from oeqa.runtime.decorator.package import OEHasPackage | 12 | from oeqa.runtime.decorator.package import OEHasPackage |
10 | 13 | ||
@@ -13,12 +16,23 @@ class SSHTest(OERuntimeTestCase): | |||
13 | @OETestDepends(['ping.PingTest.test_ping']) | 16 | @OETestDepends(['ping.PingTest.test_ping']) |
14 | @OEHasPackage(['dropbear', 'openssh-sshd']) | 17 | @OEHasPackage(['dropbear', 'openssh-sshd']) |
15 | def test_ssh(self): | 18 | def test_ssh(self): |
16 | (status, output) = self.target.run('sleep 20', timeout=2) | 19 | for i in range(5): |
17 | msg='run() timed out but return code was zero.' | 20 | status, output = self.target.run("uname -a", timeout=30, ignore_ssh_fails=True) |
18 | self.assertNotEqual(status, 0, msg=msg) | 21 | if status == 0: |
19 | (status, output) = self.target.run('uname -a') | 22 | break |
20 | self.assertEqual(status, 0, msg='SSH Test failed: %s' % output) | 23 | elif status == 255 or status == -signal.SIGTERM: |
21 | (status, output) = self.target.run('cat /etc/controllerimage') | 24 | # ssh returns 255 only if a ssh error occurs. This could |
22 | msg = "This isn't the right image - /etc/controllerimage " \ | 25 | # be an issue with "Connection refused" because the port |
23 | "shouldn't be here %s" % output | 26 | # isn't open yet, and this could check explicitly for that |
24 | self.assertEqual(status, 1, msg=msg) | 27 | # here. However, let's keep it simple and just retry for |
28 | # all errors a limited amount of times with a sleep to | ||
29 | # give it time for the port to open. | ||
30 | # We sometimes see -15 (SIGTERM) on slow emulation machines too, likely | ||
31 | # from boot/init not being 100% complete, retry for these too. | ||
32 | time.sleep(5) | ||
33 | continue | ||
34 | else: | ||
35 | run_network_serialdebug(self.target.runner) | ||
36 | self.fail("uname failed with \"%s\" (exit code %s)" % (output, status)) | ||
37 | if status != 0: | ||
38 | self.fail("ssh failed with \"%s\" (exit code %s)" % (output, status)) | ||
diff --git a/meta/lib/oeqa/runtime/cases/stap.py b/meta/lib/oeqa/runtime/cases/stap.py index 3be4162108..d83cb0b2b8 100644 --- a/meta/lib/oeqa/runtime/cases/stap.py +++ b/meta/lib/oeqa/runtime/cases/stap.py | |||
@@ -16,16 +16,21 @@ class StapTest(OERuntimeTestCase): | |||
16 | @OEHasPackage(['gcc-symlinks']) | 16 | @OEHasPackage(['gcc-symlinks']) |
17 | @OEHasPackage(['kernel-devsrc']) | 17 | @OEHasPackage(['kernel-devsrc']) |
18 | def test_stap(self): | 18 | def test_stap(self): |
19 | from oe.utils import parallel_make_value | ||
20 | pmv = parallel_make_value((self.td.get('PARALLEL_MAKE') or '').split()) | ||
21 | parallel_make = "-j %d" % (pmv) if pmv else "" | ||
22 | |||
19 | try: | 23 | try: |
20 | cmd = 'make -j -C /usr/src/kernel scripts prepare' | 24 | cmd = 'make %s -C /usr/src/kernel scripts prepare' % (parallel_make) |
21 | status, output = self.target.run(cmd, 900) | 25 | status, output = self.target.run(cmd, 900) |
22 | self.assertEqual(status, 0, msg='\n'.join([cmd, output])) | 26 | self.assertEqual(status, 0, msg='\n'.join([cmd, output])) |
23 | 27 | ||
24 | cmd = 'stap -v -p4 -m stap-hello --disable-cache -DSTP_NO_VERREL_CHECK -e \'probe oneshot { print("Hello, "); println("SystemTap!") }\'' | 28 | cmd = 'stap -v -p4 -m stap_hello --disable-cache -DSTP_NO_VERREL_CHECK -e \'probe oneshot { print("Hello, "); println("SystemTap!") }\'' |
25 | status, output = self.target.run(cmd, 900) | 29 | status, output = self.target.run(cmd, 900) |
26 | self.assertEqual(status, 0, msg='\n'.join([cmd, output])) | 30 | self.assertEqual(status, 0, msg='\n'.join([cmd, output])) |
27 | 31 | ||
28 | cmd = 'staprun -v -R -b1 stap-hello.ko' | 32 | cmd = 'staprun -v -R -b1 stap_hello.ko' |
33 | status, output = self.target.run(cmd, 60) | ||
29 | self.assertEqual(status, 0, msg='\n'.join([cmd, output])) | 34 | self.assertEqual(status, 0, msg='\n'.join([cmd, output])) |
30 | self.assertIn('Hello, SystemTap!', output, msg='\n'.join([cmd, output])) | 35 | self.assertIn('Hello, SystemTap!', output, msg='\n'.join([cmd, output])) |
31 | except: | 36 | except: |
diff --git a/meta/lib/oeqa/runtime/cases/systemd.py b/meta/lib/oeqa/runtime/cases/systemd.py index 5481e1d840..640f28abe9 100644 --- a/meta/lib/oeqa/runtime/cases/systemd.py +++ b/meta/lib/oeqa/runtime/cases/systemd.py | |||
@@ -145,18 +145,29 @@ class SystemdServiceTests(SystemdTest): | |||
145 | Verify that call-stacks generated by systemd-coredump contain symbolicated call-stacks, | 145 | Verify that call-stacks generated by systemd-coredump contain symbolicated call-stacks, |
146 | extracted from the minidebuginfo metadata (.gnu_debugdata elf section). | 146 | extracted from the minidebuginfo metadata (.gnu_debugdata elf section). |
147 | """ | 147 | """ |
148 | t_thread = threading.Thread(target=self.target.run, args=("ulimit -c unlimited && sleep 1000",)) | 148 | # use "env sleep" instead of "sleep" to avoid calling the shell builtin function |
149 | t_thread = threading.Thread(target=self.target.run, args=("ulimit -c unlimited && env sleep 1000",)) | ||
149 | t_thread.start() | 150 | t_thread.start() |
150 | time.sleep(1) | 151 | time.sleep(1) |
151 | 152 | ||
152 | status, output = self.target.run('pidof sleep') | 153 | status, sleep_pid = self.target.run('pidof sleep') |
153 | # cause segfault on purpose | 154 | # cause segfault on purpose |
154 | self.target.run('kill -SEGV %s' % output) | 155 | self.target.run('kill -SEGV %s' % sleep_pid) |
155 | self.assertEqual(status, 0, msg = 'Not able to find process that runs sleep, output : %s' % output) | 156 | self.assertEqual(status, 0, msg = 'Not able to find process that runs sleep, output : %s' % sleep_pid) |
156 | 157 | ||
157 | (status, output) = self.target.run('coredumpctl info') | 158 | # Give some time to systemd-coredump@.service to process the coredump |
159 | for x in range(20): | ||
160 | status, output = self.target.run('coredumpctl list %s' % sleep_pid) | ||
161 | if status == 0: | ||
162 | break | ||
163 | time.sleep(1) | ||
164 | else: | ||
165 | self.fail("Timed out waiting for coredump creation") | ||
166 | |||
167 | (status, output) = self.target.run('coredumpctl info %s' % sleep_pid) | ||
158 | self.assertEqual(status, 0, msg='MiniDebugInfo Test failed: %s' % output) | 168 | self.assertEqual(status, 0, msg='MiniDebugInfo Test failed: %s' % output) |
159 | self.assertEqual('sleep_for_duration (busybox.nosuid' in output, True, msg='Call stack is missing minidebuginfo symbols (functions shown as "n/a"): %s' % output) | 169 | self.assertEqual('sleep_for_duration (busybox.nosuid' in output or 'xnanosleep (sleep.coreutils' in output, |
170 | True, msg='Call stack is missing minidebuginfo symbols (functions shown as "n/a"): %s' % output) | ||
160 | 171 | ||
161 | class SystemdJournalTests(SystemdTest): | 172 | class SystemdJournalTests(SystemdTest): |
162 | 173 | ||
diff --git a/meta/lib/oeqa/runtime/cases/uki.py b/meta/lib/oeqa/runtime/cases/uki.py new file mode 100644 index 0000000000..77bc5b9791 --- /dev/null +++ b/meta/lib/oeqa/runtime/cases/uki.py | |||
@@ -0,0 +1,16 @@ | |||
1 | # SPDX-License-Identifier: MIT | ||
2 | # | ||
3 | |||
4 | from oeqa.runtime.case import OERuntimeTestCase | ||
5 | from oeqa.core.decorator.data import skipIfNotInDataVar | ||
6 | |||
7 | class UkiTest(OERuntimeTestCase): | ||
8 | |||
9 | @skipIfNotInDataVar('IMAGE_CLASSES', 'uki', 'Test case uki is for images which use uki.bbclass') | ||
10 | def test_uki(self): | ||
11 | uki_filename = self.td.get('UKI_FILENAME') | ||
12 | status, output = self.target.run('ls /boot/EFI/Linux/%s' % uki_filename) | ||
13 | self.assertEqual(status, 0, output) | ||
14 | |||
15 | status, output = self.target.run('echo $( cat /sys/firmware/efi/efivars/LoaderEntrySelected-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f ) | grep %s' % uki_filename) | ||
16 | self.assertEqual(status, 0, output) | ||
diff --git a/meta/lib/oeqa/runtime/cases/weston.py b/meta/lib/oeqa/runtime/cases/weston.py index ee4d336482..e2cecffe83 100644 --- a/meta/lib/oeqa/runtime/cases/weston.py +++ b/meta/lib/oeqa/runtime/cases/weston.py | |||
@@ -16,7 +16,7 @@ class WestonTest(OERuntimeTestCase): | |||
16 | 16 | ||
17 | @classmethod | 17 | @classmethod |
18 | def tearDownClass(cls): | 18 | def tearDownClass(cls): |
19 | cls.tc.target.run('rm %s' % cls.weston_log_file) | 19 | cls.tc.target.run('rm %s' % cls.weston_log_file, ignore_ssh_fails=True) |
20 | 20 | ||
21 | @OETestDepends(['ssh.SSHTest.test_ssh']) | 21 | @OETestDepends(['ssh.SSHTest.test_ssh']) |
22 | @OEHasPackage(['weston']) | 22 | @OEHasPackage(['weston']) |
diff --git a/meta/lib/oeqa/runtime/context.py b/meta/lib/oeqa/runtime/context.py index cb7227a8df..daabc44910 100644 --- a/meta/lib/oeqa/runtime/context.py +++ b/meta/lib/oeqa/runtime/context.py | |||
@@ -8,6 +8,7 @@ import os | |||
8 | import sys | 8 | import sys |
9 | 9 | ||
10 | from oeqa.core.context import OETestContext, OETestContextExecutor | 10 | from oeqa.core.context import OETestContext, OETestContextExecutor |
11 | from oeqa.core.target.serial import OESerialTarget | ||
11 | from oeqa.core.target.ssh import OESSHTarget | 12 | from oeqa.core.target.ssh import OESSHTarget |
12 | from oeqa.core.target.qemu import OEQemuTarget | 13 | from oeqa.core.target.qemu import OEQemuTarget |
13 | 14 | ||
@@ -60,7 +61,7 @@ class OERuntimeTestContextExecutor(OETestContextExecutor): | |||
60 | runtime_group = self.parser.add_argument_group('runtime options') | 61 | runtime_group = self.parser.add_argument_group('runtime options') |
61 | 62 | ||
62 | runtime_group.add_argument('--target-type', action='store', | 63 | runtime_group.add_argument('--target-type', action='store', |
63 | default=self.default_target_type, choices=['simpleremote', 'qemu'], | 64 | default=self.default_target_type, choices=['simpleremote', 'qemu', 'serial'], |
64 | help="Target type of device under test, default: %s" \ | 65 | help="Target type of device under test, default: %s" \ |
65 | % self.default_target_type) | 66 | % self.default_target_type) |
66 | runtime_group.add_argument('--target-ip', action='store', | 67 | runtime_group.add_argument('--target-ip', action='store', |
@@ -108,6 +109,8 @@ class OERuntimeTestContextExecutor(OETestContextExecutor): | |||
108 | target = OESSHTarget(logger, target_ip, server_ip, **kwargs) | 109 | target = OESSHTarget(logger, target_ip, server_ip, **kwargs) |
109 | elif target_type == 'qemu': | 110 | elif target_type == 'qemu': |
110 | target = OEQemuTarget(logger, server_ip, **kwargs) | 111 | target = OEQemuTarget(logger, server_ip, **kwargs) |
112 | elif target_type == 'serial': | ||
113 | target = OESerialTarget(logger, target_ip, server_ip, **kwargs) | ||
111 | else: | 114 | else: |
112 | # XXX: This code uses the old naming convention for controllers and | 115 | # XXX: This code uses the old naming convention for controllers and |
113 | # targets, the idea it is to leave just targets as the controller | 116 | # targets, the idea it is to leave just targets as the controller |
@@ -203,8 +206,15 @@ class OERuntimeTestContextExecutor(OETestContextExecutor): | |||
203 | 206 | ||
204 | super(OERuntimeTestContextExecutor, self)._process_args(logger, args) | 207 | super(OERuntimeTestContextExecutor, self)._process_args(logger, args) |
205 | 208 | ||
209 | td = self.tc_kwargs['init']['td'] | ||
210 | |||
206 | target_kwargs = {} | 211 | target_kwargs = {} |
212 | target_kwargs['machine'] = td.get("MACHINE") or None | ||
207 | target_kwargs['qemuboot'] = args.qemu_boot | 213 | target_kwargs['qemuboot'] = args.qemu_boot |
214 | target_kwargs['serialcontrol_cmd'] = td.get("TEST_SERIALCONTROL_CMD") or None | ||
215 | target_kwargs['serialcontrol_extra_args'] = td.get("TEST_SERIALCONTROL_EXTRA_ARGS") or "" | ||
216 | target_kwargs['serialcontrol_ps1'] = td.get("TEST_SERIALCONTROL_PS1") or None | ||
217 | target_kwargs['serialcontrol_connect_timeout'] = td.get("TEST_SERIALCONTROL_CONNECT_TIMEOUT") or None | ||
208 | 218 | ||
209 | self.tc_kwargs['init']['target'] = \ | 219 | self.tc_kwargs['init']['target'] = \ |
210 | OERuntimeTestContextExecutor.getTarget(args.target_type, | 220 | OERuntimeTestContextExecutor.getTarget(args.target_type, |