aboutsummaryrefslogtreecommitdiff
path: root/backend/tests/test-cfg-obj.hh
diff options
context:
space:
mode:
Diffstat (limited to 'backend/tests/test-cfg-obj.hh')
-rw-r--r--backend/tests/test-cfg-obj.hh254
1 files changed, 254 insertions, 0 deletions
diff --git a/backend/tests/test-cfg-obj.hh b/backend/tests/test-cfg-obj.hh
new file mode 100644
index 0000000..ab8b851
--- /dev/null
+++ b/backend/tests/test-cfg-obj.hh
@@ -0,0 +1,254 @@
+// test-cfg-obj.hh -- test suite for configuration objects
+// Copyright (C) 2008 SEIKO EPSON CORPORATION
+//
+// License: GPLv2+|iscan
+// Authors: AVASYS CORPORATION
+//
+// This file is part of Image Scan!'s SANE backend test suite.
+//
+// Image Scan!'s SANE backend test suite 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 2 of the License or at your option any later version.
+//
+// This program 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 ought to have received a copy of the GNU General Public License
+// along with this package. If not, see <http://www.gnu.org/licenses/>.
+//
+//
+// Linking Image Scan!'s SANE backend statically or dynamically with
+// other modules is making a combined work based on this SANE backend.
+// Thus, the terms and conditions of the GNU General Public License
+// cover the whole combination.
+//
+// As a special exception, the copyright holders of Image Scan!'s SANE
+// backend give you permission to link Image Scan!'s SANE backend with
+// SANE frontends that communicate with Image Scan!'s SANE backend
+// solely through the SANE Application Programming Interface,
+// regardless of the license terms of these SANE frontends, and to
+// copy and distribute the resulting combined work under terms of your
+// choice, provided that every copy of the combined work is
+// accompanied by a complete copy of the source code of Image Scan!'s
+// SANE backend (the version of Image Scan!'s SANE backend used to
+// produce the combined work), being distributed under the terms of
+// the GNU General Public License plus this exception. An independent
+// module is a module which is not derived from or based on Image
+// Scan!'s SANE backend.
+//
+// As a special exception, the copyright holders of Image Scan!'s SANE
+// backend give you permission to link Image Scan!'s SANE backend with
+// independent modules that communicate with Image Scan!'s SANE
+// backend solely through the "Interpreter" interface, regardless of
+// the license terms of these independent modules, and to copy and
+// distribute the resulting combined work under terms of your choice,
+// provided that every copy of the combined work is accompanied by a
+// complete copy of the source code of Image Scan!'s SANE backend (the
+// version of Image Scan!'s SANE backend used to produce the combined
+// work), being distributed under the terms of the GNU General Public
+// License plus this exception. An independent module is a module
+// which is not derived from or based on Image Scan!'s SANE backend.
+//
+// Note that people who make modified versions of Image Scan!'s SANE
+// backend are not obligated to grant special exceptions for their
+// modified versions; it is their choice whether to do so. The GNU
+// General Public License gives permission to release a modified
+// version without this exception; this exception also makes it
+// possible to release a modified version which carries forward this
+// exception.
+
+
+#ifndef included_test_cfg_obj_hh
+#define included_test_cfg_obj_hh
+
+#ifndef __cplusplus
+#error "This is a C++ include file. Use a C++ compiler to compile"
+#error "code that includes this file."
+#endif
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "../cfg-obj.h"
+#include <cxxtest/TestSuite.h>
+
+#include <cerrno>
+#include <cstdlib>
+#include <cstring>
+#include <fstream>
+#include <string>
+#include <unistd.h>
+
+#include "../message.h"
+
+
+class test_cfg_obj : public CxxTest::TestSuite
+{
+public:
+
+ void test_life_cycle (void)
+ {
+ cfg = cfg_init (dir.c_str (), NULL);
+ TS_ASSERT (cfg);
+
+ cfg = cfg_exit (cfg);
+ TS_ASSERT (!cfg);
+ }
+
+ void test_life_cycle_status (void)
+ {
+ SANE_Status status = SANE_STATUS_NO_MEM;
+
+ cfg = cfg_init (dir.c_str (), &status);
+ TS_ASSERT (cfg);
+
+ TS_ASSERT (SANE_STATUS_NO_MEM != status);
+
+ cfg = cfg_exit (cfg);
+ TS_ASSERT (!cfg);
+ }
+
+ void test_key_query (void)
+ {
+ cfg = cfg_init (dir.c_str (), NULL);
+ TS_ASSERT (cfg);
+
+ TS_ASSERT (cfg_has (cfg, CFG_KEY_USB));
+ }
+
+ void test_option_value_query (void)
+ {
+ cfg = cfg_init (dir.c_str (), NULL);
+ TS_ASSERT (cfg);
+
+ TS_ASSERT (cfg_has (cfg, CFG_KEY_OPTION));
+ TS_ASSERT (cfg_has_value (cfg, CFG_KEY_OPTION, "prefer-adf"));
+ TS_ASSERT (!cfg_has_value (cfg, CFG_KEY_OPTION, "not-a-valid-option"));
+ TS_ASSERT (!cfg_has_value (cfg, CFG_KEY_OPTION, "not-in-config"));
+ }
+
+ void test_key_mutator (void)
+ {
+ cfg = cfg_init (dir.c_str (), NULL);
+ TS_ASSERT (cfg);
+
+ TS_ASSERT (cfg_has (cfg, CFG_KEY_USB));
+ cfg_set (cfg, CFG_KEY_USB, false);
+ TS_ASSERT (!cfg_has (cfg, CFG_KEY_USB));
+ cfg_set (cfg, CFG_KEY_USB, true);
+ TS_ASSERT (cfg_has (cfg, CFG_KEY_USB));
+ }
+
+ void test_net_registration (void)
+ {
+ add_cfg_entry ("net\n");
+
+ cfg = cfg_init (dir.c_str (), NULL);
+ TS_ASSERT (!cfg_has (cfg, CFG_KEY_NET));
+ }
+
+private:
+
+ void *cfg;
+ std::string dir;
+
+ /*! Create a temporary, minimal configuration directory.
+
+ The configuration directory is made available to the unit test
+ environment via the \c SANE_CONFIG_DIR environment variable so
+ configuration objects (should) take note. In addition, a very
+ minimal configuration file, containing the \c usb keyword and
+ a few options is created in this directory as well.
+ */
+ void setUp (void)
+ {
+ int result;
+ msg_init ();
+
+ char dirname_template[] = ".cfg-obj-XXXXXX";
+ char *dirname = mkdtemp (dirname_template);
+ if (!dirname)
+ {
+ err_fatal ("mkdtemp: %s", strerror (errno));
+ }
+ require (dirname);
+
+ result = chdir (dirname);
+ require (0 == result);
+
+ std::ofstream ofs (cfg_file_name);
+ ofs << "usb\n";
+ ofs << "option prefer-adf \n";
+ ofs << "option not-a-valid-option\n";
+
+ result = chdir ("..");
+ require (0 == result);
+
+ result = setenv ("SANE_CONFIG_DIR", dirname, true);
+ require (0 == result);
+
+ cfg = NULL;
+ dir = dirname;
+ }
+
+ /*! Attempts to undo the effects of setUp().
+
+ The environment's \c SANE_CONFIG_DIR is unset and the temporary
+ configuration directory is recursively removed. Failures to
+ undo any of the necessary actions are logged but will not cause
+ a test to fail.
+ */
+ void tearDown (void)
+ {
+ int result;
+
+ if (0 != unsetenv ("SANE_CONFIG_DIR"))
+ {
+ err_minor ("unsetenv: %s", strerror (errno));
+ }
+
+ if (0 != chdir (dir.c_str ()))
+ {
+ err_minor ("%s: %s", dir.c_str (), strerror (errno));
+ }
+ else
+ {
+ if (0 != unlink (cfg_file_name))
+ {
+ err_minor ("%s: %s", cfg_file_name, strerror (errno));
+ }
+ if (0 != unlink ("usb"))
+ {
+ err_minor ("%s: %s", "usb", strerror (errno));
+ }
+ result = chdir ("..");
+ require (0 == result);
+ }
+
+ if (0 != rmdir (dir.c_str ()))
+ {
+ err_minor ("%s: %s", dir.c_str (), strerror (errno));
+ }
+ dir = "";
+
+ cfg = cfg_exit (cfg);
+ promise (!cfg);
+ }
+
+ void add_cfg_entry (const char *str)
+ {
+ chdir (dir.c_str ());
+ std::ofstream ofs (cfg_file_name,
+ std::ios_base::out | std::ios_base::app);
+
+ ofs << str;
+ chdir ("..");
+ }
+};
+
+
+#endif /* !defined (included_test_cfg_obj_hh) */