diff options
10 files changed, 199 insertions, 133 deletions
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/filestatus.h b/src/plugins/qmldesigner/designercore/projectstorage/filestatus.h index 9700c4aa9b..34a0b64839 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/filestatus.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/filestatus.h @@ -27,8 +27,6 @@ #include "projectstorageids.h" -#include <ctime> -#include <sys/types.h> #include <vector> namespace QmlDesigner { @@ -36,13 +34,13 @@ namespace QmlDesigner { class FileStatus { public: - explicit FileStatus(SourceId sourceId, off_t size, std::time_t lastModified) + explicit FileStatus(SourceId sourceId, long long size, long long lastModified) : sourceId{sourceId} , size{size} , lastModified{lastModified} {} - explicit FileStatus(int sourceId, off_t size, std::time_t lastModified) + explicit FileStatus(int sourceId, long long size, long long lastModified) : sourceId{sourceId} , size{size} , lastModified{lastModified} @@ -54,15 +52,30 @@ public: && first.lastModified == second.lastModified; } + friend bool operator!=(const FileStatus &first, const FileStatus &second) + { + return !(first == second); + } + friend bool operator<(const FileStatus &first, const FileStatus &second) { return first.sourceId < second.sourceId; } + friend bool operator<(SourceId first, const FileStatus &second) + { + return first < second.sourceId; + } + + friend bool operator<(const FileStatus &first, SourceId second) + { + return first.sourceId < second; + } + public: SourceId sourceId; - off_t size; - std::time_t lastModified; + long long size; + long long lastModified; }; using FileStatuses = std::vector<FileStatus>; diff --git a/src/plugins/qmldesigner/designercore/projectstorage/filestatuscache.cpp b/src/plugins/qmldesigner/designercore/projectstorage/filestatuscache.cpp index 57e1d4cee1..725d71fdb2 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/filestatuscache.cpp +++ b/src/plugins/qmldesigner/designercore/projectstorage/filestatuscache.cpp @@ -36,20 +36,25 @@ namespace QmlDesigner { long long FileStatusCache::lastModifiedTime(SourceId sourceId) const { - return findEntry(sourceId).lastModified; + return find(sourceId).lastModified; +} + +long long FileStatusCache::fileSize(SourceId sourceId) const +{ + return find(sourceId).size; } void FileStatusCache::update(SourceId sourceId) { auto found = std::lower_bound(m_cacheEntries.begin(), m_cacheEntries.end(), - Internal::FileStatusCacheEntry{sourceId}, + sourceId, [](const auto &first, const auto &second) { - return first.sourceId < second.sourceId; + return first < second; }); if (found != m_cacheEntries.end() && found->sourceId == sourceId) - found->lastModified = m_fileSystem.lastModified(sourceId); + *found = m_fileSystem.fileStatus(sourceId); } void FileStatusCache::update(SourceIds sourceIds) @@ -59,7 +64,7 @@ void FileStatusCache::update(SourceIds sourceIds) sourceIds.begin(), sourceIds.end(), Utils::make_iterator([&](auto &entry) { - entry.lastModified = m_fileSystem.lastModified(entry.sourceId); + entry = m_fileSystem.fileStatus(entry.sourceId); })); } @@ -73,14 +78,14 @@ SourceIds FileStatusCache::modified(SourceIds sourceIds) const sourceIds.begin(), sourceIds.end(), Utils::make_iterator([&](auto &entry) { - auto newLastModified = m_fileSystem.lastModified(entry.sourceId); - if (newLastModified > entry.lastModified) { + auto fileStatus = m_fileSystem.fileStatus(entry.sourceId); + if (fileStatus != entry) { modifiedSourceIds.push_back(entry.sourceId); - entry.lastModified = newLastModified; + entry = fileStatus; } })); - Internal::FileStatusCacheEntries newEntries; + FileStatuses newEntries; newEntries.reserve(sourceIds.size()); std::set_difference(sourceIds.begin(), @@ -88,13 +93,12 @@ SourceIds FileStatusCache::modified(SourceIds sourceIds) const m_cacheEntries.begin(), m_cacheEntries.end(), Utils::make_iterator([&](SourceId newSourceId) { - newEntries.emplace_back(newSourceId, - m_fileSystem.lastModified(newSourceId)); + newEntries.push_back(m_fileSystem.fileStatus(newSourceId)); modifiedSourceIds.push_back(newSourceId); })); if (newEntries.size()) { - Internal::FileStatusCacheEntries mergedEntries; + FileStatuses mergedEntries; mergedEntries.reserve(m_cacheEntries.size() + newEntries.size()); std::set_union(newEntries.begin(), @@ -116,19 +120,19 @@ FileStatusCache::size_type FileStatusCache::size() const return m_cacheEntries.size(); } -Internal::FileStatusCacheEntry FileStatusCache::findEntry(SourceId sourceId) const +const FileStatus &FileStatusCache::find(SourceId sourceId) const { auto found = std::lower_bound(m_cacheEntries.begin(), m_cacheEntries.end(), - Internal::FileStatusCacheEntry{sourceId}, + sourceId, [](const auto &first, const auto &second) { - return first.sourceId < second.sourceId; + return first < second; }); if (found != m_cacheEntries.end() && found->sourceId == sourceId) return *found; - auto inserted = m_cacheEntries.emplace(found, sourceId, m_fileSystem.lastModified(sourceId)); + auto inserted = m_cacheEntries.insert(found, m_fileSystem.fileStatus(sourceId)); return *inserted; } diff --git a/src/plugins/qmldesigner/designercore/projectstorage/filestatuscache.h b/src/plugins/qmldesigner/designercore/projectstorage/filestatuscache.h index 55e9290387..3be9ba5767 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/filestatuscache.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/filestatuscache.h @@ -25,51 +25,19 @@ #pragma once +#include "filestatus.h" #include "filesysteminterface.h" -#include "vector" #include <QtGlobal> QT_FORWARD_DECLARE_CLASS(QFileInfo) namespace QmlDesigner { -namespace Internal { -class FileStatusCacheEntry -{ -public: - FileStatusCacheEntry(QmlDesigner::SourceId sourceId, long long lastModified = 0) - : sourceId(sourceId) - , lastModified(lastModified) - {} - - friend bool operator<(FileStatusCacheEntry first, FileStatusCacheEntry second) - { - return first.sourceId < second.sourceId; - } - - friend bool operator<(FileStatusCacheEntry first, SourceId second) - { - return first.sourceId < second; - } - - friend bool operator<(SourceId first, FileStatusCacheEntry second) - { - return first < second.sourceId; - } - -public: - SourceId sourceId; - long long lastModified; -}; - -using FileStatusCacheEntries = std::vector<FileStatusCacheEntry>; - -} class FileStatusCache { public: - using size_type = Internal::FileStatusCacheEntries::size_type; + using size_type = FileStatuses::size_type; FileStatusCache(FileSystemInterface &fileSystem) : m_fileSystem(fileSystem) @@ -78,6 +46,9 @@ public: FileStatusCache(const FileStatusCache &) = delete; long long lastModifiedTime(SourceId sourceId) const; + long long fileSize(SourceId sourceId) const; + const FileStatus &find(SourceId sourceId) const; + void update(SourceId sourceId); void update(SourceIds sourceIds); SourceIds modified(SourceIds sourceIds) const; @@ -85,10 +56,7 @@ public: size_type size() const; private: - Internal::FileStatusCacheEntry findEntry(SourceId sourceId) const; - -private: - mutable Internal::FileStatusCacheEntries m_cacheEntries; + mutable FileStatuses m_cacheEntries; FileSystemInterface &m_fileSystem; }; diff --git a/src/plugins/qmldesigner/designercore/projectstorage/filesystem.cpp b/src/plugins/qmldesigner/designercore/projectstorage/filesystem.cpp index 08ec31c707..803fb89915 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/filesystem.cpp +++ b/src/plugins/qmldesigner/designercore/projectstorage/filesystem.cpp @@ -64,6 +64,19 @@ long long FileSystem::lastModified(SourceId sourceId) const return 0; } +FileStatus FileSystem::fileStatus(SourceId sourceId) const +{ + QFileInfo fileInfo(QString(m_sourcePathCache.sourcePath(sourceId))); + + fileInfo.refresh(); + + if (fileInfo.exists()) { + return FileStatus{sourceId, fileInfo.size(), fileInfo.lastModified().toMSecsSinceEpoch()}; + } + + return FileStatus{sourceId, -1, -1}; +} + void FileSystem::remove(const SourceIds &sourceIds) { for (SourceId sourceId : sourceIds) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/filesystem.h b/src/plugins/qmldesigner/designercore/projectstorage/filesystem.h index 43b57ff38d..041090508e 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/filesystem.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/filesystem.h @@ -52,6 +52,7 @@ public: SourceIds directoryEntries(const QString &directoryPath) const override; long long lastModified(SourceId sourceId) const override; + FileStatus fileStatus(SourceId sourceId) const override; void remove(const SourceIds &sourceIds) override; diff --git a/src/plugins/qmldesigner/designercore/projectstorage/filesysteminterface.h b/src/plugins/qmldesigner/designercore/projectstorage/filesysteminterface.h index 2f1809982b..01ea60baca 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/filesysteminterface.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/filesysteminterface.h @@ -31,11 +31,14 @@ namespace QmlDesigner { +class FileStatus; + class FileSystemInterface { public: virtual SourceIds directoryEntries(const QString &directoryPath) const = 0; virtual long long lastModified(SourceId sourceId) const = 0; + virtual FileStatus fileStatus(SourceId sourceId) const = 0; virtual void remove(const SourceIds &sourceIds) = 0; protected: diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index 9f8e8501cf..71d9f139e8 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -2181,7 +2181,7 @@ public: "SELECT propertyDeclarationId FROM properties", database}; mutable ReadStatement<3> selectAllFileStatusesStatement{ - "SELECT sourceId, size, lastModified FROM fileStatuses", database}; + "SELECT sourceId, size, lastModified FROM fileStatuses ORDER BY sourceId", database}; mutable ReadStatement<3> selectFileStatusesForSourceIdsStatement{ "SELECT sourceId, size, lastModified FROM fileStatuses WHERE sourceId IN carray(?1) ORDER " "BY sourceId", diff --git a/tests/unit/unittest/filestatuscache-test.cpp b/tests/unit/unittest/filestatuscache-test.cpp index c28faf4ffa..243bc80e14 100644 --- a/tests/unit/unittest/filestatuscache-test.cpp +++ b/tests/unit/unittest/filestatuscache-test.cpp @@ -35,6 +35,7 @@ namespace { +using QmlDesigner::FileStatus; using QmlDesigner::SourceId; using QmlDesigner::SourceIds; @@ -43,10 +44,14 @@ class FileStatusCache : public testing::Test protected: FileStatusCache() { - ON_CALL(fileSystem, lastModified(Eq(header))).WillByDefault(Return(headerLastModifiedTime)); - ON_CALL(fileSystem, lastModified(Eq(source))).WillByDefault(Return(sourceLastModifiedTime)); - ON_CALL(fileSystem, lastModified(Eq(header2))).WillByDefault(Return(header2LastModifiedTime)); - ON_CALL(fileSystem, lastModified(Eq(source2))).WillByDefault(Return(source2LastModifiedTime)); + ON_CALL(fileSystem, fileStatus(Eq(header))) + .WillByDefault(Return(FileStatus{header, headerFileSize, headerLastModifiedTime})); + ON_CALL(fileSystem, fileStatus(Eq(source))) + .WillByDefault(Return(FileStatus{source, sourceFileSize, sourceLastModifiedTime})); + ON_CALL(fileSystem, fileStatus(Eq(header2))) + .WillByDefault(Return(FileStatus{header2, header2FileSize, header2LastModifiedTime})); + ON_CALL(fileSystem, fileStatus(Eq(source2))) + .WillByDefault(Return(FileStatus{source2, source2FileSize, source2LastModifiedTime})); } protected: @@ -59,99 +64,123 @@ protected: SourceIds entries{header, source, header2, source2}; long long headerLastModifiedTime = 100; long long headerLastModifiedTime2 = 110; + long long headerFileSize = 1000; + long long headerFileSize2 = 1100; long long header2LastModifiedTime = 300; long long header2LastModifiedTime2 = 310; + long long header2FileSize = 3000; + long long header2FileSize2 = 3100; long long sourceLastModifiedTime = 200; long long source2LastModifiedTime = 400; + long long sourceFileSize = 2000; + long long source2FileSize = 4000; }; TEST_F(FileStatusCache, CreateEntry) { - cache.lastModifiedTime(header); + cache.find(header); ASSERT_THAT(cache, SizeIs(1)); } TEST_F(FileStatusCache, AskCreatedEntryForLastModifiedTime) { - auto lastModified = cache.lastModifiedTime(header); + auto fileStatus = cache.find(header); - ASSERT_THAT(lastModified, headerLastModifiedTime); + ASSERT_THAT(fileStatus, (FileStatus{header, headerFileSize, headerLastModifiedTime})); } -TEST_F(FileStatusCache, AskCachedEntryForLastModifiedTime) +TEST_F(FileStatusCache, FindCachedEntry) { - cache.lastModifiedTime(header); + cache.find(header); + + auto fileStatus = cache.find(header); + + ASSERT_THAT(fileStatus, (FileStatus{header, headerFileSize, headerLastModifiedTime})); +} + +TEST_F(FileStatusCache, LastModifiedTime) +{ + cache.find(header); + + auto lastModifiedTime = cache.lastModifiedTime(header); + + ASSERT_THAT(lastModifiedTime, headerLastModifiedTime); +} - auto lastModified = cache.lastModifiedTime(header); +TEST_F(FileStatusCache, FileSize) +{ + cache.find(header); + + auto fileSize = cache.fileSize(header); - ASSERT_THAT(lastModified, headerLastModifiedTime); + ASSERT_THAT(fileSize, headerFileSize); } TEST_F(FileStatusCache, DontAddEntryTwice) { - cache.lastModifiedTime(header); + cache.find(header); - cache.lastModifiedTime(header); + cache.find(header); ASSERT_THAT(cache, SizeIs(1)); } TEST_F(FileStatusCache, AddNewEntry) { - cache.lastModifiedTime(header); + cache.find(header); - cache.lastModifiedTime(source); + cache.find(source); ASSERT_THAT(cache, SizeIs(2)); } TEST_F(FileStatusCache, AskNewEntryForLastModifiedTime) { - cache.lastModifiedTime(header); + cache.find(header); - auto lastModified = cache.lastModifiedTime(source); + auto fileStatus = cache.find(source); - ASSERT_THAT(lastModified, sourceLastModifiedTime); + ASSERT_THAT(fileStatus, (FileStatus{source, sourceFileSize, sourceLastModifiedTime})); } TEST_F(FileStatusCache, AddNewEntryReverseOrder) { - cache.lastModifiedTime(source); + cache.find(source); - cache.lastModifiedTime(header); + cache.find(header); ASSERT_THAT(cache, SizeIs(2)); } TEST_F(FileStatusCache, AskNewEntryReverseOrderAddedForLastModifiedTime) { - cache.lastModifiedTime(source); + cache.find(source); - auto lastModified = cache.lastModifiedTime(header); + auto fileStatus = cache.find(header); - ASSERT_THAT(lastModified, headerLastModifiedTime); + ASSERT_THAT(fileStatus, (FileStatus{header, headerFileSize, headerLastModifiedTime})); } TEST_F(FileStatusCache, UpdateFile) { - EXPECT_CALL(fileSystem, lastModified(Eq(header))) + EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) - .WillOnce(Return(headerLastModifiedTime)) - .WillOnce(Return(headerLastModifiedTime2)); + .WillOnce(Return(FileStatus{header, headerFileSize, headerLastModifiedTime})) + .WillOnce(Return(FileStatus{header, headerFileSize2, headerLastModifiedTime2})); cache.lastModifiedTime(header); cache.update(header); - ASSERT_THAT(cache.lastModifiedTime(header), headerLastModifiedTime2); + ASSERT_THAT(cache.find(header), (FileStatus{header, headerFileSize2, headerLastModifiedTime2})); } TEST_F(FileStatusCache, UpdateFileDoesNotChangeEntryCount) { - EXPECT_CALL(fileSystem, lastModified(Eq(header))) + EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) - .WillOnce(Return(headerLastModifiedTime)) - .WillOnce(Return(headerLastModifiedTime2)); + .WillOnce(Return(FileStatus{header, headerFileSize, headerLastModifiedTime})) + .WillOnce(Return(FileStatus{header, headerFileSize, headerLastModifiedTime2})); cache.lastModifiedTime(header); cache.update(header); @@ -166,35 +195,36 @@ TEST_F(FileStatusCache, UpdateFileForNonExistingEntry) ASSERT_THAT(cache, SizeIs(0)); } -TEST_F(FileStatusCache, UpdateFiles) +TEST_F(FileStatusCache, UpdateFileStats) { - EXPECT_CALL(fileSystem, lastModified(Eq(header))) + EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) - .WillOnce(Return(headerLastModifiedTime)) - .WillOnce(Return(headerLastModifiedTime2)); - EXPECT_CALL(fileSystem, lastModified(Eq(header2))) + .WillOnce(Return(FileStatus{header, headerFileSize, headerLastModifiedTime})) + .WillOnce(Return(FileStatus{header, headerFileSize2, headerLastModifiedTime2})); + EXPECT_CALL(fileSystem, fileStatus(Eq(header2))) .Times(2) - .WillOnce(Return(header2LastModifiedTime)) - .WillOnce(Return(header2LastModifiedTime2)); + .WillOnce(Return(FileStatus{header2, header2FileSize, header2LastModifiedTime})) + .WillOnce(Return(FileStatus{header2, header2FileSize2, header2LastModifiedTime2})); cache.lastModifiedTime(header); cache.lastModifiedTime(header2); cache.update(entries); - ASSERT_THAT(cache.lastModifiedTime(header), headerLastModifiedTime2); - ASSERT_THAT(cache.lastModifiedTime(header2), header2LastModifiedTime2); + ASSERT_THAT(cache.find(header), (FileStatus{header, headerFileSize2, headerLastModifiedTime2})); + ASSERT_THAT(cache.find(header2), + (FileStatus{header2, header2FileSize2, header2LastModifiedTime2})); } TEST_F(FileStatusCache, UpdateFilesDoesNotChangeEntryCount) { - EXPECT_CALL(fileSystem, lastModified(Eq(header))) + EXPECT_CALL(fileSystem, fileStatus(Eq(header))) .Times(2) - .WillOnce(Return(headerLastModifiedTime)) - .WillOnce(Return(headerLastModifiedTime2)); - EXPECT_CALL(fileSystem, lastModified(Eq(header2))) + .WillOnce(Return(FileStatus{header, headerFileSize, headerLastModifiedTime})) + .WillOnce(Return(FileStatus{header, headerFileSize2, headerLastModifiedTime})); + EXPECT_CALL(fileSystem, fileStatus(Eq(header2))) .Times(2) - .WillOnce(Return(header2LastModifiedTime)) - .WillOnce(Return(header2LastModifiedTime2)); + .WillOnce(Return(FileStatus{header2, header2FileSize, header2LastModifiedTime})) + .WillOnce(Return(FileStatus{header2, header2FileSize2, header2LastModifiedTime})); cache.lastModifiedTime(header); cache.lastModifiedTime(header2); @@ -237,18 +267,20 @@ TEST_F(FileStatusCache, SomeNewModifiedEntries) TEST_F(FileStatusCache, SomeAlreadyExistingModifiedEntries) { - EXPECT_CALL(fileSystem, lastModified(Eq(header))) + EXPECT_CALL(fileSystem, fileStatus(Eq(header))) + .Times(2) + .WillOnce(Return(FileStatus{header, headerFileSize, headerLastModifiedTime})) + .WillOnce(Return(FileStatus{header, headerFileSize2, headerLastModifiedTime})); + EXPECT_CALL(fileSystem, fileStatus(Eq(header2))) .Times(2) - .WillOnce(Return(headerLastModifiedTime)) - .WillOnce(Return(headerLastModifiedTime2)); - EXPECT_CALL(fileSystem, lastModified(Eq(header2))) + .WillOnce(Return(FileStatus{header2, header2FileSize, header2LastModifiedTime})) + .WillOnce(Return(FileStatus{header2, header2FileSize2, header2LastModifiedTime})); + EXPECT_CALL(fileSystem, fileStatus(Eq(source))) .Times(2) - .WillOnce(Return(header2LastModifiedTime)) - .WillOnce(Return(header2LastModifiedTime2)); - EXPECT_CALL(fileSystem, lastModified(Eq(source))).Times(2).WillRepeatedly(Return(sourceLastModifiedTime)); - EXPECT_CALL(fileSystem, lastModified(Eq(source2))) + .WillRepeatedly(Return(FileStatus{source, sourceFileSize, sourceLastModifiedTime})); + EXPECT_CALL(fileSystem, fileStatus(Eq(source2))) .Times(2) - .WillRepeatedly(Return(source2LastModifiedTime)); + .WillRepeatedly(Return(FileStatus{source2, source2FileSize, source2LastModifiedTime})); cache.modified(entries); auto modifiedIds = cache.modified(entries); @@ -258,13 +290,17 @@ TEST_F(FileStatusCache, SomeAlreadyExistingModifiedEntries) TEST_F(FileStatusCache, SomeAlreadyExistingAndSomeNewModifiedEntries) { - EXPECT_CALL(fileSystem, lastModified(Eq(header))).WillRepeatedly(Return(headerLastModifiedTime)); - EXPECT_CALL(fileSystem, lastModified(Eq(header2))) + EXPECT_CALL(fileSystem, fileStatus(Eq(header))) + .WillRepeatedly(Return(FileStatus{header, headerFileSize, headerLastModifiedTime})); + EXPECT_CALL(fileSystem, fileStatus(Eq(header2))) .Times(2) - .WillOnce(Return(header2LastModifiedTime)) - .WillOnce(Return(header2LastModifiedTime2)); - EXPECT_CALL(fileSystem, lastModified(Eq(source))).Times(2).WillRepeatedly(Return(sourceLastModifiedTime)); - EXPECT_CALL(fileSystem, lastModified(Eq(source2))).WillRepeatedly(Return(source2LastModifiedTime)); + .WillOnce(Return(FileStatus{header2, header2FileSize, header2LastModifiedTime})) + .WillOnce(Return(FileStatus{header2, header2FileSize, header2LastModifiedTime2})); + EXPECT_CALL(fileSystem, fileStatus(Eq(source))) + .Times(2) + .WillRepeatedly(Return(FileStatus{source, sourceFileSize, sourceLastModifiedTime})); + EXPECT_CALL(fileSystem, fileStatus(Eq(source2))) + .WillRepeatedly(Return(FileStatus{source2, source2FileSize, source2LastModifiedTime})); cache.modified({source, header2}); auto modifiedIds = cache.modified(entries); @@ -274,23 +310,25 @@ TEST_F(FileStatusCache, SomeAlreadyExistingAndSomeNewModifiedEntries) TEST_F(FileStatusCache, TimeIsUpdatedForSomeAlreadyExistingModifiedEntries) { - EXPECT_CALL(fileSystem, lastModified(Eq(header))) + EXPECT_CALL(fileSystem, fileStatus(Eq(header))) + .Times(2) + .WillOnce(Return(FileStatus{header, headerFileSize, headerLastModifiedTime})) + .WillOnce(Return(FileStatus{header, headerFileSize2, headerLastModifiedTime2})); + EXPECT_CALL(fileSystem, fileStatus(Eq(header2))) .Times(2) - .WillOnce(Return(headerLastModifiedTime)) - .WillOnce(Return(headerLastModifiedTime2)); - EXPECT_CALL(fileSystem, lastModified(Eq(header2))) + .WillOnce(Return(FileStatus{header2, header2FileSize, header2LastModifiedTime})) + .WillOnce(Return(FileStatus{header2, header2FileSize2, header2LastModifiedTime2})); + EXPECT_CALL(fileSystem, fileStatus(Eq(source))) .Times(2) - .WillOnce(Return(header2LastModifiedTime)) - .WillOnce(Return(header2LastModifiedTime2)); - EXPECT_CALL(fileSystem, lastModified(Eq(source))).Times(2).WillRepeatedly(Return(sourceLastModifiedTime)); - EXPECT_CALL(fileSystem, lastModified(Eq(source2))) + .WillRepeatedly(Return(FileStatus{source, sourceFileSize, sourceLastModifiedTime})); + EXPECT_CALL(fileSystem, fileStatus(Eq(source2))) .Times(2) - .WillRepeatedly(Return(source2LastModifiedTime)); + .WillRepeatedly(Return(FileStatus{source2, source2FileSize, source2LastModifiedTime})); cache.modified(entries); cache.modified(entries); - ASSERT_THAT(cache.lastModifiedTime(header), headerLastModifiedTime2); + ASSERT_THAT(cache.find(header), (FileStatus{header, headerFileSize2, headerLastModifiedTime2})); } } // namespace diff --git a/tests/unit/unittest/filesystemmock.h b/tests/unit/unittest/filesystemmock.h index ffcf5e33a0..972f6af142 100644 --- a/tests/unit/unittest/filesystemmock.h +++ b/tests/unit/unittest/filesystemmock.h @@ -27,6 +27,7 @@ #include "googletest.h" +#include <projectstorage/filestatus.h> #include <projectstorage/filesysteminterface.h> class FileSystemMock : public QmlDesigner::FileSystemInterface @@ -36,6 +37,7 @@ public: directoryEntries, (const QString &directoryPath), (const, override)); - MOCK_METHOD(long long, lastModified, (QmlDesigner::SourceId filePathId), (const, override)); - MOCK_METHOD(void, remove, (const QmlDesigner::SourceIds &filePathIds), (override)); + MOCK_METHOD(long long, lastModified, (QmlDesigner::SourceId sourceId), (const, override)); + MOCK_METHOD(QmlDesigner::FileStatus, fileStatus, (QmlDesigner::SourceId sourceId), (const, override)); + MOCK_METHOD(void, remove, (const QmlDesigner::SourceIds &sourceIds), (override)); }; diff --git a/tests/unit/unittest/projectstorage-test.cpp b/tests/unit/unittest/projectstorage-test.cpp index fa0218bad7..cacf69ff48 100644 --- a/tests/unit/unittest/projectstorage-test.cpp +++ b/tests/unit/unittest/projectstorage-test.cpp @@ -3915,4 +3915,28 @@ TEST_F(ProjectStorageSlowTest, ThrowForInvalidSourceId) Sqlite::ConstraintPreventsModification); } +TEST_F(ProjectStorageSlowTest, FetchAllFileStatuses) +{ + setUpSourceIds(); + FileStatus fileStatus1{sourceId1, 100, 100}; + FileStatus fileStatus2{sourceId2, 101, 101}; + storage.synchronize({}, {}, {}, {sourceId1, sourceId2}, {fileStatus1, fileStatus2}); + + auto fileStatuses = convert(storage.fetchAllFileStatuses()); + + ASSERT_THAT(fileStatuses, ElementsAre(fileStatus1, fileStatus2)); +} + +TEST_F(ProjectStorageSlowTest, FetchAllFileStatusesReverse) +{ + setUpSourceIds(); + FileStatus fileStatus1{sourceId1, 100, 100}; + FileStatus fileStatus2{sourceId2, 101, 101}; + storage.synchronize({}, {}, {}, {sourceId1, sourceId2}, {fileStatus2, fileStatus1}); + + auto fileStatuses = convert(storage.fetchAllFileStatuses()); + + ASSERT_THAT(fileStatuses, ElementsAre(fileStatus1, fileStatus2)); +} + } // namespace |