aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2020-06-13 19:14:05 +0200
committerMarco Bubke <marco.bubke@qt.io>2020-06-30 09:52:50 +0000
commit32e181f5ce8795c73302d7b59713ca51bc7b1802 (patch)
tree611eb2de62b2299a399cd9eda012da25caf1ae29 /tests
parentc924a45fb23b711f810b9f71416c9de0cdf7fb8a (diff)
ClangRefactoring: Remove not used pch files
Because we use UUID for pch files every time we rebuild a pch we get a new file. This patch is collecting and removing this pch files. Change-Id: Ia8688e7215ee7b41f39b2285323eaa345056bda3 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'tests')
-rw-r--r--tests/unit/unittest/mockfilesystem.h1
-rw-r--r--tests/unit/unittest/mockprecompiledheaderstorage.h1
-rw-r--r--tests/unit/unittest/mocksqlitereadstatement.cpp6
-rw-r--r--tests/unit/unittest/mocksqlitereadstatement.h5
-rw-r--r--tests/unit/unittest/pchtaskqueue-test.cpp112
-rw-r--r--tests/unit/unittest/precompiledheaderstorage-test.cpp41
-rw-r--r--tests/unit/unittest/unittest.pro2
7 files changed, 166 insertions, 2 deletions
diff --git a/tests/unit/unittest/mockfilesystem.h b/tests/unit/unittest/mockfilesystem.h
index 688edbcae5..fff5758cc6 100644
--- a/tests/unit/unittest/mockfilesystem.h
+++ b/tests/unit/unittest/mockfilesystem.h
@@ -34,4 +34,5 @@ class MockFileSystem : public ClangBackEnd::FileSystemInterface
public:
MOCK_CONST_METHOD1(directoryEntries, ClangBackEnd::FilePathIds(const QString &directoryPath));
MOCK_CONST_METHOD1(lastModified, long long(ClangBackEnd::FilePathId filePathId));
+ MOCK_METHOD1(remove, void(const ClangBackEnd::FilePathIds &filePathIds));
};
diff --git a/tests/unit/unittest/mockprecompiledheaderstorage.h b/tests/unit/unittest/mockprecompiledheaderstorage.h
index de755e07eb..5dddf97fce 100644
--- a/tests/unit/unittest/mockprecompiledheaderstorage.h
+++ b/tests/unit/unittest/mockprecompiledheaderstorage.h
@@ -57,4 +57,5 @@ public:
MOCK_CONST_METHOD1(
fetchTimeStamps,
ClangBackEnd::PrecompiledHeaderTimeStamps(ClangBackEnd::ProjectPartId projectPartId));
+ MOCK_CONST_METHOD0(fetchAllPchPaths, ClangBackEnd::FilePaths());
};
diff --git a/tests/unit/unittest/mocksqlitereadstatement.cpp b/tests/unit/unittest/mocksqlitereadstatement.cpp
index 1a27eea50f..1f5bc53759 100644
--- a/tests/unit/unittest/mocksqlitereadstatement.cpp
+++ b/tests/unit/unittest/mocksqlitereadstatement.cpp
@@ -107,6 +107,12 @@ FilePathIds MockSqliteReadStatement::values<ClangBackEnd::FilePathId>(std::size_
return valuesReturnFilePathIds(reserveSize, projectPartId);
}
+template<>
+ClangBackEnd::FilePaths MockSqliteReadStatement::values<ClangBackEnd::FilePath>(std::size_t reserveSize)
+{
+ return valuesReturnFilePaths(reserveSize);
+}
+
template <>
std::vector<Sources::Directory> MockSqliteReadStatement::values<Sources::Directory, 2>(std::size_t reserveSize)
{
diff --git a/tests/unit/unittest/mocksqlitereadstatement.h b/tests/unit/unittest/mocksqlitereadstatement.h
index 04e1f8effc..11a7b126e5 100644
--- a/tests/unit/unittest/mocksqlitereadstatement.h
+++ b/tests/unit/unittest/mocksqlitereadstatement.h
@@ -113,6 +113,8 @@ public:
MOCK_METHOD1(valueReturnFilePath, Utils::optional<ClangBackEnd::FilePath>(int));
+ MOCK_METHOD1(valuesReturnFilePaths, ClangBackEnd::FilePaths(std::size_t));
+
MOCK_METHOD1(valueReturnSmallString,
Utils::optional<Utils::SmallString>(int));
@@ -233,6 +235,9 @@ template<>
FilePathIds MockSqliteReadStatement::values<ClangBackEnd::FilePathId>(std::size_t reserveSize,
const int &projectPartId);
+template<>
+ClangBackEnd::FilePaths MockSqliteReadStatement::values<ClangBackEnd::FilePath>(std::size_t reserveSize);
+
template <>
std::vector<Sources::Directory> MockSqliteReadStatement::values<Sources::Directory, 2>(std::size_t reserveSize);
diff --git a/tests/unit/unittest/pchtaskqueue-test.cpp b/tests/unit/unittest/pchtaskqueue-test.cpp
index 598a2a5132..6a4a2211d8 100644
--- a/tests/unit/unittest/pchtaskqueue-test.cpp
+++ b/tests/unit/unittest/pchtaskqueue-test.cpp
@@ -25,14 +25,18 @@
#include "googletest.h"
+#include "mockfilesystem.h"
#include "mockpchcreator.h"
#include "mockprecompiledheaderstorage.h"
#include "mocksqlitetransactionbackend.h"
#include "mocktaskscheduler.h"
#include "testenvironment.h"
+#include <filepathcaching.h>
#include <pchtaskqueue.h>
#include <progresscounter.h>
+#include <refactoringdatabaseinitializer.h>
+#include <sqlitedatabase.h>
namespace {
@@ -45,9 +49,26 @@ using ClangBackEnd::SlotUsage;
class PchTaskQueue : public testing::Test
{
protected:
+ ClangBackEnd::FilePathId filePathId(Utils::SmallStringView path)
+ {
+ return filePathCache.filePathId(ClangBackEnd::FilePathView{path});
+ }
+
+ ClangBackEnd::FilePathIds filePathIds(const Utils::PathStringVector &paths)
+ {
+ return filePathCache.filePathIds(Utils::transform(paths, [](const Utils::PathString &path) {
+ return ClangBackEnd::FilePathView(path);
+ }));
+ }
+
+protected:
+ Sqlite::Database database{":memory:", Sqlite::JournalMode::Memory};
+ ClangBackEnd::RefactoringDatabaseInitializer<Sqlite::Database> initializer{database};
+ ClangBackEnd::FilePathCaching filePathCache{database};
NiceMock<MockTaskScheduler<ClangBackEnd::PchTaskQueue::Task>> mockSytemPchTaskScheduler;
NiceMock<MockTaskScheduler<ClangBackEnd::PchTaskQueue::Task>> mockProjectPchTaskScheduler;
NiceMock<MockPrecompiledHeaderStorage> mockPrecompiledHeaderStorage;
+ NiceMock<MockFileSystem> mockFileSystem;
MockSqliteTransactionBackend mockSqliteTransactionBackend;
NiceMock<MockFunction<void(int, int)>> mockSetProgressCallback;
ClangBackEnd::ProgressCounter progressCounter{mockSetProgressCallback.AsStdFunction()};
@@ -57,7 +78,9 @@ protected:
progressCounter,
mockPrecompiledHeaderStorage,
mockSqliteTransactionBackend,
- testEnvironment};
+ testEnvironment,
+ mockFileSystem,
+ filePathCache};
IncludeSearchPaths systemIncludeSearchPaths{
{"/includes", 1, IncludeSearchPathType::BuiltIn},
{"/other/includes", 2, IncludeSearchPathType::System}};
@@ -390,4 +413,91 @@ TEST_F(PchTaskQueue, DeleteSystemPchEntryInDatabaseIfNoPchIsGenerated)
tasks.front()(mockPchCreator);
}
+TEST_F(PchTaskQueue, DontDeleteUnusedPchsIfSystemTaskAreProcessed)
+{
+ QString pchsDirectory{testEnvironment.pchBuildDirectory()};
+ ON_CALL(mockSytemPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 1}));
+ ON_CALL(mockProjectPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 0}));
+ ON_CALL(mockFileSystem, directoryEntries(Eq(pchsDirectory)))
+ .WillByDefault(Return(filePathIds({"/tmp/foo", "/tmp/bar"})));
+ ON_CALL(mockPrecompiledHeaderStorage, fetchAllPchPaths())
+ .WillByDefault(Return(ClangBackEnd::FilePaths{"/tmp/foo", "/tmp/poo"}));
+
+ EXPECT_CALL(mockFileSystem, remove(_)).Times(0);
+
+ queue.processEntries();
+}
+
+TEST_F(PchTaskQueue, DontDeleteUnusedPchsIfProjectTaskAreProcessed)
+{
+ QString pchsDirectory{testEnvironment.pchBuildDirectory()};
+ ON_CALL(mockSytemPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 0}));
+ ON_CALL(mockProjectPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 1}));
+ ON_CALL(mockFileSystem, directoryEntries(Eq(pchsDirectory)))
+ .WillByDefault(Return(filePathIds({"/tmp/foo", "/tmp/bar"})));
+ ON_CALL(mockPrecompiledHeaderStorage, fetchAllPchPaths())
+ .WillByDefault(Return(ClangBackEnd::FilePaths{"/tmp/foo", "/tmp/poo"}));
+
+ EXPECT_CALL(mockFileSystem, remove(_)).Times(0);
+
+ queue.processEntries();
+}
+
+TEST_F(PchTaskQueue, DontDeleteUnusedPchsIfSystemTaskIsAdded)
+{
+ QString pchsDirectory{testEnvironment.pchBuildDirectory()};
+ ON_CALL(mockSytemPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 0}));
+ ON_CALL(mockProjectPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 0}));
+ ON_CALL(mockFileSystem, directoryEntries(Eq(pchsDirectory)))
+ .WillByDefault(Return(filePathIds({"/tmp/foo", "/tmp/bar"})));
+ ON_CALL(mockPrecompiledHeaderStorage, fetchAllPchPaths())
+ .WillByDefault(Return(ClangBackEnd::FilePaths{"/tmp/foo", "/tmp/poo"}));
+ queue.addSystemPchTasks({systemTask1});
+
+ EXPECT_CALL(mockFileSystem, remove(_)).Times(0);
+
+ queue.processEntries();
+}
+
+TEST_F(PchTaskQueue, DontDeleteUnusedPchsIfProjectTaskIsAdded)
+{
+ QString pchsDirectory{testEnvironment.pchBuildDirectory()};
+ ON_CALL(mockSytemPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 0}));
+ ON_CALL(mockProjectPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 0}));
+ ON_CALL(mockFileSystem, directoryEntries(Eq(pchsDirectory)))
+ .WillByDefault(Return(filePathIds({"/tmp/foo", "/tmp/bar"})));
+ ON_CALL(mockPrecompiledHeaderStorage, fetchAllPchPaths())
+ .WillByDefault(Return(ClangBackEnd::FilePaths{"/tmp/foo", "/tmp/poo"}));
+ queue.addProjectPchTasks({projectTask1});
+
+ EXPECT_CALL(mockFileSystem, remove(_)).Times(0);
+
+ queue.processEntries();
+}
+
+TEST_F(PchTaskQueue, DeleteUnusedPchs)
+{
+ QString pchsDirectory{testEnvironment.pchBuildDirectory()};
+ ON_CALL(mockSytemPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 0}));
+ ON_CALL(mockProjectPchTaskScheduler, slotUsage()).WillByDefault(Return(SlotUsage{2, 0}));
+ ON_CALL(mockFileSystem, directoryEntries(Eq(pchsDirectory)))
+ .WillByDefault(Return(filePathIds({
+ "/tmp/foo",
+ "/tmp/bar",
+ "/tmp/hoo",
+ "/tmp/too",
+ })));
+ ON_CALL(mockPrecompiledHeaderStorage, fetchAllPchPaths())
+ .WillByDefault(Return(ClangBackEnd::FilePaths{
+ "/tmp/foo",
+ "/tmp/poo",
+ "/tmp/too",
+ }));
+
+ EXPECT_CALL(mockFileSystem,
+ remove(UnorderedElementsAre(filePathId("/tmp/bar"), filePathId("/tmp/hoo"))));
+
+ queue.processEntries();
+}
+
} // namespace
diff --git a/tests/unit/unittest/precompiledheaderstorage-test.cpp b/tests/unit/unittest/precompiledheaderstorage-test.cpp
index 8b3727decd..77574a28b9 100644
--- a/tests/unit/unittest/precompiledheaderstorage-test.cpp
+++ b/tests/unit/unittest/precompiledheaderstorage-test.cpp
@@ -53,6 +53,7 @@ protected:
MockSqliteReadStatement &fetchPrecompiledHeaderStatement = storage.fetchPrecompiledHeaderStatement;
MockSqliteReadStatement &fetchPrecompiledHeadersStatement = storage.fetchPrecompiledHeadersStatement;
MockSqliteReadStatement &fetchTimeStampsStatement = storage.fetchTimeStampsStatement;
+ MockSqliteReadStatement &fetchAllPchPathsStatement = storage.fetchAllPchPathsStatement;
};
TEST_F(PrecompiledHeaderStorage, UseTransaction)
@@ -458,6 +459,32 @@ TEST_F(PrecompiledHeaderStorage, FetchTimeStampsBusy)
storage.fetchTimeStamps(23);
}
+TEST_F(PrecompiledHeaderStorage, FetchAllPchPaths)
+{
+ InSequence s;
+
+ EXPECT_CALL(database, deferredBegin());
+ EXPECT_CALL(fetchAllPchPathsStatement, valuesReturnFilePaths(_));
+ EXPECT_CALL(database, commit());
+
+ storage.fetchAllPchPaths();
+}
+
+TEST_F(PrecompiledHeaderStorage, FetchAllPchPathsIsBusy)
+{
+ InSequence s;
+
+ EXPECT_CALL(database, deferredBegin());
+ EXPECT_CALL(fetchAllPchPathsStatement, valuesReturnFilePaths(_))
+ .WillOnce(Throw(Sqlite::StatementIsBusy{""}));
+ EXPECT_CALL(database, rollback());
+ EXPECT_CALL(database, deferredBegin());
+ EXPECT_CALL(fetchAllPchPathsStatement, valuesReturnFilePaths(_));
+ EXPECT_CALL(database, commit());
+
+ storage.fetchAllPchPaths();
+}
+
class PrecompiledHeaderStorageSlowTest : public testing::Test
{
protected:
@@ -478,4 +505,18 @@ TEST_F(PrecompiledHeaderStorageSlowTest, NoFetchTimeStamps)
Field(&ClangBackEnd::PrecompiledHeaderTimeStamps::system, Eq(33))));
}
+TEST_F(PrecompiledHeaderStorageSlowTest, FetchAllPchPaths)
+{
+ storage.insertProjectPrecompiledHeader(11, "/tmp/yi", 22);
+ storage.insertProjectPrecompiledHeader(12, "/tmp/er", 22);
+ storage.insertSystemPrecompiledHeaders({11, 12}, "/tmp/se", 33);
+ storage.insertSystemPrecompiledHeaders({13}, "/tmp/wu", 33);
+ storage.insertProjectPrecompiledHeader(13, "/tmp/san", 22);
+
+ auto filePathIds = storage.fetchAllPchPaths();
+
+ ASSERT_THAT(filePathIds,
+ UnorderedElementsAre("/tmp/er", "/tmp/san", "/tmp/se", "/tmp/wu", "/tmp/yi"));
+}
+
} // namespace
diff --git a/tests/unit/unittest/unittest.pro b/tests/unit/unittest/unittest.pro
index 48cd04843c..2ccc0bdb54 100644
--- a/tests/unit/unittest/unittest.pro
+++ b/tests/unit/unittest/unittest.pro
@@ -39,7 +39,7 @@ CONFIG(release, debug|release):QMAKE_LFLAGS += -Wl,--strip-debug
}
gcc:!clang: QMAKE_CXXFLAGS += -Wno-noexcept-type
-msvc: QMAKE_CXXFLAGS += /bigobj /wd4267 /wd4141 /wd4146
+msvc: QMAKE_CXXFLAGS += /bigobj /wd4267 /wd4141 /wd4146 /wd4624
# create fake CppTools.json for the mime type definitions
dependencyList = "\"Dependencies\" : []"