1*b0d29bc4SBrooks Davis // Copyright 2011 The Kyua Authors.
2*b0d29bc4SBrooks Davis // All rights reserved.
3*b0d29bc4SBrooks Davis //
4*b0d29bc4SBrooks Davis // Redistribution and use in source and binary forms, with or without
5*b0d29bc4SBrooks Davis // modification, are permitted provided that the following conditions are
6*b0d29bc4SBrooks Davis // met:
7*b0d29bc4SBrooks Davis //
8*b0d29bc4SBrooks Davis // * Redistributions of source code must retain the above copyright
9*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer.
10*b0d29bc4SBrooks Davis // * Redistributions in binary form must reproduce the above copyright
11*b0d29bc4SBrooks Davis //   notice, this list of conditions and the following disclaimer in the
12*b0d29bc4SBrooks Davis //   documentation and/or other materials provided with the distribution.
13*b0d29bc4SBrooks Davis // * Neither the name of Google Inc. nor the names of its contributors
14*b0d29bc4SBrooks Davis //   may be used to endorse or promote products derived from this software
15*b0d29bc4SBrooks Davis //   without specific prior written permission.
16*b0d29bc4SBrooks Davis //
17*b0d29bc4SBrooks Davis // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*b0d29bc4SBrooks Davis // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*b0d29bc4SBrooks Davis // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*b0d29bc4SBrooks Davis // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*b0d29bc4SBrooks Davis // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*b0d29bc4SBrooks Davis // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*b0d29bc4SBrooks Davis // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*b0d29bc4SBrooks Davis // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*b0d29bc4SBrooks Davis // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*b0d29bc4SBrooks Davis // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*b0d29bc4SBrooks Davis // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*b0d29bc4SBrooks Davis 
29*b0d29bc4SBrooks Davis #include "store/write_transaction.hpp"
30*b0d29bc4SBrooks Davis 
31*b0d29bc4SBrooks Davis #include <cstring>
32*b0d29bc4SBrooks Davis #include <map>
33*b0d29bc4SBrooks Davis #include <string>
34*b0d29bc4SBrooks Davis 
35*b0d29bc4SBrooks Davis #include <atf-c++.hpp>
36*b0d29bc4SBrooks Davis 
37*b0d29bc4SBrooks Davis #include "model/context.hpp"
38*b0d29bc4SBrooks Davis #include "model/metadata.hpp"
39*b0d29bc4SBrooks Davis #include "model/test_case.hpp"
40*b0d29bc4SBrooks Davis #include "model/test_program.hpp"
41*b0d29bc4SBrooks Davis #include "model/test_result.hpp"
42*b0d29bc4SBrooks Davis #include "store/exceptions.hpp"
43*b0d29bc4SBrooks Davis #include "store/write_backend.hpp"
44*b0d29bc4SBrooks Davis #include "utils/datetime.hpp"
45*b0d29bc4SBrooks Davis #include "utils/fs/path.hpp"
46*b0d29bc4SBrooks Davis #include "utils/logging/operations.hpp"
47*b0d29bc4SBrooks Davis #include "utils/optional.ipp"
48*b0d29bc4SBrooks Davis #include "utils/sqlite/database.hpp"
49*b0d29bc4SBrooks Davis #include "utils/sqlite/exceptions.hpp"
50*b0d29bc4SBrooks Davis #include "utils/sqlite/statement.ipp"
51*b0d29bc4SBrooks Davis 
52*b0d29bc4SBrooks Davis namespace datetime = utils::datetime;
53*b0d29bc4SBrooks Davis namespace fs = utils::fs;
54*b0d29bc4SBrooks Davis namespace logging = utils::logging;
55*b0d29bc4SBrooks Davis namespace sqlite = utils::sqlite;
56*b0d29bc4SBrooks Davis 
57*b0d29bc4SBrooks Davis using utils::optional;
58*b0d29bc4SBrooks Davis 
59*b0d29bc4SBrooks Davis 
60*b0d29bc4SBrooks Davis namespace {
61*b0d29bc4SBrooks Davis 
62*b0d29bc4SBrooks Davis 
63*b0d29bc4SBrooks Davis /// Performs a test for a working put_result
64*b0d29bc4SBrooks Davis ///
65*b0d29bc4SBrooks Davis /// \param result The result object to put.
66*b0d29bc4SBrooks Davis /// \param result_type The textual name of the result to expect in the
67*b0d29bc4SBrooks Davis ///     database.
68*b0d29bc4SBrooks Davis /// \param exp_reason The reason to expect in the database.  This is separate
69*b0d29bc4SBrooks Davis ///     from the result parameter so that we can handle passed() here as well.
70*b0d29bc4SBrooks Davis ///     Just provide NULL in this case.
71*b0d29bc4SBrooks Davis static void
do_put_result_ok_test(const model::test_result & result,const char * result_type,const char * exp_reason)72*b0d29bc4SBrooks Davis do_put_result_ok_test(const model::test_result& result,
73*b0d29bc4SBrooks Davis                       const char* result_type, const char* exp_reason)
74*b0d29bc4SBrooks Davis {
75*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
76*b0d29bc4SBrooks Davis         fs::path("test.db"));
77*b0d29bc4SBrooks Davis     backend.database().exec("PRAGMA foreign_keys = OFF");
78*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
79*b0d29bc4SBrooks Davis     const datetime::timestamp start_time = datetime::timestamp::from_values(
80*b0d29bc4SBrooks Davis         2012, 01, 30, 22, 10, 00, 0);
81*b0d29bc4SBrooks Davis     const datetime::timestamp end_time = datetime::timestamp::from_values(
82*b0d29bc4SBrooks Davis         2012, 01, 30, 22, 15, 30, 123456);
83*b0d29bc4SBrooks Davis     tx.put_result(result, 312, start_time, end_time);
84*b0d29bc4SBrooks Davis     tx.commit();
85*b0d29bc4SBrooks Davis 
86*b0d29bc4SBrooks Davis     sqlite::statement stmt = backend.database().create_statement(
87*b0d29bc4SBrooks Davis         "SELECT test_case_id, result_type, result_reason "
88*b0d29bc4SBrooks Davis         "FROM test_results");
89*b0d29bc4SBrooks Davis 
90*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
91*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(312, stmt.column_int64(0));
92*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(result_type, stmt.column_text(1));
93*b0d29bc4SBrooks Davis     if (exp_reason != NULL)
94*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(exp_reason, stmt.column_text(2));
95*b0d29bc4SBrooks Davis     else
96*b0d29bc4SBrooks Davis         ATF_REQUIRE(stmt.column_type(2) == sqlite::type_null);
97*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
98*b0d29bc4SBrooks Davis }
99*b0d29bc4SBrooks Davis 
100*b0d29bc4SBrooks Davis 
101*b0d29bc4SBrooks Davis }  // anonymous namespace
102*b0d29bc4SBrooks Davis 
103*b0d29bc4SBrooks Davis 
104*b0d29bc4SBrooks Davis ATF_TEST_CASE(commit__ok);
ATF_TEST_CASE_HEAD(commit__ok)105*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(commit__ok)
106*b0d29bc4SBrooks Davis {
107*b0d29bc4SBrooks Davis     logging::set_inmemory();
108*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
109*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(commit__ok)110*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(commit__ok)
111*b0d29bc4SBrooks Davis {
112*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
113*b0d29bc4SBrooks Davis         fs::path("test.db"));
114*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
115*b0d29bc4SBrooks Davis     backend.database().exec("CREATE TABLE a (b INTEGER PRIMARY KEY)");
116*b0d29bc4SBrooks Davis     backend.database().exec("SELECT * FROM a");
117*b0d29bc4SBrooks Davis     tx.commit();
118*b0d29bc4SBrooks Davis     backend.database().exec("SELECT * FROM a");
119*b0d29bc4SBrooks Davis }
120*b0d29bc4SBrooks Davis 
121*b0d29bc4SBrooks Davis 
122*b0d29bc4SBrooks Davis ATF_TEST_CASE(commit__fail);
ATF_TEST_CASE_HEAD(commit__fail)123*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(commit__fail)
124*b0d29bc4SBrooks Davis {
125*b0d29bc4SBrooks Davis     logging::set_inmemory();
126*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
127*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(commit__fail)128*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(commit__fail)
129*b0d29bc4SBrooks Davis {
130*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
131*b0d29bc4SBrooks Davis         fs::path("test.db"));
132*b0d29bc4SBrooks Davis     const model::context context(fs::path("/foo/bar"),
133*b0d29bc4SBrooks Davis                                  std::map< std::string, std::string >());
134*b0d29bc4SBrooks Davis     {
135*b0d29bc4SBrooks Davis         store::write_transaction tx = backend.start_write();
136*b0d29bc4SBrooks Davis         tx.put_context(context);
137*b0d29bc4SBrooks Davis         backend.database().exec(
138*b0d29bc4SBrooks Davis             "CREATE TABLE foo ("
139*b0d29bc4SBrooks Davis             "a REFERENCES env_vars(var_name) DEFERRABLE INITIALLY DEFERRED)");
140*b0d29bc4SBrooks Davis         backend.database().exec("INSERT INTO foo VALUES (\"WHAT\")");
141*b0d29bc4SBrooks Davis         ATF_REQUIRE_THROW(store::error, tx.commit());
142*b0d29bc4SBrooks Davis     }
143*b0d29bc4SBrooks Davis     // If the code attempts to maintain any state regarding the already-put
144*b0d29bc4SBrooks Davis     // objects and the commit does not clean up correctly, this would fail in
145*b0d29bc4SBrooks Davis     // some manner.
146*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
147*b0d29bc4SBrooks Davis     tx.put_context(context);
148*b0d29bc4SBrooks Davis     tx.commit();
149*b0d29bc4SBrooks Davis }
150*b0d29bc4SBrooks Davis 
151*b0d29bc4SBrooks Davis 
152*b0d29bc4SBrooks Davis ATF_TEST_CASE(rollback__ok);
ATF_TEST_CASE_HEAD(rollback__ok)153*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(rollback__ok)
154*b0d29bc4SBrooks Davis {
155*b0d29bc4SBrooks Davis     logging::set_inmemory();
156*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
157*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(rollback__ok)158*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(rollback__ok)
159*b0d29bc4SBrooks Davis {
160*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
161*b0d29bc4SBrooks Davis         fs::path("test.db"));
162*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
163*b0d29bc4SBrooks Davis     backend.database().exec("CREATE TABLE a_table (b INTEGER PRIMARY KEY)");
164*b0d29bc4SBrooks Davis     backend.database().exec("SELECT * FROM a_table");
165*b0d29bc4SBrooks Davis     tx.rollback();
166*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW_RE(sqlite::error, "a_table",
167*b0d29bc4SBrooks Davis                          backend.database().exec("SELECT * FROM a_table"));
168*b0d29bc4SBrooks Davis }
169*b0d29bc4SBrooks Davis 
170*b0d29bc4SBrooks Davis 
171*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_test_program__ok);
ATF_TEST_CASE_HEAD(put_test_program__ok)172*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_test_program__ok)
173*b0d29bc4SBrooks Davis {
174*b0d29bc4SBrooks Davis     logging::set_inmemory();
175*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
176*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_test_program__ok)177*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_test_program__ok)
178*b0d29bc4SBrooks Davis {
179*b0d29bc4SBrooks Davis     const model::metadata md = model::metadata_builder()
180*b0d29bc4SBrooks Davis         .add_custom("var1", "value1")
181*b0d29bc4SBrooks Davis         .add_custom("var2", "value2")
182*b0d29bc4SBrooks Davis         .build();
183*b0d29bc4SBrooks Davis     const model::test_program test_program(
184*b0d29bc4SBrooks Davis         "mock", fs::path("the/binary"), fs::path("/some//root"),
185*b0d29bc4SBrooks Davis         "the-suite", md, model::test_cases_map());
186*b0d29bc4SBrooks Davis 
187*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
188*b0d29bc4SBrooks Davis         fs::path("test.db"));
189*b0d29bc4SBrooks Davis     backend.database().exec("PRAGMA foreign_keys = OFF");
190*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
191*b0d29bc4SBrooks Davis     const int64_t test_program_id = tx.put_test_program(test_program);
192*b0d29bc4SBrooks Davis     tx.commit();
193*b0d29bc4SBrooks Davis 
194*b0d29bc4SBrooks Davis     {
195*b0d29bc4SBrooks Davis         sqlite::statement stmt = backend.database().create_statement(
196*b0d29bc4SBrooks Davis             "SELECT * FROM test_programs");
197*b0d29bc4SBrooks Davis 
198*b0d29bc4SBrooks Davis         ATF_REQUIRE(stmt.step());
199*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ(test_program_id,
200*b0d29bc4SBrooks Davis                        stmt.safe_column_int64("test_program_id"));
201*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("/some/root/the/binary",
202*b0d29bc4SBrooks Davis                        stmt.safe_column_text("absolute_path"));
203*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("/some/root", stmt.safe_column_text("root"));
204*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("the/binary", stmt.safe_column_text("relative_path"));
205*b0d29bc4SBrooks Davis         ATF_REQUIRE_EQ("the-suite", stmt.safe_column_text("test_suite_name"));
206*b0d29bc4SBrooks Davis         ATF_REQUIRE(!stmt.step());
207*b0d29bc4SBrooks Davis     }
208*b0d29bc4SBrooks Davis }
209*b0d29bc4SBrooks Davis 
210*b0d29bc4SBrooks Davis 
211*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_test_case__fail);
ATF_TEST_CASE_HEAD(put_test_case__fail)212*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_test_case__fail)
213*b0d29bc4SBrooks Davis {
214*b0d29bc4SBrooks Davis     logging::set_inmemory();
215*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
216*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_test_case__fail)217*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_test_case__fail)
218*b0d29bc4SBrooks Davis {
219*b0d29bc4SBrooks Davis     const model::test_program test_program = model::test_program_builder(
220*b0d29bc4SBrooks Davis         "plain", fs::path("the/binary"), fs::path("/some/root"), "the-suite")
221*b0d29bc4SBrooks Davis         .add_test_case("main")
222*b0d29bc4SBrooks Davis         .build();
223*b0d29bc4SBrooks Davis 
224*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
225*b0d29bc4SBrooks Davis         fs::path("test.db"));
226*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
227*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(store::error, tx.put_test_case(test_program, "main", -1));
228*b0d29bc4SBrooks Davis     tx.commit();
229*b0d29bc4SBrooks Davis }
230*b0d29bc4SBrooks Davis 
231*b0d29bc4SBrooks Davis 
232*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_test_case_file__empty);
ATF_TEST_CASE_HEAD(put_test_case_file__empty)233*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_test_case_file__empty)
234*b0d29bc4SBrooks Davis {
235*b0d29bc4SBrooks Davis     logging::set_inmemory();
236*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
237*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_test_case_file__empty)238*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_test_case_file__empty)
239*b0d29bc4SBrooks Davis {
240*b0d29bc4SBrooks Davis     atf::utils::create_file("input.txt", "");
241*b0d29bc4SBrooks Davis 
242*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
243*b0d29bc4SBrooks Davis         fs::path("test.db"));
244*b0d29bc4SBrooks Davis     backend.database().exec("PRAGMA foreign_keys = OFF");
245*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
246*b0d29bc4SBrooks Davis     const optional< int64_t > file_id = tx.put_test_case_file(
247*b0d29bc4SBrooks Davis         "my-file", fs::path("input.txt"), 123L);
248*b0d29bc4SBrooks Davis     tx.commit();
249*b0d29bc4SBrooks Davis     ATF_REQUIRE(!file_id);
250*b0d29bc4SBrooks Davis 
251*b0d29bc4SBrooks Davis     sqlite::statement stmt = backend.database().create_statement(
252*b0d29bc4SBrooks Davis         "SELECT * FROM test_case_files NATURAL JOIN files");
253*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
254*b0d29bc4SBrooks Davis }
255*b0d29bc4SBrooks Davis 
256*b0d29bc4SBrooks Davis 
257*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_test_case_file__some);
ATF_TEST_CASE_HEAD(put_test_case_file__some)258*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_test_case_file__some)
259*b0d29bc4SBrooks Davis {
260*b0d29bc4SBrooks Davis     logging::set_inmemory();
261*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
262*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_test_case_file__some)263*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_test_case_file__some)
264*b0d29bc4SBrooks Davis {
265*b0d29bc4SBrooks Davis     const char contents[] = "This is a test!";
266*b0d29bc4SBrooks Davis 
267*b0d29bc4SBrooks Davis     atf::utils::create_file("input.txt", contents);
268*b0d29bc4SBrooks Davis 
269*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
270*b0d29bc4SBrooks Davis         fs::path("test.db"));
271*b0d29bc4SBrooks Davis     backend.database().exec("PRAGMA foreign_keys = OFF");
272*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
273*b0d29bc4SBrooks Davis     const optional< int64_t > file_id = tx.put_test_case_file(
274*b0d29bc4SBrooks Davis         "my-file", fs::path("input.txt"), 123L);
275*b0d29bc4SBrooks Davis     tx.commit();
276*b0d29bc4SBrooks Davis     ATF_REQUIRE(file_id);
277*b0d29bc4SBrooks Davis 
278*b0d29bc4SBrooks Davis     sqlite::statement stmt = backend.database().create_statement(
279*b0d29bc4SBrooks Davis         "SELECT * FROM test_case_files NATURAL JOIN files");
280*b0d29bc4SBrooks Davis 
281*b0d29bc4SBrooks Davis     ATF_REQUIRE(stmt.step());
282*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ(123L, stmt.safe_column_int64("test_case_id"));
283*b0d29bc4SBrooks Davis     ATF_REQUIRE_EQ("my-file", stmt.safe_column_text("file_name"));
284*b0d29bc4SBrooks Davis     const sqlite::blob blob = stmt.safe_column_blob("contents");
285*b0d29bc4SBrooks Davis     ATF_REQUIRE(std::strlen(contents) == static_cast< std::size_t >(blob.size));
286*b0d29bc4SBrooks Davis     ATF_REQUIRE(std::memcmp(contents, blob.memory, blob.size) == 0);
287*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
288*b0d29bc4SBrooks Davis }
289*b0d29bc4SBrooks Davis 
290*b0d29bc4SBrooks Davis 
291*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_test_case_file__fail);
ATF_TEST_CASE_HEAD(put_test_case_file__fail)292*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_test_case_file__fail)
293*b0d29bc4SBrooks Davis {
294*b0d29bc4SBrooks Davis     logging::set_inmemory();
295*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
296*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_test_case_file__fail)297*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_test_case_file__fail)
298*b0d29bc4SBrooks Davis {
299*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
300*b0d29bc4SBrooks Davis         fs::path("test.db"));
301*b0d29bc4SBrooks Davis     backend.database().exec("PRAGMA foreign_keys = OFF");
302*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
303*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(store::error,
304*b0d29bc4SBrooks Davis                       tx.put_test_case_file("foo", fs::path("missing"), 1L));
305*b0d29bc4SBrooks Davis     tx.commit();
306*b0d29bc4SBrooks Davis 
307*b0d29bc4SBrooks Davis     sqlite::statement stmt = backend.database().create_statement(
308*b0d29bc4SBrooks Davis         "SELECT * FROM test_case_files NATURAL JOIN files");
309*b0d29bc4SBrooks Davis     ATF_REQUIRE(!stmt.step());
310*b0d29bc4SBrooks Davis }
311*b0d29bc4SBrooks Davis 
312*b0d29bc4SBrooks Davis 
313*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_result__ok__broken);
ATF_TEST_CASE_HEAD(put_result__ok__broken)314*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_result__ok__broken)
315*b0d29bc4SBrooks Davis {
316*b0d29bc4SBrooks Davis     logging::set_inmemory();
317*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
318*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_result__ok__broken)319*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_result__ok__broken)
320*b0d29bc4SBrooks Davis {
321*b0d29bc4SBrooks Davis     const model::test_result result(model::test_result_broken, "a b cd");
322*b0d29bc4SBrooks Davis     do_put_result_ok_test(result, "broken", "a b cd");
323*b0d29bc4SBrooks Davis }
324*b0d29bc4SBrooks Davis 
325*b0d29bc4SBrooks Davis 
326*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_result__ok__expected_failure);
ATF_TEST_CASE_HEAD(put_result__ok__expected_failure)327*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_result__ok__expected_failure)
328*b0d29bc4SBrooks Davis {
329*b0d29bc4SBrooks Davis     logging::set_inmemory();
330*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
331*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_result__ok__expected_failure)332*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_result__ok__expected_failure)
333*b0d29bc4SBrooks Davis {
334*b0d29bc4SBrooks Davis     const model::test_result result(model::test_result_expected_failure,
335*b0d29bc4SBrooks Davis                                     "a b cd");
336*b0d29bc4SBrooks Davis     do_put_result_ok_test(result, "expected_failure", "a b cd");
337*b0d29bc4SBrooks Davis }
338*b0d29bc4SBrooks Davis 
339*b0d29bc4SBrooks Davis 
340*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_result__ok__failed);
ATF_TEST_CASE_HEAD(put_result__ok__failed)341*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_result__ok__failed)
342*b0d29bc4SBrooks Davis {
343*b0d29bc4SBrooks Davis     logging::set_inmemory();
344*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
345*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_result__ok__failed)346*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_result__ok__failed)
347*b0d29bc4SBrooks Davis {
348*b0d29bc4SBrooks Davis     const model::test_result result(model::test_result_failed, "a b cd");
349*b0d29bc4SBrooks Davis     do_put_result_ok_test(result, "failed", "a b cd");
350*b0d29bc4SBrooks Davis }
351*b0d29bc4SBrooks Davis 
352*b0d29bc4SBrooks Davis 
353*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_result__ok__passed);
ATF_TEST_CASE_HEAD(put_result__ok__passed)354*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_result__ok__passed)
355*b0d29bc4SBrooks Davis {
356*b0d29bc4SBrooks Davis     logging::set_inmemory();
357*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
358*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_result__ok__passed)359*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_result__ok__passed)
360*b0d29bc4SBrooks Davis {
361*b0d29bc4SBrooks Davis     const model::test_result result(model::test_result_passed);
362*b0d29bc4SBrooks Davis     do_put_result_ok_test(result, "passed", NULL);
363*b0d29bc4SBrooks Davis }
364*b0d29bc4SBrooks Davis 
365*b0d29bc4SBrooks Davis 
366*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_result__ok__skipped);
ATF_TEST_CASE_HEAD(put_result__ok__skipped)367*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_result__ok__skipped)
368*b0d29bc4SBrooks Davis {
369*b0d29bc4SBrooks Davis     logging::set_inmemory();
370*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
371*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_result__ok__skipped)372*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_result__ok__skipped)
373*b0d29bc4SBrooks Davis {
374*b0d29bc4SBrooks Davis     const model::test_result result(model::test_result_skipped, "a b cd");
375*b0d29bc4SBrooks Davis     do_put_result_ok_test(result, "skipped", "a b cd");
376*b0d29bc4SBrooks Davis }
377*b0d29bc4SBrooks Davis 
378*b0d29bc4SBrooks Davis 
379*b0d29bc4SBrooks Davis ATF_TEST_CASE(put_result__fail);
ATF_TEST_CASE_HEAD(put_result__fail)380*b0d29bc4SBrooks Davis ATF_TEST_CASE_HEAD(put_result__fail)
381*b0d29bc4SBrooks Davis {
382*b0d29bc4SBrooks Davis     logging::set_inmemory();
383*b0d29bc4SBrooks Davis     set_md_var("require.files", store::detail::schema_file().c_str());
384*b0d29bc4SBrooks Davis }
ATF_TEST_CASE_BODY(put_result__fail)385*b0d29bc4SBrooks Davis ATF_TEST_CASE_BODY(put_result__fail)
386*b0d29bc4SBrooks Davis {
387*b0d29bc4SBrooks Davis     const model::test_result result(model::test_result_broken, "foo");
388*b0d29bc4SBrooks Davis 
389*b0d29bc4SBrooks Davis     store::write_backend backend = store::write_backend::open_rw(
390*b0d29bc4SBrooks Davis         fs::path("test.db"));
391*b0d29bc4SBrooks Davis     store::write_transaction tx = backend.start_write();
392*b0d29bc4SBrooks Davis     const datetime::timestamp zero = datetime::timestamp::from_microseconds(0);
393*b0d29bc4SBrooks Davis     ATF_REQUIRE_THROW(store::error, tx.put_result(result, -1, zero, zero));
394*b0d29bc4SBrooks Davis     tx.commit();
395*b0d29bc4SBrooks Davis }
396*b0d29bc4SBrooks Davis 
397*b0d29bc4SBrooks Davis 
ATF_INIT_TEST_CASES(tcs)398*b0d29bc4SBrooks Davis ATF_INIT_TEST_CASES(tcs)
399*b0d29bc4SBrooks Davis {
400*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, commit__ok);
401*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, commit__fail);
402*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, rollback__ok);
403*b0d29bc4SBrooks Davis 
404*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_test_program__ok);
405*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_test_case__fail);
406*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_test_case_file__empty);
407*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_test_case_file__some);
408*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_test_case_file__fail);
409*b0d29bc4SBrooks Davis 
410*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_result__ok__broken);
411*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_result__ok__expected_failure);
412*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_result__ok__failed);
413*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_result__ok__passed);
414*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_result__ok__skipped);
415*b0d29bc4SBrooks Davis     ATF_ADD_TEST_CASE(tcs, put_result__fail);
416*b0d29bc4SBrooks Davis }
417