1#
2# SPDX-License-Identifier: MIT
3#
4
5
6from oeqa.selftest.case import OESelftestTestCase
7from oeqa.utils.commands import bitbake
8
9class BitBakeLogging(OESelftestTestCase):
10
11    def assertCount(self, item, entry, count):
12        self.assertEqual(item.count(entry), count, msg="Output:\n'''\n%s\n'''\ndoesn't contain %d copies of:\n'''\n%s\n'''\n" % (item, count, entry))
13
14    def test_shell_logging(self):
15        # no logs, no verbose
16        self.write_config('BBINCLUDELOGS = ""')
17        result = bitbake("logging-test -c shelltest -f", ignore_status = True)
18        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
19        self.assertNotIn("This is shell stdout", result.output)
20        self.assertNotIn("This is shell stderr", result.output)
21
22        # logs, no verbose
23        self.write_config('BBINCLUDELOGS = "yes"')
24        result = bitbake("logging-test -c shelltest -f", ignore_status = True)
25        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
26        self.assertCount(result.output, "This is shell stdout", 1)
27        self.assertCount(result.output, "This is shell stderr", 1)
28
29        # no logs, verbose
30        self.write_config('BBINCLUDELOGS = ""')
31        result = bitbake("logging-test -c shelltest -f -v", ignore_status = True)
32        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
33        # two copies due to set +x
34        self.assertCount(result.output, "This is shell stdout", 2)
35        self.assertCount(result.output, "This is shell stderr", 2)
36
37        # logs, verbose
38        self.write_config('BBINCLUDELOGS = "yes"')
39        result = bitbake("logging-test -c shelltest -f -v", ignore_status = True)
40        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
41        # two copies due to set +x
42        self.assertCount(result.output, "This is shell stdout", 2)
43        self.assertCount(result.output, "This is shell stderr", 2)
44
45    def test_python_exit_logging(self):
46        # no logs, no verbose
47        self.write_config('BBINCLUDELOGS = ""')
48        result = bitbake("logging-test -c pythontest_exit -f", ignore_status = True)
49        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
50        self.assertNotIn("This is python stdout", result.output)
51
52        # logs, no verbose
53        self.write_config('BBINCLUDELOGS = "yes"')
54        result = bitbake("logging-test -c pythontest_exit -f", ignore_status = True)
55        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
56        # A sys.exit() should include the output
57        self.assertCount(result.output, "This is python stdout", 1)
58
59        # no logs, verbose
60        self.write_config('BBINCLUDELOGS = ""')
61        result = bitbake("logging-test -c pythontest_exit -f -v", ignore_status = True)
62        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
63        # python tasks don't log output with -v currently
64        #self.assertCount(result.output, "This is python stdout", 1)
65
66        # logs, verbose
67        self.write_config('BBINCLUDELOGS = "yes"')
68        result = bitbake("logging-test -c pythontest_exit -f -v", ignore_status = True)
69        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
70        # python tasks don't log output with -v currently
71        #self.assertCount(result.output, "This is python stdout", 1)
72
73    def test_python_fatal_logging(self):
74        # no logs, no verbose
75        self.write_config('BBINCLUDELOGS = ""')
76        result = bitbake("logging-test -c pythontest_fatal -f", ignore_status = True)
77        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
78        self.assertNotIn("This is python fatal test stdout", result.output)
79        self.assertCount(result.output, "This is a fatal error", 1)
80
81        # logs, no verbose
82        self.write_config('BBINCLUDELOGS = "yes"')
83        result = bitbake("logging-test -c pythontest_fatal -f", ignore_status = True)
84        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
85        # A bb.fatal() should not include the output
86        self.assertNotIn("This is python fatal test stdout", result.output)
87        self.assertCount(result.output, "This is a fatal error", 1)
88
89        # no logs, verbose
90        self.write_config('BBINCLUDELOGS = ""')
91        result = bitbake("logging-test -c pythontest_fatal -f -v", ignore_status = True)
92        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
93        # python tasks don't log output with -v currently
94        #self.assertCount(result.output, "This is python fatal test stdout", 1)
95        self.assertCount(result.output, "This is a fatal error", 1)
96
97        # logs, verbose
98        self.write_config('BBINCLUDELOGS = "yes"')
99        result = bitbake("logging-test -c pythontest_fatal -f -v", ignore_status = True)
100        self.assertIn("ERROR: Logfile of failure stored in:", result.output)
101        # python tasks don't log output with -v currently
102        #self.assertCount(result.output, "This is python fatal test stdout", 1)
103        self.assertCount(result.output, "This is a fatal error", 1)
104
105