2018-02-20 12:43:05 +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"
# include "mocksqlitedatabase.h"
# include <precompiledheaderstorage.h>
# include <refactoringdatabaseinitializer.h>
# include <sqlitedatabase.h>
# include <sqlitewritestatement.h>
2018-03-28 16:25:01 +02:00
# include <sqlitetransaction.h>
2018-02-20 12:43:05 +01:00
namespace {
2018-09-11 17:02:45 +02:00
using Storage = ClangBackEnd : : PrecompiledHeaderStorage < NiceMock < MockSqliteDatabase > > ;
2018-02-20 12:43:05 +01:00
class PrecompiledHeaderStorage : public testing : : Test
{
protected :
NiceMock < MockSqliteDatabase > database ;
Storage storage { database } ;
MockSqliteWriteStatement & insertPrecompiledHeaderStatement = storage . m_insertPrecompiledHeaderStatement ;
MockSqliteWriteStatement & insertProjectPartStatement = storage . m_insertProjectPartStatement ;
MockSqliteWriteStatement & deletePrecompiledHeaderStatement = storage . m_deletePrecompiledHeaderStatement ;
} ;
TEST_F ( PrecompiledHeaderStorage , UseTransaction )
{
InSequence s ;
EXPECT_CALL ( database , immediateBegin ( ) ) ;
EXPECT_CALL ( database , commit ( ) ) ;
Storage storage { database } ;
}
TEST_F ( PrecompiledHeaderStorage , InsertPrecompiledHeader )
{
InSequence s ;
2018-03-28 16:25:01 +02:00
EXPECT_CALL ( database , immediateBegin ( ) ) ;
EXPECT_CALL ( insertProjectPartStatement , write ( TypedEq < Utils : : SmallStringView > ( " project1 " ) ) ) ;
EXPECT_CALL ( insertPrecompiledHeaderStatement ,
write ( TypedEq < Utils : : SmallStringView > ( " project1 " ) ,
TypedEq < Utils : : SmallStringView > ( " /path/to/pch " ) ,
TypedEq < long long > ( 22 ) ) ) ;
EXPECT_CALL ( database , commit ( ) ) ;
storage . insertPrecompiledHeader ( " project1 " , " /path/to/pch " , 22 ) ;
}
TEST_F ( PrecompiledHeaderStorage , InsertPrecompiledHeaderStatementIsBusy )
{
InSequence s ;
EXPECT_CALL ( database , immediateBegin ( ) ) . WillOnce ( Throw ( Sqlite : : StatementIsBusy ( " busy " ) ) ) ;
EXPECT_CALL ( database , immediateBegin ( ) ) ;
2018-02-20 12:43:05 +01:00
EXPECT_CALL ( insertProjectPartStatement , write ( TypedEq < Utils : : SmallStringView > ( " project1 " ) ) ) ;
EXPECT_CALL ( insertPrecompiledHeaderStatement ,
write ( TypedEq < Utils : : SmallStringView > ( " project1 " ) ,
TypedEq < Utils : : SmallStringView > ( " /path/to/pch " ) ,
TypedEq < long long > ( 22 ) ) ) ;
2018-03-28 16:25:01 +02:00
EXPECT_CALL ( database , commit ( ) ) ;
2018-02-20 12:43:05 +01:00
storage . insertPrecompiledHeader ( " project1 " , " /path/to/pch " , 22 ) ;
}
TEST_F ( PrecompiledHeaderStorage , DeletePrecompiledHeader )
{
InSequence s ;
2018-03-28 16:25:01 +02:00
EXPECT_CALL ( database , immediateBegin ( ) ) ;
EXPECT_CALL ( deletePrecompiledHeaderStatement , write ( TypedEq < Utils : : SmallStringView > ( " project1 " ) ) ) ;
EXPECT_CALL ( database , commit ( ) ) ;
storage . deletePrecompiledHeader ( " project1 " ) ;
}
TEST_F ( PrecompiledHeaderStorage , DeletePrecompiledHeaderStatementIsBusy )
{
InSequence s ;
EXPECT_CALL ( database , immediateBegin ( ) ) . WillOnce ( Throw ( Sqlite : : StatementIsBusy ( " busy " ) ) ) ;
EXPECT_CALL ( database , immediateBegin ( ) ) ;
2018-02-20 12:43:05 +01:00
EXPECT_CALL ( deletePrecompiledHeaderStatement , write ( TypedEq < Utils : : SmallStringView > ( " project1 " ) ) ) ;
2018-03-28 16:25:01 +02:00
EXPECT_CALL ( database , commit ( ) ) ;
2018-02-20 12:43:05 +01:00
storage . deletePrecompiledHeader ( " project1 " ) ;
}
TEST_F ( PrecompiledHeaderStorage , InsertPrecompiledHeaderStatement )
{
ASSERT_THAT ( insertPrecompiledHeaderStatement . sqlStatement ,
Eq ( " INSERT OR REPLACE INTO precompiledHeaders(projectPartId, pchPath, pchBuildTime) VALUES((SELECT projectPartId FROM projectParts WHERE projectPartName = ?),?,?) " ) ) ;
}
TEST_F ( PrecompiledHeaderStorage , InsertProjectPartStatement )
{
ASSERT_THAT ( insertProjectPartStatement . sqlStatement ,
Eq ( " INSERT OR IGNORE INTO projectParts(projectPartName) VALUES (?) " ) ) ;
}
TEST_F ( PrecompiledHeaderStorage , DeletePrecompiledHeaderStatement )
{
ASSERT_THAT ( deletePrecompiledHeaderStatement . sqlStatement ,
Eq ( " DELETE FROM precompiledHeaders WHERE projectPartId = (SELECT projectPartId FROM projectParts WHERE projectPartName = ?) " ) ) ;
}
TEST_F ( PrecompiledHeaderStorage , CompilePrecompiledHeaderStatements )
{
Sqlite : : Database database { " :memory: " , Sqlite : : JournalMode : : Memory } ;
ClangBackEnd : : RefactoringDatabaseInitializer < Sqlite : : Database > initializer { database } ;
2018-09-11 17:02:45 +02:00
ASSERT_NO_THROW ( ClangBackEnd : : PrecompiledHeaderStorage < > { database } ) ;
2018-02-20 12:43:05 +01:00
}
}