blob: b440f7a8094ce60def315893b4ce4c1f5d3bc147 [file] [log] [blame]
Mickey Sweatt7f177902015-06-10 17:20:19 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Davide Pesaventoeee3e822016-11-26 19:19:34 +01003 * Copyright (c) 2013-2016 Regents of the University of California.
Mickey Sweatt7f177902015-06-10 17:20:19 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
22#include "util/sqlite3-statement.hpp"
23
Mickey Sweatt7f177902015-06-10 17:20:19 -070024#include "boost-test.hpp"
25
Davide Pesaventoeee3e822016-11-26 19:19:34 +010026#include <boost/filesystem.hpp>
Mickey Sweatt7f177902015-06-10 17:20:19 -070027#include <sqlite3.h>
28
29namespace ndn {
30namespace util {
31namespace tests {
32
33class Sqlite3StatementTestFixture
34{
35public:
36 Sqlite3StatementTestFixture()
37 : m_path(boost::filesystem::path(UNIT_TEST_CONFIG_PATH))
38 {
39 boost::filesystem::create_directories(m_path);
40 int result = sqlite3_open_v2((m_path / "sqlite3-statement.db").string().c_str(), &db,
41 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
42#ifdef NDN_CXX_DISABLE_SQLITE3_FS_LOCKING
43 "unix-dotfile"
44#else
45 nullptr
46#endif
47 );
48
49 if (result != SQLITE_OK) {
50 BOOST_FAIL("Sqlite3 database cannot be opened/created: " + m_path.string());
51 }
52 }
53
54 ~Sqlite3StatementTestFixture()
55 {
56 sqlite3_close(db);
57 boost::filesystem::remove_all(m_path);
58 }
59
60private:
61 boost::filesystem::path m_path;
62
63public:
64 sqlite3* db;
65};
66
Davide Pesaventoeee3e822016-11-26 19:19:34 +010067BOOST_AUTO_TEST_SUITE(Util)
68BOOST_FIXTURE_TEST_SUITE(TestSqlite3Statement, Sqlite3StatementTestFixture)
Mickey Sweatt7f177902015-06-10 17:20:19 -070069
70BOOST_AUTO_TEST_CASE(Basic)
71{
72 // create table
73 BOOST_CHECK_NO_THROW(Sqlite3Statement(db, "CREATE TABLE test (t1 int, t2 text)").step());
74
75 // insert data into table
76 BOOST_CHECK_NO_THROW(Sqlite3Statement(db, "INSERT INTO test VALUES (1, 'test1')").step());
77
78 {
79 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (2, ?)");
80 stmt.bind(1, "test2", std::strlen("test2"), SQLITE_STATIC);
81 stmt.step();
82 }
83
84 {
85 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (3, ?)");
86 stmt.bind(1, "test3", SQLITE_TRANSIENT);
87 stmt.step();
88 }
89
90 Block block(100);
91 block.encode();
92 {
93 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (4, ?)");
94 stmt.bind(1, block, SQLITE_STATIC);
95 stmt.step();
96 }
97
98 {
99 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (5, ?)");
100 stmt.bind(1, reinterpret_cast<const void*>(block.wire()), block.size(), SQLITE_STATIC);
101 stmt.step();
102 }
103
104 {
105 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (?, ?)");
106 stmt.bind(1, 6);
107 stmt.bind(2, "test", SQLITE_TRANSIENT);
108 stmt.step();
109 }
110
111 // check content of the table
112
113 {
114 Sqlite3Statement stmt(db, "SELECT count(*) FROM test");
115 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
116 BOOST_CHECK_EQUAL(stmt.getInt(0), 6);
117 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_DONE);
118 }
119
120 {
121 Sqlite3Statement stmt(db, "SELECT t1, t2 FROM test ORDER BY t1");
122 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
123 BOOST_CHECK_EQUAL(stmt.getInt(0), 1);
124 BOOST_CHECK_EQUAL(stmt.getString(1), "test1");
125
126 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
127 BOOST_CHECK_EQUAL(stmt.getInt(0), 2);
128 BOOST_CHECK_EQUAL(stmt.getString(1), "test2");
129
130 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
131 BOOST_CHECK_EQUAL(stmt.getInt(0), 3);
132 BOOST_CHECK_EQUAL(stmt.getString(1), "test3");
133
134 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
135 BOOST_CHECK_EQUAL(stmt.getInt(0), 4);
136
137 Block newBlock;
138 BOOST_CHECK_NO_THROW(newBlock = stmt.getBlock(1));
139 BOOST_CHECK_EQUAL(newBlock.type(), 100);
140 BOOST_CHECK(newBlock == block);
141
142 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
143 BOOST_CHECK_EQUAL(stmt.getInt(0), 5);
144 BOOST_CHECK_EQUAL(stmt.getSize(1), block.size());
145 BOOST_CHECK_EQUAL_COLLECTIONS(block.begin(), block.end(),
146 stmt.getBlob(1), stmt.getBlob(1) + stmt.getSize(1));
147
148 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
149 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_DONE);
150 }
151}
152
Davide Pesaventoeee3e822016-11-26 19:19:34 +0100153BOOST_AUTO_TEST_SUITE_END() // TestSqlite3Statement
154BOOST_AUTO_TEST_SUITE_END() // Util
Mickey Sweatt7f177902015-06-10 17:20:19 -0700155
156} // namespace tests
157} // namespace util
158} // namespace ndn