2017-07-24 21:07:54

by Shuah Khan

[permalink] [raw]
Subject: [PATCH 0/3] selftests: sync test conversion to TAP13

This patch series includes patches to convert sync test to use TAP13
ksft framework. In addition, fix to sync test to differentiate between
unsupported feature and access error when a non-root user runs it.

Updated kfst framework to return counters for sync test to use to print
the final pass or fail summary message. Updated ksft+print_cnts() to
print counters to summarize the test results.

Shuah Khan (3):
selftests: sync: differentiate between sync unsupported and access
errors
selftests: kselftest framework: add API to return pass/fail/* counts
selftests: sync: convert to use TAP13 ksft framework

tools/testing/selftests/kselftest.h | 10 +++++
tools/testing/selftests/sync/sync_test.c | 71 +++++++++++++++++++++-----------
tools/testing/selftests/sync/synctest.h | 3 +-
3 files changed, 58 insertions(+), 26 deletions(-)

--
2.11.0


2017-07-24 21:08:04

by Shuah Khan

[permalink] [raw]
Subject: [PATCH 1/3] selftests: sync: differentiate between sync unsupported and access errors

Sync test doesn't differentiate between sync unsupported and test run
by non-root user and treats both as unsupported cases.

Fix it to add handling for these two different scenarios.

Signed-off-by: Shuah Khan <[email protected]>
---
tools/testing/selftests/sync/sync_test.c | 23 +++++++++++++++++++----
1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/sync/sync_test.c b/tools/testing/selftests/sync/sync_test.c
index 62fa666e501a..86ae45ad0347 100644
--- a/tools/testing/selftests/sync/sync_test.c
+++ b/tools/testing/selftests/sync/sync_test.c
@@ -31,6 +31,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
+#include <errno.h>

#include "synctest.h"

@@ -56,18 +57,32 @@ static int run_test(int (*test)(void), char *name)
static int sync_api_supported(void)
{
struct stat sbuf;
+ int ret;
+
+ ret = stat("/sys/kernel/debug/sync/sw_sync", &sbuf);
+ if (!ret)
+ return 0;
+
+ if (errno == ENOENT) {
+ printf("SKIP: Sync framework not supported by kernel\n");
+ exit(0);
+ }
+ if (errno == EACCES) {
+ printf("SKIP: Run Sync test as root.\n");
+ exit(0);
+ }
+
+ perror("stat");
+ exit(ret);

- return 0 == stat("/sys/kernel/debug/sync/sw_sync", &sbuf);
}

int main(void)
{
int err = 0;

- if (!sync_api_supported()) {
- printf("SKIP: Sync framework not supported by kernel\n");
+ if (!sync_api_supported())
return 0;
- }

printf("[RUN]\tTesting sync framework\n");

--
2.11.0

2017-07-24 21:08:17

by Shuah Khan

[permalink] [raw]
Subject: [PATCH 2/3] selftests: kselftest framework: add API to return pass/fail/* counts

Some tests print final pass/fail message based on fail count. Add
ksft_get_*_cnt() API to kselftest framework to return counts.

Update ksft_print_cnts() to print the test results summary message with
individual pass, fail, ... counters.

Signed-off-by: Shuah Khan <[email protected]>
---
tools/testing/selftests/kselftest.h | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/tools/testing/selftests/kselftest.h b/tools/testing/selftests/kselftest.h
index 08e90c2cc5cb..45bf25905279 100644
--- a/tools/testing/selftests/kselftest.h
+++ b/tools/testing/selftests/kselftest.h
@@ -45,6 +45,12 @@ static inline void ksft_inc_xfail_cnt(void) { ksft_cnt.ksft_xfail++; }
static inline void ksft_inc_xpass_cnt(void) { ksft_cnt.ksft_xpass++; }
static inline void ksft_inc_xskip_cnt(void) { ksft_cnt.ksft_xskip++; }

+static inline int ksft_get_pass_cnt(void) { return ksft_cnt.ksft_pass; }
+static inline int ksft_get_fail_cnt(void) { return ksft_cnt.ksft_fail; }
+static inline int ksft_get_xfail_cnt(void) { return ksft_cnt.ksft_xfail; }
+static inline int ksft_get_xpass_cnt(void) { return ksft_cnt.ksft_xpass; }
+static inline int ksft_get_xskip_cnt(void) { return ksft_cnt.ksft_xskip; }
+
static inline void ksft_print_header(void)
{
printf("TAP version 13\n");
@@ -52,6 +58,10 @@ static inline void ksft_print_header(void)

static inline void ksft_print_cnts(void)
{
+ printf("Pass %d Fail %d Xfail %d Xpass %d Skip %d\n",
+ ksft_cnt.ksft_pass, ksft_cnt.ksft_fail,
+ ksft_cnt.ksft_xfail, ksft_cnt.ksft_xpass,
+ ksft_cnt.ksft_xskip);
printf("1..%d\n", ksft_test_num());
}

--
2.11.0

2017-07-24 21:08:27

by Shuah Khan

[permalink] [raw]
Subject: [PATCH 3/3] selftests: sync: convert to use TAP13 ksft framework

Convert test to use TAP13 ksft framework. Output after conversion:

TAP version 13
# [RUN] Testing sync framework
ok 1 [RUN] test_alloc_timeline
ok 2 [RUN] test_alloc_fence
ok 3 [RUN] test_alloc_fence_negative
ok 4 [RUN] test_fence_one_timeline_wait
ok 5 [RUN] test_fence_one_timeline_merge
ok 6 [RUN] test_fence_merge_same_fence
ok 7 [RUN] test_fence_multi_timeline_wait
ok 8 [RUN] test_stress_two_threads_shared_timeline
ok 9 [RUN] test_consumer_stress_multi_producer_single_consumer
ok 10 [RUN] test_merge_stress_random_merge
Pass 10 Fail 0 Xfail 0 Xpass 0 Skip 0
1..10

Signed-off-by: Shuah Khan <[email protected]>
---
tools/testing/selftests/sync/sync_test.c | 72 +++++++++++++++++---------------
tools/testing/selftests/sync/synctest.h | 3 +-
2 files changed, 41 insertions(+), 34 deletions(-)

diff --git a/tools/testing/selftests/sync/sync_test.c b/tools/testing/selftests/sync/sync_test.c
index 86ae45ad0347..7f7938263c5c 100644
--- a/tools/testing/selftests/sync/sync_test.c
+++ b/tools/testing/selftests/sync/sync_test.c
@@ -32,76 +32,82 @@
#include <sys/stat.h>
#include <sys/wait.h>
#include <errno.h>
+#include <string.h>

+#include "../kselftest.h"
#include "synctest.h"

static int run_test(int (*test)(void), char *name)
{
int result;
pid_t childpid;
+ int ret;

fflush(stdout);
childpid = fork();

if (childpid) {
waitpid(childpid, &result, 0);
- if (WIFEXITED(result))
- return WEXITSTATUS(result);
+ if (WIFEXITED(result)) {
+ ret = WEXITSTATUS(result);
+ if (!ret)
+ ksft_test_result_pass("[RUN]\t%s\n", name);
+ else
+ ksft_test_result_fail("[RUN]\t%s\n", name);
+ return ret;
+ }
return 1;
}

- printf("[RUN]\tExecuting %s\n", name);
exit(test());
}

-static int sync_api_supported(void)
+static void sync_api_supported(void)
{
struct stat sbuf;
int ret;

ret = stat("/sys/kernel/debug/sync/sw_sync", &sbuf);
if (!ret)
- return 0;
+ return;

- if (errno == ENOENT) {
- printf("SKIP: Sync framework not supported by kernel\n");
- exit(0);
- }
- if (errno == EACCES) {
- printf("SKIP: Run Sync test as root.\n");
- exit(0);
- }
+ if (errno == ENOENT)
+ ksft_exit_skip("Sync framework not supported by kernel\n");

- perror("stat");
- exit(ret);
+ if (errno == EACCES)
+ ksft_exit_skip("Run Sync test as root.\n");

+ ksft_exit_fail_msg("stat failed on /sys/kernel/debug/sync/sw_sync: %s",
+ strerror(errno));
}

int main(void)
{
- int err = 0;
+ int err;
+
+ ksft_print_header();

- if (!sync_api_supported())
- return 0;
+ sync_api_supported();

- printf("[RUN]\tTesting sync framework\n");
+ ksft_print_msg("[RUN]\tTesting sync framework\n");

- err += RUN_TEST(test_alloc_timeline);
- err += RUN_TEST(test_alloc_fence);
- err += RUN_TEST(test_alloc_fence_negative);
+ RUN_TEST(test_alloc_timeline);
+ RUN_TEST(test_alloc_fence);
+ RUN_TEST(test_alloc_fence_negative);

- err += RUN_TEST(test_fence_one_timeline_wait);
- err += RUN_TEST(test_fence_one_timeline_merge);
- err += RUN_TEST(test_fence_merge_same_fence);
- err += RUN_TEST(test_fence_multi_timeline_wait);
- err += RUN_TEST(test_stress_two_threads_shared_timeline);
- err += RUN_TEST(test_consumer_stress_multi_producer_single_consumer);
- err += RUN_TEST(test_merge_stress_random_merge);
+ RUN_TEST(test_fence_one_timeline_wait);
+ RUN_TEST(test_fence_one_timeline_merge);
+ RUN_TEST(test_fence_merge_same_fence);
+ RUN_TEST(test_fence_multi_timeline_wait);
+ RUN_TEST(test_stress_two_threads_shared_timeline);
+ RUN_TEST(test_consumer_stress_multi_producer_single_consumer);
+ RUN_TEST(test_merge_stress_random_merge);

+ err = ksft_get_fail_cnt();
if (err)
- printf("[FAIL]\tsync errors: %d\n", err);
- else
- printf("[OK]\tsync\n");
+ ksft_exit_fail_msg("%d out of %d sync tests failed\n",
+ err, ksft_test_num());

- return !!err;
+ /* need this return to keep gcc happy */
+ return ksft_exit_pass();
}
diff --git a/tools/testing/selftests/sync/synctest.h b/tools/testing/selftests/sync/synctest.h
index e7d1d57dba7a..90a8e5369914 100644
--- a/tools/testing/selftests/sync/synctest.h
+++ b/tools/testing/selftests/sync/synctest.h
@@ -29,10 +29,11 @@
#define SELFTESTS_SYNCTEST_H

#include <stdio.h>
+#include "../kselftest.h"

#define ASSERT(cond, msg) do { \
if (!(cond)) { \
- printf("[ERROR]\t%s", (msg)); \
+ ksft_print_msg("[ERROR]\t%s", (msg)); \
return 1; \
} \
} while (0)
--
2.11.0

2017-07-28 18:25:52

by Gustavo Padovan

[permalink] [raw]
Subject: Re: [PATCH 0/3] selftests: sync test conversion to TAP13

Hi Shuah,

Thank you for your patches.

On Mon, 2017-07-24 at 15:07 -0600, Shuah Khan wrote:
> This patch series includes patches to convert sync test to use TAP13
> ksft framework. In addition, fix to sync test to differentiate
> between
> unsupported feature and access error when a non-root user runs it.
>
> Updated kfst framework to return counters for sync test to use to
> print
> the final pass or fail summary message. Updated ksft+print_cnts() to
> print counters to summarize the test results.
>
> Shuah Khan (3):
>   selftests: sync: differentiate between sync unsupported and access
>     errors
>   selftests: kselftest framework: add API to return pass/fail/*
> counts
>   selftests: sync: convert to use TAP13 ksft framework
>
>  tools/testing/selftests/kselftest.h      | 10 +++++
>  tools/testing/selftests/sync/sync_test.c | 71 +++++++++++++++++++++-
> ----------
>  tools/testing/selftests/sync/synctest.h  |  3 +-
>  3 files changed, 58 insertions(+), 26 deletions(-)

All looks good to me, so for the 3 patches:
Reviewed-by: Gustavo Padovan <[email protected]>

Gustavo

--
Gustavo Padovan
Collabora Ltd.

2017-07-28 19:12:52

by Shuah Khan

[permalink] [raw]
Subject: Re: [PATCH 0/3] selftests: sync test conversion to TAP13

On 07/28/2017 12:25 PM, Gustavo Padovan wrote:
> Hi Shuah,
>
> Thank you for your patches.
>
> On Mon, 2017-07-24 at 15:07 -0600, Shuah Khan wrote:
>> This patch series includes patches to convert sync test to use TAP13
>> ksft framework. In addition, fix to sync test to differentiate
>> between
>> unsupported feature and access error when a non-root user runs it.
>>
>> Updated kfst framework to return counters for sync test to use to
>> print
>> the final pass or fail summary message. Updated ksft+print_cnts() to
>> print counters to summarize the test results.
>>
>> Shuah Khan (3):
>> selftests: sync: differentiate between sync unsupported and access
>> errors
>> selftests: kselftest framework: add API to return pass/fail/*
>> counts
>> selftests: sync: convert to use TAP13 ksft framework
>>
>> tools/testing/selftests/kselftest.h | 10 +++++
>> tools/testing/selftests/sync/sync_test.c | 71 +++++++++++++++++++++-
>> ----------
>> tools/testing/selftests/sync/synctest.h | 3 +-
>> 3 files changed, 58 insertions(+), 26 deletions(-)
>
> All looks good to me, so for the 3 patches:
> Reviewed-by: Gustavo Padovan <[email protected]>
>
> Gustavo
>

Thanks Gustavo. I will get them in to linux-ksefltest next for 4.14-rc1
with your Reviwed-by.

-- Shuah