From 891cea19ddbd60069d06a7f472672f7e569a9354 Mon Sep 17 00:00:00 2001 From: Steven Knight Date: Sat, 4 Sep 2004 17:25:20 +0000 Subject: Add an rpcgen tool. (Kevin Quick) --- doc/man/scons.1 | 95 +++++++++++++++++++++++++ src/CHANGES.txt | 5 ++ src/engine/MANIFEST.in | 1 + src/engine/SCons/Tool/__init__.py | 3 +- src/engine/SCons/Tool/rpcgen.py | 64 +++++++++++++++++ test/Rpcgen/RPCGEN.py | 145 ++++++++++++++++++++++++++++++++++++++ test/Rpcgen/RPCGENCLIENTFLAGS.py | 85 ++++++++++++++++++++++ test/Rpcgen/RPCGENFLAGS.py | 84 ++++++++++++++++++++++ test/Rpcgen/RPCGENHEADERFLAGS.py | 85 ++++++++++++++++++++++ test/Rpcgen/RPCGENSERVICEFLAGS.py | 85 ++++++++++++++++++++++ test/Rpcgen/RPCGENXDRFLAGS.py | 85 ++++++++++++++++++++++ test/import.py | 1 + test/rpcgen.py | 99 ++++++++++++++++++++++++++ 13 files changed, 836 insertions(+), 1 deletion(-) create mode 100644 src/engine/SCons/Tool/rpcgen.py create mode 100644 test/Rpcgen/RPCGEN.py create mode 100644 test/Rpcgen/RPCGENCLIENTFLAGS.py create mode 100644 test/Rpcgen/RPCGENFLAGS.py create mode 100644 test/Rpcgen/RPCGENHEADERFLAGS.py create mode 100644 test/Rpcgen/RPCGENSERVICEFLAGS.py create mode 100644 test/Rpcgen/RPCGENXDRFLAGS.py create mode 100644 test/rpcgen.py diff --git a/doc/man/scons.1 b/doc/man/scons.1 index 910d77d..28f7029 100644 --- a/doc/man/scons.1 +++ b/doc/man/scons.1 @@ -1022,6 +1022,7 @@ pdflatex pdftex qt rmic +rpcgen sgiar sgic++ sgicc @@ -1657,6 +1658,66 @@ env.RMIC(target = 'outdir3', .EE '\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.IP RPCGenClient() +.IP env.RPCGenClient() +Generates an RPC client stub (_clnt.c) file +from a specified RPC (.x) source file. +Because rpcgen only builds output files +in the local directory, +the command will be executed +in the source file's directory by default. + +.ES +# Builds src/rpcif_clnt.c +env.RPCGenClient('src/rpcif.x') +.EE + +'\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.IP RPCGenHeader() +.IP env.RPCGenHeader() +Generates an RPC header (.h) file +from a specified RPC (.x) source file. +Because rpcgen only builds output files +in the local directory, +the command will be executed +in the source file's directory by default. + +.ES +# Builds src/rpcif.h +env.RPCGenHeader('src/rpcif.x') +.EE + +'\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.IP RPCGenService() +.IP env.RPCGenService() +Generates an RPC server-skeleton (_svc.c) file +from a specified RPC (.x) source file. +Because rpcgen only builds output files +in the local directory, +the command will be executed +in the source file's directory by default. + +.ES +# Builds src/rpcif_svc.c +env.RPCGenClient('src/rpcif.x') +.EE + +'\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" +.IP RPCGenXDR() +.IP env.RPCGenXDR() +Generates an RPC XDR routine (_xdr.c) file +from a specified RPC (.x) source file. +Because rpcgen only builds output files +in the local directory, +the command will be executed +in the source file's directory by default. + +.ES +# Builds src/rpcif_xdr.c +env.RPCGenClient('src/rpcif.x') +.EE + +'\""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" .IP SharedLibrary() .IP env.SharedLibrary() Builds a shared library @@ -5828,6 +5889,40 @@ are included on this command line. .IP RMICFLAGS General options passed to the Java RMI stub compiler. +.IP RPCGEN +The RPC protocol compiler. + +.IP RPCGENCLIENTFLAGS +Options passed to the RPC protocol compiler +when generating client side stubs. +These are in addition to any flags specified in the +.B RPCGENFLAGS +construction variable. + +.IP RPCGENFLAGS +General options passed to the RPC protocol compiler. + +.IP RPCGENHEADERFLAGS +Options passed to the RPC protocol compiler +when generating a header file. +These are in addition to any flags specified in the +.B RPCGENFLAGS +construction variable. + +.IP RPCGENSERVICEFLAGS +Options passed to the RPC protocol compiler +when generating server side stubs. +These are in addition to any flags specified in the +.B RPCGENFLAGS +construction variable. + +.IP RPCGENXDRFLAGS +Options passed to the RPC protocol compiler +when generating XDR routines. +These are in addition to any flags specified in the +.B RPCGENFLAGS +construction variable. + .IP RPATH A list of paths to search for shared libraries when running programs. Currently only used in the GNU linker (gnulink) and IRIX linker (sgilink). diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 5fdc59d..ad69907 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -43,6 +43,11 @@ RELEASE 0.97 - XXX - Fix the Builder name returned from ListBuilders and other instances of subclasses of the BuilderBase class. + - Add Builders and construction variables to support rpcgen: + RPCGenClient(), RPCGenHeader(), RPCGenService(), RPCGenXDR(), + $RPCGEN, $RPCGENFLAGS, $RPCGENCLIENTFLAGS, $RPCGENHEADERFLAGS, + $RPCGENSERVICEFLAGS, $RPCGENXDRFLAGS. + From Christoph Wiedemann: - Add an Environment.SetDefault() method that only sets values if diff --git a/src/engine/MANIFEST.in b/src/engine/MANIFEST.in index c9effcf..0fcac9c 100644 --- a/src/engine/MANIFEST.in +++ b/src/engine/MANIFEST.in @@ -109,6 +109,7 @@ SCons/Tool/PharLapCommon.py SCons/Tool/qt.py SCons/Tool/RCS.py SCons/Tool/rmic.py +SCons/Tool/rpcgen.py SCons/Tool/SCCS.py SCons/Tool/sgiar.py SCons/Tool/sgic++.py diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py index a040a55..afad44c 100644 --- a/src/engine/SCons/Tool/__init__.py +++ b/src/engine/SCons/Tool/__init__.py @@ -329,7 +329,8 @@ def tool_list(platform, env): 'jar', 'javac', 'javah', 'latex', 'lex', 'm4', 'midl', 'msvs', 'pdflatex', 'pdftex', 'Perforce', - 'RCS', 'rmic', 'SCCS', + 'RCS', 'rmic', 'rpcgen', + 'SCCS', # 'Subversion', 'swig', 'tar', 'tex', 'yacc', 'zip'], diff --git a/src/engine/SCons/Tool/rpcgen.py b/src/engine/SCons/Tool/rpcgen.py new file mode 100644 index 0000000..e040f07 --- /dev/null +++ b/src/engine/SCons/Tool/rpcgen.py @@ -0,0 +1,64 @@ +"""SCons.Tool.rpcgen + +Tool-specific initialization for RPCGEN tools. + +Three normally shouldn't be any need to import this module directly. +It will usually be imported through the generic SCons.Tool.Tool() +selection method. +""" + +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +from SCons.Builder import Builder +import SCons.Util + +cmd = "cd ${SOURCE.dir} && $RPCGEN -%s $RPCGENFLAGS %s -o ${TARGET.abspath} ${SOURCE.file}" + +rpcgen_client = cmd % ('l', '$RPCGENCLIENTFLAGS') +rpcgen_header = cmd % ('h', '$RPCGENHEADERFLAGS') +rpcgen_service = cmd % ('m', '$RPCGENSERVICEFLAGS') +rpcgen_xdr = cmd % ('c', '$RPCGENXDRFLAGS') + +def generate(env): + "Add RPCGEN Builders and construction variables for an Environment." + + client = Builder(action=rpcgen_client, suffix='_clnt.c', src_suffix='.x') + header = Builder(action=rpcgen_header, suffix='.h', src_suffix='.x') + service = Builder(action=rpcgen_service, suffix='_svc.c', src_suffix='.x') + xdr = Builder(action=rpcgen_xdr, suffix='_xdr.c', src_suffix='.x') + env.Append(BUILDERS={'RPCGenClient' : client, + 'RPCGenHeader' : header, + 'RPCGenService' : service, + 'RPCGenXDR' : xdr}) + env['RPCGEN'] = 'rpcgen' + env['RPCGENFLAGS'] = SCons.Util.CLVar('') + env['RPCGENCLIENTFLAGS'] = SCons.Util.CLVar('') + env['RPCGENHEADERFLAGS'] = SCons.Util.CLVar('') + env['RPCGENSERVICEFLAGS'] = SCons.Util.CLVar('') + env['RPCGENXDRFLAGS'] = SCons.Util.CLVar('') + +def exists(env): + return env.Detect('rpcgen') diff --git a/test/Rpcgen/RPCGEN.py b/test/Rpcgen/RPCGEN.py new file mode 100644 index 0000000..162615b --- /dev/null +++ b/test/Rpcgen/RPCGEN.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('myrpcgen.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 'chlmo:', []) +for opt, arg in cmd_opts: + if opt == '-o': output = open(arg, 'wb') +output.write(string.join(sys.argv) + "\\n") +for a in args: + contents = open(a, 'rb').read() + output.write(string.replace(contents, 'RPCGEN', 'myrpcgen.py')) +output.close() +sys.exit(0) +""") + +test.write('SConstruct', """\ +env = Environment(RPCGEN = r'%s myrpcgen.py', tools=['default', 'rpcgen']) +env.RPCGenHeader('rpcif') +env.RPCGenClient('rpcif') +env.RPCGenService('rpcif') +env.RPCGenXDR('rpcif') +""" % (python,)) + +test.write('rpcif.x', """\ +RPCGEN +""") + +test.run() + +output = "myrpcgen.py %s -o %s rpcif.x\nmyrpcgen.py\n" +expect_clnt = output % ('-l', test.workpath('rpcif_clnt.c')) +expect_h = output % ('-h', test.workpath('rpcif.h')) +expect_svc = output % ('-m', test.workpath('rpcif_svc.c')) +expect_xdr = output % ('-c', test.workpath('rpcif_xdr.c')) + +test.must_match('rpcif_clnt.c', expect_clnt) +test.must_match('rpcif.h', expect_h) +test.must_match('rpcif_svc.c', expect_svc) +test.must_match('rpcif_xdr.c', expect_xdr) + + + +rpcgen = test.where_is('rpcgen') +if rpcgen: + + test.subdir('do_rpcgen') + + test.write('SConstruct', """\ +import os +env = Environment(ENV=os.environ) +env.Program('rpcclnt', ['rpcclnt.c', 'do_rpcgen/rpcif_clnt.c']) +env.RPCGenHeader('do_rpcgen/rpcif') +env.RPCGenClient('do_rpcgen/rpcif') +env.RPCGenService('do_rpcgen/rpcif') +env.RPCGenXDR('do_rpcgen/rpcif') +""") + + test.write(['do_rpcgen', 'rpcif.x'], """\ +program RPCTEST_IF +{ + version RPCTEST_IF_VERSION + { + int START(unsigned long) = 1; + int STOP(unsigned long) = 2; + int STATUS(unsigned long) = 3; + } = 1; /* version */ +} = 0xfeedf00d; /* portmap program ID */ +""") + +# Following test tries to make sure it can compile and link, but when +# it's run it doesn't actually invoke any rpc operations because that +# would have significant dependencies on network configuration, +# portmapper, etc. that aren't necessarily appropriate for an scons +# test. + + test.write('rpcclnt.c', """\ +#include +#include +#include "do_rpcgen/rpcif.h" + +int main(int argc, char **args) { + const char* const SERVER = "localhost"; + CLIENT *cl; + int *rslt; + unsigned long arg = 0; + if (argc > 2) { + cl = clnt_create( SERVER, RPCTEST_IF, RPCTEST_IF_VERSION, "udp" ); + if (cl == 0 ) { return 1; } + rslt = start_1(&arg, cl); + if (*rslt == 0) { clnt_perror( cl, SERVER ); return 1; } + clnt_destroy(cl); + } else + printf("Hello!\\n"); + return 0; +} +""") + + + test.run() + + test.run(program=test.workpath('rpcclnt'+_exe)) + + test.fail_test(not test.stdout() in ["Hello!\n", "Hello!\r\n"]) + + + +test.pass_test() diff --git a/test/Rpcgen/RPCGENCLIENTFLAGS.py b/test/Rpcgen/RPCGENCLIENTFLAGS.py new file mode 100644 index 0000000..d8ce226 --- /dev/null +++ b/test/Rpcgen/RPCGENCLIENTFLAGS.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('myrpcgen.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 'chlmo:x', []) +for opt, arg in cmd_opts: + if opt == '-o': output = open(arg, 'wb') +output.write(string.join(sys.argv) + "\\n") +for a in args: + contents = open(a, 'rb').read() + output.write(string.replace(contents, 'RPCGEN', 'myrpcgen.py')) +output.close() +sys.exit(0) +""") + +test.write('SConstruct', """\ +env = Environment(RPCGEN = r'%s myrpcgen.py', + RPCGENCLIENTFLAGS = '-x', + tools=['default', 'rpcgen']) +env.RPCGenHeader('rpcif') +env.RPCGenClient('rpcif') +env.RPCGenService('rpcif') +env.RPCGenXDR('rpcif') +""" % (python,)) + +test.write('rpcif.x', """\ +RPCGEN +""") + +test.run() + +output = "myrpcgen.py %s -o %s rpcif.x\nmyrpcgen.py\n" +output_clnt = "myrpcgen.py %s -x -o %s rpcif.x\nmyrpcgen.py\n" + +expect_clnt = output_clnt % ('-l', test.workpath('rpcif_clnt.c')) +expect_h = output % ('-h', test.workpath('rpcif.h')) +expect_svc = output % ('-m', test.workpath('rpcif_svc.c')) +expect_xdr = output % ('-c', test.workpath('rpcif_xdr.c')) + +test.must_match('rpcif_clnt.c', expect_clnt) +test.must_match('rpcif.h', expect_h) +test.must_match('rpcif_svc.c', expect_svc) +test.must_match('rpcif_xdr.c', expect_xdr) + + + +test.pass_test() diff --git a/test/Rpcgen/RPCGENFLAGS.py b/test/Rpcgen/RPCGENFLAGS.py new file mode 100644 index 0000000..951254f --- /dev/null +++ b/test/Rpcgen/RPCGENFLAGS.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('myrpcgen.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 'chlmo:x', []) +for opt, arg in cmd_opts: + if opt == '-o': output = open(arg, 'wb') +output.write(string.join(sys.argv) + "\\n") +for a in args: + contents = open(a, 'rb').read() + output.write(string.replace(contents, 'RPCGEN', 'myrpcgen.py')) +output.close() +sys.exit(0) +""") + +test.write('SConstruct', """\ +env = Environment(RPCGEN = r'%s myrpcgen.py', + RPCGENFLAGS = '-x', + tools=['default', 'rpcgen']) +env.RPCGenHeader('rpcif') +env.RPCGenClient('rpcif') +env.RPCGenService('rpcif') +env.RPCGenXDR('rpcif') +""" % (python,)) + +test.write('rpcif.x', """\ +RPCGEN +""") + +test.run() + +output = "myrpcgen.py %s -x -o %s rpcif.x\nmyrpcgen.py\n" + +expect_clnt = output % ('-l', test.workpath('rpcif_clnt.c')) +expect_h = output % ('-h', test.workpath('rpcif.h')) +expect_svc = output % ('-m', test.workpath('rpcif_svc.c')) +expect_xdr = output % ('-c', test.workpath('rpcif_xdr.c')) + +test.must_match('rpcif_clnt.c', expect_clnt) +test.must_match('rpcif.h', expect_h) +test.must_match('rpcif_svc.c', expect_svc) +test.must_match('rpcif_xdr.c', expect_xdr) + + + +test.pass_test() diff --git a/test/Rpcgen/RPCGENHEADERFLAGS.py b/test/Rpcgen/RPCGENHEADERFLAGS.py new file mode 100644 index 0000000..e8d3cb0 --- /dev/null +++ b/test/Rpcgen/RPCGENHEADERFLAGS.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('myrpcgen.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 'chlmo:x', []) +for opt, arg in cmd_opts: + if opt == '-o': output = open(arg, 'wb') +output.write(string.join(sys.argv) + "\\n") +for a in args: + contents = open(a, 'rb').read() + output.write(string.replace(contents, 'RPCGEN', 'myrpcgen.py')) +output.close() +sys.exit(0) +""") + +test.write('SConstruct', """\ +env = Environment(RPCGEN = r'%s myrpcgen.py', + RPCGENHEADERFLAGS = '-x', + tools=['default', 'rpcgen']) +env.RPCGenHeader('rpcif') +env.RPCGenClient('rpcif') +env.RPCGenService('rpcif') +env.RPCGenXDR('rpcif') +""" % (python,)) + +test.write('rpcif.x', """\ +RPCGEN +""") + +test.run() + +output = "myrpcgen.py %s -o %s rpcif.x\nmyrpcgen.py\n" +output_h = "myrpcgen.py %s -x -o %s rpcif.x\nmyrpcgen.py\n" + +expect_clnt = output % ('-l', test.workpath('rpcif_clnt.c')) +expect_h = output_h % ('-h', test.workpath('rpcif.h')) +expect_svc = output % ('-m', test.workpath('rpcif_svc.c')) +expect_xdr = output % ('-c', test.workpath('rpcif_xdr.c')) + +test.must_match('rpcif_clnt.c', expect_clnt) +test.must_match('rpcif.h', expect_h) +test.must_match('rpcif_svc.c', expect_svc) +test.must_match('rpcif_xdr.c', expect_xdr) + + + +test.pass_test() diff --git a/test/Rpcgen/RPCGENSERVICEFLAGS.py b/test/Rpcgen/RPCGENSERVICEFLAGS.py new file mode 100644 index 0000000..fbc5c7f --- /dev/null +++ b/test/Rpcgen/RPCGENSERVICEFLAGS.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('myrpcgen.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 'chlmo:x', []) +for opt, arg in cmd_opts: + if opt == '-o': output = open(arg, 'wb') +output.write(string.join(sys.argv) + "\\n") +for a in args: + contents = open(a, 'rb').read() + output.write(string.replace(contents, 'RPCGEN', 'myrpcgen.py')) +output.close() +sys.exit(0) +""") + +test.write('SConstruct', """\ +env = Environment(RPCGEN = r'%s myrpcgen.py', + RPCGENSERVICEFLAGS = '-x', + tools=['default', 'rpcgen']) +env.RPCGenHeader('rpcif') +env.RPCGenClient('rpcif') +env.RPCGenService('rpcif') +env.RPCGenXDR('rpcif') +""" % (python,)) + +test.write('rpcif.x', """\ +RPCGEN +""") + +test.run() + +output = "myrpcgen.py %s -o %s rpcif.x\nmyrpcgen.py\n" +output_svc = "myrpcgen.py %s -x -o %s rpcif.x\nmyrpcgen.py\n" + +expect_clnt = output % ('-l', test.workpath('rpcif_clnt.c')) +expect_h = output % ('-h', test.workpath('rpcif.h')) +expect_svc = output_svc % ('-m', test.workpath('rpcif_svc.c')) +expect_xdr = output % ('-c', test.workpath('rpcif_xdr.c')) + +test.must_match('rpcif_clnt.c', expect_clnt) +test.must_match('rpcif.h', expect_h) +test.must_match('rpcif_svc.c', expect_svc) +test.must_match('rpcif_xdr.c', expect_xdr) + + + +test.pass_test() diff --git a/test/Rpcgen/RPCGENXDRFLAGS.py b/test/Rpcgen/RPCGENXDRFLAGS.py new file mode 100644 index 0000000..dc428a0 --- /dev/null +++ b/test/Rpcgen/RPCGENXDRFLAGS.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import string +import sys +import TestSCons + +python = TestSCons.python +_exe = TestSCons._exe + +test = TestSCons.TestSCons() + + + +test.write('myrpcgen.py', """ +import getopt +import string +import sys +cmd_opts, args = getopt.getopt(sys.argv[1:], 'chlmo:x', []) +for opt, arg in cmd_opts: + if opt == '-o': output = open(arg, 'wb') +output.write(string.join(sys.argv) + "\\n") +for a in args: + contents = open(a, 'rb').read() + output.write(string.replace(contents, 'RPCGEN', 'myrpcgen.py')) +output.close() +sys.exit(0) +""") + +test.write('SConstruct', """\ +env = Environment(RPCGEN = r'%s myrpcgen.py', + RPCGENXDRFLAGS = '-x', + tools=['default', 'rpcgen']) +env.RPCGenHeader('rpcif') +env.RPCGenClient('rpcif') +env.RPCGenService('rpcif') +env.RPCGenXDR('rpcif') +""" % (python,)) + +test.write('rpcif.x', """\ +RPCGEN +""") + +test.run() + +output = "myrpcgen.py %s -o %s rpcif.x\nmyrpcgen.py\n" +output_xdr = "myrpcgen.py %s -x -o %s rpcif.x\nmyrpcgen.py\n" + +expect_clnt = output % ('-l', test.workpath('rpcif_clnt.c')) +expect_h = output % ('-h', test.workpath('rpcif.h')) +expect_svc = output % ('-m', test.workpath('rpcif_svc.c')) +expect_xdr = output_xdr % ('-c', test.workpath('rpcif_xdr.c')) + +test.must_match('rpcif_clnt.c', expect_clnt) +test.must_match('rpcif.h', expect_h) +test.must_match('rpcif_svc.c', expect_svc) +test.must_match('rpcif_xdr.c', expect_xdr) + + + +test.pass_test() diff --git a/test/import.py b/test/import.py index 91c06ec..0e72ec4 100644 --- a/test/import.py +++ b/test/import.py @@ -112,6 +112,7 @@ tools = [ 'qt', 'RCS', 'rmic', + 'rpcgen', 'SCCS', 'sgiar', 'sgic++', diff --git a/test/rpcgen.py b/test/rpcgen.py new file mode 100644 index 0000000..7c9f8ec --- /dev/null +++ b/test/rpcgen.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +# +# __COPYRIGHT__ +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY +# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__" + +import os +import string +import sys +import TestSCons + +_exe = TestSCons._exe +test = TestSCons.TestSCons() + +rpcgen = test.where_is('rpcgen') +if not rpcgen: + print "rpcgen not found, skipping test" + test.pass_test(1) + +test.subdir('do_rpcgen') + +test.write('SConstruct', """\ +import os +env = Environment(ENV=os.environ) +env.Program('rpcclnt', ['rpcclnt.c', 'do_rpcgen/rpcif_clnt.c']) +env.RPCGenHeader('do_rpcgen/rpcif') +env.RPCGenClient('do_rpcgen/rpcif') +env.RPCGenService('do_rpcgen/rpcif') +env.RPCGenXDR('do_rpcgen/rpcif') +""") + +test.write(['do_rpcgen', 'rpcif.x'], """\ +program RPCTEST_IF +{ + version RPCTEST_IF_VERSION + { + int START(unsigned long) = 1; + int STOP(unsigned long) = 2; + int STATUS(unsigned long) = 3; + } = 1; /* version */ +} = 0xfeedf00d; /* portmap program ID */ +""") + +# Following test tries to make sure it can compile and link, but when +# it's run it doesn't actually invoke any rpc operations because that +# would have significant dependencies on network configuration, +# portmapper, etc. that aren't necessarily appropriate for an scons +# test. + +test.write('rpcclnt.c', """\ +#include +#include +#include "do_rpcgen/rpcif.h" + +int main(int argc, char **args) { + const char* const SERVER = "localhost"; + CLIENT *cl; + int *rslt; + unsigned long arg = 0; + if (argc > 2) { + cl = clnt_create( SERVER, RPCTEST_IF, RPCTEST_IF_VERSION, "udp" ); + if (cl == 0 ) { return 1; } + rslt = start_1(&arg, cl); + if (*rslt == 0) { clnt_perror( cl, SERVER ); return 1; } + clnt_destroy(cl); + } else + printf("Hello!\\n"); + return 0; +} +""") + + +test.run() + +test.run(program=test.workpath('rpcclnt'+_exe)) + +test.fail_test(not test.stdout() in ["Hello!\n", "Hello!\r\n"]) + +test.pass_test() -- cgit v0.12