summaryrefslogtreecommitdiff
path: root/source4/build/pidl/Parse/Pidl/Test.pm
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build/pidl/Parse/Pidl/Test.pm')
-rw-r--r--source4/build/pidl/Parse/Pidl/Test.pm169
1 files changed, 169 insertions, 0 deletions
diff --git a/source4/build/pidl/Parse/Pidl/Test.pm b/source4/build/pidl/Parse/Pidl/Test.pm
new file mode 100644
index 0000000000..88403f31d4
--- /dev/null
+++ b/source4/build/pidl/Parse/Pidl/Test.pm
@@ -0,0 +1,169 @@
+# Simple system for running tests against pidl
+# (C) 2005 Jelmer Vernooij <jelmer@samba.org>
+# Published under the GNU General Public License
+
+package Parse::Pidl::Test;
+
+use strict;
+use pidl::util;
+use Getopt::Long;
+
+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,$idl_path, $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, '-Lbin', '-lrpc', '-o', $exe_name, @$objs);
+}
+
+sub test_idl($$$$)
+{
+ my ($name,$settings,$idl,$c) = @_;
+
+ $| = 1;
+
+ print "Running $name... ";
+
+ my $outputdir = $settings->{OutputDir};
+
+ my $c_filename = $outputdir."/".$name."_test.c";
+ my $idl_filename = $outputdir."/".$name."_idl.idl";
+ my $exe_filename = $outputdir."/".$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-Compiler'}, $settings->{'IDL-Arguments'}) == -1);
+
+ my @srcs = ($c_filename);
+ push (@srcs, @{$settings->{'ExtraFiles'}});
+
+ foreach (@srcs) {
+ next unless /\.c$/;
+ return -1 if (compile_cfile($_) == -1);
+ }
+
+ my @objs;
+ foreach (@srcs) {
+ if (/\.c$/) { s/\.c$/\.o/g; }
+ push(@objs, $_);
+ }
+
+ return -1 if (link_files($exe_filename, \@objs) == -1);
+
+ my $ret = system("./$exe_filename");
+ if ($ret != 0) {
+ $ret = $? >> 8;
+ print "failed with return value $ret\n";
+ return $ret;
+ }
+
+ unless ($settings->{Keep}) {
+ unlink(@srcs, @objs, $exe_filename, $idl_filename);
+ }
+
+ print "Ok\n";
+
+ return $ret;
+}
+
+sub GetSettings($)
+{
+ my $settings = {
+ OutputDir => ".",
+ 'IDL-Compiler' => "./build/pidl/pidl.pl"
+ };
+
+ my %opts = ();
+ GetOptions('idl-compiler=s' => \$settings->{'IDL-Compiler'},
+ 'outputdir=s' => \$settings->{OutputDir},
+ 'keep' => \$settings->{Keep},
+ 'help' => sub { ShowHelp(); exit 1; } );
+
+ return %$settings;
+}
+
+sub ShowHelp()
+{
+ print " --idl-compiler=PATH-TO-PIDL Override path to IDL compiler\n";
+ print " --outputdir=OUTPUTDIR Write temporary files to OUTPUTDIR rather then .\n";
+ print " --keep Keep intermediate files after running test";
+ print " --help Show this help message\n";
+}
+
+1;