62 {
64 return;
65
69 file.open("a+b");
70 file.close();
71 file.open("w+b");
72
73 std::vector<char>
a, b, c,
d, e,
f, g, h, i,
j;
74 a.assign(file.filesystem_block_size(),
'A');
75 b.assign(file.filesystem_block_size(), 'B');
76 c.assign(file.filesystem_block_size()/4, 'C');
77 d.assign(file.filesystem_block_size()/4,
'D');
78 e.assign(file.filesystem_block_size()/4, 'E');
79 f.assign(file.filesystem_block_size()/4,
'F');
80 g.assign(file.filesystem_block_size()/2, 'G');
81 h.assign(file.filesystem_block_size()/2, 'H');
82 i.assign(file.filesystem_block_size(), 'I');
83 j.assign(file.filesystem_block_size(),
'J');
84
85 std::vector<char> nom, nom2, nom4;
86 nom.resize(file.filesystem_block_size());
87 nom2.resize(file.filesystem_block_size()/2);
88 nom4.resize(file.filesystem_block_size()/4);
89
90 file.write(
a.data(),
a.size());
91 file.write(b.data(), b.size());
92 file.write(c.data(), c.size());
93 file.write(
d.data(),
d.size());
94 file.write(e.data(), e.size());
95 file.write(
f.data(),
f.size());
96 file.write(g.data(), g.size());
97 file.write(h.data(), h.size());
98
99
100 file.punch_hole(4, 8);
101 file.seek(0);
102 file.read(nom.data(), nom.size());
103 BOOST_TEST_REQUIRE(nom ==
a);
104
105
106 file.punch_hole(file.filesystem_block_size(), file.filesystem_block_size()+file.filesystem_block_size()/2);
107 file.seek(file.filesystem_block_size());
108 file.read(nom.data(), nom.size());
109 BOOST_TEST_REQUIRE(nom == b);
110
111
112 file.punch_hole(file.filesystem_block_size(), file.filesystem_block_size()*2+file.filesystem_block_size()/2);
113 file.seek(0);
114 file.read(nom.data(), nom.size());
115 BOOST_TEST_REQUIRE(nom ==
a);
116 file.read(nom.data(), nom.size());
117 BOOST_TEST_REQUIRE(nom != b);
118 file.read(nom4.data(), nom4.size());
119 BOOST_TEST_REQUIRE(nom4 == c);
120
121
122 file.seek_end(0);
123 file.write(i.data(), i.size());
124 file.write(
j.data(),
j.size());
125
126
127 file.seek(file.filesystem_block_size()*2);
128 file.read(nom4.data(), nom4.size());
129 BOOST_TEST_REQUIRE(nom4 == c);
130
131
132 file.punch_hole(file.filesystem_block_size()*2, file.filesystem_block_size()*3+file.filesystem_block_size()/2);
133 file.seek(file.filesystem_block_size()*2);
134 file.read(nom4.data(), nom4.size());
135 BOOST_TEST_REQUIRE(nom4 != c);
136
137
138 file.seek(file.filesystem_block_size()*3);
139 file.read(nom2.data(), nom2.size());
140 BOOST_TEST_REQUIRE(nom2 == g);
141 file.read(nom2.data(), nom2.size());
142 BOOST_TEST_REQUIRE(nom2 == h);
143 file.read(nom.data(), nom.size());
144 BOOST_TEST_REQUIRE(nom == i);
145
146
147 file.seek(file.filesystem_block_size()*4);
148 file.read(nom.data(), nom.size());
149 BOOST_TEST_REQUIRE(nom == i);
150
151
152 file.punch_hole(file.filesystem_block_size()*4, file.filesystem_block_size()*5);
153 file.seek(file.filesystem_block_size()*4);
154 file.read(nom.data(), nom.size());
155 BOOST_TEST_REQUIRE(nom != i);
156 file.read(nom.data(), nom.size());
157 BOOST_TEST_REQUIRE(nom ==
j);
158 }
static bool supports_hole_punching()
void set_file_path(fc::path file_path)
const fc::path & path() const
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a