All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH i-g-t 1/2] Add support for subtest-specific documentation
@ 2017-08-09 11:40 Petri Latvala
  2017-08-09 11:40 ` [PATCH i-g-t 2/2] docs: Include subtest documentation Petri Latvala
                   ` (3 more replies)
  0 siblings, 4 replies; 6+ messages in thread
From: Petri Latvala @ 2017-08-09 11:40 UTC (permalink / raw)
  To: intel-gfx

The current documentation for tests is limited to a single string per
test binary. This patch adds support for documenting individual
subtests.

The syntax for subtest documentation is:

   igt_document_subtest("Frob knobs to see if one of the "
                        "crossbeams will go out of skew on the "
                        "treadle.\n");
   igt_subtest("knob-frobbing-askew")
     test_frob();

or with a format string:

  for_example_loop(e) {
    igt_document_subtest_f("Frob %s to see if one of the "
                           "crossbeams will go out of skew on the "
                           "treadle.\n", e->readable_name);
    igt_subtest_f("%s-frob-askew", e->name)
      test_frob(e);
  }

The documentation cannot be extracted from just comments, because
associating them with the correct subtest name will then require doing
pattern matching in the documentation generator, for subtests where
the name is generated at runtime using igt_subtest_f.

v2: Rebase, change function name in commit message to match code

Signed-off-by: Petri Latvala <petri.latvala@intel.com>
Acked-by: Leo Li <sunpeng.li@amd.com>
---
 lib/igt_aux.c  |   8 ++--
 lib/igt_core.c | 147 +++++++++++++++++++++++++++++++++++++++++++++------------
 lib/igt_core.h |   6 ++-
 3 files changed, 126 insertions(+), 35 deletions(-)

diff --git a/lib/igt_aux.c b/lib/igt_aux.c
index f428f15..d56f41f 100644
--- a/lib/igt_aux.c
+++ b/lib/igt_aux.c
@@ -311,7 +311,7 @@ static void sig_handler(int i)
  */
 void igt_fork_signal_helper(void)
 {
-	if (igt_only_list_subtests())
+	if (igt_only_collect_data())
 		return;
 
 	/* We pick SIGCONT as it is a "safe" signal - if we send SIGCONT to
@@ -344,7 +344,7 @@ void igt_fork_signal_helper(void)
  */
 void igt_stop_signal_helper(void)
 {
-	if (igt_only_list_subtests())
+	if (igt_only_collect_data())
 		return;
 
 	igt_stop_helper(&signal_helper);
@@ -375,7 +375,7 @@ static void __attribute__((noreturn)) shrink_helper_process(int fd, pid_t pid)
  */
 void igt_fork_shrink_helper(int drm_fd)
 {
-	assert(!igt_only_list_subtests());
+	assert(!igt_only_collect_data());
 	igt_require(igt_drop_caches_has(drm_fd, DROP_SHRINK_ALL));
 	igt_fork_helper(&shrink_helper)
 		shrink_helper_process(drm_fd, getppid());
@@ -473,7 +473,7 @@ void igt_stop_hang_detector(void)
 #else
 void igt_fork_hang_detector(int fd)
 {
-	if (igt_only_list_subtests())
+	if (igt_only_collect_data())
 		return;
 }
 
diff --git a/lib/igt_core.c b/lib/igt_core.c
index c0488e9..f1cb0e9 100644
--- a/lib/igt_core.c
+++ b/lib/igt_core.c
@@ -99,7 +99,7 @@
  *
  * To allow this i-g-t provides #igt_fixture code blocks for setup code outside
  * of subtests and automatically skips the subtest code blocks themselves. For
- * special cases igt_only_list_subtests() is also provided. For setup code only
+ * special cases igt_only_collect_data() is also provided. For setup code only
  * shared by a group of subtest encapsulate the #igt_fixture block and all the
  * subtestest in a #igt_subtest_group block.
  *
@@ -253,9 +253,9 @@ static unsigned int exit_handler_count;
 const char *igt_interactive_debug;
 
 /* subtests helpers */
-static bool list_subtests = false;
-static char *run_single_subtest = NULL;
-static bool run_single_subtest_found = false;
+static char *single_subtest = NULL;
+static bool single_subtest_found = false;
+static char *current_subtest_documentation = NULL;
 static const char *in_subtest = NULL;
 static struct timespec subtest_time;
 static clockid_t igt_clock = (clockid_t)-1;
@@ -265,6 +265,13 @@ static bool in_atexit_handler = false;
 static enum {
 	CONT = 0, SKIP, FAIL
 } skip_subtests_henceforth = CONT;
+static enum {
+	EXECUTE_ALL,
+	EXECUTE_SINGLE,
+	LIST_SUBTESTS,
+	DOCUMENT,
+	DOCUMENT_SINGLE
+} runmode = EXECUTE_ALL;
 
 bool __igt_plain_output = false;
 
@@ -277,6 +284,8 @@ bool test_child;
 enum {
  OPT_LIST_SUBTESTS,
  OPT_RUN_SUBTEST,
+ OPT_DOC_SUBTESTS,
+ OPT_DOC_SINGLE_SUBTEST,
  OPT_DESCRIPTION,
  OPT_DEBUG,
  OPT_INTERACTIVE_DEBUG,
@@ -469,7 +478,7 @@ bool __igt_fixture(void)
 {
 	assert(!in_fixture);
 
-	if (igt_only_list_subtests())
+	if (igt_only_collect_data())
 		return false;
 
 	if (skip_subtests_henceforth)
@@ -563,7 +572,7 @@ static void low_mem_killer_disable(bool disable)
 bool igt_exit_called;
 static void common_exit_handler(int sig)
 {
-	if (!igt_only_list_subtests()) {
+	if (!igt_only_collect_data()) {
 		low_mem_killer_disable(false);
 		kick_fbcon(true);
 	}
@@ -583,7 +592,7 @@ static void print_version(void)
 {
 	struct utsname uts;
 
-	if (list_subtests)
+	if (igt_only_collect_data())
 		return;
 
 	uname(&uts);
@@ -599,6 +608,8 @@ static void print_usage(const char *help_str, bool output_on_stderr)
 
 	fprintf(f, "Usage: %s [OPTIONS]\n", command_str);
 	fprintf(f, "  --list-subtests\n"
+		   "  --document-all-subtests\n"
+		   "  --document-subtest <pattern>\n"
 		   "  --run-subtest <pattern>\n"
 		   "  --debug[=log-domain]\n"
 		   "  --interactive-debug[=domain]\n"
@@ -710,6 +721,8 @@ static int common_init(int *argc, char **argv,
 	static struct option long_options[] = {
 		{"list-subtests", 0, 0, OPT_LIST_SUBTESTS},
 		{"run-subtest", 1, 0, OPT_RUN_SUBTEST},
+		{"document-all-subtests", 0, 0, OPT_DOC_SUBTESTS},
+		{"document-subtest", 1, 0, OPT_DOC_SINGLE_SUBTEST},
 		{"help-description", 0, 0, OPT_DESCRIPTION},
 		{"debug", optional_argument, 0, OPT_DEBUG},
 		{"interactive-debug", optional_argument, 0, OPT_INTERACTIVE_DEBUG},
@@ -800,12 +813,24 @@ static int common_init(int *argc, char **argv,
 				igt_log_domain_filter = strdup(optarg);
 			break;
 		case OPT_LIST_SUBTESTS:
-			if (!run_single_subtest)
-				list_subtests = true;
+			if (runmode == EXECUTE_ALL)
+				runmode = LIST_SUBTESTS;
 			break;
 		case OPT_RUN_SUBTEST:
-			if (!list_subtests)
-				run_single_subtest = strdup(optarg);
+			if (runmode == EXECUTE_ALL) {
+				runmode = EXECUTE_SINGLE;
+				single_subtest = strdup(optarg);
+			}
+			break;
+		case OPT_DOC_SUBTESTS:
+			if (runmode == EXECUTE_ALL)
+				runmode = DOCUMENT;
+			break;
+		case OPT_DOC_SINGLE_SUBTEST:
+			if (runmode == EXECUTE_ALL) {
+				runmode = DOCUMENT_SINGLE;
+				single_subtest = strdup(optarg);
+			}
 			break;
 		case OPT_DESCRIPTION:
 			print_test_description();
@@ -837,11 +862,11 @@ out:
 	/* exit immediately if this test has no subtests and a subtest or the
 	 * list of subtests has been requested */
 	if (!test_with_subtests) {
-		if (run_single_subtest) {
-			igt_warn("Unknown subtest: %s\n", run_single_subtest);
+		if (runmode == EXECUTE_SINGLE || runmode == DOCUMENT_SINGLE) {
+			igt_warn("Unknown subtest: %s\n", single_subtest);
 			exit(IGT_EXIT_INVALID);
 		}
-		if (list_subtests)
+		if (runmode == LIST_SUBTESTS || runmode == DOCUMENT)
 			exit(IGT_EXIT_INVALID);
 	}
 
@@ -849,7 +874,7 @@ out:
 		/* exit with no error for -h/--help */
 		exit(ret == -1 ? 0 : IGT_EXIT_INVALID);
 
-	if (!list_subtests) {
+	if (!igt_only_collect_data()) {
 		kick_fbcon(false);
 		kmsg(KERN_INFO "[IGT] %s: executing\n", command_str);
 		print_version();
@@ -957,16 +982,37 @@ bool __igt_run_subtest(const char *subtest_name)
 			igt_exit();
 		}
 
-	if (list_subtests) {
+	if (runmode == LIST_SUBTESTS) {
 		printf("%s\n", subtest_name);
 		return false;
 	}
 
-	if (run_single_subtest) {
-		if (uwildmat(subtest_name, run_single_subtest) == 0)
+	if (runmode == DOCUMENT) {
+		if (current_subtest_documentation) {
+			printf("%s:\n\n", subtest_name);
+			printf("%s", current_subtest_documentation);
+			free(current_subtest_documentation);
+			current_subtest_documentation = NULL;
+		}
+		return false;
+	}
+
+	if (runmode == EXECUTE_SINGLE || runmode == DOCUMENT_SINGLE) {
+		if (uwildmat(subtest_name, single_subtest) == 0)
 			return false;
-		else
-			run_single_subtest_found = true;
+		else {
+			single_subtest_found = true;
+
+			if (runmode == DOCUMENT_SINGLE) {
+				if (current_subtest_documentation) {
+					printf("%s", current_subtest_documentation);
+					free(current_subtest_documentation);
+					current_subtest_documentation = NULL;
+				}
+
+				return false;
+			}
+		}
 	}
 
 	if (skip_subtests_henceforth) {
@@ -983,10 +1029,51 @@ bool __igt_run_subtest(const char *subtest_name)
 	_igt_log_buffer_reset();
 
 	gettime(&subtest_time);
+
 	return (in_subtest = subtest_name);
 }
 
 /**
+ * igt_document_subtest:
+ * @documentation: documentation for the next subtest
+ *
+ * This function sets the documentation string for the next occurring subtest.
+ */
+void igt_document_subtest(const char *documentation)
+{
+	if (runmode == DOCUMENT || runmode == DOCUMENT_SINGLE) {
+		free(current_subtest_documentation);
+		current_subtest_documentation = strdup(documentation);
+	}
+}
+
+/**
+ * igt_document_subtest_f:
+ * @documentation: Documentation for the next subtest
+ * @...: format string and optional arguments
+ *
+ * This function sets the documentation string for the next occurring subtest.
+ *
+ * Like igt_document_subtest(), but also accepts a printf format
+ * string instead of a static string.
+ */
+__attribute__((format(printf, 1, 2)))
+void igt_document_subtest_f(const char *documentation, ...)
+{
+	int err;
+	va_list args;
+
+	if (runmode == DOCUMENT || runmode == DOCUMENT_SINGLE) {
+		free(current_subtest_documentation);
+		va_start(args, documentation);
+		err = vasprintf(&current_subtest_documentation, documentation, args);
+		if (err < 0)
+			current_subtest_documentation = NULL;
+	}
+}
+
+
+/**
  * igt_subtest_name:
  *
  * Returns: The name of the currently executed subtest or NULL if called from
@@ -998,14 +1085,14 @@ const char *igt_subtest_name(void)
 }
 
 /**
- * igt_only_list_subtests:
+ * igt_only_collect_data:
  *
- * Returns: Returns true if only subtest should be listed and any setup code
+ * Returns: Returns true if the running mode is only collecting data and any setup code
  * must be skipped, false otherwise.
  */
-bool igt_only_list_subtests(void)
+bool igt_only_collect_data(void)
 {
-	return list_subtests;
+	return runmode != EXECUTE_ALL && runmode != EXECUTE_SINGLE;
 }
 
 void __igt_subtest_group_save(int *save)
@@ -1059,7 +1146,7 @@ void igt_skip(const char *f, ...)
 
 	assert(!test_child);
 
-	if (!igt_only_list_subtests()) {
+	if (!igt_only_collect_data()) {
 		va_start(args, f);
 		vprintf(f, args);
 		va_end(args);
@@ -1443,12 +1530,12 @@ void igt_exit(void)
 		g_key_file_free(igt_key_file);
 #endif
 
-	if (run_single_subtest && !run_single_subtest_found) {
-		igt_warn("Unknown subtest: %s\n", run_single_subtest);
+	if (single_subtest && !single_subtest_found) {
+		igt_warn("Unknown subtest: %s\n", single_subtest);
 		exit(IGT_EXIT_INVALID);
 	}
 
-	if (igt_only_list_subtests())
+	if (igt_only_collect_data())
 		exit(IGT_EXIT_SUCCESS);
 
 	/* Calling this without calling one of the above is a failure */
@@ -2012,7 +2099,7 @@ bool igt_run_in_simulation(void)
  */
 void igt_skip_on_simulation(void)
 {
-	if (igt_only_list_subtests())
+	if (igt_only_collect_data())
 		return;
 
 	if (!in_fixture && !in_subtest) {
@@ -2087,7 +2174,7 @@ void igt_vlog(const char *domain, enum igt_log_level level, const char *format,
 	program_name = command_str;
 #endif
 
-	if (list_subtests && level <= IGT_LOG_WARN)
+	if (igt_only_collect_data() && level <= IGT_LOG_WARN)
 		return;
 
 	if (vasprintf(&line, format, args) == -1)
diff --git a/lib/igt_core.h b/lib/igt_core.h
index 1619a9d..275e467 100644
--- a/lib/igt_core.h
+++ b/lib/igt_core.h
@@ -197,8 +197,12 @@ bool __igt_run_subtest(const char *subtest_name);
 #define igt_subtest_f(f...) \
 	__igt_subtest_f(igt_tokencat(__tmpchar, __LINE__), f)
 
+void igt_document_subtest(const char *documentation);
+__attribute__((format(printf, 1, 2)))
+void igt_document_subtest_f(const char *documentation, ...);
+
 const char *igt_subtest_name(void);
-bool igt_only_list_subtests(void);
+bool igt_only_collect_data(void);
 
 void __igt_subtest_group_save(int *);
 void __igt_subtest_group_restore(int);
-- 
2.9.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH i-g-t 2/2] docs: Include subtest documentation
  2017-08-09 11:40 [PATCH i-g-t 1/2] Add support for subtest-specific documentation Petri Latvala
@ 2017-08-09 11:40 ` Petri Latvala
  2017-08-09 12:00 ` [PATCH i-g-t 1/2] Add support for subtest-specific documentation Arkadiusz Hiler
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 6+ messages in thread
From: Petri Latvala @ 2017-08-09 11:40 UTC (permalink / raw)
  To: intel-gfx

A simple and naive format: Double newline denotes paragraph change,
otherwise insert subtest documentation into the generated docs as-is.

Signed-off-by: Petri Latvala <petri.latvala@intel.com>
---


This works for me, but I don't know if the generated docs are actually
valid docbook xml.



docs/reference/intel-gpu-tools/Makefile.am | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/docs/reference/intel-gpu-tools/Makefile.am b/docs/reference/intel-gpu-tools/Makefile.am
index ee1e900..2407e37 100644
--- a/docs/reference/intel-gpu-tools/Makefile.am
+++ b/docs/reference/intel-gpu-tools/Makefile.am
@@ -56,6 +56,12 @@ xml/igt_test_programs_%_description.xml: $(TESTLISTS)
 				for subtest in $$subtest_list; do \
 					echo "<member>" >> $@; \
 					echo "$$subtest" | perl -pe 's/\b$(KEYWORDS)\b/<acronym>\1<\/acronym>/g' >> $@; \
+					subtest_doc=`./$$testprog --document-subtest $$subtest`; \
+					if [ -n "$$subtest_doc" ]; then \
+						echo "<para><![CDATA[" >> $@; \
+						echo "$$subtest_doc" | sed ':a;N;$$!ba;s,\n\n,]]></para><para><![CDATA[,g'>> $@; \
+						echo "]]></para>" >> $@; \
+					fi; \
 					echo "</member>" >> $@; \
 				done; \
 				echo "</simplelist>" >> $@; \
-- 
2.9.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH i-g-t 1/2] Add support for subtest-specific documentation
  2017-08-09 11:40 [PATCH i-g-t 1/2] Add support for subtest-specific documentation Petri Latvala
  2017-08-09 11:40 ` [PATCH i-g-t 2/2] docs: Include subtest documentation Petri Latvala
@ 2017-08-09 12:00 ` Arkadiusz Hiler
  2017-08-09 12:49 ` ✓ Fi.CI.BAT: success for series starting with [1/2] " Patchwork
  2017-08-09 20:18 ` [PATCH i-g-t 1/2] " Belgaumkar, Vinay
  3 siblings, 0 replies; 6+ messages in thread
From: Arkadiusz Hiler @ 2017-08-09 12:00 UTC (permalink / raw)
  To: Petri Latvala; +Cc: intel-gfx

On Wed, Aug 09, 2017 at 02:40:49PM +0300, Petri Latvala wrote:
> The current documentation for tests is limited to a single string per
> test binary. This patch adds support for documenting individual
> subtests.
> 
> The syntax for subtest documentation is:
> 
>    igt_document_subtest("Frob knobs to see if one of the "
>                         "crossbeams will go out of skew on the "
>                         "treadle.\n");
>    igt_subtest("knob-frobbing-askew")
>      test_frob();
> 
> or with a format string:
> 
>   for_example_loop(e) {
>     igt_document_subtest_f("Frob %s to see if one of the "
>                            "crossbeams will go out of skew on the "
>                            "treadle.\n", e->readable_name);
>     igt_subtest_f("%s-frob-askew", e->name)
>       test_frob(e);
>   }
> 
> The documentation cannot be extracted from just comments, because
> associating them with the correct subtest name will then require doing
> pattern matching in the documentation generator, for subtests where
> the name is generated at runtime using igt_subtest_f.
> 
> v2: Rebase, change function name in commit message to match code
> 
> Signed-off-by: Petri Latvala <petri.latvala@intel.com>
> Acked-by: Leo Li <sunpeng.li@amd.com>

I like approach of pairing the documentation 1:1 with subtests much
better than just having comments on top of internal functions (those
does not have to map directly onto subtests).

Bonus points for having it right above the igt_subtest_f() call and
making it easily accessible from the command line as those are the two
places developers and maintainers check first.

Acked-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 6+ messages in thread

* ✓ Fi.CI.BAT: success for series starting with [1/2] Add support for subtest-specific documentation
  2017-08-09 11:40 [PATCH i-g-t 1/2] Add support for subtest-specific documentation Petri Latvala
  2017-08-09 11:40 ` [PATCH i-g-t 2/2] docs: Include subtest documentation Petri Latvala
  2017-08-09 12:00 ` [PATCH i-g-t 1/2] Add support for subtest-specific documentation Arkadiusz Hiler
@ 2017-08-09 12:49 ` Patchwork
  2017-08-09 20:18 ` [PATCH i-g-t 1/2] " Belgaumkar, Vinay
  3 siblings, 0 replies; 6+ messages in thread
From: Patchwork @ 2017-08-09 12:49 UTC (permalink / raw)
  To: Petri Latvala; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/2] Add support for subtest-specific documentation
URL   : https://patchwork.freedesktop.org/series/28554/
State : success

== Summary ==

IGT patchset tested on top of latest successful build
c129026622accef6f54c0cfb0dc55e930cfa60b5 igt: add syncobj_basic.

with latest DRM-Tip kernel build CI_DRM_2938
6da5aacea58f drm-tip: 2017y-08m-09d-10h-44m-50s UTC integration manifest

Test gem_exec_flush:
        Subgroup basic-batch-kernel-default-uc:
                pass       -> FAIL       (fi-snb-2600) fdo#100007
Test kms_cursor_legacy:
        Subgroup basic-busy-flip-before-cursor-atomic:
                fail       -> PASS       (fi-snb-2600) fdo#100215
Test kms_flip:
        Subgroup basic-flip-vs-modeset:
                skip       -> PASS       (fi-skl-x1585l) fdo#101781

fdo#100007 https://bugs.freedesktop.org/show_bug.cgi?id=100007
fdo#100215 https://bugs.freedesktop.org/show_bug.cgi?id=100215
fdo#101781 https://bugs.freedesktop.org/show_bug.cgi?id=101781

fi-bdw-5557u     total:279  pass:268  dwarn:0   dfail:0   fail:0   skip:11  time:433s
fi-bdw-gvtdvm    total:279  pass:265  dwarn:0   dfail:0   fail:0   skip:14  time:424s
fi-blb-e6850     total:279  pass:224  dwarn:1   dfail:0   fail:0   skip:54  time:361s
fi-bsw-n3050     total:279  pass:243  dwarn:0   dfail:0   fail:0   skip:36  time:491s
fi-bxt-j4205     total:279  pass:260  dwarn:0   dfail:0   fail:0   skip:19  time:494s
fi-byt-j1900     total:279  pass:254  dwarn:1   dfail:0   fail:0   skip:24  time:520s
fi-glk-2a        total:279  pass:260  dwarn:0   dfail:0   fail:0   skip:19  time:582s
fi-hsw-4770      total:279  pass:263  dwarn:0   dfail:0   fail:0   skip:16  time:434s
fi-hsw-4770r     total:279  pass:263  dwarn:0   dfail:0   fail:0   skip:16  time:405s
fi-ilk-650       total:279  pass:229  dwarn:0   dfail:0   fail:0   skip:50  time:420s
fi-ivb-3520m     total:279  pass:261  dwarn:0   dfail:0   fail:0   skip:18  time:508s
fi-ivb-3770      total:279  pass:261  dwarn:0   dfail:0   fail:0   skip:18  time:477s
fi-kbl-7500u     total:279  pass:261  dwarn:0   dfail:0   fail:0   skip:18  time:459s
fi-kbl-7560u     total:279  pass:269  dwarn:0   dfail:0   fail:0   skip:10  time:562s
fi-kbl-r         total:279  pass:261  dwarn:0   dfail:0   fail:0   skip:18  time:574s
fi-pnv-d510      total:279  pass:223  dwarn:1   dfail:0   fail:0   skip:55  time:520s
fi-skl-6260u     total:279  pass:269  dwarn:0   dfail:0   fail:0   skip:10  time:452s
fi-skl-6700k     total:279  pass:261  dwarn:0   dfail:0   fail:0   skip:18  time:640s
fi-skl-6770hq    total:279  pass:269  dwarn:0   dfail:0   fail:0   skip:10  time:462s
fi-skl-gvtdvm    total:279  pass:266  dwarn:0   dfail:0   fail:0   skip:13  time:433s
fi-skl-x1585l    total:279  pass:269  dwarn:0   dfail:0   fail:0   skip:10  time:490s
fi-snb-2520m     total:279  pass:251  dwarn:0   dfail:0   fail:0   skip:28  time:544s
fi-snb-2600      total:279  pass:249  dwarn:0   dfail:0   fail:1   skip:29  time:409s

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_40/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH i-g-t 1/2] Add support for subtest-specific documentation
  2017-08-09 11:40 [PATCH i-g-t 1/2] Add support for subtest-specific documentation Petri Latvala
                   ` (2 preceding siblings ...)
  2017-08-09 12:49 ` ✓ Fi.CI.BAT: success for series starting with [1/2] " Patchwork
@ 2017-08-09 20:18 ` Belgaumkar, Vinay
  2017-08-10  8:31   ` Petri Latvala
  3 siblings, 1 reply; 6+ messages in thread
From: Belgaumkar, Vinay @ 2017-08-09 20:18 UTC (permalink / raw)
  To: intel-gfx



On 8/9/2017 4:40 AM, Petri Latvala wrote:
> The current documentation for tests is limited to a single string per
> test binary. This patch adds support for documenting individual
> subtests.
>
> The syntax for subtest documentation is:
>
>     igt_document_subtest("Frob knobs to see if one of the "
>                          "crossbeams will go out of skew on the "
>                          "treadle.\n");
>     igt_subtest("knob-frobbing-askew")
>       test_frob();
>
> or with a format string:
>
>    for_example_loop(e) {
>      igt_document_subtest_f("Frob %s to see if one of the "
>                             "crossbeams will go out of skew on the "
>                             "treadle.\n", e->readable_name);
>      igt_subtest_f("%s-frob-askew", e->name)
>        test_frob(e);
>    }
>
> The documentation cannot be extracted from just comments, because
> associating them with the correct subtest name will then require doing
> pattern matching in the documentation generator, for subtests where
> the name is generated at runtime using igt_subtest_f.
>
> v2: Rebase, change function name in commit message to match code
>
> Signed-off-by: Petri Latvala <petri.latvala@intel.com>
> Acked-by: Leo Li <sunpeng.li@amd.com>
> ---
>   lib/igt_aux.c  |   8 ++--
>   lib/igt_core.c | 147 +++++++++++++++++++++++++++++++++++++++++++++------------
>   lib/igt_core.h |   6 ++-
>   3 files changed, 126 insertions(+), 35 deletions(-)
>
> diff --git a/lib/igt_aux.c b/lib/igt_aux.c
> index f428f15..d56f41f 100644
> --- a/lib/igt_aux.c
> +++ b/lib/igt_aux.c
> @@ -311,7 +311,7 @@ static void sig_handler(int i)
>    */
>   void igt_fork_signal_helper(void)
>   {
> -	if (igt_only_list_subtests())
> +	if (igt_only_collect_data())
>   		return;
>   
>   	/* We pick SIGCONT as it is a "safe" signal - if we send SIGCONT to
> @@ -344,7 +344,7 @@ void igt_fork_signal_helper(void)
>    */
>   void igt_stop_signal_helper(void)
>   {
> -	if (igt_only_list_subtests())
> +	if (igt_only_collect_data())
>   		return;
>   
>   	igt_stop_helper(&signal_helper);
> @@ -375,7 +375,7 @@ static void __attribute__((noreturn)) shrink_helper_process(int fd, pid_t pid)
>    */
>   void igt_fork_shrink_helper(int drm_fd)
>   {
> -	assert(!igt_only_list_subtests());
> +	assert(!igt_only_collect_data());
>   	igt_require(igt_drop_caches_has(drm_fd, DROP_SHRINK_ALL));
>   	igt_fork_helper(&shrink_helper)
>   		shrink_helper_process(drm_fd, getppid());
> @@ -473,7 +473,7 @@ void igt_stop_hang_detector(void)
>   #else
>   void igt_fork_hang_detector(int fd)
>   {
> -	if (igt_only_list_subtests())
> +	if (igt_only_collect_data())
>   		return;
>   }
>   
> diff --git a/lib/igt_core.c b/lib/igt_core.c
> index c0488e9..f1cb0e9 100644
> --- a/lib/igt_core.c
> +++ b/lib/igt_core.c
> @@ -99,7 +99,7 @@
>    *
>    * To allow this i-g-t provides #igt_fixture code blocks for setup code outside
>    * of subtests and automatically skips the subtest code blocks themselves. For
> - * special cases igt_only_list_subtests() is also provided. For setup code only
> + * special cases igt_only_collect_data() is also provided. For setup code only
>    * shared by a group of subtest encapsulate the #igt_fixture block and all the
>    * subtestest in a #igt_subtest_group block.
>    *
> @@ -253,9 +253,9 @@ static unsigned int exit_handler_count;
>   const char *igt_interactive_debug;
>   
>   /* subtests helpers */
> -static bool list_subtests = false;
> -static char *run_single_subtest = NULL;
> -static bool run_single_subtest_found = false;
> +static char *single_subtest = NULL;
> +static bool single_subtest_found = false;
> +static char *current_subtest_documentation = NULL;
>   static const char *in_subtest = NULL;
>   static struct timespec subtest_time;
>   static clockid_t igt_clock = (clockid_t)-1;
> @@ -265,6 +265,13 @@ static bool in_atexit_handler = false;
>   static enum {
>   	CONT = 0, SKIP, FAIL
>   } skip_subtests_henceforth = CONT;
> +static enum {
> +	EXECUTE_ALL,
> +	EXECUTE_SINGLE,
> +	LIST_SUBTESTS,
> +	DOCUMENT,
> +	DOCUMENT_SINGLE
> +} runmode = EXECUTE_ALL;
>   
>   bool __igt_plain_output = false;
>   
> @@ -277,6 +284,8 @@ bool test_child;
>   enum {
>    OPT_LIST_SUBTESTS,
>    OPT_RUN_SUBTEST,
> + OPT_DOC_SUBTESTS,
> + OPT_DOC_SINGLE_SUBTEST,
>    OPT_DESCRIPTION,
>    OPT_DEBUG,
>    OPT_INTERACTIVE_DEBUG,
> @@ -469,7 +478,7 @@ bool __igt_fixture(void)
>   {
>   	assert(!in_fixture);
>   
> -	if (igt_only_list_subtests())
> +	if (igt_only_collect_data())
>   		return false;
>   
>   	if (skip_subtests_henceforth)
> @@ -563,7 +572,7 @@ static void low_mem_killer_disable(bool disable)
>   bool igt_exit_called;
>   static void common_exit_handler(int sig)
>   {
> -	if (!igt_only_list_subtests()) {
> +	if (!igt_only_collect_data()) {
>   		low_mem_killer_disable(false);
>   		kick_fbcon(true);
>   	}
> @@ -583,7 +592,7 @@ static void print_version(void)
>   {
>   	struct utsname uts;
>   
> -	if (list_subtests)
> +	if (igt_only_collect_data())
>   		return;
>   
>   	uname(&uts);
> @@ -599,6 +608,8 @@ static void print_usage(const char *help_str, bool output_on_stderr)
>   
>   	fprintf(f, "Usage: %s [OPTIONS]\n", command_str);
>   	fprintf(f, "  --list-subtests\n"
> +		   "  --document-all-subtests\n"
> +		   "  --document-subtest <pattern>\n"
>   		   "  --run-subtest <pattern>\n"
>   		   "  --debug[=log-domain]\n"
>   		   "  --interactive-debug[=domain]\n"
> @@ -710,6 +721,8 @@ static int common_init(int *argc, char **argv,
>   	static struct option long_options[] = {
>   		{"list-subtests", 0, 0, OPT_LIST_SUBTESTS},
>   		{"run-subtest", 1, 0, OPT_RUN_SUBTEST},
> +		{"document-all-subtests", 0, 0, OPT_DOC_SUBTESTS},
> +		{"document-subtest", 1, 0, OPT_DOC_SINGLE_SUBTEST},

Can we add these options to the README file as well?

>   		{"help-description", 0, 0, OPT_DESCRIPTION},
>   		{"debug", optional_argument, 0, OPT_DEBUG},
>   		{"interactive-debug", optional_argument, 0, OPT_INTERACTIVE_DEBUG},
> @@ -800,12 +813,24 @@ static int common_init(int *argc, char **argv,
>   				igt_log_domain_filter = strdup(optarg);
>   			break;
>   		case OPT_LIST_SUBTESTS:
> -			if (!run_single_subtest)
> -				list_subtests = true;
> +			if (runmode == EXECUTE_ALL)
> +				runmode = LIST_SUBTESTS;
>   			break;
>   		case OPT_RUN_SUBTEST:
> -			if (!list_subtests)
> -				run_single_subtest = strdup(optarg);
> +			if (runmode == EXECUTE_ALL) {
> +				runmode = EXECUTE_SINGLE;
> +				single_subtest = strdup(optarg);
> +			}
> +			break;
> +		case OPT_DOC_SUBTESTS:
> +			if (runmode == EXECUTE_ALL)
> +				runmode = DOCUMENT;
> +			break;
> +		case OPT_DOC_SINGLE_SUBTEST:
> +			if (runmode == EXECUTE_ALL) {
> +				runmode = DOCUMENT_SINGLE;
> +				single_subtest = strdup(optarg);
> +			}
>   			break;
>   		case OPT_DESCRIPTION:
>   			print_test_description();
> @@ -837,11 +862,11 @@ out:
>   	/* exit immediately if this test has no subtests and a subtest or the
>   	 * list of subtests has been requested */
>   	if (!test_with_subtests) {
> -		if (run_single_subtest) {
> -			igt_warn("Unknown subtest: %s\n", run_single_subtest);
> +		if (runmode == EXECUTE_SINGLE || runmode == DOCUMENT_SINGLE) {
> +			igt_warn("Unknown subtest: %s\n", single_subtest);
>   			exit(IGT_EXIT_INVALID);
>   		}
> -		if (list_subtests)
> +		if (runmode == LIST_SUBTESTS || runmode == DOCUMENT)
>   			exit(IGT_EXIT_INVALID);
>   	}
>   
> @@ -849,7 +874,7 @@ out:
>   		/* exit with no error for -h/--help */
>   		exit(ret == -1 ? 0 : IGT_EXIT_INVALID);
>   
> -	if (!list_subtests) {
> +	if (!igt_only_collect_data()) {
>   		kick_fbcon(false);
>   		kmsg(KERN_INFO "[IGT] %s: executing\n", command_str);
>   		print_version();
> @@ -957,16 +982,37 @@ bool __igt_run_subtest(const char *subtest_name)
>   			igt_exit();
>   		}
>   
> -	if (list_subtests) {
> +	if (runmode == LIST_SUBTESTS) {
>   		printf("%s\n", subtest_name);
>   		return false;
>   	}
>   
> -	if (run_single_subtest) {
> -		if (uwildmat(subtest_name, run_single_subtest) == 0)
> +	if (runmode == DOCUMENT) {
> +		if (current_subtest_documentation) {
> +			printf("%s:\n\n", subtest_name);
> +			printf("%s", current_subtest_documentation);
> +			free(current_subtest_documentation);
> +			current_subtest_documentation = NULL;
> +		}
> +		return false;
> +	}
> +
> +	if (runmode == EXECUTE_SINGLE || runmode == DOCUMENT_SINGLE) {
> +		if (uwildmat(subtest_name, single_subtest) == 0)
>   			return false;
> -		else
> -			run_single_subtest_found = true;
> +		else {
> +			single_subtest_found = true;
> +
> +			if (runmode == DOCUMENT_SINGLE) {
> +				if (current_subtest_documentation) {
> +					printf("%s", current_subtest_documentation);
> +					free(current_subtest_documentation);
> +					current_subtest_documentation = NULL;
> +				}
> +
> +				return false;
> +			}
> +		}
>   	}
>   
>   	if (skip_subtests_henceforth) {
> @@ -983,10 +1029,51 @@ bool __igt_run_subtest(const char *subtest_name)
>   	_igt_log_buffer_reset();
>   
>   	gettime(&subtest_time);
> +
>   	return (in_subtest = subtest_name);
>   }
>   
>   /**
> + * igt_document_subtest:
> + * @documentation: documentation for the next subtest
> + *
> + * This function sets the documentation string for the next occurring subtest.
> + */
> +void igt_document_subtest(const char *documentation)
> +{
> +	if (runmode == DOCUMENT || runmode == DOCUMENT_SINGLE) {
> +		free(current_subtest_documentation);
> +		current_subtest_documentation = strdup(documentation);
> +	}
> +}
> +
> +/**
> + * igt_document_subtest_f:
> + * @documentation: Documentation for the next subtest
> + * @...: format string and optional arguments
> + *
> + * This function sets the documentation string for the next occurring subtest.
> + *
> + * Like igt_document_subtest(), but also accepts a printf format
> + * string instead of a static string.
> + */
> +__attribute__((format(printf, 1, 2)))
> +void igt_document_subtest_f(const char *documentation, ...)
> +{
> +	int err;
> +	va_list args;
> +
> +	if (runmode == DOCUMENT || runmode == DOCUMENT_SINGLE) {
> +		free(current_subtest_documentation);
> +		va_start(args, documentation);
> +		err = vasprintf(&current_subtest_documentation, documentation, args);

Missing va_end?

> +		if (err < 0)
> +			current_subtest_documentation = NULL;
> +	}
> +}
> +
> +
> +/**
>    * igt_subtest_name:
>    *
>    * Returns: The name of the currently executed subtest or NULL if called from
> @@ -998,14 +1085,14 @@ const char *igt_subtest_name(void)
>   }
>   
>   /**
> - * igt_only_list_subtests:
> + * igt_only_collect_data:
>    *
> - * Returns: Returns true if only subtest should be listed and any setup code
> + * Returns: Returns true if the running mode is only collecting data and any setup code
>    * must be skipped, false otherwise.
>    */
> -bool igt_only_list_subtests(void)
> +bool igt_only_collect_data(void)
>   {
> -	return list_subtests;
> +	return runmode != EXECUTE_ALL && runmode != EXECUTE_SINGLE;
>   }
>   
>   void __igt_subtest_group_save(int *save)
> @@ -1059,7 +1146,7 @@ void igt_skip(const char *f, ...)
>   
>   	assert(!test_child);
>   
> -	if (!igt_only_list_subtests()) {
> +	if (!igt_only_collect_data()) {
>   		va_start(args, f);
>   		vprintf(f, args);
>   		va_end(args);
> @@ -1443,12 +1530,12 @@ void igt_exit(void)
>   		g_key_file_free(igt_key_file);
>   #endif
>   
> -	if (run_single_subtest && !run_single_subtest_found) {
> -		igt_warn("Unknown subtest: %s\n", run_single_subtest);
> +	if (single_subtest && !single_subtest_found) {
> +		igt_warn("Unknown subtest: %s\n", single_subtest);
>   		exit(IGT_EXIT_INVALID);
>   	}
>   
> -	if (igt_only_list_subtests())
> +	if (igt_only_collect_data())
>   		exit(IGT_EXIT_SUCCESS);
>   
>   	/* Calling this without calling one of the above is a failure */
> @@ -2012,7 +2099,7 @@ bool igt_run_in_simulation(void)
>    */
>   void igt_skip_on_simulation(void)
>   {
> -	if (igt_only_list_subtests())
> +	if (igt_only_collect_data())
>   		return;
>   
>   	if (!in_fixture && !in_subtest) {
> @@ -2087,7 +2174,7 @@ void igt_vlog(const char *domain, enum igt_log_level level, const char *format,
>   	program_name = command_str;
>   #endif
>   
> -	if (list_subtests && level <= IGT_LOG_WARN)
> +	if (igt_only_collect_data() && level <= IGT_LOG_WARN)
>   		return;
>   
>   	if (vasprintf(&line, format, args) == -1)
> diff --git a/lib/igt_core.h b/lib/igt_core.h
> index 1619a9d..275e467 100644
> --- a/lib/igt_core.h
> +++ b/lib/igt_core.h
> @@ -197,8 +197,12 @@ bool __igt_run_subtest(const char *subtest_name);
>   #define igt_subtest_f(f...) \
>   	__igt_subtest_f(igt_tokencat(__tmpchar, __LINE__), f)
>   
> +void igt_document_subtest(const char *documentation);
> +__attribute__((format(printf, 1, 2)))
> +void igt_document_subtest_f(const char *documentation, ...);
> +
>   const char *igt_subtest_name(void);
> -bool igt_only_list_subtests(void);
> +bool igt_only_collect_data(void);
>   
>   void __igt_subtest_group_save(int *);
>   void __igt_subtest_group_restore(int);

I have also sent you a separate email with the gtkdoc generated after 
using the new method.

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH i-g-t 1/2] Add support for subtest-specific documentation
  2017-08-09 20:18 ` [PATCH i-g-t 1/2] " Belgaumkar, Vinay
@ 2017-08-10  8:31   ` Petri Latvala
  0 siblings, 0 replies; 6+ messages in thread
From: Petri Latvala @ 2017-08-10  8:31 UTC (permalink / raw)
  To: Belgaumkar, Vinay; +Cc: intel-gfx

On Wed, Aug 09, 2017 at 01:18:55PM -0700, Belgaumkar, Vinay wrote:
> > @@ -710,6 +721,8 @@ static int common_init(int *argc, char **argv,
> >   	static struct option long_options[] = {
> >   		{"list-subtests", 0, 0, OPT_LIST_SUBTESTS},
> >   		{"run-subtest", 1, 0, OPT_RUN_SUBTEST},
> > +		{"document-all-subtests", 0, 0, OPT_DOC_SUBTESTS},
> > +		{"document-subtest", 1, 0, OPT_DOC_SINGLE_SUBTEST},
> 
> Can we add these options to the README file as well?
>


Sending another series soon with README updated.


> >   		{"help-description", 0, 0, OPT_DESCRIPTION},
> >   		{"debug", optional_argument, 0, OPT_DEBUG},
> >   		{"interactive-debug", optional_argument, 0, OPT_INTERACTIVE_DEBUG},
> > @@ -800,12 +813,24 @@ static int common_init(int *argc, char **argv,
> >   				igt_log_domain_filter = strdup(optarg);
> >   			break;
> >   		case OPT_LIST_SUBTESTS:
> > -			if (!run_single_subtest)
> > -				list_subtests = true;
> > +			if (runmode == EXECUTE_ALL)
> > +				runmode = LIST_SUBTESTS;
> >   			break;
> >   		case OPT_RUN_SUBTEST:
> > -			if (!list_subtests)
> > -				run_single_subtest = strdup(optarg);
> > +			if (runmode == EXECUTE_ALL) {
> > +				runmode = EXECUTE_SINGLE;
> > +				single_subtest = strdup(optarg);
> > +			}
> > +			break;
> > +		case OPT_DOC_SUBTESTS:
> > +			if (runmode == EXECUTE_ALL)
> > +				runmode = DOCUMENT;
> > +			break;
> > +		case OPT_DOC_SINGLE_SUBTEST:
> > +			if (runmode == EXECUTE_ALL) {
> > +				runmode = DOCUMENT_SINGLE;
> > +				single_subtest = strdup(optarg);
> > +			}
> >   			break;
> >   		case OPT_DESCRIPTION:
> >   			print_test_description();
> > @@ -837,11 +862,11 @@ out:
> >   	/* exit immediately if this test has no subtests and a subtest or the
> >   	 * list of subtests has been requested */
> >   	if (!test_with_subtests) {
> > -		if (run_single_subtest) {
> > -			igt_warn("Unknown subtest: %s\n", run_single_subtest);
> > +		if (runmode == EXECUTE_SINGLE || runmode == DOCUMENT_SINGLE) {
> > +			igt_warn("Unknown subtest: %s\n", single_subtest);
> >   			exit(IGT_EXIT_INVALID);
> >   		}
> > -		if (list_subtests)
> > +		if (runmode == LIST_SUBTESTS || runmode == DOCUMENT)
> >   			exit(IGT_EXIT_INVALID);
> >   	}
> > @@ -849,7 +874,7 @@ out:
> >   		/* exit with no error for -h/--help */
> >   		exit(ret == -1 ? 0 : IGT_EXIT_INVALID);
> > -	if (!list_subtests) {
> > +	if (!igt_only_collect_data()) {
> >   		kick_fbcon(false);
> >   		kmsg(KERN_INFO "[IGT] %s: executing\n", command_str);
> >   		print_version();
> > @@ -957,16 +982,37 @@ bool __igt_run_subtest(const char *subtest_name)
> >   			igt_exit();
> >   		}
> > -	if (list_subtests) {
> > +	if (runmode == LIST_SUBTESTS) {
> >   		printf("%s\n", subtest_name);
> >   		return false;
> >   	}
> > -	if (run_single_subtest) {
> > -		if (uwildmat(subtest_name, run_single_subtest) == 0)
> > +	if (runmode == DOCUMENT) {
> > +		if (current_subtest_documentation) {
> > +			printf("%s:\n\n", subtest_name);
> > +			printf("%s", current_subtest_documentation);
> > +			free(current_subtest_documentation);
> > +			current_subtest_documentation = NULL;
> > +		}
> > +		return false;
> > +	}
> > +
> > +	if (runmode == EXECUTE_SINGLE || runmode == DOCUMENT_SINGLE) {
> > +		if (uwildmat(subtest_name, single_subtest) == 0)
> >   			return false;
> > -		else
> > -			run_single_subtest_found = true;
> > +		else {
> > +			single_subtest_found = true;
> > +
> > +			if (runmode == DOCUMENT_SINGLE) {
> > +				if (current_subtest_documentation) {
> > +					printf("%s", current_subtest_documentation);
> > +					free(current_subtest_documentation);
> > +					current_subtest_documentation = NULL;
> > +				}
> > +
> > +				return false;
> > +			}
> > +		}
> >   	}
> >   	if (skip_subtests_henceforth) {
> > @@ -983,10 +1029,51 @@ bool __igt_run_subtest(const char *subtest_name)
> >   	_igt_log_buffer_reset();
> >   	gettime(&subtest_time);
> > +
> >   	return (in_subtest = subtest_name);
> >   }
> >   /**
> > + * igt_document_subtest:
> > + * @documentation: documentation for the next subtest
> > + *
> > + * This function sets the documentation string for the next occurring subtest.
> > + */
> > +void igt_document_subtest(const char *documentation)
> > +{
> > +	if (runmode == DOCUMENT || runmode == DOCUMENT_SINGLE) {
> > +		free(current_subtest_documentation);
> > +		current_subtest_documentation = strdup(documentation);
> > +	}
> > +}
> > +
> > +/**
> > + * igt_document_subtest_f:
> > + * @documentation: Documentation for the next subtest
> > + * @...: format string and optional arguments
> > + *
> > + * This function sets the documentation string for the next occurring subtest.
> > + *
> > + * Like igt_document_subtest(), but also accepts a printf format
> > + * string instead of a static string.
> > + */
> > +__attribute__((format(printf, 1, 2)))
> > +void igt_document_subtest_f(const char *documentation, ...)
> > +{
> > +	int err;
> > +	va_list args;
> > +
> > +	if (runmode == DOCUMENT || runmode == DOCUMENT_SINGLE) {
> > +		free(current_subtest_documentation);
> > +		va_start(args, documentation);
> > +		err = vasprintf(&current_subtest_documentation, documentation, args);
> 
> Missing va_end?
>

Yep, thanks for spotting this.



> > +		if (err < 0)
> > +			current_subtest_documentation = NULL;
> > +	}
> > +}
> > +
> > +
> > +/**
> >    * igt_subtest_name:
> >    *
> >    * Returns: The name of the currently executed subtest or NULL if called from
> > @@ -998,14 +1085,14 @@ const char *igt_subtest_name(void)
> >   }
> >   /**
> > - * igt_only_list_subtests:
> > + * igt_only_collect_data:
> >    *
> > - * Returns: Returns true if only subtest should be listed and any setup code
> > + * Returns: Returns true if the running mode is only collecting data and any setup code
> >    * must be skipped, false otherwise.
> >    */
> > -bool igt_only_list_subtests(void)
> > +bool igt_only_collect_data(void)
> >   {
> > -	return list_subtests;
> > +	return runmode != EXECUTE_ALL && runmode != EXECUTE_SINGLE;
> >   }
> >   void __igt_subtest_group_save(int *save)
> > @@ -1059,7 +1146,7 @@ void igt_skip(const char *f, ...)
> >   	assert(!test_child);
> > -	if (!igt_only_list_subtests()) {
> > +	if (!igt_only_collect_data()) {
> >   		va_start(args, f);
> >   		vprintf(f, args);
> >   		va_end(args);
> > @@ -1443,12 +1530,12 @@ void igt_exit(void)
> >   		g_key_file_free(igt_key_file);
> >   #endif
> > -	if (run_single_subtest && !run_single_subtest_found) {
> > -		igt_warn("Unknown subtest: %s\n", run_single_subtest);
> > +	if (single_subtest && !single_subtest_found) {
> > +		igt_warn("Unknown subtest: %s\n", single_subtest);
> >   		exit(IGT_EXIT_INVALID);
> >   	}
> > -	if (igt_only_list_subtests())
> > +	if (igt_only_collect_data())
> >   		exit(IGT_EXIT_SUCCESS);
> >   	/* Calling this without calling one of the above is a failure */
> > @@ -2012,7 +2099,7 @@ bool igt_run_in_simulation(void)
> >    */
> >   void igt_skip_on_simulation(void)
> >   {
> > -	if (igt_only_list_subtests())
> > +	if (igt_only_collect_data())
> >   		return;
> >   	if (!in_fixture && !in_subtest) {
> > @@ -2087,7 +2174,7 @@ void igt_vlog(const char *domain, enum igt_log_level level, const char *format,
> >   	program_name = command_str;
> >   #endif
> > -	if (list_subtests && level <= IGT_LOG_WARN)
> > +	if (igt_only_collect_data() && level <= IGT_LOG_WARN)
> >   		return;
> >   	if (vasprintf(&line, format, args) == -1)
> > diff --git a/lib/igt_core.h b/lib/igt_core.h
> > index 1619a9d..275e467 100644
> > --- a/lib/igt_core.h
> > +++ b/lib/igt_core.h
> > @@ -197,8 +197,12 @@ bool __igt_run_subtest(const char *subtest_name);
> >   #define igt_subtest_f(f...) \
> >   	__igt_subtest_f(igt_tokencat(__tmpchar, __LINE__), f)
> > +void igt_document_subtest(const char *documentation);
> > +__attribute__((format(printf, 1, 2)))
> > +void igt_document_subtest_f(const char *documentation, ...);
> > +
> >   const char *igt_subtest_name(void);
> > -bool igt_only_list_subtests(void);
> > +bool igt_only_collect_data(void);
> >   void __igt_subtest_group_save(int *);
> >   void __igt_subtest_group_restore(int);
> 
> I have also sent you a separate email with the gtkdoc generated after using
> the new method.
>


The documentation string tracking was indeed done wrong, fixed in the
new series.


--
Petri Latvala
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2017-08-10  8:31 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-09 11:40 [PATCH i-g-t 1/2] Add support for subtest-specific documentation Petri Latvala
2017-08-09 11:40 ` [PATCH i-g-t 2/2] docs: Include subtest documentation Petri Latvala
2017-08-09 12:00 ` [PATCH i-g-t 1/2] Add support for subtest-specific documentation Arkadiusz Hiler
2017-08-09 12:49 ` ✓ Fi.CI.BAT: success for series starting with [1/2] " Patchwork
2017-08-09 20:18 ` [PATCH i-g-t 1/2] " Belgaumkar, Vinay
2017-08-10  8:31   ` Petri Latvala

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.