|
5 | 5 | import os |
6 | 6 | import unittest |
7 | 7 | import datetime |
| 8 | +import time |
8 | 9 |
|
9 | 10 | import patch_path |
10 | 11 | from mock_server import Server |
@@ -129,6 +130,82 @@ def test_row_before_connect(self): |
129 | 130 | finally: |
130 | 131 | sender.close() |
131 | 132 |
|
| 133 | + def test_flush_1(self): |
| 134 | + with Server() as server: |
| 135 | + with ilp.Sender('localhost', server.port) as sender: |
| 136 | + server.accept() |
| 137 | + with self.assertRaisesRegex(ilp.IlpError, 'Column names'): |
| 138 | + sender.row('tbl1', symbols={'...bad name..': 'val1'}) |
| 139 | + self.assertEqual(str(sender), '') |
| 140 | + sender.flush() |
| 141 | + self.assertEqual(str(sender), '') |
| 142 | + msgs = server.recv() |
| 143 | + self.assertEqual(msgs, []) |
| 144 | + |
| 145 | + def test_flush_2(self): |
| 146 | + with Server() as server: |
| 147 | + with ilp.Sender('localhost', server.port) as sender: |
| 148 | + server.accept() |
| 149 | + server.close() |
| 150 | + |
| 151 | + # We enter a bad state where we can't flush again. |
| 152 | + with self.assertRaises(ilp.IlpError): |
| 153 | + for _ in range(1000): |
| 154 | + time.sleep(0.01) |
| 155 | + sender.row('tbl1', symbols={'a': 'b'}) |
| 156 | + sender.flush() |
| 157 | + |
| 158 | + # We should still be in a bad state. |
| 159 | + with self.assertRaises(ilp.IlpError): |
| 160 | + sender.row('tbl1', symbols={'a': 'b'}) |
| 161 | + sender.flush() |
| 162 | + |
| 163 | + # Leaving the `with` scope will call __exit__ and here we test |
| 164 | + # that a prior exception will not cause subsequent problems. |
| 165 | + |
| 166 | + def test_flush_3(self): |
| 167 | + # Same as test_flush_2, but we catch the exception _outside_ the |
| 168 | + # sender's `with` block, to ensure no exceptions get trapped. |
| 169 | + with Server() as server: |
| 170 | + with self.assertRaises(ilp.IlpError): |
| 171 | + with ilp.Sender('localhost', server.port) as sender: |
| 172 | + server.accept() |
| 173 | + server.close() |
| 174 | + for _ in range(1000): |
| 175 | + time.sleep(0.01) |
| 176 | + sender.row('tbl1', symbols={'a': 'b'}) |
| 177 | + sender.flush() |
| 178 | + |
| 179 | + def test_independent_buffer(self): |
| 180 | + buf = ilp.Buffer() |
| 181 | + buf.row('tbl1', symbols={'sym1': 'val1'}) |
| 182 | + exp = 'tbl1,sym1=val1\n' |
| 183 | + bexp = exp[:-1].encode('utf-8') |
| 184 | + self.assertEqual(str(buf), exp) |
| 185 | + |
| 186 | + with Server() as server1, Server() as server2: |
| 187 | + with ilp.Sender('localhost', server1.port) as sender1, \ |
| 188 | + ilp.Sender('localhost', server2.port) as sender2: |
| 189 | + server1.accept() |
| 190 | + server2.accept() |
| 191 | + |
| 192 | + sender1.flush(buf, clear=False) |
| 193 | + self.assertEqual(str(buf), exp) |
| 194 | + |
| 195 | + sender2.flush(buf, clear=False) |
| 196 | + self.assertEqual(str(buf), exp) |
| 197 | + |
| 198 | + msgs1 = server1.recv() |
| 199 | + msgs2 = server2.recv() |
| 200 | + self.assertEqual(msgs1, [bexp]) |
| 201 | + self.assertEqual(msgs2, [bexp]) |
| 202 | + |
| 203 | + sender1.flush(buf) |
| 204 | + self.assertEqual(server1.recv(), [bexp]) |
| 205 | + |
| 206 | + # The buffer is now auto-cleared. |
| 207 | + self.assertEqual(str(buf), '') |
| 208 | + |
132 | 209 |
|
133 | 210 | if __name__ == '__main__': |
134 | 211 | unittest.main() |
0 commit comments