15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/bind.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/connection.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/statement.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/sqlite/sqlite3.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that certain features are/are-not enabled in our SQLite. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void CaptureErrorCallback(int* error_pointer, std::string* sql_text, 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int error, sql::Statement* stmt) { 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *error_pointer = error; 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const char* text = stmt ? stmt->GetSQLStatement() : NULL; 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *sql_text = text ? text : "no statement available"; 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SQLiteFeaturesTest : public testing::Test { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLiteFeaturesTest() : error_(SQLITE_OK) {} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db_.Open(temp_dir_.path().AppendASCII("SQLStatementTest.db"))); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The error delegate will set |error_| and |sql_text_| when any sqlite 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // statement operation returns an error code. 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) db_.set_error_callback(base::Bind(&CaptureErrorCallback, 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) &error_, &sql_text_)); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void TearDown() { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If any error happened the original sql statement can be found in 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |sql_text_|. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SQLITE_OK, error_); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) db_.Close(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Connection& db() { return db_; } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Connection db_; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The error code of the most recent error. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Original statement which has caused the error. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string sql_text_; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Do not include fts1 support, it is not useful, and nobody is 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// looking at it. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SQLiteFeaturesTest, NoFTS1) { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(SQLITE_ERROR, db().ExecuteAndReturnErrorCode( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "CREATE VIRTUAL TABLE foo USING fts1(x)")); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_IOS) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fts2 is used for older history files, so we're signed on for keeping our 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// version up-to-date. iOS does not include fts2, so this test does not run on 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iOS. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(shess): Think up a crazy way to get out from having to support 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this forever. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SQLiteFeaturesTest, FTS2) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db().Execute("CREATE VIRTUAL TABLE foo USING fts2(x)")); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fts3 is used for current history files, and also for WebDatabase. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SQLiteFeaturesTest, FTS3) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(db().Execute("CREATE VIRTUAL TABLE foo USING fts3(x)")); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 83