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 DumpCustomCompressTest : public CompressedDumpTest {
26 public:
DumpCustomCompressTest()27     DumpCustomCompressTest() : CompressedDumpTest("custom") {}
28 };
29 
TEST_F(DumpCustomCompressTest,compressed_run1)30 TEST_F(DumpCustomCompressTest, compressed_run1)
31 {
32     if (!COMPRESS_BINARY) GTEST_SKIP();
33 
34     auto base_name       = "custom_run1.melt";
35     auto text_file       = text_dump_filename(base_name);
36     auto compressed_file = compressed_dump_filename(base_name);
37     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
38 
39     if (compression_style == "custom/zstd") {
40         generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "units yes",
41                                           "units yes checksum yes", 1);
42     } else {
43         generate_text_and_compressed_dump(text_file, compressed_file, fields, "units yes", 1);
44     }
45 
46     TearDown();
47 
48     ASSERT_FILE_EXISTS(text_file);
49     ASSERT_FILE_EXISTS(compressed_file);
50 
51     auto converted_file = convert_compressed_to_text(compressed_file);
52 
53     ASSERT_FILE_EXISTS(converted_file);
54     ASSERT_FILE_EQUAL(text_file, converted_file);
55     delete_file(text_file);
56     delete_file(compressed_file);
57     delete_file(converted_file);
58 }
59 
TEST_F(DumpCustomCompressTest,compressed_with_time_run1)60 TEST_F(DumpCustomCompressTest, compressed_with_time_run1)
61 {
62     if (!COMPRESS_BINARY) GTEST_SKIP();
63 
64     auto base_name       = "with_time_custom_run1.melt";
65     auto text_file       = text_dump_filename(base_name);
66     auto compressed_file = compressed_dump_filename(base_name);
67     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
68 
69     if (compression_style == "custom/zstd") {
70         generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "time yes",
71                                           "time yes checksum yes", 1);
72     } else {
73         generate_text_and_compressed_dump(text_file, compressed_file, fields, "time yes", 1);
74     }
75 
76     TearDown();
77 
78     ASSERT_FILE_EXISTS(text_file);
79     ASSERT_FILE_EXISTS(compressed_file);
80 
81     auto converted_file = convert_compressed_to_text(compressed_file);
82 
83     ASSERT_FILE_EXISTS(converted_file);
84     ASSERT_FILE_EQUAL(text_file, converted_file);
85     delete_file(text_file);
86     delete_file(compressed_file);
87     delete_file(converted_file);
88 }
89 
TEST_F(DumpCustomCompressTest,compressed_no_buffer_run1)90 TEST_F(DumpCustomCompressTest, compressed_no_buffer_run1)
91 {
92     if (!COMPRESS_BINARY) GTEST_SKIP();
93 
94     auto base_name       = "no_buffer_custom_run1.melt";
95     auto text_file       = text_dump_filename(base_name);
96     auto compressed_file = compressed_dump_filename(base_name);
97     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
98 
99     if (compression_style == "custom/zstd") {
100         generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "buffer no",
101                                           "buffer no checksum yes", 1);
102     } else {
103         generate_text_and_compressed_dump(text_file, compressed_file, fields, "buffer no", 1);
104     }
105 
106     TearDown();
107 
108     ASSERT_FILE_EXISTS(text_file);
109     ASSERT_FILE_EXISTS(compressed_file);
110 
111     auto converted_file = convert_compressed_to_text(compressed_file);
112 
113     ASSERT_FILE_EXISTS(converted_file);
114     ASSERT_FILE_EQUAL(text_file, converted_file);
115     delete_file(text_file);
116     delete_file(compressed_file);
117     delete_file(converted_file);
118 }
119 
TEST_F(DumpCustomCompressTest,compressed_triclinic_run1)120 TEST_F(DumpCustomCompressTest, compressed_triclinic_run1)
121 {
122     if (!COMPRESS_BINARY) GTEST_SKIP();
123 
124     auto base_name       = "custom_tri_run1.melt";
125     auto text_file       = text_dump_filename(base_name);
126     auto compressed_file = compressed_dump_filename(base_name);
127     auto fields          = "id type proc x y z xs ys zs xsu ysu zsu vx vy vz fx fy fz";
128 
129     enable_triclinic();
130 
131     generate_text_and_compressed_dump(text_file, compressed_file, fields, "units yes", 1);
132 
133     TearDown();
134 
135     ASSERT_FILE_EXISTS(text_file);
136     ASSERT_FILE_EXISTS(compressed_file);
137 
138     auto converted_file = convert_compressed_to_text(compressed_file);
139 
140     ASSERT_FILE_EXISTS(converted_file);
141     ASSERT_FILE_EQUAL(text_file, converted_file);
142     delete_file(text_file);
143     delete_file(compressed_file);
144     delete_file(converted_file);
145 }
146 
TEST_F(DumpCustomCompressTest,compressed_multi_file_run1)147 TEST_F(DumpCustomCompressTest, compressed_multi_file_run1)
148 {
149     if (!COMPRESS_BINARY) GTEST_SKIP();
150 
151     auto base_name         = "multi_file_run1_*.melt.custom";
152     auto base_name_0       = "multi_file_run1_0.melt.custom";
153     auto base_name_1       = "multi_file_run1_1.melt.custom";
154     auto text_file         = text_dump_filename(base_name);
155     auto text_file_0       = text_dump_filename(base_name_0);
156     auto text_file_1       = text_dump_filename(base_name_1);
157     auto compressed_file   = compressed_dump_filename(base_name);
158     auto compressed_file_0 = compressed_dump_filename(base_name_0);
159     auto compressed_file_1 = compressed_dump_filename(base_name_1);
160     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
161 
162     if (compression_style == "custom/zstd") {
163         generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
164                                           "checksum no", 1);
165     } else {
166         generate_text_and_compressed_dump(text_file, compressed_file, fields, "", 1);
167     }
168 
169     TearDown();
170 
171     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
172     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
173 
174     ASSERT_THAT(converted_file_0, Eq(converted_dump_filename(base_name_0)));
175     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
176     ASSERT_FILE_EXISTS(converted_file_0);
177     ASSERT_FILE_EXISTS(converted_file_1);
178     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
179     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
180 
181     delete_file(text_file_0);
182     delete_file(text_file_1);
183     delete_file(compressed_file_0);
184     delete_file(compressed_file_1);
185     delete_file(converted_file_0);
186     delete_file(converted_file_1);
187 }
188 
TEST_F(DumpCustomCompressTest,compressed_multi_file_with_pad_run1)189 TEST_F(DumpCustomCompressTest, compressed_multi_file_with_pad_run1)
190 {
191     if (!COMPRESS_BINARY) GTEST_SKIP();
192 
193     auto base_name         = "multi_file_pad_run1_*.melt.custom";
194     auto base_name_0       = "multi_file_pad_run1_000.melt.custom";
195     auto base_name_1       = "multi_file_pad_run1_001.melt.custom";
196     auto text_file         = text_dump_filename(base_name);
197     auto text_file_0       = text_dump_filename(base_name_0);
198     auto text_file_1       = text_dump_filename(base_name_1);
199     auto compressed_file   = compressed_dump_filename(base_name);
200     auto compressed_file_0 = compressed_dump_filename(base_name_0);
201     auto compressed_file_1 = compressed_dump_filename(base_name_1);
202     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
203 
204     generate_text_and_compressed_dump(text_file, compressed_file, fields, "pad 3", 1);
205 
206     TearDown();
207 
208     ASSERT_FILE_EXISTS(text_file_0);
209     ASSERT_FILE_EXISTS(text_file_1);
210     ASSERT_FILE_EXISTS(compressed_file_0);
211     ASSERT_FILE_EXISTS(compressed_file_1);
212 
213     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
214     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
215 
216     ASSERT_THAT(converted_file_0, Eq(converted_dump_filename(base_name_0)));
217     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
218     ASSERT_FILE_EXISTS(converted_file_0);
219     ASSERT_FILE_EXISTS(converted_file_1);
220     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
221     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
222 
223     delete_file(text_file_0);
224     delete_file(text_file_1);
225     delete_file(compressed_file_0);
226     delete_file(compressed_file_1);
227     delete_file(converted_file_0);
228     delete_file(converted_file_1);
229 }
230 
TEST_F(DumpCustomCompressTest,compressed_multi_file_with_maxfiles_run1)231 TEST_F(DumpCustomCompressTest, compressed_multi_file_with_maxfiles_run1)
232 {
233     if (!COMPRESS_BINARY) GTEST_SKIP();
234 
235     auto base_name         = "multi_file_maxfiles_run1_*.melt.custom";
236     auto base_name_0       = "multi_file_maxfiles_run1_0.melt.custom";
237     auto base_name_1       = "multi_file_maxfiles_run1_1.melt.custom";
238     auto base_name_2       = "multi_file_maxfiles_run1_2.melt.custom";
239     auto text_file         = text_dump_filename(base_name);
240     auto text_file_0       = text_dump_filename(base_name_0);
241     auto text_file_1       = text_dump_filename(base_name_1);
242     auto text_file_2       = text_dump_filename(base_name_2);
243     auto compressed_file   = compressed_dump_filename(base_name);
244     auto compressed_file_0 = compressed_dump_filename(base_name_0);
245     auto compressed_file_1 = compressed_dump_filename(base_name_1);
246     auto compressed_file_2 = compressed_dump_filename(base_name_2);
247     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
248 
249     generate_text_and_compressed_dump(text_file, compressed_file, fields, "maxfiles 2", 2);
250 
251     TearDown();
252 
253     ASSERT_FILE_NOT_EXISTS(text_file_0);
254     ASSERT_FILE_EXISTS(text_file_1);
255     ASSERT_FILE_EXISTS(text_file_2);
256     ASSERT_FILE_NOT_EXISTS(compressed_file_0);
257     ASSERT_FILE_EXISTS(compressed_file_1);
258     ASSERT_FILE_EXISTS(compressed_file_2);
259 
260     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
261     auto converted_file_2 = convert_compressed_to_text(compressed_file_2);
262 
263     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
264     ASSERT_THAT(converted_file_2, Eq(converted_dump_filename(base_name_2)));
265     ASSERT_FILE_EXISTS(converted_file_1);
266     ASSERT_FILE_EXISTS(converted_file_2);
267     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
268     ASSERT_FILE_EQUAL(text_file_2, converted_file_2);
269 
270     delete_file(text_file_1);
271     delete_file(text_file_2);
272     delete_file(compressed_file_1);
273     delete_file(compressed_file_2);
274     delete_file(converted_file_1);
275     delete_file(converted_file_2);
276 }
277 
TEST_F(DumpCustomCompressTest,compressed_modify_bad_param)278 TEST_F(DumpCustomCompressTest, compressed_modify_bad_param)
279 {
280     if (compression_style != "custom/gz") GTEST_SKIP();
281 
282     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
283     command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
284                         compressed_dump_filename("modify_bad_param_run0_*.melt.custom"), fields));
285 
286     TEST_FAILURE(
287         ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
288         command("dump_modify id1 compression_level 12"););
289 }
290 
TEST_F(DumpCustomCompressTest,compressed_modify_multi_bad_param)291 TEST_F(DumpCustomCompressTest, compressed_modify_multi_bad_param)
292 {
293     if (compression_style != "custom/gz") GTEST_SKIP();
294 
295     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
296     command(fmt::format("dump id1 all {} 1 {} {}", compression_style,
297                         compressed_dump_filename("modify_multi_bad_param_run0_*.melt.custom"),
298                         fields));
299 
300     TEST_FAILURE(
301         ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
302         command("dump_modify id1 pad 3 compression_level 12"););
303 }
304 
TEST_F(DumpCustomCompressTest,compressed_modify_clevel_run0)305 TEST_F(DumpCustomCompressTest, compressed_modify_clevel_run0)
306 {
307     if (!COMPRESS_BINARY) GTEST_SKIP();
308 
309     auto base_name       = "modify_clevel_run0.melt.custom";
310     auto text_file       = text_dump_filename(base_name);
311     auto compressed_file = compressed_dump_filename(base_name);
312 
313     auto fields = "id type proc x y z ix iy iz xs ys zs xu yu zu xsu ysu zsu vx vy vz fx fy fz";
314     generate_text_and_compressed_dump(text_file, compressed_file, fields, fields, "",
315                                       "compression_level 3", 0);
316 
317     TearDown();
318 
319     ASSERT_FILE_EXISTS(text_file);
320     ASSERT_FILE_EXISTS(compressed_file);
321 
322     auto converted_file = convert_compressed_to_text(compressed_file);
323 
324     ASSERT_THAT(converted_file, Eq(converted_dump_filename(base_name)));
325     ASSERT_FILE_EXISTS(converted_file);
326     ASSERT_FILE_EQUAL(text_file, converted_file);
327     delete_file(text_file);
328     delete_file(compressed_file);
329     delete_file(converted_file);
330 }
331