~aleteoryx/muditaos

948e926bff96de0e3cbc9e36494fb09cc65b7fce — Alek Rudnik 4 years ago 8cfc550
[EGD-7243] Fix seg fault on db initializer test case

Seg was found when running test on bench.
Moreover the test was actually not working.
1 files changed, 59 insertions(+), 25 deletions(-)

M module-db/tests/test-initializer/unittest.cpp
M module-db/tests/test-initializer/unittest.cpp => module-db/tests/test-initializer/unittest.cpp +59 -25
@@ 134,21 134,20 @@ TEST_CASE("Database initialization scripts")
                                      "FOREIGN KEY(album_id) 	REFERENCES albums(_id)"
                                      ");\n";

    const std::string script_insert = "insert or ignore into artists(name) VALUES('%q');\n";
    const std::string script_insert = "insert or ignore into tracks(name) VALUES('ala ma kota');\n";

    const std::string script_comment = "--insert or ignore into artists(name) VALUES('%q');\n"
                                       "insert or ignore into artists(name) VALUES('%q');\n"
                                       "--insert or ignore into artists(name) VALUES('%q');\n"
                                       "insert or ignore into artists(name) VALUES('%q');\n";
    const std::string script_comment = "--insert or ignore into tracks(name) VALUES('ula');\n"
                                       "insert or ignore into tracks(name) VALUES('ala ma kota');\n"
                                       "--insert or ignore into tracks(name) VALUES('basia');\n"
                                       "insert or ignore into tracks(name) VALUES('ala ma kota');\n";

    const std::string script_invalid = "insert artists(name) VALUES('%q');\n";
    const std::string script_invalid = "inserts error(name) VALUES('super');\n";

    SECTION("list files")
    {
        ScopedDir dir("scripts");

        auto file = std::fopen(dir("test_1.sql").c_str(), "w");
        LOG_INFO("test file: %s", dir("test_1.sql").c_str());
        std::fclose(file);

        file = std::fopen(dir("test_021.sql").c_str(), "w");


@@ 157,7 156,7 @@ TEST_CASE("Database initialization scripts")
        file = std::fopen(dir("test_011.sql").c_str(), "w");
        std::fclose(file);

        file = std::fopen(dir("test_003.sql").c_str(), "w");
        file = std::fopen(dir("test_013.sql").c_str(), "w");
        std::fclose(file);

        file = std::fopen(dir("noprefix_003.sql").c_str(), "w");


@@ 169,15 168,33 @@ TEST_CASE("Database initialization scripts")

        REQUIRE(files.size() == 4);
        REQUIRE(files[0] == (std::filesystem::path{"scripts"} / "test_1.sql"));
        REQUIRE(files[1] == (std::filesystem::path{"scripts"} / "test_003.sql"));
        REQUIRE(files[2] == (std::filesystem::path{"scripts"} / "test_011.sql"));
        REQUIRE(files[1] == (std::filesystem::path{"scripts"} / "test_011.sql"));
        REQUIRE(files[2] == (std::filesystem::path{"scripts"} / "test_013.sql"));
        REQUIRE(files[3] == (std::filesystem::path{"scripts"} / "test_021.sql"));
    }

    SECTION("read script files")
    SECTION("execute single valid script")
    {
        ScopedDir dir("execute_valid_script");
        std::string test_file("test_001.sql");

        auto file = std::fopen(dir(test_file).c_str(), "w");
        std::fwrite(script_create.data(), sizeof(char), script_create.size(), file);
        std::fclose(file);

        Database db(dir("test.db").c_str());
        DatabaseInitializer initializer(&db);
        auto commands = initializer.readCommands(dir(test_file));
        REQUIRE(commands.size() == 1);

        bool r = initializer.run(dir());
        REQUIRE(r == true);
    }

    SECTION("execute 2 valid script files")
    {
        ScopedDir dir("scripts");
        std::string test_file("read_script_test_1.sql");
        std::string test_file("test_001.sql");

        auto file = std::fopen(dir(test_file).c_str(), "w");
        std::fwrite(script_create.data(), sizeof(char), script_create.size(), file);


@@ 187,55 204,69 @@ TEST_CASE("Database initialization scripts")
        Database db(dir("test.db").c_str());
        DatabaseInitializer initializer(&db);
        auto commands = initializer.readCommands(dir(test_file));

        REQUIRE(commands.size() == 2);

        bool result = initializer.run(dir());
        REQUIRE(result == true);
    }

    SECTION("read empty script files")
    SECTION("execute multiple valid script files")
    {
        ScopedDir dir("scripts");
        std::string test_file("read_empty_1.sql");
        std::string test_file("test_001.sql");

        auto file = std::fopen(dir(test_file).c_str(), "w");
        std::fwrite(script_create.data(), sizeof(char), script_create.size(), file);
        std::fwrite(script_insert.data(), sizeof(char), script_insert.size(), file);
        std::fwrite(script_insert.data(), sizeof(char), script_insert.size(), file);
        std::fwrite(script_insert.data(), sizeof(char), script_insert.size(), file);
        std::fwrite(script_insert.data(), sizeof(char), script_insert.size(), file);
        std::fwrite(script_insert.data(), sizeof(char), script_insert.size(), file);
        std::fclose(file);

        Database db(dir("test.db").c_str());
        DatabaseInitializer initializer(&db);
        auto commands = initializer.readCommands(dir(test_file));
        REQUIRE(commands.size() == 6);

        REQUIRE(commands.empty());
        bool result = initializer.run(dir());
        REQUIRE(result == true);
    }

    SECTION("read script file with comment")
    SECTION("execute empty script files")
    {
        ScopedDir dir("read_script_file_with_comment");
        ScopedDir dir("scripts");
        std::string test_file("test_001.sql");

        auto file = std::fopen(dir(test_file).c_str(), "w");
        std::fwrite(script_comment.data(), sizeof(char), script_comment.size(), file);
        std::fclose(file);

        Database db(dir("test.db").c_str());
        DatabaseInitializer initializer(&db);
        auto commands = initializer.readCommands(dir(test_file));
        REQUIRE(commands.empty());

        REQUIRE(commands.size() == 2);
        bool result = initializer.run(dir());
        REQUIRE(result == true);
    }

    SECTION("execute valid script")
    SECTION("execute script file with comment")
    {
        ScopedDir dir("execute_valid_script");
        ScopedDir dir("read_script_file_with_comment");
        std::string test_file("test_001.sql");

        auto file = std::fopen(dir(test_file).c_str(), "w");
        std::fwrite(script_create.data(), sizeof(char), script_create.size(), file);
        std::fwrite(script_comment.data(), sizeof(char), script_comment.size(), file);
        std::fclose(file);

        Database db(dir("test.db").c_str());
        DatabaseInitializer initializer(&db);
        bool r = initializer.run(dir());
        auto commands = initializer.readCommands(dir(test_file));
        REQUIRE(commands.size() == 3);

        REQUIRE(r == true);
        bool result = initializer.run(dir());
        REQUIRE(result == true);
    }

    SECTION("execute invalid script")


@@ 244,13 275,16 @@ TEST_CASE("Database initialization scripts")
        std::string test_file("test_001.sql");

        auto file = std::fopen(dir(test_file).c_str(), "w");
        std::fwrite(script_create.data(), sizeof(char), script_create.size(), file);
        std::fwrite(script_invalid.data(), sizeof(char), script_invalid.size(), file);
        std::fclose(file);

        Database db(dir("test.db").c_str());
        DatabaseInitializer initializer(&db);
        bool result = initializer.run(dir());
        auto commands = initializer.readCommands(dir(test_file));
        REQUIRE(commands.size() == 2);

        bool result = initializer.run(dir());
        REQUIRE(result == false);
    }