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 DumpXYZCompressTest : public CompressedDumpTest {
26 public:
DumpXYZCompressTest()27     DumpXYZCompressTest() : CompressedDumpTest("xyz") {}
28 };
29 
TEST_F(DumpXYZCompressTest,compressed_run0)30 TEST_F(DumpXYZCompressTest, compressed_run0)
31 {
32     if (!COMPRESS_BINARY) GTEST_SKIP();
33 
34     auto base_name         = "run*.melt.xyz";
35     auto base_name_0       = "run0.melt.xyz";
36     auto text_files        = text_dump_filename(base_name);
37     auto compressed_files  = compressed_dump_filename(base_name);
38     auto text_file_0       = text_dump_filename(base_name_0);
39     auto compressed_file_0 = compressed_dump_filename(base_name_0);
40 
41     if (compression_style == "xyz/zstd") {
42         generate_text_and_compressed_dump(text_files, compressed_files, "", "", "", "checksum yes",
43                                           0);
44     } else {
45         generate_text_and_compressed_dump(text_files, compressed_files, "", "", 0);
46     }
47 
48     TearDown();
49 
50     ASSERT_FILE_EXISTS(text_file_0);
51     ASSERT_FILE_EXISTS(compressed_file_0);
52 
53     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
54 
55     ASSERT_FILE_EXISTS(converted_file_0);
56     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
57     delete_file(text_file_0);
58     delete_file(compressed_file_0);
59     delete_file(converted_file_0);
60 }
61 
TEST_F(DumpXYZCompressTest,compressed_no_buffer_run0)62 TEST_F(DumpXYZCompressTest, compressed_no_buffer_run0)
63 {
64     if (!COMPRESS_BINARY) GTEST_SKIP();
65 
66     auto base_name         = "no_buffer_run*.melt.xyz";
67     auto base_name_0       = "no_buffer_run0.melt.xyz";
68     auto text_files        = text_dump_filename(base_name);
69     auto compressed_files  = compressed_dump_filename(base_name);
70     auto text_file_0       = text_dump_filename(base_name_0);
71     auto compressed_file_0 = compressed_dump_filename(base_name_0);
72 
73     if (compression_style == "xyz/zstd") {
74         generate_text_and_compressed_dump(text_files, compressed_files, "", "", "buffer no",
75                                           "buffer no", 0);
76     } else {
77         generate_text_and_compressed_dump(text_files, compressed_files, "", "buffer no", 0);
78     }
79 
80     TearDown();
81 
82     ASSERT_FILE_EXISTS(text_file_0);
83     ASSERT_FILE_EXISTS(compressed_file_0);
84 
85     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
86 
87     ASSERT_FILE_EXISTS(converted_file_0);
88     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
89     delete_file(text_file_0);
90     delete_file(compressed_file_0);
91     delete_file(converted_file_0);
92 }
93 
TEST_F(DumpXYZCompressTest,compressed_multi_file_run1)94 TEST_F(DumpXYZCompressTest, compressed_multi_file_run1)
95 {
96     if (!COMPRESS_BINARY) GTEST_SKIP();
97 
98     auto base_name         = "multi_file_run1_*.melt.xyz";
99     auto base_name_0       = "multi_file_run1_0.melt.xyz";
100     auto base_name_1       = "multi_file_run1_1.melt.xyz";
101     auto text_file         = text_dump_filename(base_name);
102     auto text_file_0       = text_dump_filename(base_name_0);
103     auto text_file_1       = text_dump_filename(base_name_1);
104     auto compressed_file   = compressed_dump_filename(base_name);
105     auto compressed_file_0 = compressed_dump_filename(base_name_0);
106     auto compressed_file_1 = compressed_dump_filename(base_name_1);
107 
108     if (compression_style == "xyz/zstd") {
109         generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "checksum no", 1);
110     } else {
111         generate_text_and_compressed_dump(text_file, compressed_file, "", "", 1);
112     }
113 
114     TearDown();
115 
116     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
117     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
118 
119     ASSERT_THAT(converted_file_0, Eq(converted_dump_filename(base_name_0)));
120     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
121     ASSERT_FILE_EXISTS(converted_file_0);
122     ASSERT_FILE_EXISTS(converted_file_1);
123     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
124     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
125 
126     delete_file(text_file_0);
127     delete_file(text_file_1);
128     delete_file(compressed_file_0);
129     delete_file(compressed_file_1);
130     delete_file(converted_file_0);
131     delete_file(converted_file_1);
132 }
133 
TEST_F(DumpXYZCompressTest,compressed_multi_file_with_pad_run1)134 TEST_F(DumpXYZCompressTest, compressed_multi_file_with_pad_run1)
135 {
136     if (!COMPRESS_BINARY) GTEST_SKIP();
137 
138     auto base_name         = "multi_file_pad_run1_*.melt.xyz";
139     auto base_name_0       = "multi_file_pad_run1_000.melt.xyz";
140     auto base_name_1       = "multi_file_pad_run1_001.melt.xyz";
141     auto text_file         = text_dump_filename(base_name);
142     auto text_file_0       = text_dump_filename(base_name_0);
143     auto text_file_1       = text_dump_filename(base_name_1);
144     auto compressed_file   = compressed_dump_filename(base_name);
145     auto compressed_file_0 = compressed_dump_filename(base_name_0);
146     auto compressed_file_1 = compressed_dump_filename(base_name_1);
147 
148     generate_text_and_compressed_dump(text_file, compressed_file, "", "pad 3", 1);
149 
150     TearDown();
151 
152     ASSERT_FILE_EXISTS(text_file_0);
153     ASSERT_FILE_EXISTS(text_file_1);
154     ASSERT_FILE_EXISTS(compressed_file_0);
155     ASSERT_FILE_EXISTS(compressed_file_1);
156 
157     auto converted_file_0 = convert_compressed_to_text(compressed_file_0);
158     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
159 
160     ASSERT_THAT(converted_file_0, Eq(converted_dump_filename(base_name_0)));
161     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
162     ASSERT_FILE_EXISTS(converted_file_0);
163     ASSERT_FILE_EXISTS(converted_file_1);
164     ASSERT_FILE_EQUAL(text_file_0, converted_file_0);
165     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
166 
167     delete_file(text_file_0);
168     delete_file(text_file_1);
169     delete_file(compressed_file_0);
170     delete_file(compressed_file_1);
171     delete_file(converted_file_0);
172     delete_file(converted_file_1);
173 }
174 
TEST_F(DumpXYZCompressTest,compressed_multi_file_with_maxfiles_run1)175 TEST_F(DumpXYZCompressTest, compressed_multi_file_with_maxfiles_run1)
176 {
177     if (!COMPRESS_BINARY) GTEST_SKIP();
178 
179     auto base_name         = "multi_file_maxfiles_run1_*.melt.xyz";
180     auto base_name_0       = "multi_file_maxfiles_run1_0.melt.xyz";
181     auto base_name_1       = "multi_file_maxfiles_run1_1.melt.xyz";
182     auto base_name_2       = "multi_file_maxfiles_run1_2.melt.xyz";
183     auto text_file         = text_dump_filename(base_name);
184     auto text_file_0       = text_dump_filename(base_name_0);
185     auto text_file_1       = text_dump_filename(base_name_1);
186     auto text_file_2       = text_dump_filename(base_name_2);
187     auto compressed_file   = compressed_dump_filename(base_name);
188     auto compressed_file_0 = compressed_dump_filename(base_name_0);
189     auto compressed_file_1 = compressed_dump_filename(base_name_1);
190     auto compressed_file_2 = compressed_dump_filename(base_name_2);
191 
192     generate_text_and_compressed_dump(text_file, compressed_file, "", "maxfiles 2", 2);
193 
194     TearDown();
195 
196     ASSERT_FILE_NOT_EXISTS(text_file_0);
197     ASSERT_FILE_EXISTS(text_file_1);
198     ASSERT_FILE_EXISTS(text_file_2);
199     ASSERT_FILE_NOT_EXISTS(compressed_file_0);
200     ASSERT_FILE_EXISTS(compressed_file_1);
201     ASSERT_FILE_EXISTS(compressed_file_2);
202 
203     auto converted_file_1 = convert_compressed_to_text(compressed_file_1);
204     auto converted_file_2 = convert_compressed_to_text(compressed_file_2);
205 
206     ASSERT_THAT(converted_file_1, Eq(converted_dump_filename(base_name_1)));
207     ASSERT_THAT(converted_file_2, Eq(converted_dump_filename(base_name_2)));
208     ASSERT_FILE_EXISTS(converted_file_1);
209     ASSERT_FILE_EXISTS(converted_file_2);
210     ASSERT_FILE_EQUAL(text_file_1, converted_file_1);
211     ASSERT_FILE_EQUAL(text_file_2, converted_file_2);
212 
213     delete_file(text_file_1);
214     delete_file(text_file_2);
215     delete_file(compressed_file_1);
216     delete_file(compressed_file_2);
217     delete_file(converted_file_1);
218     delete_file(converted_file_2);
219 }
220 
TEST_F(DumpXYZCompressTest,compressed_modify_bad_param)221 TEST_F(DumpXYZCompressTest, compressed_modify_bad_param)
222 {
223     if (compression_style != "xyz/gz") GTEST_SKIP();
224 
225     BEGIN_HIDE_OUTPUT();
226     command(fmt::format("dump id1 all {} 1 {}", compression_style,
227                         compressed_dump_filename("modify_bad_param_run0_*.melt.xyz")));
228     END_HIDE_OUTPUT();
229 
230     TEST_FAILURE(
231         ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
232         command("dump_modify id1 compression_level 12"););
233 }
234 
TEST_F(DumpXYZCompressTest,compressed_modify_multi_bad_param)235 TEST_F(DumpXYZCompressTest, compressed_modify_multi_bad_param)
236 {
237     if (compression_style != "xyz/gz") GTEST_SKIP();
238 
239     BEGIN_HIDE_OUTPUT();
240     command(fmt::format("dump id1 all {} 1 {}", compression_style,
241                         compressed_dump_filename("modify_multi_bad_param_run0_*.melt.xyz")));
242     END_HIDE_OUTPUT();
243 
244     TEST_FAILURE(
245         ".*ERROR on proc 0: Illegal dump_modify command: Compression level must in the range of.*",
246         command("dump_modify id1 pad 3 compression_level 12"););
247 }
248 
TEST_F(DumpXYZCompressTest,compressed_modify_clevel_run0)249 TEST_F(DumpXYZCompressTest, compressed_modify_clevel_run0)
250 {
251     if (!COMPRESS_BINARY) GTEST_SKIP();
252 
253     auto base_name       = "modify_clevel_run0.melt.xyz";
254     auto text_file       = text_dump_filename(base_name);
255     auto compressed_file = compressed_dump_filename(base_name);
256 
257     generate_text_and_compressed_dump(text_file, compressed_file, "", "", "", "compression_level 3",
258                                       0);
259 
260     TearDown();
261 
262     ASSERT_FILE_EXISTS(text_file);
263     ASSERT_FILE_EXISTS(compressed_file);
264 
265     auto converted_file = convert_compressed_to_text(compressed_file);
266 
267     ASSERT_THAT(converted_file, Eq(converted_dump_filename(base_name)));
268     ASSERT_FILE_EXISTS(converted_file);
269     ASSERT_FILE_EQUAL(text_file, converted_file);
270     delete_file(text_file);
271     delete_file(compressed_file);
272     delete_file(converted_file);
273 }
274