14
14
# limitations under the License.
15
15
import logging
16
16
17
+ from twisted .test .proto_helpers import AccumulatingProtocol
18
+
17
19
from synapse .logging import RemoteHandler
18
20
19
- from tests .server import connect_client
21
+ from tests .server import FakeTransport
20
22
from tests .unittest import DEBUG , HomeserverTestCase
21
23
22
24
23
- class FakeBeginner :
24
- def beginLoggingTo (self , observers , ** kwargs ):
25
- self .observers = observers
26
-
27
-
28
25
class StructuredLoggingTestBase :
29
26
"""
30
27
Test base that registers a cleanup handler to reset the stdlib log handler
@@ -38,6 +35,20 @@ def _cleanup():
38
35
self .addCleanup (_cleanup )
39
36
40
37
38
+ def connect_logging_client (reactor , client_id ):
39
+ # This is essentially tests.server.connect_client, but disabling autoflush on
40
+ # the client transport. This is necessary to avoid an infinite loop due to
41
+ # sending of data via the logging transport causing additional logs to be
42
+ # written.
43
+ factory = reactor .tcpClients .pop (client_id )[2 ]
44
+ client = factory .buildProtocol (None )
45
+ server = AccumulatingProtocol ()
46
+ server .makeConnection (FakeTransport (client , reactor ))
47
+ client .makeConnection (FakeTransport (server , reactor , autoflush = False ))
48
+
49
+ return client , server
50
+
51
+
41
52
class RemoteHandlerTestCase (StructuredLoggingTestBase , HomeserverTestCase ):
42
53
@DEBUG
43
54
def test_log_output (self ):
@@ -51,12 +62,10 @@ def test_log_output(self):
51
62
logger .info ("Hello there, %s!" , "wally" )
52
63
53
64
# Trigger the connection
54
- self .pump ()
55
-
56
- _ , server = connect_client (self .reactor , 0 )
65
+ client , server = connect_logging_client (self .reactor , 0 )
57
66
58
67
# Trigger data being sent
59
- self . pump ()
68
+ client . transport . flush ()
60
69
61
70
# One log message, with a single trailing newline
62
71
logs = server .data .decode ("utf8" ).splitlines ()
@@ -89,8 +98,8 @@ def test_log_backpressure_debug(self):
89
98
logger .debug ("too much debug" )
90
99
91
100
# Allow the reconnection
92
- _ , server = connect_client (self .reactor , 0 )
93
- self . pump ()
101
+ client , server = connect_logging_client (self .reactor , 0 )
102
+ client . transport . flush ()
94
103
95
104
# Only the 7 infos made it through, the debugs were elided
96
105
logs = server .data .splitlines ()
@@ -124,8 +133,8 @@ def test_log_backpressure_info(self):
124
133
logger .debug ("too much debug" )
125
134
126
135
# Allow the reconnection
127
- _ , server = connect_client (self .reactor , 0 )
128
- self . pump ()
136
+ client , server = connect_logging_client (self .reactor , 0 )
137
+ client . transport . flush ()
129
138
130
139
# The 10 warnings made it through, the debugs and infos were elided
131
140
logs = server .data .splitlines ()
@@ -150,8 +159,8 @@ def test_log_backpressure_cut_middle(self):
150
159
logger .warning ("warn %s" % (i ,))
151
160
152
161
# Allow the reconnection
153
- _ , server = connect_client (self .reactor , 0 )
154
- self . pump ()
162
+ client , server = connect_logging_client (self .reactor , 0 )
163
+ client . transport . flush ()
155
164
156
165
# The first five and last five warnings made it through, the debugs and
157
166
# infos were elided
0 commit comments