aboutsummaryrefslogtreecommitdiff
path: root/backend/tests/test-model-info.hh
diff options
context:
space:
mode:
Diffstat (limited to 'backend/tests/test-model-info.hh')
-rw-r--r--backend/tests/test-model-info.hh241
1 files changed, 241 insertions, 0 deletions
diff --git a/backend/tests/test-model-info.hh b/backend/tests/test-model-info.hh
new file mode 100644
index 0000000..1796b03
--- /dev/null
+++ b/backend/tests/test-model-info.hh
@@ -0,0 +1,241 @@
+// test-model-info.hh -- test suite for model info objects
+// Copyright (C) 2010 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_model_info_hh
+#define included_test_model_info_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 "../model-info.h"
+#include <cxxtest/TestSuite.h>
+
+#include <cstdlib>
+#include <cstring>
+#include <string>
+
+#include "../list.h"
+#include "../message.h"
+#include "../get-infofile.h"
+
+struct base
+{
+ std::string dir;
+ void *cache;
+
+ void setUp (void)
+ {
+ // Log at least broken promises and unmet requirements.
+ setenv ("SANE_DEBUG_EPKOWA", "FATAL", false);
+ msg_init ();
+
+ char *srcdir = getenv ("srcdir");
+ dir = (srcdir ? srcdir : ".");
+
+ cache = NULL;
+ }
+
+ void tearDown (void)
+ {
+ cache = model_info_cache_exit (cache);
+ promise (!cache);
+ }
+};
+
+class test_model_cache_info : public CxxTest::TestSuite, public base
+{
+public:
+
+ void test_cache_life_cycle (void)
+ {
+ cache = model_info_cache_init (dir.c_str (), NULL);
+ TS_ASSERT (cache);
+
+ cache = model_info_cache_exit (cache);
+ TS_ASSERT (!cache);
+ }
+
+ void test_cache_life_cycle_status (void)
+ {
+ SANE_Status status = SANE_STATUS_NO_MEM;
+
+ cache = model_info_cache_init (dir.c_str (), &status);
+ TS_ASSERT (cache);
+
+ TS_ASSERT (SANE_STATUS_NO_MEM != status);
+
+ cache = model_info_cache_exit (cache);
+ TS_ASSERT (!cache);
+ }
+
+ void test_cache_unique_entries (void)
+ {
+ cache = model_info_cache_init (dir.c_str (), NULL);
+ TS_ASSERT (cache);
+
+ for (int i = 0; i < 10; ++i) {
+ model_info_cache_get_info ("GT-X970", NULL);
+ model_info_cache_get_info ("ES-H300", NULL);
+ }
+ TS_ASSERT_EQUALS (2, list_size (static_cast<list *> (cache)));
+ }
+
+private:
+ void setUp (void) { base::setUp (); }
+ void tearDown (void) { base::setUp (); }
+};
+
+class test_model_info : public CxxTest::TestSuite, public base
+{
+public:
+
+ void test_get_non_existent_model (void)
+ {
+ char *model = model_info_cache_get_model (bad_fw_name);
+ TS_ASSERT_EQUALS (std::string (model), std::string (bad_fw_name));
+ free (model);
+ }
+
+ void test_get_non_existent_info (void)
+ {
+ const void *info = model_info_cache_get_info (bad_fw_name, NULL);
+ TS_ASSERT (info);
+ }
+
+ void test_get_info_from_loaded_cache (void)
+ {
+ // load cache
+ model_info_cache_get_info (bad_fw_name, NULL);
+ model_info_cache_get_info ("GT-X970", NULL); // XML data
+ model_info_cache_get_info ("ES-H300", NULL); // XML data
+
+ // get info
+ const void *info = model_info_cache_get_info ("GT-X970", NULL);
+ TS_ASSERT (info);
+ TS_ASSERT (model_info_cache_get_info ("ES-H300", NULL));
+ TS_ASSERT (model_info_cache_get_info (bad_fw_name, NULL));
+ TS_ASSERT_EQUALS (info, model_info_cache_get_info ("GT-X970", NULL));
+ }
+
+ void test_get_existing_model (void)
+ {
+ setenv ("TZ", "", true); // force UTC, i.e. overseas model name
+
+ char *model = model_info_cache_get_model ("ES-H300");
+ TS_ASSERT_EQUALS (std::string ("GT-2500"), std::string (model));
+ free (model);
+ }
+
+ void test_default_values (void)
+ {
+ const void *p = model_info_cache_get_info (bad_fw_name, NULL);
+
+ const char *name = model_info_get_name (p);
+ TS_ASSERT_EQUALS (std::string (bad_fw_name), std::string (name));
+
+ const EpsonScanHard profile = model_info_get_profile (p);
+ TS_ASSERT_SAME_DATA (profile, &epson_scan_hard[0],
+ sizeof (profile));
+ }
+
+ void test_profile_equality_values (void)
+ {
+ // Identical models but for their fw_names.
+ const void *p1 = model_info_cache_get_info ("GT-10000", NULL);
+ const void *p2 = model_info_cache_get_info ("ES-6000", NULL);
+
+ TS_ASSERT_DIFFERS (p1, p2);
+ TS_ASSERT_SAME_DATA (model_info_get_profile (p1),
+ model_info_get_profile (p2),
+ sizeof (const EpsonScanHard));
+ }
+
+private:
+
+ // A firmware name that is guaranteed not to be used.
+ static const char *bad_fw_name;
+
+ void setUp (void)
+ {
+ base::setUp ();
+ cache = model_info_cache_init (dir.c_str (), NULL);
+ TS_ASSERT (cache);
+ // The ESC/I spec has a 16 byte limit on the F/W name.
+ TS_ASSERT (16 < strlen (bad_fw_name));
+ }
+
+ void tearDown (void)
+ {
+ base::tearDown ();
+ }
+};
+
+const char * test_model_info::bad_fw_name = " __ BAD F/W NAME __ ";
+
+#endif /* !defined (included_test_model_info_hh) */