@@ -63,6 +63,7 @@ OF SUCH DAMAGE.
6363
6464
6565#include <cstddef>
66+ #include <cstdlib>
6667
6768#include <gtest/gtest.h>
6869
@@ -75,6 +76,50 @@ static size_t bad_filename(char **dst, const size_t dst_size,
7576 return SNPRINTF(*dst, dst_size, "@CMAKE_BINARY_DIR@");
7677}
7778
79+ TEST(external, read_file) {
80+ const char DEVNULL[] = "/dev/null";
81+ const std::size_t DEVNULL_LEN = strlen(DEVNULL);
82+
83+ struct input in;
84+ in.check_extdb_valid = true;
85+
86+ struct work work;
87+ memset(&work, 0, sizeof(work));
88+
89+ char filename[] = "XXXXXX";
90+ const int fd = mkstemp(filename);
91+ ASSERT_GE(fd, 0);
92+ EXPECT_EQ(strncpy(work.name, filename, 6), work.name);
93+ EXPECT_EQ(write(fd, DEVNULL, DEVNULL_LEN), (ssize_t) DEVNULL_LEN);
94+ EXPECT_EQ(write(fd, "\n", (std::size_t) 1), (ssize_t) 1);
95+
96+ char extdb_filename[] = "XXXXXX";
97+ const int extdb_fd = mkstemp(extdb_filename);
98+ ASSERT_GE(extdb_fd, 0);
99+ EXPECT_EQ(close(extdb_fd), 0);
100+ EXPECT_EQ(remove(extdb_filename), 0);
101+ EXPECT_EQ(write(fd, extdb_filename, (std::size_t) 6), (ssize_t) 6);
102+ EXPECT_EQ(write(fd, "\n", (std::size_t) 1), (ssize_t) 1);
103+
104+ EXPECT_EQ(close(fd), 0);
105+
106+ EXPECT_EQ(external_read_file(&in, &work,
107+ [](struct input *, void *,
108+ const long long int,
109+ const char *) -> int { return 0; },
110+ nullptr),
111+ (std::size_t) 1);
112+
113+ EXPECT_EQ(remove(filename), 0);
114+
115+ EXPECT_EQ(external_read_file(&in, &work,
116+ [](struct input *, void *,
117+ const long long int,
118+ const char *) -> int { return 0; },
119+ nullptr),
120+ (std::size_t) 0);
121+ }
122+
78123TEST(external, concatenate) {
79124 // type is used when querying the external database table,
80125 // not for attching the individual external databases
@@ -144,8 +189,8 @@ TEST(external, concatenate) {
144189
145190 external_concatenate_cleanup(db, drop_view,
146191 &type,
147- NULL ,
148- NULL, NULL
192+ nullptr ,
193+ nullptr, nullptr
149194 #if defined(DEBUG) && defined(CUMULATIVE_TIMES)
150195 , &query_count
151196 #endif
@@ -176,8 +221,8 @@ TEST(external, concatenate) {
176221
177222 external_concatenate_cleanup(db, drop_view,
178223 &type,
179- NULL ,
180- NULL, NULL
224+ nullptr ,
225+ nullptr, nullptr
181226 #if defined(DEBUG) && defined(CUMULATIVE_TIMES)
182227 , &query_count
183228 #endif
@@ -200,6 +245,28 @@ TEST(external, concatenate) {
200245 EXPECT_EQ(rc, 0);
201246
202247 external_concatenate_cleanup(db, drop_view,
248+ &type,
249+ nullptr,
250+ nullptr, nullptr
251+ #if defined(DEBUG) && defined(CUMULATIVE_TIMES)
252+ , &query_count
253+ #endif
254+ );
255+
256+ sqlite3_close(db);
257+
258+ // drop view but bad db
259+ external_concatenate_cleanup(nullptr, drop_view,
260+ &type,
261+ nullptr,
262+ nullptr, nullptr
263+ #if defined(DEBUG) && defined(CUMULATIVE_TIMES)
264+ , &query_count
265+ #endif
266+ );
267+
268+ // no drop view, drop type but bad db
269+ external_concatenate_cleanup(nullptr, drop_view,
203270 &type,
204271 NULL,
205272 NULL, NULL
@@ -208,5 +275,14 @@ TEST(external, concatenate) {
208275 #endif
209276 );
210277
211- sqlite3_close(db);
278+
279+ // no drop view, no type
280+ external_concatenate_cleanup(db, nullptr,
281+ nullptr,
282+ nullptr,
283+ nullptr, nullptr
284+ #if defined(DEBUG) && defined(CUMULATIVE_TIMES)
285+ , &query_count
286+ #endif
287+ );
212288}
0 commit comments