From 9ea17ac59570faab41e290f900057882f816fda6 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Fri, 2 Feb 2001 05:57:15 +0000 Subject: Patch derived from Trent's 101162: a Python/C API testing framework. STILL NEEDS UNIX BUILD CHANGES. --- Lib/test/output/test_capi | 1 + Lib/test/test_capi.py | 16 ++++++++ Misc/NEWS | 13 ++++++- Modules/_testmodule.c | 68 ++++++++++++++++++++++++++++++++ PCbuild/_test.dsp | 99 +++++++++++++++++++++++++++++++++++++++++++++++ PCbuild/pcbuild.dsw | 12 ++++++ PCbuild/readme.txt | 3 ++ 7 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 Lib/test/output/test_capi create mode 100644 Lib/test/test_capi.py create mode 100644 Modules/_testmodule.c create mode 100644 PCbuild/_test.dsp diff --git a/Lib/test/output/test_capi b/Lib/test/output/test_capi new file mode 100644 index 0000000..c095219 --- /dev/null +++ b/Lib/test/output/test_capi @@ -0,0 +1 @@ +test_capi diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py new file mode 100644 index 0000000..8b39829 --- /dev/null +++ b/Lib/test/test_capi.py @@ -0,0 +1,16 @@ +# Run the _test module tests (tests for the Python/C API): by defn, these +# are all functions _test exports whose name begins with 'test_'. + +import sys +import test_support +import _test + +for name in dir(_test): + if name.startswith('test_'): + test = getattr(_test, name) + if test_support.verbose: + print "internal", name + try: + test() + except _test.error: + raise test_support.TestFailed, sys.exc_info()[1] diff --git a/Misc/NEWS b/Misc/NEWS index 86cb703..0e7a1ff 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -60,7 +60,7 @@ Core language, builtins, and interpreter - A 'continue' statement can now appear in a try block within the body of a loop. It is still not possible to use continue in a finally - clause. + clause. Standard library @@ -94,12 +94,21 @@ Standard library - The socket module now supports raw packets on Linux. The socket family is AF_PACKET. +- test_capi.py is a start at running tests of the Python C API. The tests + are implemented by the new Modules/_testmodule.c. + Windows changes - Build procedure: the zlib project is built in a different way that ensures the zlib header files used can no longer get out of synch with - the zlib binary used. See PCbuild\readme.txt for details. + the zlib binary used. See PCbuild\readme.txt for details. Your old + zlib-related directories can be deleted; you'll need to download fresh + source for zlib and unpack it into a new directory. + +- Build: New subproject _test for the benefit of test_capi.py (see above). +- Build: subproject ucnhash is gone, since the code was folded into the + unicodedata subproject. What's New in Python 2.1 alpha 1? ================================= diff --git a/Modules/_testmodule.c b/Modules/_testmodule.c new file mode 100644 index 0000000..e4c9c75 --- /dev/null +++ b/Modules/_testmodule.c @@ -0,0 +1,68 @@ +/* + * C Extension module to test Python interpreter C APIs. + * + * The 'test_*' functions exported by this module are run as part of the + * standard Python regression test, via Lib/test/test_capi.py. + */ + +#include "Python.h" + +static PyObject *TestError; /* set to exception object in init */ + +/* Test #defines from config.h (particularly the SIZEOF_* defines). + + The ones derived from autoconf on the UNIX-like OSes can be relied + upon (in the absence of sloppy cross-compiling), but the Windows + platforms have these hardcoded. Better safe than sorry. +*/ +static PyObject* +sizeof_error(const char* fatname, const char* typename, + int expected, int got) +{ + char buf[1024]; + sprintf(buf, "%s #define == %d but sizeof(%s) == %d", + fatname, expected, typename, got); + PyErr_SetString(TestError, buf); + return (PyObject*)NULL; +} + +static PyObject* +test_config(PyObject *self, PyObject *args) +{ + if (!PyArg_ParseTuple(args, ":test_config")) + return NULL; + +#define CHECK_SIZEOF(FATNAME, TYPE) \ + if (FATNAME != sizeof(TYPE)) \ + return sizeof_error(#FATNAME, #TYPE, FATNAME, sizeof(TYPE)) + + CHECK_SIZEOF(SIZEOF_INT, int); + CHECK_SIZEOF(SIZEOF_LONG, long); + CHECK_SIZEOF(SIZEOF_VOID_P, void*); + CHECK_SIZEOF(SIZEOF_TIME_T, time_t); +#ifdef HAVE_LONG_LONG + CHECK_SIZEOF(SIZEOF_LONG_LONG, LONG_LONG); +#endif + +#undef CHECK_SIZEOF + + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef TestMethods[] = { + {"test_config", test_config, METH_VARARGS}, + {NULL, NULL} /* sentinel */ +}; + +DL_EXPORT(void) +init_test(void) +{ + PyObject *m, *d; + + m = Py_InitModule("_test", TestMethods); + + TestError = PyErr_NewException("_test.error", NULL, NULL); + d = PyModule_GetDict(m); + PyDict_SetItemString(d, "error", TestError); +} diff --git a/PCbuild/_test.dsp b/PCbuild/_test.dsp new file mode 100644 index 0000000..6bf5666 --- /dev/null +++ b/PCbuild/_test.dsp @@ -0,0 +1,99 @@ +# Microsoft Developer Studio Project File - Name="_test" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=_test - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "_test.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "_test.mak" CFG="_test - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "_test - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "_test - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "_test" +# PROP Scc_LocalPath ".." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "_test - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "." +# PROP Intermediate_Dir "x86-temp-release\_test" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +F90=df.exe +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\Include" /I "..\PC" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0xc09 /d "NDEBUG" +# ADD RSC /l 0xc09 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1e1F0000" /dll /machine:I386 /out:"./_test.pyd" /export:init_test +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "_test - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "." +# PROP Intermediate_Dir "x86-temp-debug\_test" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +F90=df.exe +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\Include" /I "..\PC" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "MMAP_EXPORTS" /YX /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0xc09 /d "_DEBUG" +# ADD RSC /l 0xc09 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /base:"0x1e1F0000" /dll /debug /machine:I386 /out:"./_test_d.pyd" /pdbtype:sept /export:init_test +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "_test - Win32 Release" +# Name "_test - Win32 Debug" +# Begin Source File + +SOURCE=..\Modules\_testmodule.c +# End Source File +# End Target +# End Project diff --git a/PCbuild/pcbuild.dsw b/PCbuild/pcbuild.dsw index 1e521ad..87c9ad9 100644 --- a/PCbuild/pcbuild.dsw +++ b/PCbuild/pcbuild.dsw @@ -33,6 +33,18 @@ Package=<4> ############################################################################### +Project: "_test"=.\_test.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + Project: "_tkinter"=.\_tkinter.dsp - Package Owner=<4> Package=<5> diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt index 255a53b..f7a6e8c 100644 --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -55,6 +55,9 @@ winreg Windows registry API winsound play sounds (typically .wav files) under Windows +_test + tests of the Python C API, run via Lib/test/test_capi.py, and + implemented by module Modules/_testmodule.c The following subprojects will generally NOT build out of the box. They wrap code Python doesn't control, and you'll need to download the base -- cgit v0.12