All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Palethorpe <rpalethorpe@suse.com>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH v3 5/8] doc: Document TEST macro and state TST_RET/ERR rule LTP-002
Date: Wed, 28 Jul 2021 13:34:09 +0100	[thread overview]
Message-ID: <20210728123412.31858-6-rpalethorpe@suse.com> (raw)
In-Reply-To: <20210728123412.31858-1-rpalethorpe@suse.com>

There are cases where these variables can be safely used by the
library. However it is a difficult problem to identify these cases
automatically.

Identifying any library code which uses them is relatively easy. In
fact it is easier to automate it than by code review. Because it is
such a boring thing to repeatedly look for and comment on.

If a test library function needs these variables it can recreate its
own private copies.

Signed-off-by: Richard Palethorpe <rpalethorpe@suse.com>
---
 doc/c-test-api.txt                     | 54 +++++++++++++++++++++++++-
 doc/library-api-writing-guidelines.txt | 14 +++++++
 2 files changed, 66 insertions(+), 2 deletions(-)

diff --git a/doc/c-test-api.txt b/doc/c-test-api.txt
index dd6c608a4..25b9beb7c 100644
--- a/doc/c-test-api.txt
+++ b/doc/c-test-api.txt
@@ -291,8 +291,58 @@ static void test(void)
 }
 -------------------------------------------------------------------------------
 
-The 'TST_EXP_FAIL2()' is the same as 'TST_EXP_FAIL()' except the return value
-is expected to be non-negative integer if call passes.
+The 'TST_EXP_FAIL2()' is the same as 'TST_EXP_FAIL()' except the
+return value is expected to be non-negative integer if call
+passes. These macros build upon the +TEST()+ macro and associated
+variables.
+
+[source,c]
+-------------------------------------------------------------------------------
+TEST(socket(AF_INET, SOCK_RAW, 1));
+if (TST_RET > -1) {
+	tst_res(TFAIL, "Created raw socket");
+	SAFE_CLOSE(TST_RET);
+} else if (TST_ERR != EPERM) {
+	tst_res(TFAIL | TTERRNO,
+		"Failed to create socket for wrong reason");
+} else {
+	tst_res(TPASS | TTERRNO, "Didn't create raw socket");
+}
+-------------------------------------------------------------------------------
+
+The +TEST+ macro sets +TST_RET+ to its argument's return value and
++TST_ERR+ to +errno+. The +TTERNO+ flag can be used to print the error
+number's symbolic value.
+
+No LTP library function or macro, except those in 'tst_test_macros.h',
+will write to these variables (rule 'LTP-002'). So their values will
+not be changed unexpectedly.
+
+[source,c]
+-------------------------------------------------------------------------------
+TST_EXP_POSITIVE(wait(&status));
+
+if (!TST_PASS)
+	return;
+-------------------------------------------------------------------------------
+
+If the return value of 'wait' is positive. This macro will print a
+pass result and set +TST_PASS+ appropriately. If the return value is
+zero or negative, then it will print fail.
+
+As seen above, this and similar macros take optional variadic
+arguments. These begin with a format string and then appropriate
+values to be formatted. So
+
+[source,c]
+-------------------------------------------------------------------------------
+TST_EXP_PASS(chown("a/file", uid, gid), "chown(%s,%d,%d)",
+	     "a/file", uid, gid);
+-------------------------------------------------------------------------------
+
+expects +chown+ to return 0 and emits a pass or a fail. The arguments
+to +chown+ will be printed in either case. There are many similar
+macros to those shown here, please see 'tst_test_macros.h'.
 
 [source,c]
 -------------------------------------------------------------------------------
diff --git a/doc/library-api-writing-guidelines.txt b/doc/library-api-writing-guidelines.txt
index a4393fc54..2819d4177 100644
--- a/doc/library-api-writing-guidelines.txt
+++ b/doc/library-api-writing-guidelines.txt
@@ -21,10 +21,24 @@ Don't forget to update docs when you change the API.
 2. C API
 --------
 
+2.1 LTP-001: Sources have tst_ prefix
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
 API source code is in headers `include/*.h`, `include/lapi/*.h` (backward
 compatibility for old kernel and libc) and C sources in `lib/*.c`. Files have
 'tst_' prefix.
 
+2.2 LTP-002: TST_RET and TST_ERR are not modified
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The test author is guaranteed that the test API will not modify these
+variables. This prevents silent errors where the return value and
+errno are overwritten before the test has chance to check them.
+
+The macros which are clearly intended to update these variables. That
+is +TEST+ and those in 'tst_test_macros.h'. Are of course allowed to
+update these variables.
+
 3. Shell API
 ------------
 
-- 
2.31.1


  parent reply	other threads:[~2021-07-28 12:34 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-28 12:34 [LTP] [PATCH v3 0/8] Sparse based checker and rule proposal Richard Palethorpe
2021-07-28 12:34 ` [LTP] [PATCH v3 1/8] Add Sparse based checker and TST_RET/ERR check Richard Palethorpe
2021-07-28 12:34 ` [LTP] [PATCH v3 2/8] Add 'make check' to the build system Richard Palethorpe
2021-08-27 12:06   ` Petr Vorel
2021-08-30 14:33     ` Cyril Hrubis
2021-08-30 18:13       ` Petr Vorel
2021-07-28 12:34 ` [LTP] [PATCH v3 3/8] doc: Add rules and recommendations list Richard Palethorpe
2021-07-28 12:34 ` [LTP] [PATCH v3 4/8] doc: Remind authors and maintainers to run make check Richard Palethorpe
2021-07-28 12:34 ` Richard Palethorpe [this message]
2021-07-29 15:27   ` [LTP] [PATCH v3 5/8] doc: Document TEST macro and state TST_RET/ERR rule LTP-002 Cyril Hrubis
2021-07-28 12:34 ` [LTP] [PATCH v3 6/8] Reference LTP-002 rule in Cocci scripts Richard Palethorpe
2021-07-28 12:34 ` [LTP] [PATCH v3 7/8] API: Move libtsc.h from realtime tests include to tst_tsc.h Richard Palethorpe
2021-07-28 12:34 ` [LTP] [PATCH v3 8/8] API/tst_tsc: Add guards and remove some boilerplate Richard Palethorpe
2021-08-09 20:12 ` [LTP] Review of C static analyses tools Richard Palethorpe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210728123412.31858-6-rpalethorpe@suse.com \
    --to=rpalethorpe@suse.com \
    --cc=ltp@lists.linux.it \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.