@@ -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,55 @@ 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+ std::cout << testfile.path << std::endl;
356+ auto ref_archive = zim::Archive (testfile.path );
357+ auto archive = zim::Archive (testfile.path );
358+
359+ archive.set_dirent_cache_max_size (30 );
360+ archive.set_cluster_cache_max_size (5 );
361+
362+ auto range = ref_archive.iterEfficient ();
363+ auto ref_it = range.begin ();
364+ ASSERT_ARCHIVE_EQUIVALENT_IT_LIMIT (ref_it, range.end (), archive, 50 )
365+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 30 );
366+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 2 ); // Only 2 clusters in the file
367+
368+ // Reduce cache size
369+ archive.set_dirent_cache_max_size (10 );
370+ archive.set_cluster_cache_max_size (1 );
371+
372+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 10 );
373+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 1 );
374+
375+ ASSERT_ARCHIVE_EQUIVALENT_IT_LIMIT (ref_it, range.end (), archive, 50 )
376+
377+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 10 );
378+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 1 );
379+
380+ // Clean cache
381+ // (More than testing the value, this is needed as we want to be sure the cache is actually populated later)
382+ archive.set_dirent_cache_max_size (0 );
383+ archive.set_cluster_cache_max_size (0 );
384+
385+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 0 );
386+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 0 );
387+
388+ // Increase the cache
389+ archive.set_dirent_cache_max_size (20 );
390+ archive.set_cluster_cache_max_size (1 );
391+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 0 );
392+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 0 );
393+
394+ ASSERT_ARCHIVE_EQUIVALENT (ref_archive, archive)
395+ EXPECT_EQ (archive.get_dirent_cache_current_size (), 20 );
396+ EXPECT_EQ (archive.get_cluster_cache_current_size (), 1 );
397+ }
398+ }
399+
340400TEST (ZimArchive, openDontFallbackOnNonSplitZimArchive)
341401{
342402 const char * fname = " wikibooks_be_all_nopic_2017-02.zim" ;
0 commit comments