# Simple system for running tests against pidl # (C) 2005 Jelmer Vernooij # Published under the GNU General Public License package Test; use strict; use util; my $idl_path = "./build/pidl/pidl.pl"; my $cc = $ENV{CC}; my @cflags = split / /, $ENV{CFLAGS}; my @ldflags = split / /, $ENV{LDFLAGS}; $cc = "cc" if ($cc eq ""); sub generate_cfile($$$) { my ($filename, $fragment, $incfiles) = @_; unless (open (OUT, ">$filename")) { print STDERR "Unable to open $filename\n"; return -1; } print OUT ' /* This file was autogenerated. All changes made will be lost! */ #include "include/includes.h" '; foreach (@$incfiles) { print OUT "#include \"$_\"\n"; } print OUT ' int main(int argc, char **argv) { TALLOC_CTX *mem_ctx = talloc_init(NULL); '; print OUT $fragment; print OUT "\treturn 0;\n}\n"; close OUT; return 0; } sub generate_idlfile($$) { my ($filename,$fragment) = @_; unless (open(OUT, ">$filename")) { print STDERR "Unable to open $filename\n"; return -1; } print OUT ' [uuid("1-2-3-4-5")] interface test_if { '; print OUT $fragment; print OUT "\n}\n"; close OUT; return 0; } sub compile_idl($$) { my ($filename,$idlargs) = @_; my @args = @$idlargs; push (@args, $filename); unless (system($idl_path, @args) == 0) { print STDERR "Error compiling IDL file $filename: $!\n"; return -1; } } sub compile_cfile($) { my ($filename) = @_; return system($cc, @cflags, '-I.', '-Iinclude', '-c', $filename); } sub link_files($$) { my ($exe_name,$objs) = @_; return system($cc, @ldflags, '-I.', '-Iinclude', '-Lbin', '-lrpc', '-o', $exe_name, @$objs); } sub test_idl($$$$) { my ($name,$settings,$idl,$c) = @_; $| = 1; print "Running test $name... "; my $c_filename = $name."_test.c"; my $idl_filename = $name."_idl.idl"; my $exe_filename = $name."_exe"; return -1 if (generate_cfile($c_filename, $c, $settings->{IncludeFiles}) == -1); return -1 if (generate_idlfile($idl_filename, $idl) == -1); return -1 if (compile_idl($idl_filename, $settings->{'IDL-Arguments'}) == -1); my @srcs = ($c_filename); push (@srcs, @{$settings->{'ExtraFiles'}}); foreach (@srcs) { next unless /\.c$/; return -1 if (compile_cfile($_) == -1); } return -1 if (link_files($exe_filename, \@srcs) == -1); my $ret = system("./$exe_filename"); if ($ret != 0) { print "failed with return value $ret\n"; return $ret; } print "Ok\n"; return $ret; } 1;