| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  | /****************************************************************************
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Copyright (C) 2017 The Qt Company Ltd. | 
					
						
							|  |  |  | ** Contact: https://www.qt.io/licensing/
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** This file is part of Qt Creator. | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** Commercial License Usage | 
					
						
							|  |  |  | ** Licensees holding valid commercial Qt licenses may use this file in | 
					
						
							|  |  |  | ** accordance with the commercial license agreement provided with the | 
					
						
							|  |  |  | ** Software or, alternatively, in accordance with the terms contained in | 
					
						
							|  |  |  | ** a written agreement between you and The Qt Company. For licensing terms | 
					
						
							|  |  |  | ** and conditions see https://www.qt.io/terms-conditions. For further
 | 
					
						
							|  |  |  | ** information use the contact form at https://www.qt.io/contact-us.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ** GNU General Public License Usage | 
					
						
							|  |  |  | ** Alternatively, this file may be used under the terms of the GNU | 
					
						
							|  |  |  | ** General Public License version 3 as published by the Free Software | 
					
						
							|  |  |  | ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT | 
					
						
							|  |  |  | ** included in the packaging of this file. Please review the following | 
					
						
							|  |  |  | ** information to ensure the GNU General Public License requirements will | 
					
						
							|  |  |  | ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
 | 
					
						
							|  |  |  | ** | 
					
						
							|  |  |  | ****************************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "googletest.h"
 | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  | #include "mockfilesystem.h"
 | 
					
						
							| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include <filepathcaching.h>
 | 
					
						
							|  |  |  | #include <filestatuscache.h>
 | 
					
						
							|  |  |  | #include <refactoringdatabaseinitializer.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <QDateTime>
 | 
					
						
							|  |  |  | #include <QFileInfo>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <fstream>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using ClangBackEnd::FilePathId; | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  | using ClangBackEnd::FilePathIds; | 
					
						
							| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | class FileStatusCache : public testing::Test | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | protected: | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  |     FileStatusCache() | 
					
						
							| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  |         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)); | 
					
						
							| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | protected: | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  |     NiceMock<MockFileSystem> fileSystem; | 
					
						
							|  |  |  |     ClangBackEnd::FileStatusCache cache{fileSystem}; | 
					
						
							|  |  |  |     FilePathId header{1}; | 
					
						
							|  |  |  |     FilePathId source{2}; | 
					
						
							|  |  |  |     FilePathId header2{3}; | 
					
						
							|  |  |  |     FilePathId source2{4}; | 
					
						
							|  |  |  |     FilePathIds entries{header, source, header2, source2}; | 
					
						
							|  |  |  |     long long headerLastModifiedTime = 100; | 
					
						
							|  |  |  |     long long headerLastModifiedTime2 = 110; | 
					
						
							|  |  |  |     long long header2LastModifiedTime = 300; | 
					
						
							|  |  |  |     long long header2LastModifiedTime2 = 310; | 
					
						
							|  |  |  |     long long sourceLastModifiedTime = 200; | 
					
						
							|  |  |  |     long long source2LastModifiedTime = 400; | 
					
						
							| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, CreateEntry) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache, SizeIs(1)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, AskCreatedEntryForLastModifiedTime) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto lastModified = cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(lastModified, headerLastModifiedTime); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, AskCachedEntryForLastModifiedTime) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto lastModified = cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(lastModified, headerLastModifiedTime); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, DontAddEntryTwice) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache, SizeIs(1)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, AddNewEntry) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cache.lastModifiedTime(source); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache, SizeIs(2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, AskNewEntryForLastModifiedTime) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto lastModified = cache.lastModifiedTime(source); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(lastModified, sourceLastModifiedTime); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, AddNewEntryReverseOrder) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.lastModifiedTime(source); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache, SizeIs(2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, AskNewEntryReverseOrderAddedForLastModifiedTime) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.lastModifiedTime(source); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto lastModified = cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(lastModified, headerLastModifiedTime); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, UpdateFile) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  |     EXPECT_CALL(fileSystem, lastModified(Eq(header))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime)) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime2)); | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     cache.update(header); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  |     ASSERT_THAT(cache.lastModifiedTime(header), headerLastModifiedTime2); | 
					
						
							| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, UpdateFileDoesNotChangeEntryCount) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  |     EXPECT_CALL(fileSystem, lastModified(Eq(header))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime)) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime2)); | 
					
						
							| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cache.update(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache, SizeIs(1)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, UpdateFileForNonExistingEntry) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.update(header); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache, SizeIs(0)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  | TEST_F(FileStatusCache, UpdateFiles) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(Eq(header))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime)) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime2)); | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(Eq(header2))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillOnce(Return(header2LastModifiedTime)) | 
					
						
							|  |  |  |         .WillOnce(Return(header2LastModifiedTime2)); | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  |     cache.lastModifiedTime(header2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cache.update(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache.lastModifiedTime(header), headerLastModifiedTime2); | 
					
						
							|  |  |  |     ASSERT_THAT(cache.lastModifiedTime(header2), header2LastModifiedTime2); | 
					
						
							| 
									
										
										
										
											2018-02-08 17:49:02 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-06-06 10:57:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, UpdateFilesDoesNotChangeEntryCount) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(Eq(header))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime)) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime2)); | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(Eq(header2))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillOnce(Return(header2LastModifiedTime)) | 
					
						
							|  |  |  |         .WillOnce(Return(header2LastModifiedTime2)); | 
					
						
							|  |  |  |     cache.lastModifiedTime(header); | 
					
						
							|  |  |  |     cache.lastModifiedTime(header2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cache.update(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache, SizeIs(2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, UpdateFilesForNonExistingEntry) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.update(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache, SizeIs(0)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, NewModifiedEntries) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto modifiedIds = cache.modified(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(modifiedIds, entries); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, NoNewModifiedEntries) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.modified(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto modifiedIds = cache.modified(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(modifiedIds, IsEmpty()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, SomeNewModifiedEntries) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     cache.modified({source, header2}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto modifiedIds = cache.modified(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(modifiedIds, ElementsAre(header, source2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, SomeAlreadyExistingModifiedEntries) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(Eq(header))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime)) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime2)); | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(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))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillRepeatedly(Return(source2LastModifiedTime)); | 
					
						
							|  |  |  |     cache.modified(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto modifiedIds = cache.modified(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(modifiedIds, ElementsAre(header, header2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, SomeAlreadyExistingAndSomeNewModifiedEntries) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(Eq(header))).WillRepeatedly(Return(headerLastModifiedTime)); | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(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)); | 
					
						
							|  |  |  |     cache.modified({source, header2}); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto modifiedIds = cache.modified(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(modifiedIds, ElementsAre(header, header2, source2)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TEST_F(FileStatusCache, TimeIsUpdatedForSomeAlreadyExistingModifiedEntries) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(Eq(header))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime)) | 
					
						
							|  |  |  |         .WillOnce(Return(headerLastModifiedTime2)); | 
					
						
							|  |  |  |     EXPECT_CALL(fileSystem, lastModified(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))) | 
					
						
							|  |  |  |         .Times(2) | 
					
						
							|  |  |  |         .WillRepeatedly(Return(source2LastModifiedTime)); | 
					
						
							|  |  |  |     cache.modified(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cache.modified(entries); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ASSERT_THAT(cache.lastModifiedTime(header), headerLastModifiedTime2); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // namespace
 |