torture->ev = event_ctx;
torture->results = talloc_reference(torture, results);
+ /*
+ * We start with an empty subunit prefix
+ */
+ torture_subunit_prefix_reset(torture, NULL);
+
return torture;
}
struct torture_test *test)
{
if (!strcmp(tcase->name, test->name)) {
- return talloc_strdup(ctx, test->name);
+ return talloc_asprintf(ctx, "%s%s",
+ ctx->active_prefix->subunit_prefix,
+ test->name);
} else {
- return talloc_asprintf(ctx, "%s.%s", tcase->name, test->name);
+ return talloc_asprintf(ctx, "%s%s.%s",
+ ctx->active_prefix->subunit_prefix,
+ tcase->name, test->name);
+ }
+}
+
+void torture_subunit_prefix_reset(struct torture_context *ctx,
+ const char *name)
+{
+ struct torture_subunit_prefix *prefix = &ctx->_initial_prefix;
+
+ ZERO_STRUCTP(prefix);
+
+ if (name != NULL) {
+ int ret;
+
+ ret = snprintf(prefix->subunit_prefix,
+ sizeof(prefix->subunit_prefix),
+ "%s.", name);
+ if (ret < 0) {
+ abort();
+ }
}
+
+ ctx->active_prefix = prefix;
+}
+
+static void torture_subunit_prefix_push(struct torture_context *ctx,
+ struct torture_subunit_prefix *prefix,
+ const char *name)
+{
+ *prefix = (struct torture_subunit_prefix) {
+ .parent = ctx->active_prefix,
+ };
+
+ if (ctx->active_prefix->parent != NULL ||
+ ctx->active_prefix->subunit_prefix[0] != '\0') {
+ /*
+ * We need a new component for the prefix.
+ */
+ int ret;
+
+ ret = snprintf(prefix->subunit_prefix,
+ sizeof(prefix->subunit_prefix),
+ "%s%s.",
+ ctx->active_prefix->subunit_prefix,
+ name);
+ if (ret < 0) {
+ abort();
+ }
+ }
+
+ ctx->active_prefix = prefix;
+}
+
+static void torture_subunit_prefix_pop(struct torture_context *ctx)
+{
+ ctx->active_prefix = ctx->active_prefix->parent;
}
int torture_suite_children_count(const struct torture_suite *suite)
bool torture_run_suite_restricted(struct torture_context *context,
struct torture_suite *suite, const char **restricted)
{
+ struct torture_subunit_prefix _prefix_stack;
bool ret = true;
struct torture_tcase *tcase;
struct torture_suite *tsuite;
+ torture_subunit_prefix_push(context, &_prefix_stack, suite->name);
+
if (context->results->ui_ops->suite_start)
context->results->ui_ops->suite_start(context, suite);
if (context->results->ui_ops->suite_finish)
context->results->ui_ops->suite_finish(context, suite);
+ torture_subunit_prefix_pop(context);
+
return ret;
}
* specified below.
*/
+struct torture_subunit_prefix {
+ const struct torture_subunit_prefix *parent;
+ char subunit_prefix[256];
+};
+
struct torture_context
{
struct torture_results *results;
struct torture_test *active_test;
struct torture_tcase *active_tcase;
+ struct torture_subunit_prefix _initial_prefix;
+ const struct torture_subunit_prefix *active_prefix;
enum torture_result last_result;
char *last_reason;
char *torture_subunit_test_name(struct torture_context *ctx,
struct torture_tcase *tcase,
struct torture_test *test);
+void torture_subunit_prefix_reset(struct torture_context *ctx,
+ const char *name);
/* Run the specified testsuite recursively */
bool torture_run_suite(struct torture_context *context,