# 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"; 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); int ndr_flags = 0; '; 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) = @_; print "Compiling C file $filename\n"; return system("cc", '-I.', '-Iinclude', '-c', $filename); } sub link_files($$) { my ($exe_name,$objs) = @_; return system("cc", '-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) { # return -1 if (compile_cfile($_) == -1); # } return -1 if (link_files($exe_filename, \@srcs) == -1); my $ret = system("./$exe_filename"); if ($ret != 0) { print STDERR "$name failed with return value $ret\n"; } print "Ok\n"; return $ret; } 1;