r14347: Add registration function to allow registering smbtorture test(suites)
authorJelmer Vernooij <jelmer@samba.org>
Mon, 13 Mar 2006 21:21:44 +0000 (21:21 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:57:13 +0000 (13:57 -0500)
Fix mechanism for breaking lines when printing test names.
(This used to be commit c1061f5fe478918f996fdeaa382a1f5552135bb9)

source4/build/smb_build/header.pm
source4/torture/com/simple.c
source4/torture/config.mk
source4/torture/torture.c

index 1a57ee4364207939f45cf6bd4a9b0492c9936997..af835e9daeacff8630f01804ac2701be0e0a5421 100644 (file)
@@ -29,7 +29,9 @@ sub _prepare_build_h($)
 
        foreach my $key (values %{$depend}) {
                my $DEFINE = ();
-               next if ($key->{TYPE} ne "LIBRARY" and $key->{TYPE} ne "SUBSYSTEM");
+               next if ($key->{TYPE} ne "LIBRARY" and 
+                                $key->{TYPE} ne "SUBSYSTEM" and
+                                $key->{TYPE} ne "BINARY");
                next unless defined($key->{INIT_FUNCTIONS});
 
                $DEFINE->{COMMENT} = "$key->{TYPE} $key->{NAME} INIT";
index 4e4f91c971dc674a8be4bf015cb7fd60de09ef53..d2bb4ad4e3f278feafea0be022dea5ea17b0bafa 100644 (file)
@@ -24,6 +24,7 @@
 #include "lib/com/dcom/dcom.h"
 #include "librpc/gen_ndr/com_dcom.h"
 #include "lib/cmdline/popt_common.h"
+#include "torture/torture.h"
 
 #define DEFAULT_TRANS 4096
 
@@ -95,3 +96,8 @@ BOOL torture_com_simple(void)
 
        return ret;
 }
+
+NTSTATUS torture_com_init(void)
+{
+       return register_torture_op("COM-SIMPLE", torture_com_simple, 0);
+}
index 1407089f2a3ff786d3f4fe1d2c512a2126c13518..cd6c8964752e7be28faee755da5c3a31d5e6760f 100644 (file)
@@ -63,17 +63,15 @@ REQUIRED_SUBSYSTEMS = \
 
 include smb2/config.mk
 
-#################################
-# Start SUBSYSTEM TORTURE_COM
-[SUBSYSTEM::TORTURE_COM]
+[MODULE::torture_com]
+INIT_FUNCTION = torture_com_init
+SUBSYSTEM = smbtorture
 PRIVATE_PROTO_HEADER = \
                com/proto.h
 OBJ_FILES = \
                com/simple.o
 REQUIRED_SUBSYSTEMS = \
                com dcom
-# End SUBSYSTEM TORTURE_COM
-#################################
 
 #################################
 # Start SUBSYSTEM TORTURE_RPC
@@ -235,7 +233,6 @@ REQUIRED_SUBSYSTEMS = \
                TORTURE_LOCAL \
                TORTURE_NBENCH \
                TORTURE_LDAP \
-               TORTURE_COM \
                TORTURE_NBT \
                TORTURE_NET \
                CONFIG \
index 7e961960964983f13b74f2071ebbd0bd908f1a3a..572733d59122696d966dd611d682d299ce3e1528 100644 (file)
@@ -44,6 +44,8 @@
 #include "torture/nbt/proto.h"
 #include "torture/libnet/proto.h"
 #include "torture/torture.h"
+#include "build.h"
+#include "dlinklist.h"
 
 int torture_nprocs=4;
 int torture_numops=10;
@@ -54,6 +56,7 @@ static int procnum; /* records process count number when forking */
 static struct smbcli_state *current_cli;
 static BOOL use_oplocks;
 static BOOL use_level_II_oplocks;
+#define MAX_COLS 80 /* FIXME: Determine this at run-time */
 
 BOOL torture_showall = False;
 
@@ -2192,7 +2195,7 @@ static struct {
        const char *name;
        BOOL (*fn)(void);
        BOOL (*multi_fn)(struct smbcli_state *, int );
-} torture_ops[] = {
+} builtin_torture_ops[] = {
        /* base tests */
        {"BASE-FDPASS", run_fdpasstest, 0},
        {"BASE-LOCK1",  torture_locktest1,  0},
@@ -2344,9 +2347,6 @@ static struct {
        {"LOCAL-SDDL", torture_local_sddl, 0},
        {"LOCAL-NDR", torture_local_ndr, 0},
 
-       /* COM (Component Object Model) testers */
-       {"COM-SIMPLE", torture_com_simple, 0 },
-
        /* ldap testers */
        {"LDAP-BASIC", torture_ldap_basic, 0},
        {"LDAP-CLDAP", torture_cldap, 0},
@@ -2376,7 +2376,55 @@ static struct {
 
        {NULL, NULL, 0}};
 
+static void register_builtin_ops(void)
+{
+       int i;
+       for (i = 0; builtin_torture_ops[i].name; i++) {
+               register_torture_op(builtin_torture_ops[i].name, 
+                                                       builtin_torture_ops[i].fn, 
+                                                       builtin_torture_ops[i].multi_fn);
+       }
+}
+
+
+static struct torture_op {
+       const char *name;
+       BOOL (*fn)(void);
+       BOOL (*multi_fn)(struct smbcli_state *, int );
+       struct torture_op *prev, *next;
+}* torture_ops = NULL;;
+
+static struct torture_op *find_torture_op(const char *name)
+{
+       struct torture_op *o;
+       for (o = torture_ops; o; o = o->next) {
+               if (strcmp(name, o->name) == 0)
+                       return o;
+       }
 
+       return NULL;
+}
+
+NTSTATUS register_torture_op(const char *name, BOOL (*fn)(void), BOOL (*multi_fn)(struct smbcli_state *, int ))
+{
+       struct torture_op *op;
+       
+       /* Check for duplicates */
+       if (find_torture_op(name) != NULL) {
+               DEBUG(0,("There already is a torture op registered with the name %s!\n", name));
+               return NT_STATUS_OBJECT_NAME_COLLISION;
+       }
+
+       op = talloc(talloc_autofree_context(), struct torture_op);
+
+       op->name = talloc_strdup(op, name);
+       op->fn = fn;
+       op->multi_fn = multi_fn;
+
+       DLIST_ADD(torture_ops, op);
+       
+       return NT_STATUS_OK;
+}
 
 /****************************************************************************
 run a specified test or "ALL"
@@ -2384,42 +2432,42 @@ run a specified test or "ALL"
 static BOOL run_test(const char *name)
 {
        BOOL ret = True;
-       int i;
+       struct torture_op *o;
        BOOL matched = False;
 
        if (strequal(name,"ALL")) {
-               for (i=0;torture_ops[i].name;i++) {
-                       if (!run_test(torture_ops[i].name)) {
+               for (o = torture_ops; o; o = o->next) {
+                       if (!run_test(o->name)) {
                                ret = False;
                        }
                }
                return ret;
        }
 
-       for (i=0;torture_ops[i].name;i++) {
-               if (gen_fnmatch(name, torture_ops[i].name) == 0) {
+       for (o = torture_ops; o; o = o->next) {
+               if (gen_fnmatch(name, o->name) == 0) {
                        double t;
                        matched = True;
                        init_iconv();
-                       printf("Running %s\n", torture_ops[i].name);
-                       if (torture_ops[i].multi_fn) {
+                       printf("Running %s\n", o->name);
+                       if (o->multi_fn) {
                                BOOL result = False;
-                               t = torture_create_procs(torture_ops[i].multi_fn, 
+                               t = torture_create_procs(o->multi_fn, 
                                                         &result);
                                if (!result) { 
                                        ret = False;
-                                       printf("TEST %s FAILED!\n", torture_ops[i].name);
+                                       printf("TEST %s FAILED!\n", o->name);
                                }
                                         
                        } else {
                                struct timeval tv = timeval_current();
-                               if (!torture_ops[i].fn()) {
+                               if (!o->fn()) {
                                        ret = False;
-                                       printf("TEST %s FAILED!\n", torture_ops[i].name);
+                                       printf("TEST %s FAILED!\n", o->name);
                                }
                                t = timeval_elapsed(&tv);
                        }
-                       printf("%s took %g secs\n\n", torture_ops[i].name, t);
+                       printf("%s took %g secs\n\n", o->name, t);
                }
        }
 
@@ -2473,8 +2521,8 @@ static void parse_dns(const char *dns)
 
 static void usage(poptContext pc)
 {
+       struct torture_op *o;
        int i;
-       int perline = 5;
 
        poptPrintUsage(pc, stdout, 0);
        printf("\n");
@@ -2523,12 +2571,15 @@ static void usage(poptContext pc)
 
        printf("    //server/share\n\n");
 
-       printf("tests are:");
-       for (i=0;torture_ops[i].name;i++) {
-               if ((i%perline)==0) {
+       printf("tests are:\n");
+
+       i = 0;
+       for (o = torture_ops; o; o = o->next) {
+               if (i + strlen(o->name) >= MAX_COLS) {
                        printf("\n");
+                       i = 0;
                }
-               printf("%s ", torture_ops[i].name);
+               i+=printf("%s ", o->name);
        }
        printf("\n\n");
 
@@ -2569,7 +2620,9 @@ static void max_runtime_handler(int sig)
        poptContext pc;
        enum {OPT_LOADFILE=1000,OPT_UNCLIST,OPT_TIMELIMIT,OPT_DNS,
            OPT_DANGEROUS,OPT_SMB_PORTS};
-
+       init_module_fn static_init[] = STATIC_smbtorture_MODULES;
+       init_module_fn *shared_init = load_samba_modules(NULL, "torture");
+       
        struct poptOption long_options[] = {
                POPT_AUTOHELP
                {"smb-ports",   'p', POPT_ARG_STRING, NULL,     OPT_SMB_PORTS,  "SMB ports",    NULL},
@@ -2598,6 +2651,13 @@ static void max_runtime_handler(int sig)
        setbuffer(stdout, NULL, 0);
 #endif
 
+       register_builtin_ops();
+
+       run_init_functions(static_init);
+       run_init_functions(shared_init);
+
+       talloc_free(shared_init);
+
        /* we are never interested in SIGPIPE */
        BlockSignals(True,SIGPIPE);