summarylogtreecommitdiffstats
path: root/python311-fix.patch
blob: dfd3b774494830d2a69c5626b279dc98e1861719 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
From 90c1695cfeee62e1a041cf298450a70766305102 Mon Sep 17 00:00:00 2001
Date: Thu, 18 May 2023 02:25:57 -0400
Subject: [PATCH] python3.11 fix

---
 common/test/test_backintime.py | 95 +++++++++++++++++++++++-----------
 1 file changed, 66 insertions(+), 29 deletions(-)

diff --git a/common/test/test_backintime.py b/common/test/test_backintime.py
index e091ee4..5d1836c 100644
--- a/common/test/test_backintime.py
+++ b/common/test/test_backintime.py
@@ -14,7 +14,6 @@
 # You should have received a copy of the GNU General Public License along
 # with this program; if not, write to the Free Software Foundation,Inc.,
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
 import os
 import re
 import subprocess
@@ -25,14 +24,10 @@ import json
 
 import config
 
-
-
 sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
 
 
 class TestBackInTime(generic.TestCase):
-    """main tests for backintime"""
-
     def setUp(self):
         super(TestBackInTime, self).setUp()
 
@@ -42,13 +37,20 @@ class TestBackInTime(generic.TestCase):
         self.assertEqual("", output)
 
     def test_local_snapshot_is_successful(self):
-        """end to end test - from BIT initialization through snapshot
+        """From BIT initialization through snapshot
 
         From BIT initialization all the way through successful snapshot on a
         local mount. test one of the highest level interfaces a user could
         work with - the command line ensures that argument parsing,
         functionality, and output all work as expected is NOT intended to
-        replace individual method tests, which are incredibly useful as well
+        replace individual method tests, which are incredibly useful as well.
+
+        Development notes (by Buhtz):
+        Multiple tests do compare return codes and output on stdout. The
+        intention might be an integration tests. But the asserts not qualified
+        to answer the important questions and observe the intended behaviour.
+        Heavy refactoring is needed. But because of the "level" of that tests
+        it won't happen in the near future.
         """
 
         # ensure that we see full diffs of assert output if there are any
@@ -57,6 +59,7 @@ class TestBackInTime(generic.TestCase):
         # create pristine source directory with single file
         subprocess.getoutput("chmod -R a+rwx /tmp/test && rm -rf /tmp/test")
         os.mkdir('/tmp/test')
+
         with open('/tmp/test/testfile', 'w') as f:
             f.write('some data')
 
@@ -129,29 +132,56 @@ This is free software, and you are welcome to redistribute it
 under certain conditions; type `backintime --license' for details.
 ''', re.MULTILINE))
 
+        # Workaround until refactoring was done (Buhtz, Feb.'23)
         # The log output completely goes to stderr.
-        # Note: DBus warnings at the begin and end are already ignored by the regex
-        #       but if the BiT serviceHelper.py DBus daemon is not installed
-        #       at all the warnings also occur in the middle of below expected
-        #       INFO log lines so they are removed by filtering here.
-        # TODO If filtering output rows should become a common testing pattern
-        #      this code should be refactored into a function for reusability.
-        log_output = []
-        for line in error.decode().split("\n"):
-            if (not line.startswith("WARNING: Failed to connect to Udev serviceHelper")
-                    and not line.startswith("WARNING: D-Bus message:")
-                    and not line.startswith("WARNING: Udev-based profiles cannot be changed or checked")
-                    and not line.startswith("WARNING: Inhibit Suspend failed")):
-                log_output.append(line)
-        filtered_log_output = "\n".join(log_output)
+        # Note: DBus warnings at the begin and end are already ignored by the
+        #       regex but if the BiT serviceHelper.py DBus daemon is not
+        #       installed at all the warnings also occur in the middle of below
+        #       expected INFO log lines so they are removed by filtering here.
+        #       The same goes with Gtk warnings.
+
+        line_beginnings_to_exclude = [
+            "WARNING: Failed to connect to Udev serviceHelper",
+            "WARNING: D-Bus message:",
+            "WARNING: Udev-based profiles cannot be changed or checked",
+            "WARNING: Inhibit Suspend failed",
+            "Ignoring XDG_SESSION_TYPE=wayland on Gnome. Use QT_QPA_PLATFORM=wayland to run on Wayland anyway"
+        ]
+
+        line_contains_to_exclude = [
+            "Gtk-WARNING",
+            "qt.qpa.plugin: Could not find the Qt platform plugin"
+        ]
+
+        # remove lines via startswith()
+        filtered_log_output = filter(
+            lambda line: not any([
+                line.startswith(ex) for ex in line_beginnings_to_exclude]),
+            error.decode().split('\n')
+        )
+
+        # remove lines via __contains__()
+        filtered_log_output = filter(
+            lambda line: not any([
+                ex in line for ex in line_contains_to_exclude]),
+            filtered_log_output
+        )
+
+        # remove empty lines
+        filtered_log_output = filter(
+            lambda line: line,
+            filtered_log_output
+        )
+
+        filtered_log_output = '\n'.join(filtered_log_output)
+
         self.assertRegex(filtered_log_output, re.compile(r'''INFO: Lock
 INFO: Take a new snapshot. Profile: 1 Main profile
 INFO: Call rsync to take the snapshot
 INFO: Save config file
 INFO: Save permissions
 INFO: Create info file
-INFO: Unlock
-''', re.MULTILINE))
+INFO: Unlock''', re.MULTILINE))
 
         # get snapshot id
         subprocess.check_output(["./backintime",
@@ -187,8 +217,13 @@ under certain conditions; type `backintime --license' for details.
 ''', re.MULTILINE))
 
         # The log output completely goes to stderr
-        self.assertRegex(error.decode(), re.compile(r'''INFO: Restore: /tmp/test/testfile to: /tmp/restored.*''',
-                                                     re.MULTILINE))
+        self.assertRegex(
+            error.decode(),
+            re.compile(
+                r'''INFO: Restore: /tmp/test/testfile to: /tmp/restored.*''',
+                re.MULTILINE
+            )
+        )
 
         # verify that files restored are the same as those backed up
         subprocess.check_output(["diff",
@@ -197,14 +232,16 @@ under certain conditions; type `backintime --license' for details.
                                  "/tmp/restored"])
 
     def test_diagnostics_arg(self):
-
         # "output" from stdout may currently be polluted with logging output
         # lines from INFO and DEBUG log output.
         # Logging output of WARNING and ERROR is already written to stderr
-        # so `check_output` does work here (returns only stdout without stderr).
+        # so `check_output` does work here (returns only stdout without
+        # stderr).
         output = subprocess.check_output(["./backintime", "--diagnostics"])
         # output = subprocess.getoutput("./backintime --diagnostics")
 
         diagnostics = json.loads(output)
-        self.assertEqual(diagnostics["backintime"]["name"],    config.Config.APP_NAME)
-        self.assertEqual(diagnostics["backintime"]["version"], config.Config.VERSION)
+        self.assertEqual(diagnostics["backintime"]["name"],
+                         config.Config.APP_NAME)
+        self.assertEqual(diagnostics["backintime"]["version"],
+                         config.Config.VERSION)
-- 
2.40.1