| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "app/sql/connection.h" |
| #include "app/sql/statement.h" |
| #include "base/file_util.h" |
| #include "base/memory/scoped_temp_dir.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/sqlite/sqlite3.h" |
| |
| class SQLConnectionTest : public testing::Test { |
| public: |
| SQLConnectionTest() {} |
| |
| void SetUp() { |
| ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| ASSERT_TRUE(db_.Open(temp_dir_.path().AppendASCII("SQLConnectionTest.db"))); |
| } |
| |
| void TearDown() { |
| db_.Close(); |
| } |
| |
| sql::Connection& db() { return db_; } |
| |
| private: |
| ScopedTempDir temp_dir_; |
| sql::Connection db_; |
| }; |
| |
| TEST_F(SQLConnectionTest, Execute) { |
| // Valid statement should return true. |
| ASSERT_TRUE(db().Execute("CREATE TABLE foo (a, b)")); |
| EXPECT_EQ(SQLITE_OK, db().GetErrorCode()); |
| |
| // Invalid statement should fail. |
| ASSERT_FALSE(db().Execute("CREATE TAB foo (a, b")); |
| EXPECT_EQ(SQLITE_ERROR, db().GetErrorCode()); |
| } |
| |
| TEST_F(SQLConnectionTest, CachedStatement) { |
| sql::StatementID id1("foo", 12); |
| |
| ASSERT_TRUE(db().Execute("CREATE TABLE foo (a, b)")); |
| ASSERT_TRUE(db().Execute("INSERT INTO foo(a, b) VALUES (12, 13)")); |
| |
| // Create a new cached statement. |
| { |
| sql::Statement s(db().GetCachedStatement(id1, "SELECT a FROM foo")); |
| ASSERT_FALSE(!s); // Test ! operator for validity. |
| |
| ASSERT_TRUE(s.Step()); |
| EXPECT_EQ(12, s.ColumnInt(0)); |
| } |
| |
| // The statement should be cached still. |
| EXPECT_TRUE(db().HasCachedStatement(id1)); |
| |
| { |
| // Get the same statement using different SQL. This should ignore our |
| // SQL and use the cached one (so it will be valid). |
| sql::Statement s(db().GetCachedStatement(id1, "something invalid(")); |
| ASSERT_FALSE(!s); // Test ! operator for validity. |
| |
| ASSERT_TRUE(s.Step()); |
| EXPECT_EQ(12, s.ColumnInt(0)); |
| } |
| |
| // Make sure other statements aren't marked as cached. |
| EXPECT_FALSE(db().HasCachedStatement(SQL_FROM_HERE)); |
| } |
| |
| TEST_F(SQLConnectionTest, DoesStuffExist) { |
| // Test DoesTableExist. |
| EXPECT_FALSE(db().DoesTableExist("foo")); |
| ASSERT_TRUE(db().Execute("CREATE TABLE foo (a, b)")); |
| EXPECT_TRUE(db().DoesTableExist("foo")); |
| |
| // Should be case sensitive. |
| EXPECT_FALSE(db().DoesTableExist("FOO")); |
| |
| // Test DoesColumnExist. |
| EXPECT_FALSE(db().DoesColumnExist("foo", "bar")); |
| EXPECT_TRUE(db().DoesColumnExist("foo", "a")); |
| |
| // Testing for a column on a nonexistent table. |
| EXPECT_FALSE(db().DoesColumnExist("bar", "b")); |
| } |
| |
| TEST_F(SQLConnectionTest, GetLastInsertRowId) { |
| ASSERT_TRUE(db().Execute("CREATE TABLE foo (id INTEGER PRIMARY KEY, value)")); |
| |
| ASSERT_TRUE(db().Execute("INSERT INTO foo (value) VALUES (12)")); |
| |
| // Last insert row ID should be valid. |
| int64 row = db().GetLastInsertRowId(); |
| EXPECT_LT(0, row); |
| |
| // It should be the primary key of the row we just inserted. |
| sql::Statement s(db().GetUniqueStatement("SELECT value FROM foo WHERE id=?")); |
| s.BindInt64(0, row); |
| ASSERT_TRUE(s.Step()); |
| EXPECT_EQ(12, s.ColumnInt(0)); |
| } |
| |