bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
|
3641.3.29
by John Arbash Meinel
Cleanup the copyright headers |
1 |
# Copyright (C) 2008 Canonical Ltd
|
|
3641.3.1
by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests. |
2 |
#
|
3 |
# This program is free software; you can redistribute it and/or modify
|
|
|
3641.3.29
by John Arbash Meinel
Cleanup the copyright headers |
4 |
# it under the terms of the GNU General Public License as published by
|
5 |
# the Free Software Foundation; either version 2 of the License, or
|
|
6 |
# (at your option) any later version.
|
|
|
3641.3.1
by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests. |
7 |
#
|
8 |
# This program is distributed in the hope that it will be useful,
|
|
9 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
10 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
11 |
# GNU General Public License for more details.
|
|
12 |
#
|
|
13 |
# You should have received a copy of the GNU General Public License
|
|
14 |
# along with this program; if not, write to the Free Software
|
|
|
3641.3.29
by John Arbash Meinel
Cleanup the copyright headers |
15 |
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
3641.3.1
by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests. |
16 |
#
|
17 |
||
18 |
"""Tests for writing fixed size chunks with compression."""
|
|
19 |
||
20 |
import zlib |
|
21 |
||
22 |
from bzrlib import chunk_writer |
|
23 |
from bzrlib.tests import TestCaseWithTransport |
|
24 |
||
25 |
||
26 |
class TestWriter(TestCaseWithTransport): |
|
27 |
||
28 |
def check_chunk(self, bytes_list, size): |
|
29 |
bytes = ''.join(bytes_list) |
|
30 |
self.assertEqual(size, len(bytes)) |
|
31 |
return zlib.decompress(bytes) |
|
32 |
||
33 |
def test_chunk_writer_empty(self): |
|
34 |
writer = chunk_writer.ChunkWriter(4096) |
|
35 |
bytes_list, unused, padding = writer.finish() |
|
36 |
node_bytes = self.check_chunk(bytes_list, 4096) |
|
37 |
self.assertEqual("", node_bytes) |
|
38 |
self.assertEqual(None, unused) |
|
39 |
# Only a zlib header.
|
|
40 |
self.assertEqual(4088, padding) |
|
41 |
||
42 |
def test_some_data(self): |
|
43 |
writer = chunk_writer.ChunkWriter(4096) |
|
44 |
writer.write("foo bar baz quux\n") |
|
45 |
bytes_list, unused, padding = writer.finish() |
|
46 |
node_bytes = self.check_chunk(bytes_list, 4096) |
|
47 |
self.assertEqual("foo bar baz quux\n", node_bytes) |
|
48 |
self.assertEqual(None, unused) |
|
49 |
# More than just the header..
|
|
50 |
self.assertEqual(4073, padding) |
|
51 |
||
52 |
def test_too_much_data_does_not_exceed_size(self): |
|
53 |
# Generate enough data to exceed 4K
|
|
54 |
lines = [] |
|
55 |
for group in range(48): |
|
56 |
offset = group * 50 |
|
57 |
numbers = range(offset, offset + 50) |
|
58 |
# Create a line with this group
|
|
59 |
lines.append(''.join(map(str, numbers)) + '\n') |
|
60 |
writer = chunk_writer.ChunkWriter(4096) |
|
|
3641.5.2
by John Arbash Meinel
(broken, but hopeful) Change the compact logic. |
61 |
for idx, line in enumerate(lines): |
|
3641.3.1
by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests. |
62 |
if writer.write(line): |
|
3641.5.3
by John Arbash Meinel
If we repack earlier, it catches this case. |
63 |
self.assertEqual(46, idx) |
|
3641.3.1
by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests. |
64 |
break
|
65 |
bytes_list, unused, _ = writer.finish() |
|
66 |
node_bytes = self.check_chunk(bytes_list, 4096) |
|
67 |
# the first 46 lines should have been added
|
|
68 |
expected_bytes = ''.join(lines[:46]) |
|
69 |
self.assertEqualDiff(expected_bytes, node_bytes) |
|
70 |
# And the line that failed should have been saved for us
|
|
71 |
self.assertEqual(lines[46], unused) |
|
72 |
||
73 |
def test_too_much_data_preserves_reserve_space(self): |
|
74 |
# Generate enough data to exceed 4K
|
|
75 |
lines = [] |
|
76 |
for group in range(48): |
|
77 |
offset = group * 50 |
|
78 |
numbers = range(offset, offset + 50) |
|
79 |
# Create a line with this group
|
|
80 |
lines.append(''.join(map(str, numbers)) + '\n') |
|
81 |
writer = chunk_writer.ChunkWriter(4096, 256) |
|
|
3641.5.1
by John Arbash Meinel
Update the stats for the current code layout. |
82 |
for idx, line in enumerate(lines): |
|
3641.3.1
by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests. |
83 |
if writer.write(line): |
|
3641.5.1
by John Arbash Meinel
Update the stats for the current code layout. |
84 |
self.assertEqual(44, idx) |
|
3641.3.1
by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests. |
85 |
break
|
|
3641.5.1
by John Arbash Meinel
Update the stats for the current code layout. |
86 |
else: |
87 |
self.fail('We were able to write all lines') |
|
|
3641.3.27
by John Arbash Meinel
Bringing reserved in as a keyword to write() also saves some time. |
88 |
self.assertFalse(writer.write("A"*256, reserved=True)) |
|
3641.3.1
by John Arbash Meinel
Bring in the btree_index and chunk_writer code and their tests. |
89 |
bytes_list, unused, _ = writer.finish() |
90 |
node_bytes = self.check_chunk(bytes_list, 4096) |
|
91 |
# the first 44 lines should have been added
|
|
92 |
expected_bytes = ''.join(lines[:44]) + "A"*256 |
|
93 |
self.assertEqualDiff(expected_bytes, node_bytes) |
|
94 |
# And the line that failed should have been saved for us
|
|
95 |
self.assertEqual(lines[44], unused) |