API
 
Loading...
Searching...
No Matches
streamWriterSizing_test.cpp
Go to the documentation of this file.
1/** \file streamWriterSizing_test.cpp
2 * \brief Catch2 tests for streamWriter buffer sizing helpers.
3 * \author Jared R. Males (jaredmales@gmail.com)
4 *
5 * \ingroup streamWriter_files
6 */
7
8#include "../../../tests/testXWC.hpp"
9
10#include "../streamWriter.hpp"
11
12using namespace MagAOX::app;
13
14namespace libXWCTest
15{
16
17/** \defgroup streamWriter_unit_test streamWriter Unit Tests
18 * \brief Unit tests for the streamWriter application.
19 *
20 * \ingroup application_unit_test
21 */
22
23/// Namespace for `streamWriter` unit tests.
24/** \ingroup streamWriter_unit_test
25 */
26namespace streamWriterTest
27{
28
29/// Verify `streamWriter::getCircBuffLengths()` selects bounded circular-buffer and write-chunk sizes.
30/**
31 * \ingroup streamWriter_unit_test
32 */
33SCENARIO( "streamWriter Buffer Sizing", "[streamWriter]" )
34{
35 // clang-format off
36 #ifdef STREAMWRITER_TEST_DOXYGEN_REF
37 streamWriter::getCircBuffLengths( *(size_t *)nullptr,
38 *(double *)nullptr,
39 *(size_t *)nullptr,
40 0,
41 0,
42 0,
43 0,
44 0,
45 0 );
46 #endif
47 // clang-format on
48
49 GIVEN( "A default constructed streamWriter" )
50 {
51 WHEN( "default configurations" )
52 {
53 size_t maxCircBuffLength = 1024;
54 double maxCircBuffSize = 2048.0;
55 size_t maxWriteChunkLength = 512;
56
57 size_t circBuffLength;
58 double circBuffSize;
59 size_t writeChunkLength;
60
61 uint32_t width = 1024;
62 uint32_t height = 1024;
63 size_t typeSize = 2;
64
66 circBuffSize,
67 writeChunkLength,
68 maxCircBuffLength,
69 maxCircBuffSize,
70 maxWriteChunkLength,
71 width,
72 height,
73 typeSize );
74
75 REQUIRE( circBuffLength == 1024 );
76 REQUIRE( circBuffSize == 2048 );
77 REQUIRE( writeChunkLength == 512 );
78 }
79
80 WHEN( "larger frame size using all of max size" )
81 {
82 size_t maxCircBuffLength = 1024;
83 double maxCircBuffSize = 2048.0;
84 size_t maxWriteChunkLength = 512;
85
86 size_t circBuffLength;
87 double circBuffSize;
88 size_t writeChunkLength;
89
90 uint32_t width = 2048;
91 uint32_t height = 2048;
92 size_t typeSize = 2;
93
95 circBuffSize,
96 writeChunkLength,
97 maxCircBuffLength,
98 maxCircBuffSize,
99 maxWriteChunkLength,
100 width,
101 height,
102 typeSize );
103
104 REQUIRE( circBuffLength == 256 );
105 REQUIRE( circBuffSize == 2048 );
106 REQUIRE( writeChunkLength == 128 );
107 }
108
109 WHEN( "largest frame size possible using all of max size" )
110 {
111 size_t maxCircBuffLength = 1024;
112 double maxCircBuffSize = 1024.0;
113 size_t maxWriteChunkLength = 512;
114
115 size_t circBuffLength;
116 double circBuffSize;
117 size_t writeChunkLength;
118
119 uint32_t width = 16384;
120 uint32_t height = 16384;
121 size_t typeSize = 2;
122
123 streamWriter::getCircBuffLengths( circBuffLength,
124 circBuffSize,
125 writeChunkLength,
126 maxCircBuffLength,
127 maxCircBuffSize,
128 maxWriteChunkLength,
129 width,
130 height,
131 typeSize );
132
133 REQUIRE( circBuffLength == 2 );
134 REQUIRE( circBuffSize == 1024 );
135 REQUIRE( writeChunkLength == 1 );
136 }
137
138 WHEN( "Exceeding largest frame size possible" )
139 {
140 size_t maxCircBuffLength = 1024;
141 double maxCircBuffSize = 1024.0;
142 size_t maxWriteChunkLength = 512;
143
144 size_t circBuffLength;
145 double circBuffSize;
146 size_t writeChunkLength;
147
148 uint32_t width = 16385;
149 uint32_t height = 16385;
150 size_t typeSize = 2;
151
152 streamWriter::getCircBuffLengths( circBuffLength,
153 circBuffSize,
154 writeChunkLength,
155 maxCircBuffLength,
156 maxCircBuffSize,
157 maxWriteChunkLength,
158 width,
159 height,
160 typeSize );
161
162 REQUIRE( circBuffLength == 0 );
163 REQUIRE( circBuffSize == 0 );
164 REQUIRE( writeChunkLength == 0 );
165 }
166
167 WHEN( "Exceeding largest frame size possible by a lot" )
168 {
169 size_t maxCircBuffLength = 1024;
170 double maxCircBuffSize = 1024.0;
171 size_t maxWriteChunkLength = 512;
172
173 size_t circBuffLength;
174 double circBuffSize;
175 size_t writeChunkLength;
176
177 uint32_t width = 56385;
178 uint32_t height = 56385;
179 size_t typeSize = 2;
180
181 streamWriter::getCircBuffLengths( circBuffLength,
182 circBuffSize,
183 writeChunkLength,
184 maxCircBuffLength,
185 maxCircBuffSize,
186 maxWriteChunkLength,
187 width,
188 height,
189 typeSize );
190
191 REQUIRE( circBuffLength == 0 );
192 REQUIRE( circBuffSize == 0 );
193 REQUIRE( writeChunkLength == 0 );
194 }
195
196 WHEN( "LOWFS-like setup, 32x32 frames" )
197 {
198 size_t maxCircBuffLength = 524288;
199 double maxCircBuffSize = 1024.0;
200 size_t maxWriteChunkLength = 16384;
201
202 size_t circBuffLength;
203 double circBuffSize;
204 size_t writeChunkLength;
205
206 uint32_t width = 32;
207 uint32_t height = 32;
208 size_t typeSize = 2;
209
210 streamWriter::getCircBuffLengths( circBuffLength,
211 circBuffSize,
212 writeChunkLength,
213 maxCircBuffLength,
214 maxCircBuffSize,
215 maxWriteChunkLength,
216 width,
217 height,
218 typeSize );
219
220 REQUIRE( circBuffLength == 524288 );
221 REQUIRE_THAT( circBuffSize, Catch::Matchers::WithinAbs( 1024, 0.00001 ) );
222 REQUIRE( writeChunkLength == 16384 );
223 REQUIRE( ( circBuffLength % writeChunkLength ) == 0 );
224 }
225
226 WHEN( "LOWFS-like setup, 512x512 frames" )
227 {
228 size_t maxCircBuffLength = 524288;
229 double maxCircBuffSize = 1024.0;
230 size_t maxWriteChunkLength = 16384;
231
232 size_t circBuffLength;
233 double circBuffSize;
234 size_t writeChunkLength;
235
236 uint32_t width = 512;
237 uint32_t height = 512;
238 size_t typeSize = 2;
239
240 streamWriter::getCircBuffLengths( circBuffLength,
241 circBuffSize,
242 writeChunkLength,
243 maxCircBuffLength,
244 maxCircBuffSize,
245 maxWriteChunkLength,
246 width,
247 height,
248 typeSize );
249
250 REQUIRE( circBuffLength == 2048 );
251 REQUIRE_THAT( circBuffSize, Catch::Matchers::WithinAbs( 1024, 0.00001 ) );
252 REQUIRE( writeChunkLength == 64 );
253 REQUIRE( ( circBuffLength % writeChunkLength ) == 0 );
254 }
255
256 WHEN( "LOWFS-like setup, 3200x3200 frames" )
257 {
258 size_t maxCircBuffLength = 524288;
259 double maxCircBuffSize = 1024.0;
260 size_t maxWriteChunkLength = 16384;
261
262 size_t circBuffLength;
263 double circBuffSize;
264 size_t writeChunkLength;
265
266 uint32_t width = 3200;
267 uint32_t height = 3200;
268 size_t typeSize = 2;
269
270 streamWriter::getCircBuffLengths( circBuffLength,
271 circBuffSize,
272 writeChunkLength,
273 maxCircBuffLength,
274 maxCircBuffSize,
275 maxWriteChunkLength,
276 width,
277 height,
278 typeSize );
279
280 REQUIRE( circBuffLength == 52 );
281 REQUIRE_THAT( circBuffSize, Catch::Matchers::WithinAbs( 1015.625, 0.00001 ) );
282 REQUIRE( writeChunkLength == 1 );
283 REQUIRE( ( circBuffLength % writeChunkLength ) == 0 );
284 }
285
286 WHEN( "computed odd circular buffers round down and zero write chunks promote to one" )
287 {
288 size_t maxCircBuffLength = 1000;
289 double maxCircBuffSize = 11.0 / 1048576.0;
290 size_t maxWriteChunkLength = 1;
291
292 size_t circBuffLength;
293 double circBuffSize;
294 size_t writeChunkLength;
295
296 uint32_t width = 1;
297 uint32_t height = 1;
298 size_t typeSize = 1;
299
300 streamWriter::getCircBuffLengths( circBuffLength,
301 circBuffSize,
302 writeChunkLength,
303 maxCircBuffLength,
304 maxCircBuffSize,
305 maxWriteChunkLength,
306 width,
307 height,
308 typeSize );
309
310 REQUIRE( circBuffLength == 10 );
311 REQUIRE_THAT( circBuffSize, Catch::Matchers::WithinAbs( 10.0 / 1048576.0, 1e-12 ) );
312 REQUIRE( writeChunkLength == 1 );
313 }
314
315 WHEN( "computed write chunks shrink until they evenly divide the circular buffer" )
316 {
317 size_t maxCircBuffLength = 10;
318 double maxCircBuffSize = 9.0 / 1048576.0;
319 size_t maxWriteChunkLength = 4;
320
321 size_t circBuffLength;
322 double circBuffSize;
323 size_t writeChunkLength;
324
325 uint32_t width = 1;
326 uint32_t height = 1;
327 size_t typeSize = 1;
328
329 streamWriter::getCircBuffLengths( circBuffLength,
330 circBuffSize,
331 writeChunkLength,
332 maxCircBuffLength,
333 maxCircBuffSize,
334 maxWriteChunkLength,
335 width,
336 height,
337 typeSize );
338
339 REQUIRE( circBuffLength == 8 );
340 REQUIRE_THAT( circBuffSize, Catch::Matchers::WithinAbs( 8.0 / 1048576.0, 1e-12 ) );
341 REQUIRE( writeChunkLength == 2 );
342 REQUIRE( ( circBuffLength % writeChunkLength ) == 0 );
343 }
344 }
345}
346
347} // namespace streamWriterTest
348
349} // namespace libXWCTest
static void getCircBuffLengths(size_t &circBuffLength, double &circBuffSize, size_t &writeChunkLength, size_t maxCircBuffLength, double maxCircBuffSize, size_t maxWriteChunkLength, uint32_t width, uint32_t height, size_t typeSize)
SCENARIO("streamWriter INDI Callbacks", "[streamWriter]")
Verify the streamWriter INDI callback validator accepts only the expected property.
Namespace for all libXWC tests.