diff options
author | Daniel Boelzle <dbo@openoffice.org> | 2001-10-17 11:40:31 +0000 |
---|---|---|
committer | Daniel Boelzle <dbo@openoffice.org> | 2001-10-17 11:40:31 +0000 |
commit | 866f0e76d0d7317076cbb3fc1c7d128c4c54af3a (patch) | |
tree | 34789eee05052249c5b354f2db67b1403ddf9026 /cppu/test/alignment | |
parent | dc3a05a841b2d89e74391b2652bce9183f08bc6f (diff) |
#92951# added comprehensive type test
Diffstat (limited to 'cppu/test/alignment')
-rw-r--r-- | cppu/test/alignment/diagnose.h | 101 | ||||
-rw-r--r-- | cppu/test/alignment/makefile.mk | 115 | ||||
-rw-r--r-- | cppu/test/alignment/pass1.cxx | 266 |
3 files changed, 482 insertions, 0 deletions
diff --git a/cppu/test/alignment/diagnose.h b/cppu/test/alignment/diagnose.h new file mode 100644 index 000000000000..d03f6a5011d1 --- /dev/null +++ b/cppu/test/alignment/diagnose.h @@ -0,0 +1,101 @@ +/************************************************************************* + * + * $RCSfile: diagnose.h,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: dbo $ $Date: 2001-10-17 12:40:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ +#ifndef __SHARE_H__ +#define __SHARE_H__ + +#include <sal/types.h> +#include <stdio.h> + +#if defined(__GNUC__) && defined(LINUX) && defined(INTEL) +#define __ALIGNMENT__(s, n) __alignof__ (s) +#else +#define __ALIGNMENT__(s, n) n +#endif + +#define OFFSET_OF( s, m ) ((sal_Size)((char *)&((s *)16)->m -16)) + +#define BINTEST_VERIFY( c ) \ + if (! (c)) { fprintf( stderr, "### binary compatibility test failed: " #c " [line %d]!!!\n", __LINE__ ); abort(); } + +#ifdef DEBUG + +#define BINTEST_VERIFYOFFSET( s, m, n ) \ + fprintf( stderr, "> OFFSET_OF(" #s ", " #m ") = %d\n", OFFSET_OF(s, m) ); \ + if (OFFSET_OF(s, m) != n) { fprintf( stderr, "### OFFSET_OF(" #s ", " #m ") = %d instead of expected %d!!!\n", OFFSET_OF(s, m), n ); abort(); } +#define BINTEST_VERIFYSIZE( s, n ) \ + fprintf( stderr, "> sizeof (" #s ") = %d\n", sizeof(s) ); \ + if (sizeof(s) != n) { fprintf( stderr, "### sizeof(" #s ") = %d instead of expected %d!!!\n", sizeof(s), n ); abort(); } +#define BINTEST_VERIFYALIGNMENT( s, n ) \ + fprintf( stderr, "> alignment of " #s " = %d\n", __ALIGNMENT__(s, n) ); \ + if (__ALIGNMENT__(s, n) != n) { fprintf( stderr, "### alignment of " #s " = %d instead of expected %d!!!\n", __ALIGNMENT__(s, n), n ); abort(); } + +#else + +#define BINTEST_VERIFYOFFSET( s, m, n ) \ + if (OFFSET_OF(s, m) != n) { fprintf( stderr, "### OFFSET_OF(" #s ", " #m ") = %d instead of expected %d!!!\n", OFFSET_OF(s, m), n ); abort(); } +#define BINTEST_VERIFYSIZE( s, n ) \ + if (sizeof(s) != n) { fprintf( stderr, "### sizeof(" #s ") = %d instead of expected %d!!!\n", sizeof(s), n ); abort(); } +#define BINTEST_VERIFYALIGNMENT( s, n ) \ + if (__ALIGNMENT__(s, n) != n) { fprintf( stderr, "### alignment of " #s " = %d instead of expected %d!!!\n", __ALIGNMENT__(s, n), n ); abort(); } + +#endif + +#endif diff --git a/cppu/test/alignment/makefile.mk b/cppu/test/alignment/makefile.mk new file mode 100644 index 000000000000..c0ec48c96072 --- /dev/null +++ b/cppu/test/alignment/makefile.mk @@ -0,0 +1,115 @@ +#************************************************************************* +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.1 $ +# +# last change: $Author: dbo $ $Date: 2001-10-17 12:40:31 $ +# +# The Contents of this file are made available subject to the terms of +# either of the following licenses +# +# - GNU Lesser General Public License Version 2.1 +# - Sun Industry Standards Source License Version 1.1 +# +# Sun Microsystems Inc., October, 2000 +# +# GNU Lesser General Public License Version 2.1 +# ============================================= +# Copyright 2000 by Sun Microsystems, Inc. +# 901 San Antonio Road, Palo Alto, CA 94303, USA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License version 2.1, as published by the Free Software Foundation. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# +# +# Sun Industry Standards Source License Version 1.1 +# ================================================= +# The contents of this file are subject to the Sun Industry Standards +# Source License Version 1.1 (the "License"); You may not use this file +# except in compliance with the License. You may obtain a copy of the +# License at http://www.openoffice.org/license.html. +# +# Software provided under this License is provided on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +# WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, +# MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. +# See the License for the specific provisions governing your rights and +# obligations concerning the Software. +# +# The Initial Developer of the Original Code is: Sun Microsystems, Inc. +# +# Copyright: 2000 by Sun Microsystems, Inc. +# +# All Rights Reserved. +# +# Contributor(s): _______________________________________ +# +# +# +#************************************************************************* + +# +# build /test first, then /test/alignment_tests +# + +PRJ=..$/.. +PRJNAME=cppu +TARGET=alignment +LIBTARGET=NO +TARGETTYPE=CUI +ENABLE_EXCEPTIONS=TRUE +NO_BSYMBOLIC=TRUE + +# --- Settings ----------------------------------------------------- + +.INCLUDE : svpre.mk +.INCLUDE : settings.mk +.INCLUDE : sv.mk + +# --- Files -------------------------------------------------------- + +UNOUCRDEP=$(BIN)$/testcppu.rdb +UNOUCRRDB=$(BIN)$/testcppu.rdb +UNOUCROUT=$(INCCOM)$/test$/alignment +INCPRE+=$(INCCOM)$/test -I$(INCCOM)$/test$/alignment -I$(PRJ)$/test$/alignment + +DEPOBJFILES= \ + $(OBJ)$/pass1.obj \ + $(OBJ)$/pass2.obj + +APP1OBJS = $(OBJ)$/pass1.obj +APP1STDLIBS += $(CPPUHELPERLIB) $(CPPULIB) $(SALHELPERLIB) $(SALLIB) +APP1TARGET = pass1 + +APP2OBJS = $(OBJ)$/pass2.obj +#APP2STDLIBS += $(CPPUHELPERLIB) $(CPPULIB) $(SALLIB) +APP2TARGET = pass2 + +# --- Targets ------------------------------------------------------ + +.IF "$(depend)" == "" +ALLTAR: execute_pass2 +.ELSE +ALL: ALLDEP +.ENDIF + +.INCLUDE : target.mk + +$(MISC)$/pass2.cxx: $(APP1TARGETN) + +cppumaker @$(mktmp $(CPPUMAKERFLAGS) -BUCR -O$(UNOUCROUT) $(foreach,c,$(shell $(APP1TARGETN) -env:UNO_TYPES={$(subst,\,\\ $(UNOUCRRDB))} $(subst,\,\\ $(MISC)$/pass2.cxx) dump_types) -T$c) $(UNOUCRRDB)) + +execute_pass2: $(APP2TARGETN) + $(APP2TARGETN) + diff --git a/cppu/test/alignment/pass1.cxx b/cppu/test/alignment/pass1.cxx new file mode 100644 index 000000000000..d277d125ecfc --- /dev/null +++ b/cppu/test/alignment/pass1.cxx @@ -0,0 +1,266 @@ +/************************************************************************* + * + * $RCSfile: pass1.cxx,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: dbo $ $Date: 2001-10-17 12:40:31 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + +#include <stdio.h> +#include <vector> + +#include <rtl/string.hxx> +#include <rtl/strbuf.hxx> +#include <rtl/bootstrap.hxx> +#include <rtl/process.h> + +#include <registry/reflread.hxx> + +// starting the executable: +// -env:UNO_CFG_URL=local;<absolute_path>..\\..\\test\\cfg_data;<absolute_path>\\cfg_update +// -env:UNO_TYPES=cpputest.rdb + +#include <cppuhelper/bootstrap.hxx> + +#include <com/sun/star/lang/XComponent.hpp> + +#define OUSTR(x) ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM(x) ) +#define OSTR(x) ::rtl::OUStringToOString( x, RTL_TEXTENCODING_ASCII_US ) + + +using namespace ::cppu; +using namespace ::rtl; +using namespace ::osl; +using namespace ::com::sun::star; +using namespace ::com::sun::star::uno; + + +static void find_all_structs( + Reference< registry::XRegistryKey > const & xKey, + ::std::vector< OUString > * pNames ) +{ + static RegistryTypeReaderLoader s_loader; + OSL_VERIFY( s_loader.isLoaded() ); + + if (xKey.is() && xKey->isValid()) + { + if (xKey->getValueType() == registry::RegistryValueType_BINARY) + { + Sequence< sal_Int8 > aBytes( xKey->getBinaryValue() ); + RegistryTypeReader aReader( + s_loader, (const sal_uInt8 *)aBytes.getConstArray(), + aBytes.getLength(), sal_False ); + + switch (aReader.getTypeClass()) + { + case RT_TYPE_EXCEPTION: + case RT_TYPE_STRUCT: + pNames->push_back( aReader.getTypeName().replace( '/', '.' ) ); + break; + } + } + + Sequence< Reference< registry::XRegistryKey > > keys( xKey->openKeys() ); + Reference< registry::XRegistryKey > const * pKeys = keys.getConstArray(); + for ( sal_Int32 nPos = keys.getLength(); nPos--; ) + { + find_all_structs( pKeys[ nPos ], pNames ); + } + } +} + +static OString makeIncludeName( OUString const & name ) SAL_THROW( () ) +{ + return OSTR(name.replace( '.', '/' )); +} +static OString makeCppName( OUString const & name ) SAL_THROW( () ) +{ + OStringBuffer buf( 64 ); + OString str( OSTR(name) ); + sal_Int32 n = 0; + do + { + buf.append( str.getToken( 0, '.', n ) ); + if (n >= 0) + buf.append( "::" ); + } + while (n >= 0); + return buf.makeStringAndClear(); +} + +//================================================================================================== +int SAL_CALL main( int, char const ** ) +{ + sal_Int32 argc = rtl_getAppCommandArgCount(); + if (argc < 1) + { + fprintf( stderr, "usage: pass1 pass2_source [typelist_to_stdout]\n" ); + return 1; + } + + try + { + // determine types rdb + OUString rdb_name; + Bootstrap bootstrap; + if (!bootstrap.getFrom( OUSTR("UNO_TYPES"), rdb_name ) || !rdb_name.getLength()) + { + fprintf( + stderr, + "### no UNO_TYPES registry found!!!\n\n" + "usage: pass1 pass2_source [typelist_to_stdout]\n" ); + return 1; + } + + Reference< XComponentContext > xContext( defaultBootstrap_InitialComponentContext() ); + + // read out all struct names from given registry + Reference< registry::XSimpleRegistry > xSimReg( createSimpleRegistry() ); + OSL_ASSERT( xSimReg.is() ); + xSimReg->open( rdb_name, sal_True, sal_False ); + OSL_ASSERT( xSimReg->isValid() ); + Reference< registry::XRegistryKey > xKey( xSimReg->getRootKey() ); + OSL_ASSERT( xKey.is() && xKey->isValid() ); + + ::std::vector< OUString > names; + names.reserve( 128 ); + find_all_structs( xKey->openKey( OUSTR("UCR") ), &names ); + + OUString fileName; + OSL_VERIFY( osl_Process_E_None == rtl_getAppCommandArg( 0, &fileName.pData ) ); + bool bDumpStdOut = (argc > 1); + + // generate pass2 output file [and type list] + OString str( OSTR(fileName) ); + FILE * hPass2 = fopen( str.getStr(), "w" ); + OSL_ASSERT( hPass2 ); + + size_t nPos; + for ( nPos = names.size(); nPos--; ) + { + OUString const & name = names[ nPos ]; + if (bDumpStdOut) + { + // type name on stdout + OString str( OSTR(name) ); + fprintf( stdout, "%s\n", str.getStr() ); + } + // all includes + OString includeName( makeIncludeName( name ) ); + fprintf( hPass2, "#include <%s.hdl>\n", includeName.getStr() ); + } + // include diagnose.h + fprintf( + hPass2, + "\n#include <diagnose.h>\n\n" + "int SAL_CALL main( int argc, char const * argv[] )\n{\n" ); + // generate all type checks + for ( nPos = names.size(); nPos--; ) + { + OUString const & name = names[ nPos ]; + typelib_TypeDescription * pTD = 0; + typelib_typedescription_getByName( &pTD, name.pData ); + if (pTD) + { + if (! pTD->bComplete) + { + typelib_typedescription_complete( &pTD ); + } + typelib_CompoundTypeDescription * pCTD = (typelib_CompoundTypeDescription *)pTD; + + OString cppName( makeCppName( name ) ); + fprintf( + hPass2, "\tBINTEST_VERIFYSIZE( %s, %d );\n", + cppName.getStr(), pTD->nSize ); + fprintf( + hPass2, "\tBINTEST_VERIFYALIGNMENT( %s, %d );\n", + cppName.getStr(), pTD->nAlignment ); + // offset checks + for ( sal_Int32 nPos = pCTD->nMembers; nPos--; ) + { + OString memberName( OSTR(pCTD->ppMemberNames[ nPos ]) ); + fprintf( + hPass2, "\tBINTEST_VERIFYOFFSET( %s, %s, %d );\n", + cppName.getStr(), memberName.getStr(), pCTD->pMemberOffsets[ nPos ] ); + } + typelib_typedescription_release( pTD ); + } + else + { + OString str( OSTR(name) ); + fprintf( stderr, "### cannot dump type %s!!!\n", str.getStr() ); + } + } + fprintf( + hPass2, + "\n\tfprintf( stdout, \"> alignment test succeeded.\\n\" );\n" + "\treturn 0;\n}\n\n" ); + fclose( hPass2 ); + + Reference< lang::XComponent > xComp( xContext, UNO_QUERY ); + if (xComp.is()) + { + xComp->dispose(); + } + return 0; + } + catch (Exception & exc) + { + OString str( OUStringToOString( exc.Message, RTL_TEXTENCODING_ASCII_US ) ); + ::fprintf( stderr, "# caught exception: %s\n", str.getStr() ); + return 1; + } +} |