@@ -286,21 +286,32 @@ struct TestCacheConfig {
286
286
size_t dirent_lookup_cache_size;
287
287
};
288
288
289
- #define ASSERT_ARCHIVE_EQUIVALENT (REF_ARCHIVE, TEST_ARCHIVE ) \
290
- for (auto ref_entry:REF_ARCHIVE.iterEfficient()) { \
291
- auto test_entry = TEST_ARCHIVE.getEntryByPath (ref_entry.getPath ()); \
292
- EXPECT_EQ (ref_entry.getPath (), test_entry.getPath ()); \
293
- EXPECT_EQ (ref_entry.getTitle (), test_entry.getTitle ()); \
294
- EXPECT_EQ (ref_entry.isRedirect (), test_entry.isRedirect ()); \
295
- if (ref_entry.isRedirect ()) { \
296
- EXPECT_EQ (ref_entry.getRedirectEntryIndex (), test_entry.getRedirectEntryIndex ()); \
297
- } else { \
298
- auto ref_item = ref_entry.getItem (); \
299
- auto test_item = test_entry.getItem (); \
300
- EXPECT_EQ (ref_item.getClusterIndex (), test_item.getClusterIndex ()); \
301
- EXPECT_EQ (ref_item.getBlobIndex (), test_item.getBlobIndex ()); \
302
- EXPECT_EQ (ref_item.getData (), test_item.getData ()); \
303
- } \
289
+
290
+ #define ASSERT_ARCHIVE_EQUIVALENT (REF_ARCHIVE, TEST_ARCHIVE ) \
291
+ ASSERT_ARCHIVE_EQUIVALENT_LIMIT (REF_ARCHIVE, TEST_ARCHIVE, REF_ARCHIVE.getEntryCount())
292
+
293
+ #define ASSERT_ARCHIVE_EQUIVALENT_LIMIT (REF_ARCHIVE, TEST_ARCHIVE, LIMIT ) \
294
+ { \
295
+ auto range = REF_ARCHIVE.iterEfficient (); \
296
+ auto ref_it = range.begin (); \
297
+ ASSERT_ARCHIVE_EQUIVALENT_IT_LIMIT (ref_it, range.end (), TEST_ARCHIVE, LIMIT) \
298
+ }
299
+
300
+
301
+ #define ASSERT_ARCHIVE_EQUIVALENT_IT_LIMIT (REF_IT, REF_END, TEST_ARCHIVE, LIMIT ) \
302
+ for (auto i = 0U ; i<LIMIT && REF_IT != REF_END; i++, REF_IT++) { \
303
+ auto test_entry = TEST_ARCHIVE.getEntryByPath (REF_IT->getPath ()); \
304
+ ASSERT_EQ (REF_IT->getPath (), test_entry.getPath ()); \
305
+ ASSERT_EQ (REF_IT->getTitle (), test_entry.getTitle ()); \
306
+ ASSERT_EQ (REF_IT->isRedirect (), test_entry.isRedirect ()); \
307
+ if (REF_IT->isRedirect ()) { \
308
+ ASSERT_EQ (REF_IT->getRedirectEntryIndex (), test_entry.getRedirectEntryIndex ()); \
309
+ } \
310
+ auto ref_item = REF_IT->getItem (true ); \
311
+ auto test_item = test_entry.getItem (true ); \
312
+ ASSERT_EQ (ref_item.getClusterIndex (), test_item.getClusterIndex ()); \
313
+ ASSERT_EQ (ref_item.getBlobIndex (), test_item.getBlobIndex ()); \
314
+ ASSERT_EQ (ref_item.getData (), test_item.getData ()); \
304
315
}
305
316
306
317
TEST (ZimArchive, cacheDontImpactReading)
@@ -337,6 +348,56 @@ TEST(ZimArchive, cacheDontImpactReading)
337
348
}
338
349
}
339
350
351
+
352
+ TEST (ZimArchive, cacheChange)
353
+ {
354
+ for (auto & testfile: getDataFilePath (" wikibooks_be_all_nopic_2017-02.zim" )) {
355
+ auto ref_archive = zim::Archive (testfile.path );
356
+ auto archive = zim::Archive (testfile.path );
357
+
358
+ archive.set_dirent_cache_max_size (30 );
359
+ archive.set_cluster_cache_max_size (5 );
360
+
361
+ auto range = ref_archive.iterEfficient ();
362
+ auto ref_it = range.begin ();
363
+ ASSERT_ARCHIVE_EQUIVALENT_IT_LIMIT (ref_it, range.end (), archive, 50 )
364
+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 30 );
365
+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 2 ); // Only 2 clusters in the file
366
+
367
+ // Reduce cache size
368
+ archive.set_dirent_cache_max_size (10 );
369
+ archive.set_cluster_cache_max_size (1 );
370
+
371
+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 10 );
372
+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 1 );
373
+
374
+ // We want to test change of cache while we are iterating on the archive.
375
+ // So we don't reset the ref_it to `range.begin()`.
376
+ ASSERT_ARCHIVE_EQUIVALENT_IT_LIMIT (ref_it, range.end (), archive, 50 )
377
+
378
+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 10 );
379
+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 1 );
380
+
381
+ // Clean cache
382
+ // (More than testing the value, this is needed as we want to be sure the cache is actually populated later)
383
+ archive.set_dirent_cache_max_size (0 );
384
+ archive.set_cluster_cache_max_size (0 );
385
+
386
+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 0 );
387
+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 0 );
388
+
389
+ // Increase the cache
390
+ archive.set_dirent_cache_max_size (20 );
391
+ archive.set_cluster_cache_max_size (1 );
392
+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 0 );
393
+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 0 );
394
+
395
+ ASSERT_ARCHIVE_EQUIVALENT (ref_archive, archive)
396
+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 20 );
397
+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 1 );
398
+ }
399
+ }
400
+
340
401
TEST (ZimArchive, openDontFallbackOnNonSplitZimArchive)
341
402
{
342
403
const char * fname = " wikibooks_be_all_nopic_2017-02.zim" ;
0 commit comments