Commit c6827475 authored by JINMEI Tatuya's avatar JINMEI Tatuya
Browse files

[trac915] added a utility python loadable module for testing,

"pyunittests_util".  It currently has one method named fix_current_time()
to tweak the current time value for time dependent python libraries
using C++ backend.
parent 04611df9
......@@ -776,6 +776,7 @@ AC_CONFIG_FILES([Makefile
src/lib/util/io/Makefile
src/lib/util/io/tests/Makefile
src/lib/util/unittests/Makefile
src/lib/util/pyunittests/Makefile
src/lib/util/tests/Makefile
tests/Makefile
tests/system/Makefile
......
SUBDIRS = . tests unittests io
SUBDIRS = . tests unittests io pyunittests
# The io/tests is hack, because otherwise we can not order these directories
# properly. Unittests use io and io/tests use unittest.
......
AM_CPPFLAGS = -I$(top_srcdir)/src/lib -I$(top_builddir)/src/lib
AM_CPPFLAGS += $(BOOST_INCLUDES)
AM_CXXFLAGS = $(B10_CXXFLAGS)
pyexec_LTLIBRARIES = pyunittests_util.la
pyunittests_util_la_SOURCES = pyunittests_util.cc
pyunittests_util_la_CPPFLAGS = $(AM_CPPFLAGS) $(PYTHON_INCLUDES)
pyunittests_util_la_LDFLAGS = $(PYTHON_LDFLAGS)
# Python prefers .so, while some OSes (specifically MacOS) use a different
# suffix for dynamic objects. -module is necessary to work this around.
pyunittests_util_la_LDFLAGS += -module
pyunittests_util_la_LIBADD = $(top_builddir)/src/lib/util/libutil.la
pyunittests_util_la_LIBADD += $(PYTHON_LIB)
// Copyright (C) 2011 Internet Systems Consortium, Inc. ("ISC")
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
// PERFORMANCE OF THIS SOFTWARE.
#include <Python.h>
#include <stdint.h>
// see util/time_utilities.h
namespace isc {
namespace util {
namespace detail {
extern int64_t (*gettimeFunction)();
}
}
}
namespace {
int64_t fake_current_time;
int64_t
getFakeTime() {
return (fake_current_time);
}
PyObject*
fixCurrentTime(PyObject*, PyObject* args) {
PyObject* maybe_none;
if (PyArg_ParseTuple(args, "L", &fake_current_time)) {
isc::util::detail::gettimeFunction = getFakeTime;
} else if (PyArg_ParseTuple(args, "O", &maybe_none) &&
maybe_none == Py_None) {
isc::util::detail::gettimeFunction = NULL;
} else {
PyErr_SetString(PyExc_TypeError, "Invalid arguments to "
"pyunittests_util.fix_current_time");
return (NULL);
}
PyErr_Clear();
Py_RETURN_NONE;
}
PyMethodDef PyUnittestsUtilMethods[] = {
{ "fix_current_time", fixCurrentTime, METH_VARARGS,
"Fix the current system time at the specified (fake) value.\n\n"
"This is useful for testing modules that depend on the current time.\n"
"Note that it only affects C++ modules that use gettimeWrapper() "
"defined in libutil, which allows a hook for testing.\n"
"If an integer (signed 64bit) is given, the current time will be fixed "
"to that value; if None is specified (which is the default) the use of "
"faked time will be canceled."
},
{ NULL, NULL, 0, NULL}
};
PyModuleDef pyunittests_util = {
{ PyObject_HEAD_INIT(NULL) NULL, 0, NULL},
"pyunittests_util",
"This module is a collection of utilities useful for testing "
"the BIND 10 C++ binding modules.",
-1,
PyUnittestsUtilMethods,
NULL,
NULL,
NULL,
NULL
};
} // end of unnamed namespace
PyMODINIT_FUNC
PyInit_pyunittests_util(void) {
return (PyModule_Create(&pyunittests_util));
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment