Blame test/testthreadexecutor.cpp

Packit 2035a7
/*
Packit 2035a7
 * Cppcheck - A tool for static C/C++ code analysis
Packit 2035a7
 * Copyright (C) 2007-2017 Cppcheck team.
Packit 2035a7
 *
Packit 2035a7
 * This program is free software: you can redistribute it and/or modify
Packit 2035a7
 * it under the terms of the GNU General Public License as published by
Packit 2035a7
 * the Free Software Foundation, either version 3 of the License, or
Packit 2035a7
 * (at your option) any later version.
Packit 2035a7
 *
Packit 2035a7
 * This program is distributed in the hope that it will be useful,
Packit 2035a7
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 2035a7
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 2035a7
 * GNU General Public License for more details.
Packit 2035a7
 *
Packit 2035a7
 * You should have received a copy of the GNU General Public License
Packit 2035a7
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 2035a7
 */
Packit 2035a7
Packit 2035a7
#include "settings.h"
Packit 2035a7
#include "testsuite.h"
Packit 2035a7
#include "threadexecutor.h"
Packit 2035a7
Packit 2035a7
#include <cstddef>
Packit 2035a7
#include <map>
Packit 2035a7
#include <ostream>
Packit 2035a7
#include <string>
Packit 2035a7
#include <utility>
Packit 2035a7
Packit 2035a7
class TestThreadExecutor : public TestFixture {
Packit 2035a7
public:
Packit 2035a7
    TestThreadExecutor() : TestFixture("TestThreadExecutor") {
Packit 2035a7
    }
Packit 2035a7
Packit 2035a7
private:
Packit 2035a7
    Settings settings;
Packit 2035a7
Packit 2035a7
    /**
Packit 2035a7
     * Execute check using n jobs for y files which are have
Packit 2035a7
     * identical data, given within data.
Packit 2035a7
     */
Packit 2035a7
    void check(unsigned int jobs, int files, int result, const std::string &data) {
Packit 2035a7
        errout.str("");
Packit 2035a7
        output.str("");
Packit 2035a7
        if (!ThreadExecutor::isEnabled()) {
Packit 2035a7
            // Skip this check on systems which don't use this feature
Packit 2035a7
            return;
Packit 2035a7
        }
Packit 2035a7
Packit 2035a7
        std::map<std::string, std::size_t> filemap;
Packit 2035a7
        for (int i = 1; i <= files; ++i) {
Packit 2035a7
            std::ostringstream oss;
Packit 2035a7
            oss << "file_" << i << ".cpp";
Packit 2035a7
            filemap[oss.str()] = 1;
Packit 2035a7
        }
Packit 2035a7
Packit 2035a7
        settings.jobs = jobs;
Packit 2035a7
        ThreadExecutor executor(filemap, settings, *this);
Packit 2035a7
        for (std::map<std::string, std::size_t>::const_iterator i = filemap.begin(); i != filemap.end(); ++i)
Packit 2035a7
            executor.addFileContent(i->first, data);
Packit 2035a7
Packit 2035a7
        ASSERT_EQUALS(result, executor.check());
Packit 2035a7
    }
Packit 2035a7
Packit 2035a7
    void run() {
Packit 2035a7
        LOAD_LIB_2(settings.library, "std.cfg");
Packit 2035a7
Packit 2035a7
        TEST_CASE(deadlock_with_many_errors);
Packit 2035a7
        TEST_CASE(many_threads);
Packit 2035a7
        TEST_CASE(no_errors_more_files);
Packit 2035a7
        TEST_CASE(no_errors_less_files);
Packit 2035a7
        TEST_CASE(no_errors_equal_amount_files);
Packit 2035a7
        TEST_CASE(one_error_less_files);
Packit 2035a7
        TEST_CASE(one_error_several_files);
Packit 2035a7
    }
Packit 2035a7
Packit 2035a7
    void deadlock_with_many_errors() {
Packit 2035a7
        std::ostringstream oss;
Packit 2035a7
        oss << "int main()\n"
Packit 2035a7
            << "{\n";
Packit 2035a7
        for (int i = 0; i < 500; i++)
Packit 2035a7
            oss << "  {char *a = malloc(10);}\n";
Packit 2035a7
Packit 2035a7
        oss << "  return 0;\n"
Packit 2035a7
            << "}\n";
Packit 2035a7
        check(2, 3, 3, oss.str());
Packit 2035a7
    }
Packit 2035a7
Packit 2035a7
    void many_threads() {
Packit 2035a7
        check(16, 100, 100,
Packit 2035a7
              "int main()\n"
Packit 2035a7
              "{\n"
Packit 2035a7
              "  char *a = malloc(10);\n"
Packit 2035a7
              "  return 0;\n"
Packit 2035a7
              "}");
Packit 2035a7
    }
Packit 2035a7
Packit 2035a7
    void no_errors_more_files() {
Packit 2035a7
        check(2, 3, 0,
Packit 2035a7
              "int main()\n"
Packit 2035a7
              "{\n"
Packit 2035a7
              "  return 0;\n"
Packit 2035a7
              "}");
Packit 2035a7
    }
Packit 2035a7
Packit 2035a7
    void no_errors_less_files() {
Packit 2035a7
        check(2, 1, 0,
Packit 2035a7
              "int main()\n"
Packit 2035a7
              "{\n"
Packit 2035a7
              "  return 0;\n"
Packit 2035a7
              "}");
Packit 2035a7
    }
Packit 2035a7
Packit 2035a7
    void no_errors_equal_amount_files() {
Packit 2035a7
        check(2, 2, 0,
Packit 2035a7
              "int main()\n"
Packit 2035a7
              "{\n"
Packit 2035a7
              "  return 0;\n"
Packit 2035a7
              "}");
Packit 2035a7
    }
Packit 2035a7
Packit 2035a7
    void one_error_less_files() {
Packit 2035a7
        check(2, 1, 1,
Packit 2035a7
              "int main()\n"
Packit 2035a7
              "{\n"
Packit 2035a7
              "  {char *a = malloc(10);}\n"
Packit 2035a7
              "  return 0;\n"
Packit 2035a7
              "}");
Packit 2035a7
    }
Packit 2035a7
Packit 2035a7
    void one_error_several_files() {
Packit 2035a7
        check(2, 20, 20,
Packit 2035a7
              "int main()\n"
Packit 2035a7
              "{\n"
Packit 2035a7
              "  {char *a = malloc(10);}\n"
Packit 2035a7
              "  return 0;\n"
Packit 2035a7
              "}");
Packit 2035a7
    }
Packit 2035a7
};
Packit 2035a7
Packit 2035a7
REGISTER_TEST(TestThreadExecutor)