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