summaryrefslogtreecommitdiff
path: root/test/sbuild/chroot-loopback.cc
diff options
context:
space:
mode:
Diffstat (limited to 'test/sbuild/chroot-loopback.cc')
-rw-r--r--test/sbuild/chroot-loopback.cc398
1 files changed, 398 insertions, 0 deletions
diff --git a/test/sbuild/chroot-loopback.cc b/test/sbuild/chroot-loopback.cc
new file mode 100644
index 00000000..19d3bd1e
--- /dev/null
+++ b/test/sbuild/chroot-loopback.cc
@@ -0,0 +1,398 @@
+/* Copyright © 2008-2013 Jan-Marek Glogowski <glogow@fbihome.de>
+ * Copyright © 2008-2013 Roger Leigh <rleigh@debian.org>
+ *
+ * schroot is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * schroot is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ *********************************************************************/
+
+#include "config.h"
+
+#include <algorithm>
+#include <set>
+
+#include <sbuild/chroot-loopback.h>
+#include <sbuild/chroot-facet-mountable.h>
+#include <sbuild/i18n.h>
+#include <sbuild/keyfile-writer.h>
+
+#include "test-helpers.h"
+#include "test-sbuild-chroot.h"
+
+#include <cppunit/extensions/HelperMacros.h>
+
+using namespace CppUnit;
+
+using sbuild::_;
+
+class chroot_loopback : public sbuild::chroot_loopback
+{
+public:
+ chroot_loopback():
+ sbuild::chroot_loopback()
+ {}
+
+ virtual ~chroot_loopback()
+ {}
+};
+
+class test_chroot_loopback : public test_chroot_base<chroot_loopback>
+{
+ CPPUNIT_TEST_SUITE(test_chroot_loopback);
+ CPPUNIT_TEST(test_file);
+ CPPUNIT_TEST(test_mount_options);
+ CPPUNIT_TEST(test_setup_env);
+ CPPUNIT_TEST(test_setup_env_session);
+#ifdef SBUILD_FEATURE_UNION
+ CPPUNIT_TEST(test_setup_env_union);
+ CPPUNIT_TEST(test_setup_env_session_union);
+ CPPUNIT_TEST(test_setup_env_source_union);
+ CPPUNIT_TEST(test_setup_env_session_source_union);
+#endif // SBUILD_FEATURE_UNION
+ CPPUNIT_TEST(test_setup_keyfile);
+ CPPUNIT_TEST(test_setup_keyfile_session);
+#ifdef SBUILD_FEATURE_UNION
+ CPPUNIT_TEST(test_setup_keyfile_union);
+ CPPUNIT_TEST(test_setup_keyfile_session_union);
+ CPPUNIT_TEST(test_setup_keyfile_source_union);
+ CPPUNIT_TEST(test_setup_keyfile_session_source_union);
+#endif // SBUILD_FEATURE_UNION
+ CPPUNIT_TEST(test_session_flags);
+ CPPUNIT_TEST(test_print_details);
+ CPPUNIT_TEST(test_print_config);
+ CPPUNIT_TEST(test_run_setup_scripts);
+ CPPUNIT_TEST_SUITE_END();
+
+protected:
+ std::string loopback_file;
+
+public:
+ test_chroot_loopback():
+ test_chroot_base<chroot_loopback>(),
+ loopback_file()
+ {
+ loopback_file = abs_testdata_dir;
+ loopback_file.append("/loopback-file");
+ }
+
+ void setUp()
+ {
+ test_chroot_base<chroot_loopback>::setUp();
+ CPPUNIT_ASSERT(chroot);
+ CPPUNIT_ASSERT(session);
+ CPPUNIT_ASSERT(!source);
+ CPPUNIT_ASSERT(!session_source);
+#ifdef SBUILD_FEATURE_UNION
+ CPPUNIT_ASSERT(chroot_union);
+ CPPUNIT_ASSERT(session_union);
+ CPPUNIT_ASSERT(source_union);
+ CPPUNIT_ASSERT(session_source_union);
+#endif // SBUILD_FEATURE_UNION
+ }
+
+ virtual void setup_chroot_props (sbuild::chroot::ptr& chroot)
+ {
+ test_chroot_base<chroot_loopback>::setup_chroot_props(chroot);
+
+ std::shared_ptr<sbuild::chroot_loopback> c = std::dynamic_pointer_cast<sbuild::chroot_loopback>(chroot);
+ c->set_file(loopback_file);
+
+ sbuild::chroot_facet_mountable::ptr pmnt(chroot->get_facet<sbuild::chroot_facet_mountable>());
+ CPPUNIT_ASSERT(pmnt);
+
+ pmnt->set_mount_options("-t jfs -o quota,rw");
+ pmnt->set_location("/squeeze");
+ }
+
+ void
+ test_file()
+ {
+ std::shared_ptr<sbuild::chroot_loopback> c = std::dynamic_pointer_cast<sbuild::chroot_loopback>(chroot);
+ CPPUNIT_ASSERT(c);
+ c->set_file("/dev/some/file");
+ CPPUNIT_ASSERT(c->get_file() == "/dev/some/file");
+ }
+
+ void
+ test_mount_options()
+ {
+ sbuild::chroot_facet_mountable::ptr pmnt(chroot->get_facet<sbuild::chroot_facet_mountable>());
+ CPPUNIT_ASSERT(pmnt);
+ pmnt->set_mount_options("-o opt1,opt2");
+ CPPUNIT_ASSERT(pmnt->get_mount_options() == "-o opt1,opt2");
+ }
+
+ void setup_env_gen(sbuild::environment& expected)
+ {
+ setup_env_chroot(expected);
+
+ expected.add("CHROOT_TYPE", "loopback");
+ expected.add("CHROOT_MOUNT_LOCATION", "/mnt/mount-location");
+ expected.add("CHROOT_LOCATION", "/squeeze");
+ expected.add("CHROOT_PATH", "/mnt/mount-location/squeeze");
+ expected.add("CHROOT_FILE", loopback_file);
+ expected.add("CHROOT_MOUNT_OPTIONS", "-t jfs -o quota,rw");
+ }
+
+ void test_setup_env()
+ {
+ sbuild::environment expected;
+ setup_env_gen(expected);
+
+ expected.add("CHROOT_SESSION_CLONE", "false");
+ expected.add("CHROOT_SESSION_CREATE", "true");
+ expected.add("CHROOT_SESSION_PURGE", "false");
+#ifdef SBUILD_FEATURE_UNION
+ expected.add("CHROOT_UNION_TYPE", "none");
+#endif // SBUILD_FEATURE_UNION
+
+ test_chroot_base<chroot_loopback>::test_setup_env(chroot, expected);
+ }
+
+ void test_setup_env_session()
+ {
+ sbuild::environment expected;
+ setup_env_gen(expected);
+
+ expected.add("SESSION_ID", "test-session-name");
+ expected.add("CHROOT_ALIAS", "test-session-name");
+ expected.add("CHROOT_DESCRIPTION", chroot->get_description() + ' ' + _("(session chroot)"));
+ expected.add("CHROOT_SESSION_CLONE", "false");
+ expected.add("CHROOT_SESSION_CREATE", "false");
+ expected.add("CHROOT_SESSION_PURGE", "false");
+ expected.add("CHROOT_MOUNT_DEVICE", loopback_file);
+
+#ifdef SBUILD_FEATURE_UNION
+ expected.add("CHROOT_UNION_TYPE", "none");
+#endif // SBUILD_FEATURE_UNION
+
+ test_chroot_base<chroot_loopback>::test_setup_env(session, expected);
+ }
+
+#ifdef SBUILD_FEATURE_UNION
+ void test_setup_env_union()
+ {
+ sbuild::environment expected;
+ setup_env_gen(expected);
+
+ expected.add("CHROOT_SESSION_CLONE", "true");
+ expected.add("CHROOT_SESSION_CREATE", "true");
+ expected.add("CHROOT_SESSION_PURGE", "false");
+ expected.add("CHROOT_UNION_TYPE", "aufs");
+ expected.add("CHROOT_UNION_MOUNT_OPTIONS", "union-mount-options");
+ expected.add("CHROOT_UNION_OVERLAY_DIRECTORY", "/overlay");
+ expected.add("CHROOT_UNION_UNDERLAY_DIRECTORY", "/underlay");
+
+ test_chroot_base<chroot_loopback>::test_setup_env(chroot_union, expected);
+ }
+
+ void test_setup_env_session_union()
+ {
+ sbuild::environment expected;
+ setup_env_gen(expected);
+
+ expected.add("SESSION_ID", "test-union-session-name");
+ expected.add("CHROOT_ALIAS", "test-union-session-name");
+ expected.add("CHROOT_DESCRIPTION", chroot->get_description() + ' ' + _("(session chroot)"));
+ expected.add("CHROOT_SESSION_CLONE", "false");
+ expected.add("CHROOT_SESSION_CREATE", "false");
+ expected.add("CHROOT_SESSION_PURGE", "true");
+ expected.add("CHROOT_MOUNT_DEVICE", loopback_file);
+ expected.add("CHROOT_UNION_TYPE", "aufs");
+ expected.add("CHROOT_UNION_MOUNT_OPTIONS", "union-mount-options");
+ expected.add("CHROOT_UNION_OVERLAY_DIRECTORY", "/overlay/test-union-session-name");
+ expected.add("CHROOT_UNION_UNDERLAY_DIRECTORY", "/underlay/test-union-session-name");
+ test_chroot_base<chroot_loopback>::test_setup_env(session_union, expected);
+ }
+
+ void test_setup_env_source_union()
+ {
+ sbuild::environment expected;
+ setup_env_gen(expected);
+
+ expected.add("CHROOT_NAME", "test-name");
+ expected.add("CHROOT_DESCRIPTION", chroot->get_description() + ' ' + _("(source chroot)"));
+ expected.add("CHROOT_SESSION_CLONE", "false");
+ expected.add("CHROOT_SESSION_CREATE", "true");
+ expected.add("CHROOT_SESSION_PURGE", "false");
+
+ test_chroot_base<chroot_loopback>::test_setup_env(source_union, expected);
+ }
+
+ void test_setup_env_session_source_union()
+ {
+ sbuild::environment expected;
+ setup_env_gen(expected);
+
+ expected.add("SESSION_ID", "test-session-name");
+ expected.add("CHROOT_ALIAS", "test-session-name");
+ expected.add("CHROOT_NAME", "test-name");
+ expected.add("CHROOT_DESCRIPTION", chroot->get_description() + ' ' + _("(source chroot) (session chroot)"));
+ expected.add("CHROOT_MOUNT_DEVICE", loopback_file);
+ expected.add("CHROOT_SESSION_CLONE", "false");
+ expected.add("CHROOT_SESSION_CREATE", "false");
+ expected.add("CHROOT_SESSION_PURGE", "false");
+
+ test_chroot_base<chroot_loopback>::test_setup_env(session_source_union, expected);
+ }
+#endif // SBUILD_FEATURE_UNION
+
+ void setup_keyfile_loop(sbuild::keyfile &expected, std::string group)
+ {
+ expected.set_value(group, "type", "loopback");
+ expected.set_value(group, "file", loopback_file);
+ expected.set_value(group, "location", "/squeeze");
+ expected.set_value(group, "mount-options", "-t jfs -o quota,rw");
+ }
+
+ void test_setup_keyfile()
+ {
+ sbuild::keyfile expected;
+ const std::string group(chroot->get_name());
+ setup_keyfile_chroot(expected, group);
+ setup_keyfile_loop(expected, group);
+#ifdef SBUILD_FEATURE_UNION
+ setup_keyfile_union_unconfigured(expected, group);
+#endif // SBUILD_FEATURE_UNION
+
+ test_chroot_base<chroot_loopback>::test_setup_keyfile
+ (chroot, expected, group);
+ }
+
+ void test_setup_keyfile_session()
+ {
+ sbuild::keyfile expected;
+ const std::string group(session->get_name());
+ setup_keyfile_session(expected, group);
+ setup_keyfile_loop(expected, group);
+ expected.set_value(group, "name", "test-session-name");
+ expected.set_value(group, "selected-name", "test-session-name");
+ expected.set_value(group, "mount-device", loopback_file);
+ expected.set_value(group, "mount-location", "/mnt/mount-location");
+ setup_keyfile_session_clone(expected, group);
+#ifdef SBUILD_FEATURE_UNION
+ setup_keyfile_union_unconfigured(expected, group);
+#endif // SBUILD_FEATURE_UNION
+
+ test_chroot_base<chroot_loopback>::test_setup_keyfile
+ (session, expected, group);
+ }
+
+#ifdef SBUILD_FEATURE_UNION
+ void test_setup_keyfile_union()
+ {
+ sbuild::keyfile expected;
+ const std::string group(chroot_union->get_name());
+ setup_keyfile_chroot(expected, group);
+ setup_keyfile_source(expected, group);
+ setup_keyfile_loop(expected, group);
+ setup_keyfile_union_configured(expected, group);
+
+ test_chroot_base<chroot_loopback>::test_setup_keyfile
+ (chroot_union, expected, group);
+ }
+
+ void test_setup_keyfile_session_union()
+ {
+ sbuild::keyfile expected;
+ const std::string group(session_union->get_name());
+ setup_keyfile_session(expected, group);
+ setup_keyfile_loop(expected, group);
+ expected.set_value(group, "name", "test-union-session-name");
+ expected.set_value(group, "selected-name", "test-union-session-name");
+ expected.set_value(group, "mount-device", loopback_file);
+ expected.set_value(group, "mount-location", "/mnt/mount-location");
+ setup_keyfile_session_clone(expected, group);
+ setup_keyfile_union_session(expected, group);
+
+ test_chroot_base<chroot_loopback>::test_setup_keyfile
+ (session_union, expected, group);
+ }
+
+ void test_setup_keyfile_source_union()
+ {
+ sbuild::keyfile expected;
+ const std::string group(source_union->get_name());
+ setup_keyfile_chroot(expected, group);
+ setup_keyfile_source_clone(expected, group);
+ setup_keyfile_loop(expected, group);
+ expected.set_value(group, "description", chroot->get_description() + ' ' + _("(source chroot)"));
+
+ test_chroot_base<chroot_loopback>::test_setup_keyfile
+ (source_union, expected, group);
+ }
+
+ void test_setup_keyfile_session_source_union()
+ {
+ sbuild::keyfile expected;
+ const std::string group(source_union->get_name());
+ setup_keyfile_chroot(expected, group);
+ setup_keyfile_session_source_clone(expected, group);
+ setup_keyfile_loop(expected, group);
+ expected.set_value(group, "description", chroot->get_description() + ' ' + _("(source chroot) (session chroot)"));
+ expected.set_value(group, "mount-device", loopback_file);
+ expected.set_value(group, "mount-location", "/mnt/mount-location");
+
+ test_chroot_base<chroot_loopback>::test_setup_keyfile
+ (session_source_union, expected, group);
+ }
+#endif // SBUILD_FEATURE_UNION
+
+ void test_session_flags()
+ {
+ CPPUNIT_ASSERT(chroot->get_session_flags() ==
+ sbuild::chroot::SESSION_CREATE);
+
+ CPPUNIT_ASSERT(session->get_session_flags() ==
+ sbuild::chroot::SESSION_NOFLAGS);
+
+#ifdef SBUILD_FEATURE_UNION
+ CPPUNIT_ASSERT(chroot_union->get_session_flags() ==
+ (sbuild::chroot::SESSION_CREATE |
+ sbuild::chroot::SESSION_CLONE));
+
+ CPPUNIT_ASSERT(session_union->get_session_flags() ==
+ sbuild::chroot::SESSION_PURGE);
+
+ CPPUNIT_ASSERT(source_union->get_session_flags() ==
+ sbuild::chroot::SESSION_CREATE);
+#endif // SBUILD_FEATURE_UNION
+ }
+
+ void test_print_details()
+ {
+ std::ostringstream os;
+ os << chroot;
+ // TODO: Compare output.
+ CPPUNIT_ASSERT(!os.str().empty());
+ }
+
+ void test_print_config()
+ {
+ std::ostringstream os;
+ sbuild::keyfile config;
+ config << chroot;
+ os << sbuild::keyfile_writer(config);
+ // TODO: Compare output.
+ CPPUNIT_ASSERT(!os.str().empty());
+ }
+
+ void test_run_setup_scripts()
+ {
+ CPPUNIT_ASSERT(chroot->get_run_setup_scripts());
+ }
+
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(test_chroot_loopback);