Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright Contributors to the OpenVDB Project | ||
2 | // SPDX-License-Identifier: MPL-2.0 | ||
3 | |||
4 | #include <openvdb/points/StreamCompression.h> | ||
5 | #include <openvdb/io/Compression.h> // io::COMPRESS_BLOSC | ||
6 | |||
7 | #include <gtest/gtest.h> | ||
8 | |||
9 | #ifdef __clang__ | ||
10 | #pragma GCC diagnostic push | ||
11 | #pragma GCC diagnostic ignored "-Wunused-macros" | ||
12 | #endif | ||
13 | // Boost.Interprocess uses a header-only portion of Boost.DateTime | ||
14 | #define BOOST_DATE_TIME_NO_LIB | ||
15 | #ifdef __clang__ | ||
16 | #pragma GCC diagnostic pop | ||
17 | #endif | ||
18 | #include <boost/interprocess/file_mapping.hpp> | ||
19 | #include <boost/interprocess/mapped_region.hpp> | ||
20 | #include <boost/iostreams/device/array.hpp> | ||
21 | #include <boost/iostreams/stream.hpp> | ||
22 | #include <boost/uuid/uuid_generators.hpp> | ||
23 | #include <boost/uuid/uuid_io.hpp> | ||
24 | #include <boost/version.hpp> // for BOOST_VERSION | ||
25 | |||
26 | #ifdef _WIN32 | ||
27 | #include <boost/interprocess/detail/os_file_functions.hpp> // open_existing_file(), close_file() | ||
28 | // boost::interprocess::detail was renamed to boost::interprocess::ipcdetail in Boost 1.48. | ||
29 | // Ensure that both namespaces exist. | ||
30 | namespace boost { namespace interprocess { namespace detail {} namespace ipcdetail {} } } | ||
31 | #include <windows.h> | ||
32 | #else | ||
33 | #include <sys/types.h> // for struct stat | ||
34 | #include <sys/stat.h> // for stat() | ||
35 | #include <unistd.h> // for unlink() | ||
36 | #endif | ||
37 | |||
38 | #include <atomic> | ||
39 | #include <fstream> | ||
40 | #include <numeric> // for std::iota() | ||
41 | |||
42 | #ifdef OPENVDB_USE_BLOSC | ||
43 | #include <blosc.h> | ||
44 | // A Blosc optimization introduced in 1.11.0 uses a slightly smaller block size for | ||
45 | // HCR codecs (LZ4, ZLIB, ZSTD), which otherwise fails a few regression test cases | ||
46 | #if BLOSC_VERSION_MAJOR > 1 || (BLOSC_VERSION_MAJOR == 1 && BLOSC_VERSION_MINOR > 10) | ||
47 | #define BLOSC_HCR_BLOCKSIZE_OPTIMIZATION | ||
48 | #endif | ||
49 | // Blosc 1.14+ writes backwards-compatible data by default. | ||
50 | // http://blosc.org/posts/new-forward-compat-policy/ | ||
51 | #if BLOSC_VERSION_MAJOR > 1 || (BLOSC_VERSION_MAJOR == 1 && BLOSC_VERSION_MINOR >= 14) | ||
52 | #define BLOSC_BACKWARDS_COMPATIBLE | ||
53 | #endif | ||
54 | #endif | ||
55 | |||
56 | /// @brief io::MappedFile has a private constructor, so this unit tests uses a matching proxy | ||
57 | class ProxyMappedFile | ||
58 | { | ||
59 | public: | ||
60 | 1 | explicit ProxyMappedFile(const std::string& filename) | |
61 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | : mImpl(new Impl(filename)) { } |
62 | |||
63 | private: | ||
64 | class Impl | ||
65 | { | ||
66 | public: | ||
67 | 1 | Impl(const std::string& filename) | |
68 | 1 | : mMap(filename.c_str(), boost::interprocess::read_only) | |
69 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | , mRegion(mMap, boost::interprocess::read_only) |
70 | { | ||
71 | mLastWriteTime = 0; | ||
72 | const char* regionFilename = mMap.get_name(); | ||
73 | #ifdef _WIN32 | ||
74 | using namespace boost::interprocess::detail; | ||
75 | using namespace boost::interprocess::ipcdetail; | ||
76 | using openvdb::Index64; | ||
77 | |||
78 | if (void* fh = open_existing_file(regionFilename, boost::interprocess::read_only)) { | ||
79 | FILETIME mtime; | ||
80 | if (GetFileTime(fh, nullptr, nullptr, &mtime)) { | ||
81 | mLastWriteTime = (Index64(mtime.dwHighDateTime) << 32) | mtime.dwLowDateTime; | ||
82 | } | ||
83 | close_file(fh); | ||
84 | } | ||
85 | #else | ||
86 | struct stat info; | ||
87 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (0 == ::stat(regionFilename, &info)) { |
88 | 1 | mLastWriteTime = openvdb::Index64(info.st_mtime); | |
89 | } | ||
90 | #endif | ||
91 | 1 | } | |
92 | |||
93 | using Notifier = std::function<void(std::string /*filename*/)>; | ||
94 | boost::interprocess::file_mapping mMap; | ||
95 | boost::interprocess::mapped_region mRegion; | ||
96 | bool mAutoDelete = false; | ||
97 | Notifier mNotifier; | ||
98 | mutable std::atomic<openvdb::Index64> mLastWriteTime; | ||
99 | }; // class Impl | ||
100 | std::unique_ptr<Impl> mImpl; | ||
101 | }; // class ProxyMappedFile | ||
102 | |||
103 | using namespace openvdb; | ||
104 | using namespace openvdb::compression; | ||
105 | |||
106 | 2 | class TestStreamCompression: public ::testing::Test | |
107 | { | ||
108 | public: | ||
109 | void testPagedStreams(); | ||
110 | }; // class TestStreamCompression | ||
111 | |||
112 | |||
113 | //////////////////////////////////////// | ||
114 | |||
115 | |||
116 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestStreamCompression, testBlosc) |
117 | { | ||
118 | // ensure that the library and unit tests are both built with or without Blosc enabled | ||
119 | #ifdef OPENVDB_USE_BLOSC | ||
120 |
1/16✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_TRUE(bloscCanCompress()); |
121 | #else | ||
122 | EXPECT_TRUE(!bloscCanCompress()); | ||
123 | #endif | ||
124 | |||
125 | const int count = 256; | ||
126 | |||
127 | { // valid buffer | ||
128 | // compress | ||
129 | 1 | std::unique_ptr<int[]> uncompressedBuffer(new int[count]); | |
130 | |||
131 |
2/2✓ Branch 0 taken 256 times.
✓ Branch 1 taken 1 times.
|
257 | for (int i = 0; i < count; i++) { |
132 | 256 | uncompressedBuffer.get()[i] = i / 2; | |
133 | } | ||
134 | |||
135 | 1 | size_t uncompressedBytes = count * sizeof(int); | |
136 | size_t compressedBytes; | ||
137 | |||
138 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | size_t testCompressedBytes = bloscCompressedSize( |
139 | 1 | reinterpret_cast<char*>(uncompressedBuffer.get()), uncompressedBytes); | |
140 | |||
141 | std::unique_ptr<char[]> compressedBuffer = bloscCompress( | ||
142 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | reinterpret_cast<char*>(uncompressedBuffer.get()), uncompressedBytes, compressedBytes); |
143 | |||
144 | #ifdef OPENVDB_USE_BLOSC | ||
145 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(compressedBytes < uncompressedBytes); |
146 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(compressedBuffer); |
147 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
1 | EXPECT_EQ(testCompressedBytes, compressedBytes); |
148 | |||
149 | // uncompressedSize | ||
150 | |||
151 |
3/20✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_EQ(uncompressedBytes, bloscUncompressedSize(compressedBuffer.get())); |
152 | |||
153 | // decompress | ||
154 | |||
155 | std::unique_ptr<char[]> newUncompressedBuffer = | ||
156 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | bloscDecompress(compressedBuffer.get(), uncompressedBytes); |
157 | |||
158 | // incorrect number of expected bytes | ||
159 |
4/22✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
|
2 | EXPECT_THROW(newUncompressedBuffer = |
160 | bloscDecompress(compressedBuffer.get(), 1), openvdb::RuntimeError); | ||
161 | |||
162 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(newUncompressedBuffer); |
163 | #else | ||
164 | EXPECT_TRUE(!compressedBuffer); | ||
165 | EXPECT_EQ(testCompressedBytes, size_t(0)); | ||
166 | |||
167 | // uncompressedSize | ||
168 | |||
169 | EXPECT_THROW(bloscUncompressedSize(compressedBuffer.get()), openvdb::RuntimeError); | ||
170 | |||
171 | // decompress | ||
172 | |||
173 | std::unique_ptr<char[]> newUncompressedBuffer; | ||
174 | EXPECT_THROW( | ||
175 | newUncompressedBuffer = bloscDecompress(compressedBuffer.get(), uncompressedBytes), | ||
176 | openvdb::RuntimeError); | ||
177 | |||
178 | EXPECT_TRUE(!newUncompressedBuffer); | ||
179 | #endif | ||
180 | } | ||
181 | |||
182 | { // one value (below minimum bytes) | ||
183 | 1 | std::unique_ptr<int[]> uncompressedBuffer(new int[1]); | |
184 | 1 | uncompressedBuffer.get()[0] = 10; | |
185 | |||
186 | size_t compressedBytes; | ||
187 | |||
188 | std::unique_ptr<char[]> compressedBuffer = bloscCompress( | ||
189 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | reinterpret_cast<char*>(uncompressedBuffer.get()), sizeof(int), compressedBytes); |
190 | |||
191 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(!compressedBuffer); |
192 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_EQ(compressedBytes, size_t(0)); |
193 | } | ||
194 | |||
195 | { // padded buffer | ||
196 | 1 | std::unique_ptr<char[]> largeBuffer(new char[2048]); | |
197 | |||
198 |
2/2✓ Branch 0 taken 255 times.
✓ Branch 1 taken 1 times.
|
256 | for (int paddedCount = 1; paddedCount < 256; paddedCount++) { |
199 | |||
200 |
1/2✓ Branch 1 taken 255 times.
✗ Branch 2 not taken.
|
255 | std::unique_ptr<char[]> newTest(new char[paddedCount]); |
201 |
2/2✓ Branch 0 taken 32640 times.
✓ Branch 1 taken 255 times.
|
32895 | for (int i = 0; i < paddedCount; i++) newTest.get()[i] = char(0); |
202 | |||
203 | #ifdef OPENVDB_USE_BLOSC | ||
204 | size_t compressedBytes; | ||
205 | std::unique_ptr<char[]> compressedBuffer = bloscCompress( | ||
206 |
1/2✓ Branch 1 taken 255 times.
✗ Branch 2 not taken.
|
255 | newTest.get(), paddedCount, compressedBytes); |
207 | |||
208 | // compress into a large buffer to check for any padding issues | ||
209 | size_t compressedSizeBytes; | ||
210 |
1/2✓ Branch 1 taken 255 times.
✗ Branch 2 not taken.
|
255 | bloscCompress(largeBuffer.get(), compressedSizeBytes, size_t(2048), |
211 | newTest.get(), paddedCount); | ||
212 | |||
213 | // regardless of compression, these numbers should always match | ||
214 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 255 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
255 | EXPECT_EQ(compressedSizeBytes, compressedBytes); |
215 | |||
216 | // no compression performed due to buffer being too small | ||
217 |
2/2✓ Branch 0 taken 48 times.
✓ Branch 1 taken 207 times.
|
255 | if (paddedCount <= BLOSC_MINIMUM_BYTES) { |
218 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
48 | EXPECT_TRUE(!compressedBuffer); |
219 | } | ||
220 | else { | ||
221 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 207 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
207 | EXPECT_TRUE(compressedBuffer); |
222 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 207 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
207 | EXPECT_TRUE(compressedBytes > 0); |
223 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 207 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
207 | EXPECT_TRUE(int(compressedBytes) < paddedCount); |
224 | |||
225 | std::unique_ptr<char[]> uncompressedBuffer = bloscDecompress( | ||
226 |
1/2✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
|
207 | compressedBuffer.get(), paddedCount); |
227 | |||
228 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 207 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
207 | EXPECT_TRUE(uncompressedBuffer); |
229 | |||
230 |
2/2✓ Branch 0 taken 31464 times.
✓ Branch 1 taken 207 times.
|
31671 | for (int i = 0; i < paddedCount; i++) { |
231 |
2/16✓ Branch 1 taken 31464 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 31464 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
31464 | EXPECT_EQ((uncompressedBuffer.get())[i], newTest[i]); |
232 | } | ||
233 | } | ||
234 | #endif | ||
235 | } | ||
236 | } | ||
237 | |||
238 | { // invalid buffer (out of range) | ||
239 | |||
240 | // compress | ||
241 | |||
242 | std::vector<int> smallBuffer; | ||
243 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | smallBuffer.resize(count); |
244 | |||
245 |
2/2✓ Branch 0 taken 256 times.
✓ Branch 1 taken 1 times.
|
257 | for (int i = 0; i < count; i++) smallBuffer[i] = i; |
246 | |||
247 | size_t invalidBytes = INT_MAX - 1; | ||
248 | |||
249 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | size_t testCompressedBytes = bloscCompressedSize( |
250 | 1 | reinterpret_cast<char*>(&smallBuffer[0]), invalidBytes); | |
251 | |||
252 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_EQ(testCompressedBytes, size_t(0)); |
253 | |||
254 | std::unique_ptr<char[]> buffer = bloscCompress( | ||
255 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | reinterpret_cast<char*>(&smallBuffer[0]), invalidBytes, testCompressedBytes); |
256 | |||
257 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(!buffer); |
258 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_EQ(testCompressedBytes, size_t(0)); |
259 | |||
260 | // decompress | ||
261 | |||
262 | #ifdef OPENVDB_USE_BLOSC | ||
263 | std::unique_ptr<char[]> compressedBuffer = bloscCompress( | ||
264 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | reinterpret_cast<char*>(&smallBuffer[0]), count * sizeof(int), testCompressedBytes); |
265 | |||
266 |
4/20✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
|
2 | EXPECT_THROW(buffer = bloscDecompress( |
267 | reinterpret_cast<char*>(compressedBuffer.get()), invalidBytes - 16), | ||
268 | openvdb::RuntimeError); | ||
269 | |||
270 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(!buffer); |
271 | |||
272 |
4/22✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
|
2 | EXPECT_THROW(bloscDecompress( |
273 | reinterpret_cast<char*>(compressedBuffer.get()), count * sizeof(int) + 1), | ||
274 | openvdb::RuntimeError); | ||
275 | #endif | ||
276 | } | ||
277 | |||
278 | { // uncompressible buffer | ||
279 | const int uncompressedCount = 32; | ||
280 | |||
281 | std::vector<int> values; | ||
282 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | values.reserve(uncompressedCount); // 128 bytes |
283 | |||
284 | // insert a sequence of 32 integer values that cannot be compressed using Blosc | ||
285 | |||
286 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | for (int i = 0; i < uncompressedCount; i++) { |
287 |
2/2✓ Branch 0 taken 16 times.
✓ Branch 1 taken 16 times.
|
32 | if ((i%2) == 0) { |
288 |
1/2✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
|
16 | values.push_back(i * 12340); |
289 | } else { | ||
290 |
1/4✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
16 | values.push_back(i * 56780); |
291 | } | ||
292 | } | ||
293 | |||
294 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | std::unique_ptr<int[]> uncompressedBuffer(new int[values.size()]); |
295 | |||
296 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | for (size_t i = 0; i < values.size(); i++) uncompressedBuffer.get()[i] = values[i]; |
297 | |||
298 | 1 | size_t uncompressedBytes = values.size() * sizeof(int); | |
299 | size_t compressedBytes; | ||
300 | |||
301 | std::unique_ptr<char[]> compressedBuffer = bloscCompress( | ||
302 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | reinterpret_cast<char*>(uncompressedBuffer.get()), uncompressedBytes, compressedBytes); |
303 | |||
304 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(!compressedBuffer); |
305 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_EQ(compressedBytes, size_t(0)); |
306 | } | ||
307 | 1 | } | |
308 | |||
309 | |||
310 | void | ||
311 | 1 | TestStreamCompression::testPagedStreams() | |
312 | { | ||
313 | { // one small value | ||
314 | 2 | std::ostringstream ostr(std::ios_base::binary); | |
315 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | PagedOutputStream ostream(ostr); |
316 | |||
317 | 1 | int foo = 5; | |
318 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.write(reinterpret_cast<const char*>(&foo), sizeof(int)); |
319 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ostr.tellp(), std::streampos(0)); |
320 | |||
321 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.flush(); |
322 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ostr.tellp(), std::streampos(sizeof(int))); |
323 | } | ||
324 | |||
325 | { // small values up to page threshold | ||
326 | 2 | std::ostringstream ostr(std::ios_base::binary); | |
327 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | PagedOutputStream ostream(ostr); |
328 | |||
329 |
2/2✓ Branch 0 taken 1048576 times.
✓ Branch 1 taken 1 times.
|
1048577 | for (int i = 0; i < PageSize; i++) { |
330 | 1048576 | uint8_t oneByte = 255; | |
331 |
1/2✓ Branch 1 taken 1048576 times.
✗ Branch 2 not taken.
|
1048576 | ostream.write(reinterpret_cast<const char*>(&oneByte), sizeof(uint8_t)); |
332 | } | ||
333 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ostr.tellp(), std::streampos(0)); |
334 | |||
335 | std::vector<uint8_t> values; | ||
336 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
1 | values.assign(PageSize, uint8_t(255)); |
337 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | size_t compressedSize = compression::bloscCompressedSize( |
338 | reinterpret_cast<const char*>(&values[0]), PageSize); | ||
339 | |||
340 | 1 | uint8_t oneMoreByte(255); | |
341 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.write(reinterpret_cast<const char*>(&oneMoreByte), sizeof(char)); |
342 | |||
343 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if (compressedSize == 0) { |
344 | ✗ | EXPECT_EQ(ostr.tellp(), std::streampos(PageSize)); | |
345 | } | ||
346 | else { | ||
347 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ostr.tellp(), std::streampos(compressedSize)); |
348 | } | ||
349 | } | ||
350 | |||
351 | { // one large block at exactly page threshold | ||
352 | 2 | std::ostringstream ostr(std::ios_base::binary); | |
353 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | PagedOutputStream ostream(ostr); |
354 | |||
355 | std::vector<uint8_t> values; | ||
356 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
1 | values.assign(PageSize, uint8_t(255)); |
357 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.write(reinterpret_cast<const char*>(&values[0]), values.size()); |
358 | |||
359 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ostr.tellp(), std::streampos(0)); |
360 | } | ||
361 | |||
362 | { // two large blocks at page threshold + 1 byte | ||
363 | 2 | std::ostringstream ostr(std::ios_base::binary); | |
364 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | PagedOutputStream ostream(ostr); |
365 | |||
366 | std::vector<uint8_t> values; | ||
367 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
1 | values.assign(PageSize + 1, uint8_t(255)); |
368 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.write(reinterpret_cast<const char*>(&values[0]), values.size()); |
369 | |||
370 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | size_t compressedSize = compression::bloscCompressedSize( |
371 | reinterpret_cast<const char*>(&values[0]), values.size()); | ||
372 | |||
373 | #ifndef OPENVDB_USE_BLOSC | ||
374 | compressedSize = values.size(); | ||
375 | #endif | ||
376 | |||
377 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ostr.tellp(), std::streampos(compressedSize)); |
378 | |||
379 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.write(reinterpret_cast<const char*>(&values[0]), values.size()); |
380 | |||
381 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ostr.tellp(), std::streampos(compressedSize * 2)); |
382 | |||
383 | 1 | uint8_t oneMoreByte(255); | |
384 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.write(reinterpret_cast<const char*>(&oneMoreByte), sizeof(uint8_t)); |
385 | |||
386 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.flush(); |
387 | |||
388 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ostr.tellp(), std::streampos(compressedSize * 2 + 1)); |
389 | } | ||
390 | |||
391 | { // one full page | ||
392 | 2 | std::stringstream ss(std::ios_base::out | std::ios_base::in | std::ios_base::binary); | |
393 | |||
394 | // write | ||
395 | |||
396 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | PagedOutputStream ostreamSizeOnly(ss); |
397 | ostreamSizeOnly.setSizeOnly(true); | ||
398 | |||
399 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ss.tellp(), std::streampos(0)); |
400 | |||
401 | std::vector<uint8_t> values; | ||
402 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | values.resize(PageSize); |
403 | 1 | std::iota(values.begin(), values.end(), 0); // ascending integer values | |
404 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostreamSizeOnly.write(reinterpret_cast<const char*>(&values[0]), values.size()); |
405 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostreamSizeOnly.flush(); |
406 | |||
407 | #ifdef OPENVDB_USE_BLOSC | ||
408 | // two integers - compressed size and uncompressed size | ||
409 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ss.tellp(), std::streampos(sizeof(int)*2)); |
410 | #else | ||
411 | // one integer - uncompressed size | ||
412 | EXPECT_EQ(ss.tellp(), std::streampos(sizeof(int))); | ||
413 | #endif | ||
414 | |||
415 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | PagedOutputStream ostream(ss); |
416 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.write(reinterpret_cast<const char*>(&values[0]), values.size()); |
417 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.flush(); |
418 | |||
419 | #ifndef OPENVDB_USE_BLOSC | ||
420 | EXPECT_EQ(ss.tellp(), std::streampos(PageSize+sizeof(int))); | ||
421 | #endif | ||
422 | |||
423 | // read | ||
424 | |||
425 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ss.tellg(), std::streampos(0)); |
426 | |||
427 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | PagedInputStream istream(ss); |
428 | istream.setSizeOnly(true); | ||
429 | |||
430 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | PageHandle::Ptr handle = istream.createHandle(values.size()); |
431 | |||
432 | #ifdef OPENVDB_USE_BLOSC | ||
433 | // two integers - compressed size and uncompressed size | ||
434 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(ss.tellg(), std::streampos(sizeof(int)*2)); |
435 | #else | ||
436 | // one integer - uncompressed size | ||
437 | EXPECT_EQ(ss.tellg(), std::streampos(sizeof(int))); | ||
438 | #endif | ||
439 | |||
440 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | istream.read(handle, values.size(), false); |
441 | |||
442 | #ifndef OPENVDB_USE_BLOSC | ||
443 | EXPECT_EQ(ss.tellg(), std::streampos(PageSize+sizeof(int))); | ||
444 | #endif | ||
445 | |||
446 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | std::unique_ptr<uint8_t[]> newValues(reinterpret_cast<uint8_t*>(handle->read().release())); |
447 | |||
448 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(newValues); |
449 | |||
450 |
2/2✓ Branch 0 taken 1048576 times.
✓ Branch 1 taken 1 times.
|
1048577 | for (size_t i = 0; i < values.size(); i++) { |
451 |
2/16✓ Branch 1 taken 1048576 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1048576 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1048576 | EXPECT_EQ(values[i], newValues.get()[i]); |
452 | } | ||
453 | } | ||
454 | |||
455 | std::string tempDir; | ||
456 |
1/4✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1 | if (const char* dir = std::getenv("TMPDIR")) tempDir = dir; |
457 | #ifdef _WIN32 | ||
458 | if (tempDir.empty()) { | ||
459 | char tempDirBuffer[MAX_PATH+1]; | ||
460 | int tempDirLen = GetTempPath(MAX_PATH+1, tempDirBuffer); | ||
461 | EXPECT_TRUE(tempDirLen > 0 && tempDirLen <= MAX_PATH); | ||
462 | tempDir = tempDirBuffer; | ||
463 | } | ||
464 | #else | ||
465 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
1 | if (tempDir.empty()) tempDir = P_tmpdir; |
466 | #endif | ||
467 | |||
468 | { | ||
469 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | std::string filename = tempDir + "/openvdb_page1"; |
470 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | io::StreamMetadata::Ptr streamMetadata(new io::StreamMetadata); |
471 | |||
472 | { // ascending values up to 10 million written in blocks of PageSize/3 | ||
473 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::ofstream fileout(filename.c_str(), std::ios_base::binary); |
474 | |||
475 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | io::setStreamMetadataPtr(fileout, streamMetadata); |
476 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | io::setDataCompression(fileout, openvdb::io::COMPRESS_BLOSC); |
477 | |||
478 | std::vector<uint8_t> values; | ||
479 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | values.resize(10*1000*1000); |
480 | 1 | std::iota(values.begin(), values.end(), 0); // ascending integer values | |
481 | |||
482 | // write page sizes | ||
483 | |||
484 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | PagedOutputStream ostreamSizeOnly(fileout); |
485 | ostreamSizeOnly.setSizeOnly(true); | ||
486 | |||
487 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(fileout.tellp(), std::streampos(0)); |
488 | |||
489 | int increment = PageSize/3; | ||
490 | |||
491 |
2/2✓ Branch 0 taken 29 times.
✓ Branch 1 taken 1 times.
|
30 | for (size_t i = 0; i < values.size(); i += increment) { |
492 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 28 times.
|
29 | if (size_t(i+increment) > values.size()) { |
493 | ostreamSizeOnly.write( | ||
494 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | reinterpret_cast<const char*>(&values[0]+i), values.size() - i); |
495 | } | ||
496 | else { | ||
497 |
1/2✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
|
28 | ostreamSizeOnly.write(reinterpret_cast<const char*>(&values[0]+i), increment); |
498 | } | ||
499 | } | ||
500 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostreamSizeOnly.flush(); |
501 | |||
502 | #ifdef OPENVDB_USE_BLOSC | ||
503 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | int pages = static_cast<int>(fileout.tellp() / (sizeof(int)*2)); |
504 | #else | ||
505 | int pages = static_cast<int>(fileout.tellp() / (sizeof(int))); | ||
506 | #endif | ||
507 | |||
508 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(pages, 10); |
509 | |||
510 | // write | ||
511 | |||
512 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | PagedOutputStream ostream(fileout); |
513 | |||
514 |
2/2✓ Branch 0 taken 29 times.
✓ Branch 1 taken 1 times.
|
30 | for (size_t i = 0; i < values.size(); i += increment) { |
515 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 28 times.
|
29 | if (size_t(i+increment) > values.size()) { |
516 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.write(reinterpret_cast<const char*>(&values[0]+i), values.size() - i); |
517 | } | ||
518 | else { | ||
519 |
1/2✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
|
28 | ostream.write(reinterpret_cast<const char*>(&values[0]+i), increment); |
520 | } | ||
521 | } | ||
522 | |||
523 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | ostream.flush(); |
524 | |||
525 | #ifndef OPENVDB_USE_BLOSC | ||
526 | EXPECT_EQ(fileout.tellp(), std::streampos(values.size()+sizeof(int)*pages)); | ||
527 | #endif | ||
528 | |||
529 | // abuse File being a friend of MappedFile to get around the private constructor | ||
530 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | ProxyMappedFile* proxy = new ProxyMappedFile(filename); |
531 | SharedPtr<io::MappedFile> mappedFile(reinterpret_cast<io::MappedFile*>(proxy)); | ||
532 | |||
533 | // read | ||
534 | |||
535 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | std::ifstream filein(filename.c_str(), std::ios_base::in | std::ios_base::binary); |
536 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | io::setStreamMetadataPtr(filein, streamMetadata); |
537 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | io::setMappedFilePtr(filein, mappedFile); |
538 | |||
539 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(filein.tellg(), std::streampos(0)); |
540 | |||
541 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | PagedInputStream istreamSizeOnly(filein); |
542 | istreamSizeOnly.setSizeOnly(true); | ||
543 | |||
544 | 1 | std::vector<PageHandle::Ptr> handles; | |
545 | |||
546 |
2/2✓ Branch 0 taken 29 times.
✓ Branch 1 taken 1 times.
|
30 | for (size_t i = 0; i < values.size(); i += increment) { |
547 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 28 times.
|
29 | if (size_t(i+increment) > values.size()) { |
548 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | handles.push_back(istreamSizeOnly.createHandle(values.size() - i)); |
549 | } | ||
550 | else { | ||
551 |
1/2✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
|
56 | handles.push_back(istreamSizeOnly.createHandle(increment)); |
552 | } | ||
553 | } | ||
554 | |||
555 | #ifdef OPENVDB_USE_BLOSC | ||
556 | // two integers - compressed size and uncompressed size | ||
557 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
2 | EXPECT_EQ(filein.tellg(), std::streampos(pages*sizeof(int)*2)); |
558 | #else | ||
559 | // one integer - uncompressed size | ||
560 | EXPECT_EQ(filein.tellg(), std::streampos(pages*sizeof(int))); | ||
561 | #endif | ||
562 | |||
563 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | PagedInputStream istream(filein); |
564 | |||
565 | int pageHandle = 0; | ||
566 | |||
567 |
2/2✓ Branch 0 taken 29 times.
✓ Branch 1 taken 1 times.
|
30 | for (size_t i = 0; i < values.size(); i += increment) { |
568 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 28 times.
|
29 | if (size_t(i+increment) > values.size()) { |
569 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | istream.read(handles[pageHandle++], values.size() - i); |
570 | } | ||
571 | else { | ||
572 |
1/2✓ Branch 1 taken 28 times.
✗ Branch 2 not taken.
|
28 | istream.read(handles[pageHandle++], increment); |
573 | } | ||
574 | } | ||
575 | |||
576 | // first three handles live in the same page | ||
577 | |||
578 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Page& page0 = handles[0]->page(); |
579 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Page& page1 = handles[1]->page(); |
580 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Page& page2 = handles[2]->page(); |
581 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Page& page3 = handles[3]->page(); |
582 | |||
583 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(page0.isOutOfCore()); |
584 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(page1.isOutOfCore()); |
585 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(page2.isOutOfCore()); |
586 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(page3.isOutOfCore()); |
587 | |||
588 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | handles[0]->read(); |
589 | |||
590 | // store the Page shared_ptr | ||
591 | |||
592 | Page::Ptr page = handles[0]->mPage; | ||
593 | |||
594 | // verify use count is four (one plus three handles) | ||
595 | |||
596 |
3/18✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
2 | EXPECT_EQ(page.use_count(), long(4)); |
597 | |||
598 | // on reading from the first handle, all pages referenced | ||
599 | // in the first three handles are in-core | ||
600 | |||
601 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(!page0.isOutOfCore()); |
602 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(!page1.isOutOfCore()); |
603 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(!page2.isOutOfCore()); |
604 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(page3.isOutOfCore()); |
605 | |||
606 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
2 | handles[1]->read(); |
607 | |||
608 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(handles[0]->mPage); |
609 | |||
610 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | handles[2]->read(); |
611 | |||
612 | handles.erase(handles.begin()); | ||
613 | handles.erase(handles.begin()); | ||
614 | handles.erase(handles.begin()); | ||
615 | |||
616 | // after all three handles have been read, | ||
617 | // page should have just one use count (itself) | ||
618 | |||
619 |
3/20✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
|
2 | EXPECT_EQ(page.use_count(), long(1)); |
620 | } | ||
621 | 1 | std::remove(filename.c_str()); | |
622 | } | ||
623 | 1 | } | |
624 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestStreamCompression, testPagedStreams) { testPagedStreams(); } |
625 |