1 /* ----------------------------------------------------------------------
2    LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
3    https://www.lammps.org/, Sandia National Laboratories
4    Steve Plimpton, sjplimp@sandia.gov
5 
6    Copyright (2003) Sandia Corporation.  Under the terms of Contract
7    DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
8    certain rights in this software.  This software is distributed under
9    the GNU General Public License.
10 
11    See the README file in the top-level LAMMPS directory.
12 ------------------------------------------------------------------------- */
13 
14 #include "../testing/utils.h"
15 #include "compressed_dump_test.h"
16 #include "fmt/format.h"
17 #include "utils.h"
18 #include "gmock/gmock.h"
19 #include "gtest/gtest.h"
20 
21 #include <string>
22 
23 using ::testing::Eq;
24 
25 class DumpAtomCompressTest : public CompressedDumpTest {
26 public:
DumpAtomCompressTest()27     DumpAtomCompressTest() : CompressedDumpTest("atom") {}
28 };
29 
30 //-------------------------------------------------------------------------------------------------
31 // compressed files
32 //-------------------------------------------------------------------------------------------------
33 
TEST_F(DumpAtomCompressTest,compressed_run0)34 TEST_F(DumpAtomCompressTest, compressed_run0)
35 {
36     if (!COMPRESS_BINARY) GTEST_SKIP();
37 
38     auto text_file       = text_dump_filename("run0.melt");
39     auto compressed_file = compressed_dump_filename("run0.melt");
40 
41     if (compression_style == "atom/zstd") {
42         generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "checksum yes",
43                                           0);
44     } else {
45         generate_text_and_compressed_dump(text_file, compressed_file, "", "", 0);
46     }
47 
48     TearDown();
49 
50     ASSERT_FILE_EXISTS(text_file);
51     ASSERT_FILE_EXISTS(compressed_file);
52 
53     auto converted_file = convert_compressed_to_text(compressed_file);
54 
55     ASSERT_THAT(converted_file, Eq(converted_dump_filename("run0.melt")));
56     ASSERT_FILE_EXISTS(converted_file);
57     ASSERT_FILE_EQUAL(text_file, converted_file);
58     delete_file(text_file);
59     delete_file(compressed_file);
60     delete_file(converted_file);
61 }
62 
TEST_F(DumpAtomCompressTest,compressed_no_buffer_run0)63 TEST_F(DumpAtomCompressTest, compressed_no_buffer_run0)
64 {
65     if (!COMPRESS_BINARY) GTEST_SKIP();
66 
67     auto text_file       = text_dump_filename("no_buffer_run0.melt");
68     auto compressed_file = compressed_dump_filename("no_buffer_run0.melt");
69 
70     if (compression_style == "atom/zstd") {
71         generate_text_and_compressed_dump(text_file, compressed_file, "", "", "buffer no",
72                                           "buffer no checksum yes", 0);
73     } else {
74         generate_text_and_compressed_dump(text_file, compressed_file, "", "buffer no", 0);
75     }
76 
77     TearDown();
78 
79     ASSERT_FILE_EXISTS(text_file);
80     ASSERT_FILE_EXISTS(compressed_file);
81 
82     auto converted_file = convert_compressed_to_text(compressed_file);
83 
84     ASSERT_THAT(converted_file, Eq(converted_dump_filename("no_buffer_run0.melt")));
85     ASSERT_FILE_EXISTS(converted_file);
86     ASSERT_FILE_EQUAL(text_file, converted_file);
87     delete_file(text_file);
88     delete_file(compressed_file);
89     delete_file(converted_file);
90 }
91 
TEST_F(DumpAtomCompressTest,compressed_multi_file_run1)92 TEST_F(DumpAtomCompressTest, compressed_multi_file_run1)
93 {
94     if (!COMPRESS_BINARY) GTEST_SKIP();
95 
96     auto base_name         = "multi_file_run1_*.melt";
97     auto base_name_0       = "multi_file_run1_0.melt";
98     auto base_name_1       = "multi_file_run1_1.melt";
99     auto text_file         = text_dump_filename(base_name);
100     auto text_file_0       = text_dump_filename(base_name_0);
101     auto text_file_1       = text_dump_filename(base_name_1);
102     auto compressed_file   = compressed_dump_filename(base_name);
103     auto compressed_file_0 = compressed_dump_filename(base_name_0);
104     auto compressed_file_1 = compressed_dump_filename(base_name_1);
105 
106     if (compression_style == "atom/zstd") {
107         generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "checksum no", 1);
108     } else {
109         generate_text_and_compressed_dump(text_file, compressed_file, "", "", 1);
110     }
111 
112     TearDown();
113 
114     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
115     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
116 
117     ASSERT_THAT(converted_file_0, Eq(converted_dump_filename(base_name_0)));
118     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
119     ASSERT_FILE_EXISTS(converted_file_0);
120     ASSERT_FILE_EXISTS(converted_file_1);
121     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
122     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
123 
124     delete_file(text_file_0);
125     delete_file(text_file_1);
126     delete_file(compressed_file_0);
127     delete_file(compressed_file_1);
128     delete_file(converted_file_0);
129     delete_file(converted_file_1);
130 }
131 
TEST_F(DumpAtomCompressTest,compressed_multi_file_with_pad_run1)132 TEST_F(DumpAtomCompressTest, compressed_multi_file_with_pad_run1)
133 {
134     if (!COMPRESS_BINARY) GTEST_SKIP();
135 
136     auto base_name         = "multi_file_pad_run1_*.melt";
137     auto base_name_0       = "multi_file_pad_run1_000.melt";
138     auto base_name_1       = "multi_file_pad_run1_001.melt";
139     auto text_file         = text_dump_filename(base_name);
140     auto text_file_0       = text_dump_filename(base_name_0);
141     auto text_file_1       = text_dump_filename(base_name_1);
142     auto compressed_file   = compressed_dump_filename(base_name);
143     auto compressed_file_0 = compressed_dump_filename(base_name_0);
144     auto compressed_file_1 = compressed_dump_filename(base_name_1);
145 
146     generate_text_and_compressed_dump(text_file, compressed_file, "", "pad 3", 1);
147 
148     TearDown();
149 
150     ASSERT_FILE_EXISTS(text_file_0);
151     ASSERT_FILE_EXISTS(text_file_1);
152     ASSERT_FILE_EXISTS(compressed_file_0);
153     ASSERT_FILE_EXISTS(compressed_file_1);
154 
155     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
156     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
157 
158     ASSERT_THAT(converted_file_0, Eq(converted_dump_filename(base_name_0)));
159     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
160     ASSERT_FILE_EXISTS(converted_file_0);
161     ASSERT_FILE_EXISTS(converted_file_1);
162     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
163     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
164 
165     delete_file(text_file_0);
166     delete_file(text_file_1);
167     delete_file(compressed_file_0);
168     delete_file(compressed_file_1);
169     delete_file(converted_file_0);
170     delete_file(converted_file_1);
171 }
172 
TEST_F(DumpAtomCompressTest,compressed_multi_file_with_maxfiles_run1)173 TEST_F(DumpAtomCompressTest, compressed_multi_file_with_maxfiles_run1)
174 {
175     if (!COMPRESS_BINARY) GTEST_SKIP();
176 
177     auto base_name         = "multi_file_maxfiles_run1_*.melt";
178     auto base_name_0       = "multi_file_maxfiles_run1_0.melt";
179     auto base_name_1       = "multi_file_maxfiles_run1_1.melt";
180     auto base_name_2       = "multi_file_maxfiles_run1_2.melt";
181     auto text_file         = text_dump_filename(base_name);
182     auto text_file_0       = text_dump_filename(base_name_0);
183     auto text_file_1       = text_dump_filename(base_name_1);
184     auto text_file_2       = text_dump_filename(base_name_2);
185     auto compressed_file   = compressed_dump_filename(base_name);
186     auto compressed_file_0 = compressed_dump_filename(base_name_0);
187     auto compressed_file_1 = compressed_dump_filename(base_name_1);
188     auto compressed_file_2 = compressed_dump_filename(base_name_2);
189 
190     generate_text_and_compressed_dump(text_file, compressed_file, "", "maxfiles 2", 2);
191 
192     TearDown();
193 
194     ASSERT_FILE_NOT_EXISTS(text_file_0);
195     ASSERT_FILE_EXISTS(text_file_1);
196     ASSERT_FILE_EXISTS(text_file_2);
197     ASSERT_FILE_NOT_EXISTS(compressed_file_0);
198     ASSERT_FILE_EXISTS(compressed_file_1);
199     ASSERT_FILE_EXISTS(compressed_file_2);
200 
201     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
202     auto converted_file_2 = convert_compressed_to_text(compressed_file_2);
203 
204     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
205     ASSERT_THAT(converted_file_2, Eq(converted_dump_filename(base_name_2)));
206     ASSERT_FILE_EXISTS(converted_file_1);
207     ASSERT_FILE_EXISTS(converted_file_2);
208     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
209     ASSERT_FILE_EQUAL(text_file_2, converted_file_2);
210 
211     delete_file(text_file_1);
212     delete_file(text_file_2);
213     delete_file(compressed_file_1);
214     delete_file(compressed_file_2);
215     delete_file(converted_file_1);
216     delete_file(converted_file_2);
217 }
218 
TEST_F(DumpAtomCompressTest,compressed_with_units_run0)219 TEST_F(DumpAtomCompressTest, compressed_with_units_run0)
220 {
221     if (!COMPRESS_BINARY) GTEST_SKIP();
222 
223     auto base_name       = "with_units_run0.melt";
224     auto text_file       = text_dump_filename(base_name);
225     auto compressed_file = compressed_dump_filename(base_name);
226 
227     generate_text_and_compressed_dump(text_file, compressed_file, "", "scale no units yes", 0);
228 
229     TearDown();
230 
231     ASSERT_FILE_EXISTS(text_file);
232     ASSERT_FILE_EXISTS(compressed_file);
233 
234     auto converted_file = convert_compressed_to_text(compressed_file);
235 
236     ASSERT_FILE_EXISTS(converted_file);
237     ASSERT_FILE_EQUAL(text_file, converted_file);
238     delete_file(text_file);
239     delete_file(compressed_file);
240     delete_file(converted_file);
241 }
242 
TEST_F(DumpAtomCompressTest,compressed_with_time_run0)243 TEST_F(DumpAtomCompressTest, compressed_with_time_run0)
244 {
245     if (!COMPRESS_BINARY) GTEST_SKIP();
246 
247     auto base_name       = "with_time_run0.melt";
248     auto text_file       = text_dump_filename(base_name);
249     auto compressed_file = compressed_dump_filename(base_name);
250 
251     generate_text_and_compressed_dump(text_file, compressed_file, "", "scale no time yes", 0);
252 
253     TearDown();
254 
255     ASSERT_FILE_EXISTS(text_file);
256     ASSERT_FILE_EXISTS(compressed_file);
257 
258     auto converted_file = convert_compressed_to_text(compressed_file);
259 
260     ASSERT_FILE_EXISTS(converted_file);
261     ASSERT_FILE_EQUAL(text_file, converted_file);
262     delete_file(text_file);
263     delete_file(compressed_file);
264     delete_file(converted_file);
265 }
266 
TEST_F(DumpAtomCompressTest,compressed_triclinic_run0)267 TEST_F(DumpAtomCompressTest, compressed_triclinic_run0)
268 {
269     if (!COMPRESS_BINARY) GTEST_SKIP();
270 
271     auto base_name       = "tri_run0.melt";
272     auto text_file       = text_dump_filename(base_name);
273     auto compressed_file = compressed_dump_filename(base_name);
274 
275     enable_triclinic();
276     generate_text_and_compressed_dump(text_file, compressed_file, "", "", 0);
277 
278     TearDown();
279 
280     ASSERT_FILE_EXISTS(text_file);
281     ASSERT_FILE_EXISTS(compressed_file);
282 
283     auto converted_file = convert_compressed_to_text(compressed_file);
284 
285     ASSERT_FILE_EXISTS(converted_file);
286     ASSERT_FILE_EQUAL(text_file, converted_file);
287     delete_file(text_file);
288     delete_file(compressed_file);
289     delete_file(converted_file);
290 }
291 
TEST_F(DumpAtomCompressTest,compressed_triclinic_with_units_run0)292 TEST_F(DumpAtomCompressTest, compressed_triclinic_with_units_run0)
293 {
294     if (!COMPRESS_BINARY) GTEST_SKIP();
295 
296     auto base_name       = "tri_with_units_run0.melt";
297     auto text_file       = text_dump_filename(base_name);
298     auto compressed_file = compressed_dump_filename(base_name);
299 
300     enable_triclinic();
301     generate_text_and_compressed_dump(text_file, compressed_file, "", "scale no units yes", 0);
302 
303     TearDown();
304 
305     ASSERT_FILE_EXISTS(text_file);
306     ASSERT_FILE_EXISTS(compressed_file);
307 
308     auto converted_file = convert_compressed_to_text(compressed_file);
309 
310     ASSERT_FILE_EXISTS(converted_file);
311     ASSERT_FILE_EQUAL(text_file, converted_file);
312     delete_file(text_file);
313     delete_file(compressed_file);
314     delete_file(converted_file);
315 }
316 
TEST_F(DumpAtomCompressTest,compressed_triclinic_with_time_run0)317 TEST_F(DumpAtomCompressTest, compressed_triclinic_with_time_run0)
318 {
319     if (!COMPRESS_BINARY) GTEST_SKIP();
320 
321     auto base_name       = "tri_with_time_run0.melt";
322     auto text_file       = text_dump_filename(base_name);
323     auto compressed_file = compressed_dump_filename(base_name);
324 
325     enable_triclinic();
326     generate_text_and_compressed_dump(text_file, compressed_file, "", "scale no time yes", 0);
327 
328     TearDown();
329 
330     ASSERT_FILE_EXISTS(text_file);
331     ASSERT_FILE_EXISTS(compressed_file);
332 
333     auto converted_file = convert_compressed_to_text(compressed_file);
334 
335     ASSERT_FILE_EXISTS(converted_file);
336     ASSERT_FILE_EQUAL(text_file, converted_file);
337     delete_file(text_file);
338     delete_file(compressed_file);
339     delete_file(converted_file);
340 }
341 
TEST_F(DumpAtomCompressTest,compressed_triclinic_with_image_run0)342 TEST_F(DumpAtomCompressTest, compressed_triclinic_with_image_run0)
343 {
344     if (!COMPRESS_BINARY) GTEST_SKIP();
345 
346     auto base_name       = "tri_with_image_run0.melt";
347     auto text_file       = text_dump_filename(base_name);
348     auto compressed_file = compressed_dump_filename(base_name);
349 
350     enable_triclinic();
351     generate_text_and_compressed_dump(text_file, compressed_file, "", "image yes", 0);
352 
353     TearDown();
354 
355     ASSERT_FILE_EXISTS(text_file);
356     ASSERT_FILE_EXISTS(compressed_file);
357 
358     auto converted_file = convert_compressed_to_text(compressed_file);
359 
360     ASSERT_FILE_EXISTS(converted_file);
361     ASSERT_FILE_EQUAL(text_file, converted_file);
362     delete_file(text_file);
363     delete_file(compressed_file);
364     delete_file(converted_file);
365 }
366 
TEST_F(DumpAtomCompressTest,compressed_modify_bad_param)367 TEST_F(DumpAtomCompressTest, compressed_modify_bad_param)
368 {
369     if (compression_style != "atom/gz") GTEST_SKIP();
370 
371     BEGIN_HIDE_OUTPUT();
372     command(fmt::format("dump id1 all {} 1 {}", compression_style,
373                         compressed_dump_filename("modify_bad_param_run0_*.melt")));
374     END_HIDE_OUTPUT();
375 
376     TEST_FAILURE(
377         ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
378         command("dump_modify id1 compression_level 12"););
379 }
380 
TEST_F(DumpAtomCompressTest,compressed_modify_multi_bad_param)381 TEST_F(DumpAtomCompressTest, compressed_modify_multi_bad_param)
382 {
383     if (compression_style != "atom/gz") GTEST_SKIP();
384 
385     BEGIN_HIDE_OUTPUT();
386     command(fmt::format("dump id1 all {} 1 {}", compression_style,
387                         compressed_dump_filename("modify_multi_bad_param_run0_*.melt")));
388     END_HIDE_OUTPUT();
389 
390     TEST_FAILURE(
391         ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
392         command("dump_modify id1 pad 3 compression_level 12"););
393 }
394 
TEST_F(DumpAtomCompressTest,compressed_modify_clevel_run0)395 TEST_F(DumpAtomCompressTest, compressed_modify_clevel_run0)
396 {
397     if (!COMPRESS_BINARY) GTEST_SKIP();
398 
399     auto base_name       = "modify_clevel_run0.melt";
400     auto text_file       = text_dump_filename(base_name);
401     auto compressed_file = compressed_dump_filename(base_name);
402 
403     generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "compression_level 3",
404                                       0);
405 
406     TearDown();
407 
408     ASSERT_FILE_EXISTS(text_file);
409     ASSERT_FILE_EXISTS(compressed_file);
410 
411     auto converted_file = convert_compressed_to_text(compressed_file);
412 
413     ASSERT_THAT(converted_file, Eq(converted_dump_filename(base_name)));
414     ASSERT_FILE_EXISTS(converted_file);
415     ASSERT_FILE_EQUAL(text_file, converted_file);
416     delete_file(text_file);
417     delete_file(compressed_file);
418     delete_file(converted_file);
419 }
420