// 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 .
//
//
// 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
#endif
#include "../model-info.h"
#include
#include
#include
#include
#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 (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) */