18
18
#include " ../src/clp/type_utils.hpp"
19
19
#include " ../src/clp_s/archive_constants.hpp"
20
20
#include " ../src/clp_s/ArchiveReader.hpp"
21
+ #include " ../src/clp_s/ArchiveWriter.hpp"
21
22
#include " ../src/clp_s/InputConfig.hpp"
23
+ #include " ../src/clp_s/RangeIndexWriter.hpp"
22
24
#include " clp_s_test_utils.hpp"
23
25
#include " TestOutputCleaner.hpp"
24
26
@@ -39,7 +41,13 @@ void serialize_record(
39
41
clp::ffi::ir_stream::Serializer<clp::ir::eight_byte_encoded_variable_t >& serializer
40
42
);
41
43
void generate_ir ();
42
- void check_archive_metadata (bool from_ir);
44
+ void read_and_check_archive_metadata (bool from_ir);
45
+ void check_archive_metadata_from_stats (
46
+ std::vector<clp_s::ArchiveStats> const & archive_stats,
47
+ bool from_ir
48
+ );
49
+ void
50
+ check_archive_range_index (std::vector<clp_s::RangeIndexEntry> const & range_index, bool from_ir);
43
51
44
52
auto get_test_input_path_relative_to_tests_dir () -> std::filesystem::path {
45
53
return std::filesystem::path{cTestRangeIndexInputFileDirectory} / cTestRangeIndexInputFile;
@@ -116,51 +124,82 @@ void generate_ir() {
116
124
writer.close ();
117
125
}
118
126
119
- void check_archive_metadata (bool from_ir) {
127
+ void read_and_check_archive_metadata (bool from_ir) {
120
128
clp_s::ArchiveReader archive_reader;
121
- auto const expected_input_path{
122
- from_ir ? get_ir_test_input_relative_path () : get_test_input_local_path ()
123
- };
124
129
for (auto const & entry : std::filesystem::directory_iterator (cTestRangeIndexArchiveDirectory)) {
125
130
clp_s::Path archive_path{
126
131
.source {clp_s::InputSource::Filesystem},
127
132
.path {entry.path ().string ()}
128
133
};
129
134
REQUIRE_NOTHROW (archive_reader.open (archive_path, clp_s::NetworkAuthOption{}));
130
135
auto const & range_index = archive_reader.get_range_index ();
131
- REQUIRE (1ULL == range_index.size ());
132
- auto const & range_index_entry = range_index.front ();
133
- REQUIRE (0ULL == range_index_entry.start_index );
134
- REQUIRE (4ULL == range_index_entry.end_index );
135
- auto const & metadata_fields = range_index_entry.fields ;
136
- REQUIRE (metadata_fields.contains (clp_s::constants::range_index::cArchiveCreatorId));
137
- REQUIRE (metadata_fields.at (clp_s::constants::range_index::cArchiveCreatorId).is_string ());
138
- REQUIRE (false
139
- == metadata_fields.at (clp_s::constants::range_index::cArchiveCreatorId)
140
- .template get <std::string>()
141
- .empty ());
142
- REQUIRE (metadata_fields.contains (clp_s::constants::range_index::cFilename));
143
- REQUIRE (metadata_fields.at (clp_s::constants::range_index::cFilename).is_string ());
144
- REQUIRE (expected_input_path
145
- == metadata_fields.at (clp_s::constants::range_index::cFilename)
146
- .template get <std::string>());
147
- REQUIRE (metadata_fields.contains (clp_s::constants::range_index::cFileSplitNumber));
148
- REQUIRE (metadata_fields.at (clp_s::constants::range_index::cFileSplitNumber)
149
- .is_number_integer ());
150
- REQUIRE (0ULL
151
- == metadata_fields.at (clp_s::constants::range_index::cFileSplitNumber)
152
- .template get <size_t >());
153
- if (from_ir) {
154
- REQUIRE (metadata_fields.contains (cTestRangeIndexIRMetadataKey));
155
- REQUIRE (metadata_fields.at (cTestRangeIndexIRMetadataKey).is_string ());
156
- REQUIRE (
157
- cTestRangeIndexIRMetadataValue
158
- == metadata_fields.at (cTestRangeIndexIRMetadataKey).template get <std::string>()
159
- );
160
- }
136
+ check_archive_range_index (range_index, from_ir);
161
137
REQUIRE_NOTHROW (archive_reader.close ());
162
138
}
163
139
}
140
+
141
+ void check_archive_metadata_from_stats (
142
+ std::vector<clp_s::ArchiveStats> const & archive_stats,
143
+ bool from_ir
144
+ ) {
145
+ for (auto const & stats : archive_stats) {
146
+ REQUIRE (stats.metadata .is_array ());
147
+ REQUIRE (1ULL == stats.metadata .size ());
148
+ auto entry = stats.metadata .begin ();
149
+ REQUIRE (entry->is_object ());
150
+ REQUIRE (entry->contains (clp_s::RangeIndexWriter::cStartIndexName));
151
+ REQUIRE (entry->contains (clp_s::RangeIndexWriter::cEndIndexName));
152
+ REQUIRE (entry->contains (clp_s::RangeIndexWriter::cMetadataFieldsName));
153
+ auto start_index = entry->at (clp_s::RangeIndexWriter::cStartIndexName);
154
+ auto end_index = entry->at (clp_s::RangeIndexWriter::cEndIndexName);
155
+ auto metadata_fields = entry->at (clp_s::RangeIndexWriter::cMetadataFieldsName);
156
+ REQUIRE (start_index.is_number_integer ());
157
+ REQUIRE (end_index.is_number_integer ());
158
+ REQUIRE (metadata_fields.is_object ());
159
+ std::vector<clp_s::RangeIndexEntry> range_index{clp_s::RangeIndexEntry{
160
+ start_index.template get <size_t >(),
161
+ end_index.template get <size_t >(),
162
+ std::move (metadata_fields)
163
+ }};
164
+ check_archive_range_index (range_index, from_ir);
165
+ }
166
+ }
167
+
168
+ void
169
+ check_archive_range_index (std::vector<clp_s::RangeIndexEntry> const & range_index, bool from_ir) {
170
+ REQUIRE (1ULL == range_index.size ());
171
+ auto const & range_index_entry = range_index.front ();
172
+ REQUIRE (0ULL == range_index_entry.start_index );
173
+ REQUIRE (4ULL == range_index_entry.end_index );
174
+ auto const & metadata_fields = range_index_entry.fields ;
175
+ REQUIRE (metadata_fields.contains (clp_s::constants::range_index::cArchiveCreatorId));
176
+ REQUIRE (metadata_fields.at (clp_s::constants::range_index::cArchiveCreatorId).is_string ());
177
+ REQUIRE (false
178
+ == metadata_fields.at (clp_s::constants::range_index::cArchiveCreatorId)
179
+ .template get <std::string>()
180
+ .empty ());
181
+ REQUIRE (metadata_fields.contains (clp_s::constants::range_index::cFilename));
182
+ REQUIRE (metadata_fields.at (clp_s::constants::range_index::cFilename).is_string ());
183
+ auto const expected_input_path{
184
+ from_ir ? get_ir_test_input_relative_path () : get_test_input_local_path ()
185
+ };
186
+ REQUIRE (expected_input_path
187
+ == metadata_fields.at (clp_s::constants::range_index::cFilename)
188
+ .template get <std::string>());
189
+ REQUIRE (metadata_fields.contains (clp_s::constants::range_index::cFileSplitNumber));
190
+ REQUIRE (
191
+ metadata_fields.at (clp_s::constants::range_index::cFileSplitNumber).is_number_integer ()
192
+ );
193
+ REQUIRE (0ULL
194
+ == metadata_fields.at (clp_s::constants::range_index::cFileSplitNumber)
195
+ .template get <size_t >());
196
+ if (from_ir) {
197
+ REQUIRE (metadata_fields.contains (cTestRangeIndexIRMetadataKey));
198
+ REQUIRE (metadata_fields.at (cTestRangeIndexIRMetadataKey).is_string ());
199
+ REQUIRE (cTestRangeIndexIRMetadataValue
200
+ == metadata_fields.at (cTestRangeIndexIRMetadataKey).template get <std::string>());
201
+ }
202
+ }
164
203
} // namespace
165
204
166
205
TEST_CASE (" clp-s-range-index" , " [clp-s][range-index]" ) {
@@ -178,12 +217,16 @@ TEST_CASE("clp-s-range-index", "[clp-s][range-index]") {
178
217
input_file = get_ir_test_input_relative_path ();
179
218
input_file_type = clp_s::FileType::KeyValueIr;
180
219
}
181
- REQUIRE_NOTHROW (compress_archive (
182
- input_file,
183
- std::string{cTestRangeIndexArchiveDirectory},
184
- single_file_archive,
185
- false ,
186
- input_file_type
187
- ));
188
- check_archive_metadata (from_ir);
220
+ std::vector<clp_s::ArchiveStats> archive_stats;
221
+ REQUIRE_NOTHROW (
222
+ archive_stats = compress_archive (
223
+ input_file,
224
+ std::string{cTestRangeIndexArchiveDirectory},
225
+ single_file_archive,
226
+ false ,
227
+ input_file_type
228
+ )
229
+ );
230
+ read_and_check_archive_metadata (from_ir);
231
+ check_archive_metadata_from_stats (archive_stats, from_ir);
189
232
}
0 commit comments