All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrea Cervesato via ltp <ltp@lists.linux.it>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH v3] Add tst_parse_filesize functionality in LTP test API
Date: Tue,  7 Dec 2021 14:24:16 +0100	[thread overview]
Message-ID: <20211207132416.10050-1-andrea.cervesato@suse.com> (raw)

Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.com>
---
 include/tst_test.h               |   1 +
 lib/newlib_tests/test_tst_test.c | 122 +++++++++++++++++++++++++++++++
 lib/tst_test.c                   |  41 +++++++++++
 3 files changed, 164 insertions(+)
 create mode 100644 lib/newlib_tests/test_tst_test.c

diff --git a/include/tst_test.h b/include/tst_test.h
index c06a4729b..450ddf086 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -122,6 +122,7 @@ struct tst_option {
 int tst_parse_int(const char *str, int *val, int min, int max);
 int tst_parse_long(const char *str, long *val, long min, long max);
 int tst_parse_float(const char *str, float *val, float min, float max);
+int tst_parse_filesize(const char *str, long long *val, long long min, long long max);
 
 struct tst_tag {
 	const char *name;
diff --git a/lib/newlib_tests/test_tst_test.c b/lib/newlib_tests/test_tst_test.c
new file mode 100644
index 000000000..8ee4e2932
--- /dev/null
+++ b/lib/newlib_tests/test_tst_test.c
@@ -0,0 +1,122 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2021 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*
+ * Tests for tst_parse_filesize.
+ */
+
+#include "tst_test.h"
+
+static void do_test(void)
+{
+    long long val = 0;
+    int ret = 0;
+
+    if ((ret = tst_parse_filesize("1", &val, LLONG_MIN, LLONG_MAX))) {
+        tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        if (val == 1)
+            tst_res(TPASS, "value is %lli", val);
+        else
+            tst_res(TFAIL, "%lli != %lli", val, 1);
+    }
+
+    /* small letters */
+    if ((ret = tst_parse_filesize("1k", &val, LLONG_MIN, LLONG_MAX))) {
+        tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        if (val == 1024)
+            tst_res(TPASS, "value is %lli", val);
+        else
+            tst_res(TFAIL, "%lli != %lli", val, 1024);
+    }
+
+    if ((ret = tst_parse_filesize("1m", &val, LLONG_MIN, LLONG_MAX))) {
+        tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        if (val == 1048576)
+            tst_res(TPASS, "value is %lli", val);
+        else
+            tst_res(TFAIL, "%lli != %lli", val, 1048576);
+    }
+
+    if ((ret = tst_parse_filesize("1g", &val, LLONG_MIN, LLONG_MAX))) {
+        tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        if (val == 1073741824)
+            tst_res(TPASS, "value is %lli", val);
+        else
+            tst_res(TFAIL, "%lli != %lli", val, 1073741824);
+    }
+
+    /* big letters */
+    if ((ret = tst_parse_filesize("1K", &val, LLONG_MIN, LLONG_MAX))) {
+        tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        if (val == 1024)
+            tst_res(TPASS, "value is %lli", val);
+        else
+            tst_res(TFAIL, "%lli != %lli", val, 1024);
+    }
+
+    if ((ret = tst_parse_filesize("1M", &val, LLONG_MIN, LLONG_MAX))) {
+        tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        if (val == 1048576)
+            tst_res(TPASS, "value is %lli", val);
+        else
+            tst_res(TFAIL, "%lli != %lli", val, 1048576);
+    }
+
+    if ((ret = tst_parse_filesize("1G", &val, LLONG_MIN, LLONG_MAX))) {
+        tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        if (val == 1073741824)
+            tst_res(TPASS, "value is %lli", val);
+        else
+            tst_res(TFAIL, "%lli != %lli", val, 1073741824);
+    }
+
+    /* test errors */
+    if ((ret = tst_parse_filesize("k", &val, LLONG_MIN, LLONG_MAX))) {
+        if (ret == EINVAL)
+            tst_res(TPASS, "return code %d (%s)", ret, tst_strerrno(ret));
+        else
+            tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        tst_res(TFAIL, "tst_parse_filesize should have failed");
+    }
+
+    if ((ret = tst_parse_filesize("100", &val, LLONG_MIN, 10))) {
+        if (ret == ERANGE)
+            tst_res(TPASS, "return code %d (%s)", ret, tst_strerrno(ret));
+        else
+            tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        tst_res(TFAIL, "tst_parse_filesize should have failed");
+    }
+
+    if ((ret = tst_parse_filesize("10", &val, 100, LLONG_MAX))) {
+        if (ret == ERANGE)
+            tst_res(TPASS, "return code %d (%s)", ret, tst_strerrno(ret));
+        else
+            tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        tst_res(TFAIL, "tst_parse_filesize should have failed");
+    }
+
+    if ((ret = tst_parse_filesize("10garbage", &val, LLONG_MIN, LLONG_MAX))) {
+        if (ret == EINVAL)
+            tst_res(TPASS, "return code %d (%s)", ret, tst_strerrno(ret));
+        else
+            tst_res(TFAIL, "return code %d (%s)", ret, tst_strerrno(ret));
+    } else {
+        tst_res(TFAIL, "tst_parse_filesize should have failed");
+    }
+}
+
+static struct tst_test test = {
+	.test_all = do_test,
+};
diff --git a/lib/tst_test.c b/lib/tst_test.c
index a79275722..78b107ed0 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -679,6 +679,47 @@ int tst_parse_float(const char *str, float *val, float min, float max)
 	return 0;
 }
 
+int tst_parse_filesize(const char *str, long long *val, long long min, long long max)
+{
+	long long rval;
+	char *end;
+
+	if (!str)
+		return 0;
+
+	errno = 0;
+	rval = strtoll(str, &end, 0);
+
+	if (str == end || (strlen(end) != 0 && strlen(end) != 1))
+		return EINVAL;
+
+	if (errno)
+		return errno;
+
+	switch (*end) {
+	case 'g':
+	case 'G':
+		rval *= (1024 * 1024 * 1024);
+		break;
+	case 'm':
+	case 'M':
+		rval *= (1024 * 1024);
+		break;
+	case 'k':
+	case 'K':
+		rval *= 1024;
+		break;
+	default:
+		break;
+	}
+
+	if (rval > max || rval < min)
+		return ERANGE;
+
+	*val = rval;
+	return 0;
+}
+
 static void print_colored(const char *str)
 {
 	if (tst_color_enabled(STDOUT_FILENO))
-- 
2.34.1


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

             reply	other threads:[~2021-12-07 13:24 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-07 13:24 Andrea Cervesato via ltp [this message]
2021-12-07 13:25 ` [LTP] [PATCH v3] Add tst_parse_filesize functionality in LTP test API Andrea Cervesato via ltp

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=20211207132416.10050-1-andrea.cervesato@suse.com \
    --to=ltp@lists.linux.it \
    --cc=andrea.cervesato@suse.com \
    /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.