mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-08-31 14:05:33 +00:00
[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.
This commit is contained in:
@@ -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
|
||||
|
@@ -1,4 +1,4 @@
|
||||
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.
|
||||
|
||||
|
14
src/lib/util/pyunittests/Makefile.am
Normal file
14
src/lib/util/pyunittests/Makefile.am
Normal file
@@ -0,0 +1,14 @@
|
||||
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)
|
84
src/lib/util/pyunittests/pyunittests_util.cc
Normal file
84
src/lib/util/pyunittests/pyunittests_util.cc
Normal file
@@ -0,0 +1,84 @@
|
||||
// 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));
|
||||
}
|
Reference in New Issue
Block a user