aboutsummaryrefslogtreecommitdiff
path: root/tests/depdb
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-02-29 10:57:40 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-02-29 10:57:40 +0200
commit3cf3b73ffc6881d5428a735736a347f6e143b366 (patch)
tree3559fa9d2d44cc11e07987752027f7c2a9e3e23e /tests/depdb
parent2a4f52c46f2081aaeb2664e8026d3d067142e3d5 (diff)
Implement auxiliary dependency database (.d files), use in cxx.compile
This is part of the "High Fidelity Build" work.
Diffstat (limited to 'tests/depdb')
-rw-r--r--tests/depdb/buildfile8
-rw-r--r--tests/depdb/driver.cxx166
2 files changed, 174 insertions, 0 deletions
diff --git a/tests/depdb/buildfile b/tests/depdb/buildfile
new file mode 100644
index 0000000..53e9cd3
--- /dev/null
+++ b/tests/depdb/buildfile
@@ -0,0 +1,8 @@
+# file : tests/depdb/buildfile
+# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+import libs = libbutl%lib{butl}
+
+exe{driver}: cxx{driver ../../build2/{depdb}} $libs
+exe{driver}: test.arguments = $out_base/test.d
diff --git a/tests/depdb/driver.cxx b/tests/depdb/driver.cxx
new file mode 100644
index 0000000..f156991
--- /dev/null
+++ b/tests/depdb/driver.cxx
@@ -0,0 +1,166 @@
+// file : tests/depdb/driver.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <iostream>
+
+#include <butl/filesystem>
+
+#include <build2/types>
+#include <build2/utility>
+
+#include <build2/depdb>
+
+using namespace std;
+using namespace build2;
+
+int
+main (int argc, char* argv[])
+{
+ if (argc != 2)
+ {
+ cerr << "usage: " << argv[0] << " <db-file>" << endl;
+ return 1;
+ }
+
+ path p (argv[1]);
+ auto rm = [&p] () {try_rmfile (p);};
+
+ // Create empty database.
+ //
+ {
+ rm ();
+
+ {
+ depdb d (p);
+ assert (d.writing ());
+ d.close ();
+ }
+
+ {
+ depdb d (p);
+ assert (d.reading ());
+ assert (!d.more ());
+ assert (d.read () == nullptr);
+ d.close ();
+ }
+ }
+
+ // No close/end marker.
+ //
+ {
+ rm ();
+
+ {
+ depdb d (p);
+ assert (d.writing ());
+ // No close.
+ }
+
+ {
+ depdb d (p);
+ assert (d.writing ());
+ d.close ();
+ }
+
+ {
+ depdb d (p);
+ assert (d.reading ());
+ }
+ }
+
+ // Overwrite/append/truncate.
+ //
+ {
+ rm ();
+
+ {
+ depdb d (p);
+ d.write ("foo");
+ d.close ();
+ }
+
+ {
+ depdb d (p);
+ assert (*d.read () == "foo");
+ assert (!d.more ());
+ d.close ();
+ }
+
+ {
+ depdb d (p);
+ assert (*d.read () == "foo");
+ assert (!d.more ());
+ d.write ("FOO");
+ d.close ();
+ }
+
+ {
+ depdb d (p);
+ assert (*d.read () == "FOO");
+ assert (!d.more ());
+ assert (d.read () == nullptr);
+ assert (d.read () == nullptr);
+ d.write ("BAR");
+ d.close ();
+ }
+
+ {
+ depdb d (p);
+ assert (*d.read () == "FOO");
+ assert (d.more ());
+ d.write ("foo");
+ d.close (); // Truncate.
+ }
+
+ {
+ depdb d (p);
+ assert (*d.read () == "foo");
+ assert (!d.more ());
+ }
+
+ // Stray end marker.
+ //
+ {
+ depdb d (p);
+ assert (*d.read () == "foo");
+ d.write ("fox");
+ // No close.
+ }
+
+ {
+ depdb d (p);
+ assert (d.more ());
+ assert (*d.read () == "fox");
+ assert (!d.more ());
+ }
+ }
+
+ // Read/truncate.
+ //
+ {
+ rm ();
+
+ {
+ depdb d (p);
+ d.write ("foo");
+ d.write ("bar");
+ d.close ();
+ }
+
+ {
+ depdb d (p);
+ assert (*d.read () == "foo");
+ assert (d.more ());
+ d.close (); // Truncate bar.
+ }
+
+ {
+ depdb d (p);
+ assert (*d.read () == "foo");
+ assert (!d.more ());
+ }
+ }
+
+ rm ();
+}