92
92
This uses None as the output stream to show that the constructor
93
93
doesn't try to use the output stream.
95
pack.ContainerWriter(None)
95
writer = pack.ContainerWriter(None)
97
97
def test_begin(self):
98
98
"""The begin() method writes the container format marker line."""
119
119
def test_non_empty_end_does_not_add_a_record_to_records_written(self):
120
120
"""The end() method does not count towards the records written."""
121
121
self.writer.begin()
122
self.writer.add_bytes_record([b'foo'], len(b'foo'), names=[])
122
self.writer.add_bytes_record(b'foo', names=[])
123
123
self.writer.end()
124
124
self.assertEqual(1, self.writer.records_written)
126
126
def test_add_bytes_record_no_name(self):
127
127
"""Add a bytes record with no name."""
128
128
self.writer.begin()
129
offset, length = self.writer.add_bytes_record([b'abc'], len(b'abc'), names=[])
129
offset, length = self.writer.add_bytes_record(b'abc', names=[])
130
130
self.assertEqual((42, 7), (offset, length))
131
131
self.assertOutput(
132
132
b'Bazaar pack format 1 (introduced in 0.18)\nB3\n\nabc')
136
136
self.writer.begin()
138
138
offset, length = self.writer.add_bytes_record(
139
[b'abc'], len(b'abc'), names=[(b'name1', )])
139
b'abc', names=[(b'name1', )])
140
140
self.assertEqual((42, 13), (offset, length))
141
141
self.assertOutput(
142
142
b'Bazaar pack format 1 (introduced in 0.18)\n'
158
158
self.writer.begin()
159
159
offset, length = self.writer.add_bytes_record(
160
[b'abcabc'], len(b'abcabc'), names=[(b'name1', )])
160
b'abcabc', names=[(b'name1', )])
161
161
self.assertEqual((42, 16), (offset, length))
162
162
self.assertOutput(
163
163
b'Bazaar pack format 1 (introduced in 0.18)\n'
173
173
"""Add a bytes record with two names."""
174
174
self.writer.begin()
175
175
offset, length = self.writer.add_bytes_record(
176
[b'abc'], len(b'abc'), names=[(b'name1', ), (b'name2', )])
176
b'abc', names=[(b'name1', ), (b'name2', )])
177
177
self.assertEqual((42, 19), (offset, length))
178
178
self.assertOutput(
179
179
b'Bazaar pack format 1 (introduced in 0.18)\n'
183
183
"""Add a bytes record with two names."""
184
184
self.writer.begin()
185
185
offset, length = self.writer.add_bytes_record(
186
[b'abc'], len(b'abc'), names=[(b'name1', ), (b'name2', )])
186
b'abc', names=[(b'name1', ), (b'name2', )])
187
187
self.assertEqual((42, 19), (offset, length))
188
188
self.assertOutput(
189
189
b'Bazaar pack format 1 (introduced in 0.18)\n'
193
193
"""Add a bytes record with a two-element name."""
194
194
self.writer.begin()
195
195
offset, length = self.writer.add_bytes_record(
196
[b'abc'], len(b'abc'), names=[(b'name1', b'name2')])
196
b'abc', names=[(b'name1', b'name2')])
197
197
self.assertEqual((42, 19), (offset, length))
198
198
self.assertOutput(
199
199
b'Bazaar pack format 1 (introduced in 0.18)\n'
202
202
def test_add_second_bytes_record_gets_higher_offset(self):
203
203
self.writer.begin()
204
self.writer.add_bytes_record([b'a', b'bc'], len(b'abc'), names=[])
205
offset, length = self.writer.add_bytes_record([b'abc'], len(b'abc'), names=[])
204
self.writer.add_bytes_record(b'abc', names=[])
205
offset, length = self.writer.add_bytes_record(b'abc', names=[])
206
206
self.assertEqual((49, 7), (offset, length))
207
207
self.assertOutput(
208
208
b'Bazaar pack format 1 (introduced in 0.18)\n'
216
216
self.writer.begin()
217
217
self.assertRaises(
218
218
errors.InvalidRecordError,
219
self.writer.add_bytes_record, [b'abc'], len(b'abc'), names=[(b'bad name', )])
219
self.writer.add_bytes_record, b'abc', names=[(b'bad name', )])
221
221
def test_add_bytes_records_add_to_records_written(self):
222
222
"""Adding a Bytes record increments the records_written counter."""
223
223
self.writer.begin()
224
self.writer.add_bytes_record([b'foo'], len(b'foo'), names=[])
224
self.writer.add_bytes_record(b'foo', names=[])
225
225
self.assertEqual(1, self.writer.records_written)
226
self.writer.add_bytes_record([b'foo'], len(b'foo'), names=[])
226
self.writer.add_bytes_record(b'foo', names=[])
227
227
self.assertEqual(2, self.writer.records_written)
246
246
This uses None as the output stream to show that the constructor
247
247
doesn't try to use the input stream.
249
pack.ContainerReader(None)
249
reader = pack.ContainerReader(None)
251
251
def test_empty_container(self):
252
252
"""Read an empty container."""
343
343
def test_validate_no_end_marker(self):
344
344
"""validate raises UnexpectedEndOfContainerError if there's no end of
345
container marker, even if the container up to this point has been
345
container marker, even if the container up to this point has been valid.
348
347
reader = self.get_reader_for(
349
348
b"Bazaar pack format 1 (introduced in 0.18)\n")
539
538
writer = pack.ContainerWriter(pack_data.write)
542
memos.append(writer.add_bytes_record([b'abc'], 3, names=[]))
543
memos.append(writer.add_bytes_record([b'def'], 3, names=[(b'name1', )]))
544
memos.append(writer.add_bytes_record([b'ghi'], 3, names=[(b'name2', )]))
545
memos.append(writer.add_bytes_record([b'jkl'], 3, names=[]))
541
memos.append(writer.add_bytes_record(b'abc', names=[]))
542
memos.append(writer.add_bytes_record(b'def', names=[(b'name1', )]))
543
memos.append(writer.add_bytes_record(b'ghi', names=[(b'name2', )]))
544
memos.append(writer.add_bytes_record(b'jkl', names=[]))
547
546
transport = self.get_transport()
548
transport.put_bytes('mypack', pack_data.getvalue())
547
transport.put_bytes(b'mypack', pack_data.getvalue())
549
548
requested_records = [memos[0], memos[2]]
550
reader = pack.make_readv_reader(transport, 'mypack', requested_records)
549
reader = pack.make_readv_reader(transport, b'mypack', requested_records)
552
551
for names, reader_func in reader.iter_records():
553
552
result.append((names, reader_func(None)))
565
564
def test_read_bytes(self):
566
565
"""Test reading of both single bytes and all bytes in a hunk."""
567
566
transport = self.get_transport()
568
transport.put_bytes('sample', b'0123456789')
569
f = pack.ReadVFile(transport.readv(
570
'sample', [(0, 1), (1, 2), (4, 1), (6, 2)]))
567
transport.put_bytes(b'sample', b'0123456789')
568
f = pack.ReadVFile(transport.readv(b'sample', [(0, 1), (1, 2), (4, 1), (6, 2)]))
572
570
results.append(f.read(1))
573
571
results.append(f.read(2))
582
580
This is always within a readv hunk, never across it.
584
582
transport = self.get_transport()
585
transport.put_bytes('sample', b'0\n2\n4\n')
586
f = pack.ReadVFile(transport.readv('sample', [(0, 2), (2, 4)]))
583
transport.put_bytes(b'sample', b'0\n2\n4\n')
584
f = pack.ReadVFile(transport.readv(b'sample', [(0, 2), (2, 4)]))
588
586
results.append(f.readline())
589
587
results.append(f.readline())
593
591
def test_readline_and_read(self):
594
592
"""Test exercising one byte reads, readline, and then read again."""
595
593
transport = self.get_transport()
596
transport.put_bytes('sample', b'0\n2\n4\n')
597
f = pack.ReadVFile(transport.readv('sample', [(0, 6)]))
594
transport.put_bytes(b'sample', b'0\n2\n4\n')
595
f = pack.ReadVFile(transport.readv(b'sample', [(0, 6)]))
599
597
results.append(f.read(1))
600
598
results.append(f.readline())