From c3ea4f42f0cf196ce6c621b94c61cb5c86d3af7c Mon Sep 17 00:00:00 2001 From: Martchus Date: Tue, 27 Feb 2024 01:55:59 +0100 Subject: [PATCH] Add stress test for package updater This test passes, supposedly the package updater is *not* what's causing sporatic problems with indexes being messed up. --- libpkg/data/database.cpp | 2 +- libpkg/data/database.h | 2 +- libpkg/tests/data.cpp | 46 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/libpkg/data/database.cpp b/libpkg/data/database.cpp index ccefcda..c6507fe 100644 --- a/libpkg/data/database.cpp +++ b/libpkg/data/database.cpp @@ -321,7 +321,7 @@ void Database::allPackages(const PackageVisitorMove &visitor) } } -void Database::allPackages(const PackageVisitorBase &visitor) +void Database::allPackagesBase(const PackageVisitorBase &visitor) { auto txn = m_storage->packages.getROTransaction(); for (auto i = txn.begin(); i != txn.end(); ++i) { diff --git a/libpkg/data/database.h b/libpkg/data/database.h index 6f662ab..bf48d49 100644 --- a/libpkg/data/database.h +++ b/libpkg/data/database.h @@ -173,7 +173,7 @@ struct LIBPKG_EXPORT Database : public ReflectiveRapidJSON::JsonSerializable> findPackages(const std::function &pred); void allPackages(const PackageVisitorMove &visitor); - void allPackages(const PackageVisitorBase &visitor); + void allPackagesBase(const PackageVisitorBase &visitor); void allPackagesByName(const PackageVisitorByName &visitor); void allPackagesByName(const PackageVisitorByNameBase &visitor); std::size_t packageCount() const; diff --git a/libpkg/tests/data.cpp b/libpkg/tests/data.cpp index 8598ed0..efec132 100644 --- a/libpkg/tests/data.cpp +++ b/libpkg/tests/data.cpp @@ -1,5 +1,8 @@ #include "../data/config.h" +#include "resources/config.h" + +#include #include #include #include @@ -37,6 +40,7 @@ class DataTests : public TestFixture { CPPUNIT_TEST(testAddingDepsAndProvidesFromOtherPackage); CPPUNIT_TEST(testDependencyExport); CPPUNIT_TEST(testPackageUpdater); + CPPUNIT_TEST(stresstestPackageUpdater); CPPUNIT_TEST(testMisc); CPPUNIT_TEST_SUITE_END(); @@ -61,6 +65,7 @@ public: void testAddingDepsAndProvidesFromOtherPackage(); void testDependencyExport(); void testPackageUpdater(); + void stresstestPackageUpdater(); void testMisc(); private: @@ -567,6 +572,47 @@ void DataTests::testPackageUpdater() CPPUNIT_ASSERT_EQUAL("zlib"s, newPkg->name); } +void DataTests::stresstestPackageUpdater() +{ + if (!CppUtilities::isEnvVariableSet(PROJECT_VARNAME_UPPER "_ENABLE_STRESS_TESTS").value_or(false)) { + return; + } + m_dbFile = workingCopyPath("stresstest-data.db", WorkingCopyMode::Cleanup); + m_config.initStorage(m_dbFile.data()); + + auto dbFile = testFilePath("stresstest/ownstuff-protected.files.tar.xz"); + auto dbFileOld = testFilePath("stresstest/ownstuff-protected.files.tar.xz.old"); + auto *const db = m_config.findOrCreateDatabase("ownstuff-protected"sv, "x86_64"sv); + auto basePackageFromIndex = PackageBase(); + + constexpr auto iterations = 1000; + for (auto i = 0; i != iterations; ++i) { + if (i % (iterations / 100) == 0) { + std::cerr << "\rRunning stress test: " << (i * 100 / iterations) << " %"; + } + + auto updater = LibPkg::PackageUpdater(*db, true); + updater.insertFromDatabaseFile(i % 2 == 0 ? dbFileOld : dbFile); + updater.commit(); + CPPUNIT_ASSERT_MESSAGE("packages present", db->packageCount() > 0); + + db->allPackagesBase([db, &basePackageFromIndex](StorageID packageID, std::shared_ptr &&basePackage) { + CPPUNIT_ASSERT_MESSAGE("package ID valid", packageID); + CPPUNIT_ASSERT_MESSAGE("base package returned", basePackage); + CPPUNIT_ASSERT_MESSAGE("name assigned", !basePackage->name.empty()); + CPPUNIT_ASSERT_MESSAGE("version assigned", !basePackage->version.empty()); + basePackageFromIndex.clear(); + + const auto packageIDViaIndex = db->findBasePackageWithID(basePackage->name, basePackageFromIndex); + CPPUNIT_ASSERT_MESSAGE("package ID via index valid", packageIDViaIndex); + CPPUNIT_ASSERT_EQUAL_MESSAGE("index valid, ID matches", packageID, packageIDViaIndex); + CPPUNIT_ASSERT_EQUAL_MESSAGE("index valid, name matches", basePackage->name, basePackageFromIndex.name); + return false; + }); + } + std::cerr << "Running stress test: done\n"; +} + void DataTests::testMisc() { CPPUNIT_ASSERT_EQUAL("123.4"s, PackageVersion::trimPackageVersion("123.4"s));