summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@samba.org>2006-03-13 21:21:44 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:57:13 -0500
commit42e919b3b0ba215403d90675848e282e3a0128ef (patch)
tree98fef1267faf4ca216f09ca867e07837b36cab0a
parentb1bf44a4e1190fe41440e731adaab9db14881508 (diff)
downloadsamba-42e919b3b0ba215403d90675848e282e3a0128ef.tar.gz
samba-42e919b3b0ba215403d90675848e282e3a0128ef.tar.bz2
samba-42e919b3b0ba215403d90675848e282e3a0128ef.zip
r14347: Add registration function to allow registering smbtorture test(suites)
Fix mechanism for breaking lines when printing test names. (This used to be commit c1061f5fe478918f996fdeaa382a1f5552135bb9)
-rw-r--r--source4/build/smb_build/header.pm4
-rw-r--r--source4/torture/com/simple.c6
-rw-r--r--source4/torture/config.mk9
-rw-r--r--source4/torture/torture.c104
4 files changed, 94 insertions, 29 deletions
diff --git a/source4/build/smb_build/header.pm b/source4/build/smb_build/header.pm
index 1a57ee4364..af835e9dae 100644
--- a/source4/build/smb_build/header.pm
+++ b/source4/build/smb_build/header.pm
@@ -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";
diff --git a/source4/torture/com/simple.c b/source4/torture/com/simple.c
index 4e4f91c971..d2bb4ad4e3 100644
--- a/source4/torture/com/simple.c
+++ b/source4/torture/com/simple.c
@@ -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);
+}
diff --git a/source4/torture/config.mk b/source4/torture/config.mk
index 1407089f2a..cd6c896475 100644
--- a/source4/torture/config.mk
+++ b/source4/torture/config.mk
@@ -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 \
diff --git a/source4/torture/torture.c b/source4/torture/torture.c
index 7e96196096..572733d591 100644
--- a/source4/torture/torture.c
+++ b/source4/torture/torture.c
@@ -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);