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 DumpLocalCompressTest : public CompressedDumpTest {
26 public:
DumpLocalCompressTest()27     DumpLocalCompressTest() : CompressedDumpTest("local") {}
28 
SetUp()29     void SetUp() override
30     {
31         CompressedDumpTest::SetUp();
32 
33         BEGIN_HIDE_OUTPUT();
34         command("compute comp all pair/local dist eng");
35         END_HIDE_OUTPUT();
36     }
37 };
38 
TEST_F(DumpLocalCompressTest,compressed_run0)39 TEST_F(DumpLocalCompressTest, compressed_run0)
40 {
41     if (!COMPRESS_BINARY) GTEST_SKIP();
42 
43     auto base_name         = "run*.melt.local";
44     auto base_name_0       = "run0.melt.local";
45     auto text_files        = text_dump_filename(base_name);
46     auto compressed_files  = compressed_dump_filename(base_name);
47     auto text_file_0       = text_dump_filename(base_name_0);
48     auto compressed_file_0 = compressed_dump_filename(base_name_0);
49     auto fields            = "index c_comp[1]";
50 
51     if (compression_style == "local/zstd") {
52         generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "",
53                                           "checksum yes", 0);
54     } else {
55         generate_text_and_compressed_dump(text_files, compressed_files, fields, "", 0);
56     }
57 
58     TearDown();
59 
60     ASSERT_FILE_EXISTS(text_file_0);
61     ASSERT_FILE_EXISTS(compressed_file_0);
62 
63     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
64 
65     ASSERT_FILE_EXISTS(converted_file_0);
66     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
67     delete_file(text_file_0);
68     delete_file(compressed_file_0);
69     delete_file(converted_file_0);
70 }
71 
TEST_F(DumpLocalCompressTest,compressed_no_buffer_run0)72 TEST_F(DumpLocalCompressTest, compressed_no_buffer_run0)
73 {
74     if (!COMPRESS_BINARY) GTEST_SKIP();
75 
76     auto base_name         = "no_buffer_run*.melt.local";
77     auto base_name_0       = "no_buffer_run0.melt.local";
78     auto text_files        = text_dump_filename(base_name);
79     auto compressed_files  = compressed_dump_filename(base_name);
80     auto text_file_0       = text_dump_filename(base_name_0);
81     auto compressed_file_0 = compressed_dump_filename(base_name_0);
82     auto fields            = "index c_comp[1]";
83 
84     if (compression_style == "local/zstd") {
85         generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "buffer no",
86                                           "buffer no checksum yes", 0);
87     } else {
88         generate_text_and_compressed_dump(text_files, compressed_files, fields, "buffer no", 0);
89     }
90 
91     TearDown();
92 
93     ASSERT_FILE_EXISTS(text_file_0);
94     ASSERT_FILE_EXISTS(compressed_file_0);
95 
96     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
97 
98     ASSERT_FILE_EXISTS(converted_file_0);
99     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
100     delete_file(text_file_0);
101     delete_file(compressed_file_0);
102     delete_file(converted_file_0);
103 }
104 
TEST_F(DumpLocalCompressTest,compressed_with_time_run0)105 TEST_F(DumpLocalCompressTest, compressed_with_time_run0)
106 {
107     if (!COMPRESS_BINARY) GTEST_SKIP();
108 
109     auto base_name         = "with_time_run*.melt.local";
110     auto base_name_0       = "with_time_run0.melt.local";
111     auto text_files        = text_dump_filename(base_name);
112     auto compressed_files  = compressed_dump_filename(base_name);
113     auto text_file_0       = text_dump_filename(base_name_0);
114     auto compressed_file_0 = compressed_dump_filename(base_name_0);
115     auto fields            = "index c_comp[1]";
116 
117     if (compression_style == "local/zstd") {
118         generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "time yes",
119                                           "time yes checksum yes", 0);
120     } else {
121         generate_text_and_compressed_dump(text_files, compressed_files, fields, "time yes", 0);
122     }
123 
124     TearDown();
125 
126     ASSERT_FILE_EXISTS(text_file_0);
127     ASSERT_FILE_EXISTS(compressed_file_0);
128 
129     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
130 
131     ASSERT_FILE_EXISTS(converted_file_0);
132     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
133     delete_file(text_file_0);
134     delete_file(compressed_file_0);
135     delete_file(converted_file_0);
136 }
137 
TEST_F(DumpLocalCompressTest,compressed_with_units_run0)138 TEST_F(DumpLocalCompressTest, compressed_with_units_run0)
139 {
140     if (!COMPRESS_BINARY) GTEST_SKIP();
141 
142     auto base_name         = "with_units_run*.melt.local";
143     auto base_name_0       = "with_units_run0.melt.local";
144     auto text_files        = text_dump_filename(base_name);
145     auto compressed_files  = compressed_dump_filename(base_name);
146     auto text_file_0       = text_dump_filename(base_name_0);
147     auto compressed_file_0 = compressed_dump_filename(base_name_0);
148     auto fields            = "index c_comp[1]";
149 
150     if (compression_style == "local/zstd") {
151         generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "units yes",
152                                           "units yes checksum yes", 0);
153     } else {
154         generate_text_and_compressed_dump(text_files, compressed_files, fields, "units yes", 0);
155     }
156 
157     TearDown();
158 
159     ASSERT_FILE_EXISTS(text_file_0);
160     ASSERT_FILE_EXISTS(compressed_file_0);
161 
162     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
163 
164     ASSERT_FILE_EXISTS(converted_file_0);
165     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
166     delete_file(text_file_0);
167     delete_file(compressed_file_0);
168     delete_file(converted_file_0);
169 }
170 
TEST_F(DumpLocalCompressTest,compressed_triclinic_run0)171 TEST_F(DumpLocalCompressTest, compressed_triclinic_run0)
172 {
173     if (!COMPRESS_BINARY) GTEST_SKIP();
174     enable_triclinic();
175 
176     auto base_name         = "triclinic_run*.melt.local";
177     auto base_name_0       = "triclinic_run0.melt.local";
178     auto text_files        = text_dump_filename(base_name);
179     auto compressed_files  = compressed_dump_filename(base_name);
180     auto text_file_0       = text_dump_filename(base_name_0);
181     auto compressed_file_0 = compressed_dump_filename(base_name_0);
182     auto fields            = "index c_comp[1]";
183 
184     if (compression_style == "local/zstd") {
185         generate_text_and_compressed_dump(text_files, compressed_files, fields, fields, "",
186                                           "checksum yes", 0);
187     } else {
188         generate_text_and_compressed_dump(text_files, compressed_files, fields, "", 0);
189     }
190 
191     TearDown();
192 
193     ASSERT_FILE_EXISTS(text_file_0);
194     ASSERT_FILE_EXISTS(compressed_file_0);
195 
196     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
197 
198     ASSERT_FILE_EXISTS(converted_file_0);
199     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
200     delete_file(text_file_0);
201     delete_file(compressed_file_0);
202     delete_file(converted_file_0);
203 }
204 
TEST_F(DumpLocalCompressTest,compressed_multi_file_run1)205 TEST_F(DumpLocalCompressTest, compressed_multi_file_run1)
206 {
207     if (!COMPRESS_BINARY) GTEST_SKIP();
208 
209     auto base_name         = "multi_file_run1_*.melt.local";
210     auto base_name_0       = "multi_file_run1_0.melt.local";
211     auto base_name_1       = "multi_file_run1_1.melt.local";
212     auto text_file         = text_dump_filename(base_name);
213     auto text_file_0       = text_dump_filename(base_name_0);
214     auto text_file_1       = text_dump_filename(base_name_1);
215     auto compressed_file   = compressed_dump_filename(base_name);
216     auto compressed_file_0 = compressed_dump_filename(base_name_0);
217     auto compressed_file_1 = compressed_dump_filename(base_name_1);
218     auto fields            = "index c_comp[1]";
219 
220     if (compression_style == "local/zstd") {
221         generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
222                                           "checksum no", 1);
223     } else {
224         generate_text_and_compressed_dump(text_file, compressed_file, fields, "", 1);
225     }
226 
227     TearDown();
228 
229     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
230     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
231 
232     ASSERT_THAT(converted_file_0, Eq(converted_dump_filename(base_name_0)));
233     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
234     ASSERT_FILE_EXISTS(converted_file_0);
235     ASSERT_FILE_EXISTS(converted_file_1);
236     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
237     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
238 
239     delete_file(text_file_0);
240     delete_file(text_file_1);
241     delete_file(compressed_file_0);
242     delete_file(compressed_file_1);
243     delete_file(converted_file_0);
244     delete_file(converted_file_1);
245 }
246 
TEST_F(DumpLocalCompressTest,compressed_multi_file_with_pad_run1)247 TEST_F(DumpLocalCompressTest, compressed_multi_file_with_pad_run1)
248 {
249     if (!COMPRESS_BINARY) GTEST_SKIP();
250 
251     auto base_name         = "multi_file_pad_run1_*.melt.local";
252     auto base_name_0       = "multi_file_pad_run1_000.melt.local";
253     auto base_name_1       = "multi_file_pad_run1_001.melt.local";
254     auto text_file         = text_dump_filename(base_name);
255     auto text_file_0       = text_dump_filename(base_name_0);
256     auto text_file_1       = text_dump_filename(base_name_1);
257     auto compressed_file   = compressed_dump_filename(base_name);
258     auto compressed_file_0 = compressed_dump_filename(base_name_0);
259     auto compressed_file_1 = compressed_dump_filename(base_name_1);
260     auto fields            = "index c_comp[1]";
261 
262     generate_text_and_compressed_dump(text_file, compressed_file, fields, "pad 3", 1);
263 
264     TearDown();
265 
266     ASSERT_FILE_EXISTS(text_file_0);
267     ASSERT_FILE_EXISTS(text_file_1);
268     ASSERT_FILE_EXISTS(compressed_file_0);
269     ASSERT_FILE_EXISTS(compressed_file_1);
270 
271     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
272     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
273 
274     ASSERT_THAT(converted_file_0, Eq(converted_dump_filename(base_name_0)));
275     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
276     ASSERT_FILE_EXISTS(converted_file_0);
277     ASSERT_FILE_EXISTS(converted_file_1);
278     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
279     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
280 
281     delete_file(text_file_0);
282     delete_file(text_file_1);
283     delete_file(compressed_file_0);
284     delete_file(compressed_file_1);
285     delete_file(converted_file_0);
286     delete_file(converted_file_1);
287 }
288 
TEST_F(DumpLocalCompressTest,compressed_multi_file_with_maxfiles_run1)289 TEST_F(DumpLocalCompressTest, compressed_multi_file_with_maxfiles_run1)
290 {
291     if (!COMPRESS_BINARY) GTEST_SKIP();
292 
293     auto base_name         = "multi_file_maxfiles_run1_*.melt.local";
294     auto base_name_0       = "multi_file_maxfiles_run1_0.melt.local";
295     auto base_name_1       = "multi_file_maxfiles_run1_1.melt.local";
296     auto base_name_2       = "multi_file_maxfiles_run1_2.melt.local";
297     auto text_file         = text_dump_filename(base_name);
298     auto text_file_0       = text_dump_filename(base_name_0);
299     auto text_file_1       = text_dump_filename(base_name_1);
300     auto text_file_2       = text_dump_filename(base_name_2);
301     auto compressed_file   = compressed_dump_filename(base_name);
302     auto compressed_file_0 = compressed_dump_filename(base_name_0);
303     auto compressed_file_1 = compressed_dump_filename(base_name_1);
304     auto compressed_file_2 = compressed_dump_filename(base_name_2);
305     auto fields            = "index c_comp[1]";
306 
307     generate_text_and_compressed_dump(text_file, compressed_file, fields, "maxfiles 2", 2);
308 
309     TearDown();
310 
311     ASSERT_FILE_NOT_EXISTS(text_file_0);
312     ASSERT_FILE_EXISTS(text_file_1);
313     ASSERT_FILE_EXISTS(text_file_2);
314     ASSERT_FILE_NOT_EXISTS(compressed_file_0);
315     ASSERT_FILE_EXISTS(compressed_file_1);
316     ASSERT_FILE_EXISTS(compressed_file_2);
317 
318     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
319     auto converted_file_2 = convert_compressed_to_text(compressed_file_2);
320 
321     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
322     ASSERT_THAT(converted_file_2, Eq(converted_dump_filename(base_name_2)));
323     ASSERT_FILE_EXISTS(converted_file_1);
324     ASSERT_FILE_EXISTS(converted_file_2);
325     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
326     ASSERT_FILE_EQUAL(text_file_2, converted_file_2);
327 
328     delete_file(text_file_1);
329     delete_file(text_file_2);
330     delete_file(compressed_file_1);
331     delete_file(compressed_file_2);
332     delete_file(converted_file_1);
333     delete_file(converted_file_2);
334 }
335 
TEST_F(DumpLocalCompressTest,compressed_modify_bad_param)336 TEST_F(DumpLocalCompressTest, compressed_modify_bad_param)
337 {
338     if (compression_style != "local/gz") GTEST_SKIP();
339 
340     auto fields = "index c_comp[1]";
341 
342     BEGIN_HIDE_OUTPUT();
343     command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
344                         compressed_dump_filename("modify_bad_param_run0_*.melt.local"), fields));
345     END_HIDE_OUTPUT();
346 
347     TEST_FAILURE(
348         ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
349         command("dump_modify id1 compression_level 12"););
350 }
351 
TEST_F(DumpLocalCompressTest,compressed_modify_multi_bad_param)352 TEST_F(DumpLocalCompressTest, compressed_modify_multi_bad_param)
353 {
354     if (compression_style != "local/gz") GTEST_SKIP();
355 
356     auto fields = "index c_comp[1]";
357 
358     BEGIN_HIDE_OUTPUT();
359     command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
360                         compressed_dump_filename("modify_multi_bad_param_run0_*.melt.local"),
361                         fields));
362     END_HIDE_OUTPUT();
363 
364     TEST_FAILURE(
365         ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
366         command("dump_modify id1 pad 3 compression_level 12"););
367 }
368 
TEST_F(DumpLocalCompressTest,compressed_modify_clevel_run0)369 TEST_F(DumpLocalCompressTest, compressed_modify_clevel_run0)
370 {
371     if (!COMPRESS_BINARY) GTEST_SKIP();
372 
373     auto base_name       = "modify_clevel_run0.melt.local";
374     auto text_file       = text_dump_filename(base_name);
375     auto compressed_file = compressed_dump_filename(base_name);
376     auto fields          = "index c_comp[1]";
377 
378     generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
379                                       "compression_level 3", 0);
380 
381     TearDown();
382 
383     ASSERT_FILE_EXISTS(text_file);
384     ASSERT_FILE_EXISTS(compressed_file);
385 
386     auto converted_file = convert_compressed_to_text(compressed_file);
387 
388     ASSERT_THAT(converted_file, Eq(converted_dump_filename(base_name)));
389     ASSERT_FILE_EXISTS(converted_file);
390     ASSERT_FILE_EQUAL(text_file, converted_file);
391     delete_file(text_file);
392     delete_file(compressed_file);
393     delete_file(converted_file);
394 }
395