@@ -286,21 +286,32 @@ struct TestCacheConfig {
286286 size_t dirent_lookup_cache_size;
287287};
288288
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 ()); \
304315 }
305316
306317TEST (ZimArchive, cacheDontImpactReading)
@@ -337,6 +348,54 @@ TEST(ZimArchive, cacheDontImpactReading)
337348 }
338349}
339350
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+ ASSERT_ARCHIVE_EQUIVALENT_IT_LIMIT (ref_it, range.end (), archive, 50 )
375+
376+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 10 );
377+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 1 );
378+
379+ // Clean cache
380+ // (More than testing the value, this is needed as we want to be sure the cache is actually populated later)
381+ archive.set_dirent_cache_max_size (0 );
382+ archive.set_cluster_cache_max_size (0 );
383+
384+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 0 );
385+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 0 );
386+
387+ // Increase the cache
388+ archive.set_dirent_cache_max_size (20 );
389+ archive.set_cluster_cache_max_size (1 );
390+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 0 );
391+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 0 );
392+
393+ ASSERT_ARCHIVE_EQUIVALENT (ref_archive, archive)
394+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 20 );
395+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 1 );
396+ }
397+ }
398+
340399TEST (ZimArchive, openDontFallbackOnNonSplitZimArchive)
341400{
342401 const char * fname = " wikibooks_be_all_nopic_2017-02.zim" ;
0 commit comments