blob: c5ee8b6ee5ff032073c30343e7335bd3352bb45e [file] [log] [blame]
Mickey Sweatt7f177902015-06-10 17:20:19 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Junxiao Shi72c0c642018-04-20 15:41:09 +00002/*
3 * Copyright (c) 2013-2018 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
Davide Pesavento7e780642018-11-24 15:51:34 -050022#include "ndn-cxx/util/sqlite3-statement.hpp"
Mickey Sweatt7f177902015-06-10 17:20:19 -070023
Davide Pesavento7e780642018-11-24 15:51:34 -050024#include "tests/boost-test.hpp"
Mickey Sweatt7f177902015-06-10 17:20:19 -070025
Davide Pesaventoeee3e822016-11-26 19:19:34 +010026#include <boost/filesystem.hpp>
Davide Pesaventoe1789892017-02-26 15:50:52 -050027#include <cstring>
Mickey Sweatt7f177902015-06-10 17:20:19 -070028#include <sqlite3.h>
29
30namespace ndn {
31namespace util {
32namespace tests {
33
34class Sqlite3StatementTestFixture
35{
36public:
37 Sqlite3StatementTestFixture()
38 : m_path(boost::filesystem::path(UNIT_TEST_CONFIG_PATH))
39 {
40 boost::filesystem::create_directories(m_path);
41 int result = sqlite3_open_v2((m_path / "sqlite3-statement.db").string().c_str(), &db,
42 SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
43#ifdef NDN_CXX_DISABLE_SQLITE3_FS_LOCKING
44 "unix-dotfile"
45#else
46 nullptr
47#endif
48 );
49
50 if (result != SQLITE_OK) {
51 BOOST_FAIL("Sqlite3 database cannot be opened/created: " + m_path.string());
52 }
53 }
54
55 ~Sqlite3StatementTestFixture()
56 {
57 sqlite3_close(db);
58 boost::filesystem::remove_all(m_path);
59 }
60
61private:
62 boost::filesystem::path m_path;
63
64public:
65 sqlite3* db;
66};
67
Davide Pesaventoeee3e822016-11-26 19:19:34 +010068BOOST_AUTO_TEST_SUITE(Util)
69BOOST_FIXTURE_TEST_SUITE(TestSqlite3Statement, Sqlite3StatementTestFixture)
Mickey Sweatt7f177902015-06-10 17:20:19 -070070
71BOOST_AUTO_TEST_CASE(Basic)
72{
73 // create table
74 BOOST_CHECK_NO_THROW(Sqlite3Statement(db, "CREATE TABLE test (t1 int, t2 text)").step());
75
76 // insert data into table
77 BOOST_CHECK_NO_THROW(Sqlite3Statement(db, "INSERT INTO test VALUES (1, 'test1')").step());
78
79 {
80 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (2, ?)");
81 stmt.bind(1, "test2", std::strlen("test2"), SQLITE_STATIC);
82 stmt.step();
83 }
84
85 {
86 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (3, ?)");
87 stmt.bind(1, "test3", SQLITE_TRANSIENT);
88 stmt.step();
89 }
90
91 Block block(100);
92 block.encode();
93 {
94 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (4, ?)");
95 stmt.bind(1, block, SQLITE_STATIC);
96 stmt.step();
97 }
98
99 {
100 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (5, ?)");
101 stmt.bind(1, reinterpret_cast<const void*>(block.wire()), block.size(), SQLITE_STATIC);
102 stmt.step();
103 }
104
105 {
106 Sqlite3Statement stmt(db, "INSERT INTO test VALUES (?, ?)");
107 stmt.bind(1, 6);
108 stmt.bind(2, "test", SQLITE_TRANSIENT);
109 stmt.step();
110 }
111
112 // check content of the table
113
114 {
115 Sqlite3Statement stmt(db, "SELECT count(*) FROM test");
116 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
117 BOOST_CHECK_EQUAL(stmt.getInt(0), 6);
118 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_DONE);
119 }
120
121 {
122 Sqlite3Statement stmt(db, "SELECT t1, t2 FROM test ORDER BY t1");
123 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
124 BOOST_CHECK_EQUAL(stmt.getInt(0), 1);
125 BOOST_CHECK_EQUAL(stmt.getString(1), "test1");
126
127 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
128 BOOST_CHECK_EQUAL(stmt.getInt(0), 2);
129 BOOST_CHECK_EQUAL(stmt.getString(1), "test2");
130
131 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
132 BOOST_CHECK_EQUAL(stmt.getInt(0), 3);
133 BOOST_CHECK_EQUAL(stmt.getString(1), "test3");
134
135 BOOST_CHECK_EQUAL(stmt.step(), SQLITE_ROW);
136 BOOST_CHECK_EQUAL(stmt.getInt(0), 4);
137
Junxiao Shi72c0c642018-04-20 15:41:09 +0000138 Block newBlock = stmt.getBlock(1);
Mickey Sweatt7f177902015-06-10 17:20:19 -0700139 BOOST_CHECK_EQUAL(newBlock.type(), 100);
Junxiao Shi72c0c642018-04-20 15:41:09 +0000140 BOOST_CHECK_EQUAL(newBlock, block);
Mickey Sweatt7f177902015-06-10 17:20:19 -0700141
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