summaryrefslogtreecommitdiffstats
path: root/app/sql/connection_unittest.cc
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-11 21:30:56 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-11 21:30:56 +0000
commite5ffd0e471417e75ddcd5af20c3254c0ec2f1f5d (patch)
tree60e8d7c1de4ee33cc063cfa98a168e8fe9fcf27b /app/sql/connection_unittest.cc
parent92c3dc6b3fffbaf9fa2fa409120ca051bf317234 (diff)
downloadchromium_src-e5ffd0e471417e75ddcd5af20c3254c0ec2f1f5d.zip
chromium_src-e5ffd0e471417e75ddcd5af20c3254c0ec2f1f5d.tar.gz
chromium_src-e5ffd0e471417e75ddcd5af20c3254c0ec2f1f5d.tar.bz2
Add a new wrapper for sqlite. This is mostly a large cleanup of the existing
one, combined with the statement cache in a nice way. It is designed to entirely wrap sqlite so that we can catch corrupt errors in the future and "do something" when we get them without having to change all the calling code. There is also a new meta_table file which is almost exactly like the old one but which uses the new sql interface. This patch changes Chrome's history TextDatabase to use this new wrapper as a proof of concept, because this usage is relatively well-confined. Review URL: http://codereview.chromium.org/199047 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26022 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app/sql/connection_unittest.cc')
-rw-r--r--app/sql/connection_unittest.cc113
1 files changed, 113 insertions, 0 deletions
diff --git a/app/sql/connection_unittest.cc b/app/sql/connection_unittest.cc
new file mode 100644
index 0000000..70c9ffc
--- /dev/null
+++ b/app/sql/connection_unittest.cc
@@ -0,0 +1,113 @@
+// Copyright (c) 2009 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_path.h"
+#include "base/file_util.h"
+#include "base/path_service.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/sqlite/preprocessed/sqlite3.h"
+
+class SQLConnectionTest : public testing::Test {
+ public:
+ SQLConnectionTest() {}
+
+ void SetUp() {
+ ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &path_));
+ path_ = path_.AppendASCII("SQLConnectionTest.db");
+ file_util::Delete(path_, false);
+ ASSERT_TRUE(db_.Init(path_));
+ }
+
+ void TearDown() {
+ db_.Close();
+
+ // If this fails something is going on with cleanup and later tests may
+ // fail, so we want to identify problems right away.
+ ASSERT_TRUE(file_util::Delete(path_, false));
+ }
+
+ sql::Connection& db() { return db_; }
+
+ private:
+ FilePath path_;
+ 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 nonexistant 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));
+}
+