* [PATCH 1/3 v3] selftests: Add tests for efivarfs
2013-02-06 14:48 [PATCH 0/3 v3] selftests: Add efivarfs tests Jeremy Kerr
@ 2013-02-06 14:48 ` Jeremy Kerr
2013-02-07 23:13 ` Andrew Morton
2013-02-06 14:48 ` [PATCH 3/3 v3] selftests/efivarfs: Add create-read test Jeremy Kerr
2013-02-06 14:48 ` [PATCH 2/3 v3] selftests/efivarfs: Add empty file creation test Jeremy Kerr
2 siblings, 1 reply; 10+ messages in thread
From: Jeremy Kerr @ 2013-02-06 14:48 UTC (permalink / raw)
To: linux-kernel; +Cc: linux-efi, Matt Fleming, Lingzhu Xiang, Andrew Morton
This change adds a few initial efivarfs tests to the
tools/testing/selftests directory.
The open-unlink test is based on code from
Lingzhu Xiang <lxiang@redhat.com>.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
---
tools/testing/selftests/Makefile | 2
tools/testing/selftests/efivarfs/Makefile | 12 +
tools/testing/selftests/efivarfs/efivarfs.sh | 119 +++++++++++++++++
tools/testing/selftests/efivarfs/open-unlink.c | 63 +++++++++
4 files changed, 195 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index 85baf11..dee19dd 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -1,4 +1,4 @@
-TARGETS = breakpoints kcmp mqueue vm cpu-hotplug memory-hotplug
+TARGETS = breakpoints kcmp mqueue vm cpu-hotplug memory-hotplug efivarfs
all:
for TARGET in $(TARGETS); do \
diff --git a/tools/testing/selftests/efivarfs/Makefile b/tools/testing/selftests/efivarfs/Makefile
new file mode 100644
index 0000000..1a943ee
--- /dev/null
+++ b/tools/testing/selftests/efivarfs/Makefile
@@ -0,0 +1,12 @@
+CC = $(CROSS_COMPILE)gcc
+CFLAGS = -Wall
+
+test_objs = open-unlink
+
+all: $(test_objs)
+
+run_tests: all
+ @./efivarfs.sh || echo "efivarfs selftests: [FAIL]"
+
+clean:
+ rm -f $(test_objs)
diff --git a/tools/testing/selftests/efivarfs/efivarfs.sh b/tools/testing/selftests/efivarfs/efivarfs.sh
new file mode 100755
index 0000000..e8c0d27
--- /dev/null
+++ b/tools/testing/selftests/efivarfs/efivarfs.sh
@@ -0,0 +1,119 @@
+#!/bin/bash
+
+efivarfs_mount=/sys/firmware/efi/efivars
+test_guid=210be57c-9849-4fc7-a635-e6382d1aec27
+
+check_prereqs()
+{
+ local msg="skip all tests:"
+
+ if [ $UID != 0 ]; then
+ echo $msg must be run as root >&2
+ exit 0
+ fi
+
+ if ! grep -q "^\S\+ $efivarfs_mount efivarfs" /proc/mounts; then
+ echo $msg efivarfs is not mounted on $efivarfs_mount >&2
+ exit 0
+ fi
+}
+
+run_test()
+{
+ local test="$1"
+
+ echo "--------------------"
+ echo "running $test"
+ echo "--------------------"
+
+ if [ "$(type -t $test)" = 'function' ]; then
+ ( $test )
+ else
+ ( ./$test )
+ fi
+
+ if [ $? -ne 0 ]; then
+ echo " [FAIL]"
+ rc=1
+ else
+ echo " [PASS]"
+ fi
+}
+
+test_create()
+{
+ local attrs='\x07\x00\x00\x00'
+ local file=$efivarfs_mount/$FUNCNAME-$test_guid
+
+ printf "$attrs\x00" > $file
+
+ if [ ! -e $file ]; then
+ echo "$file couldn't be created" >&2
+ exit 1
+ fi
+
+ if [ $(stat -c %s $file) -ne 5 ]; then
+ echo "$file has invalid size" >&2
+ exit 1
+ fi
+}
+
+test_delete()
+{
+ local attrs='\x07\x00\x00\x00'
+ local file=$efivarfs_mount/$FUNCNAME-$test_guid
+
+ printf "$attrs\x00" > $file
+
+ if [ ! -e $file ]; then
+ echo "$file couldn't be created" >&2
+ exit 1
+ fi
+
+ rm $file
+
+ if [ -e $file ]; then
+ echo "$file couldn't be deleted" >&2
+ exit 1
+ fi
+
+}
+
+# test that we can remove a variable by issuing a write with only
+# attributes specified
+test_zero_size_delete()
+{
+ local attrs='\x07\x00\x00\x00'
+ local file=$efivarfs_mount/$FUNCNAME-$test_guid
+
+ printf "$attrs\x00" > $file
+
+ if [ ! -e $file ]; then
+ echo "$file does not exist" >&2
+ exit 1
+ fi
+
+ printf "$attrs" > $file
+
+ if [ -e $file ]; then
+ echo "$file should have been deleted" >&2
+ exit 1
+ fi
+}
+
+test_open_unlink()
+{
+ local file=$efivarfs_mount/$FUNCNAME-$test_guid
+ ./open-unlink $file
+}
+
+check_prereqs
+
+rc=0
+
+run_test test_create
+run_test test_delete
+run_test test_zero_size_delete
+run_test test_open_unlink
+
+exit $rc
diff --git a/tools/testing/selftests/efivarfs/open-unlink.c b/tools/testing/selftests/efivarfs/open-unlink.c
new file mode 100644
index 0000000..8c07644
--- /dev/null
+++ b/tools/testing/selftests/efivarfs/open-unlink.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int main(int argc, char **argv)
+{
+ const char *path;
+ char buf[5];
+ int fd, rc;
+
+ if (argc < 2) {
+ fprintf(stderr, "usage: %s <path>\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ path = argv[1];
+
+ /* attributes: EFI_VARIABLE_NON_VOLATILE |
+ * EFI_VARIABLE_BOOTSERVICE_ACCESS |
+ * EFI_VARIABLE_RUNTIME_ACCESS
+ */
+ *(uint32_t *)buf = 0x7;
+ buf[4] = 0;
+
+ /* create a test variable */
+ fd = open(path, O_WRONLY | O_CREAT);
+ if (fd < 0) {
+ perror("open(O_WRONLY)");
+ return EXIT_FAILURE;
+ }
+
+ rc = write(fd, buf, sizeof(buf));
+ if (rc != sizeof(buf)) {
+ perror("write");
+ return EXIT_FAILURE;
+ }
+
+ close(fd);
+
+ fd = open(path, O_RDONLY);
+ if (fd < 0) {
+ perror("open");
+ return EXIT_FAILURE;
+ }
+
+ if (unlink(path) < 0) {
+ perror("unlink");
+ return EXIT_FAILURE;
+ }
+
+ rc = read(fd, buf, sizeof(buf));
+ if (rc > 0) {
+ fprintf(stderr, "reading from an unlinked variable "
+ "shouldn't be possible\n");
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [PATCH 1/3 v3] selftests: Add tests for efivarfs
2013-02-06 14:48 ` [PATCH 1/3 v3] selftests: Add tests for efivarfs Jeremy Kerr
@ 2013-02-07 23:13 ` Andrew Morton
[not found] ` <20130207151333.f01d415c.akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>
0 siblings, 1 reply; 10+ messages in thread
From: Andrew Morton @ 2013-02-07 23:13 UTC (permalink / raw)
To: Jeremy Kerr
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA,
linux-efi-u79uwXL29TY76Z2rM5mHXA, Matt Fleming, Lingzhu Xiang,
Dave Young
On Wed, 06 Feb 2013 22:48:08 +0800
Jeremy Kerr <jk-mnsaURCQ41sdnm+yROfE0A@public.gmane.org> wrote:
> This change adds a few initial efivarfs tests to the
> tools/testing/selftests directory.
>
> The open-unlink test is based on code from
> Lingzhu Xiang <lxiang-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>.
>
> ...
>
> --- a/tools/testing/selftests/Makefile
> +++ b/tools/testing/selftests/Makefile
> @@ -1,4 +1,4 @@
> -TARGETS = breakpoints kcmp mqueue vm cpu-hotplug memory-hotplug
> +TARGETS = breakpoints kcmp mqueue vm cpu-hotplug memory-hotplug efivarfs
bah. This sort of Makefile construct is a wonderful source of patch
rejects and fixups. I'll covert this to
--- a/tools/testing/selftests/Makefile~a
+++ a/tools/testing/selftests/Makefile
@@ -1,4 +1,11 @@
-TARGETS = breakpoints epoll kcmp mqueue vm cpu-hotplug memory-hotplug efivarfs
+TARGETS = breakpoints
+TARGETS += epoll
+TARGETS += kcmp
+TARGETS += mqueue
+TARGETS += vm
+TARGETS += cpu-hotplug
+TARGETS += memory-hotplug
+TARGETS += efivarfs
all:
for TARGET in $(TARGETS); do \
> new file mode 100644
> index 0000000..1a943ee
> --- /dev/null
> +++ b/tools/testing/selftests/efivarfs/Makefile
> @@ -0,0 +1,12 @@
> +CC = $(CROSS_COMPILE)gcc
> +CFLAGS = -Wall
> +
> +test_objs = open-unlink
> +
> +all: $(test_objs)
> +
> +run_tests: all
> + @./efivarfs.sh || echo "efivarfs selftests: [FAIL]"
Problem. When I apply the patch, ./efivarfs.sh doesn't have execute
permissions. I don't think there's a way of (reliably?) transporting
this with patch and diff.
So we should explicitly invoke sh or /bin/sh or $SHELL or whatever
here. This problem is common to several Makefiles in tools/testing/selftests/
I'll do this for now:
--- a/tools/testing/selftests/efivarfs/Makefile~selftests-add-tests-for-efivarfs-fix
+++ a/tools/testing/selftests/efivarfs/Makefile
@@ -6,7 +6,7 @@ test_objs = open-unlink
all: $(test_objs)
run_tests: all
- @./efivarfs.sh || echo "efivarfs selftests: [FAIL]"
+ @/bin/sh ./efivarfs.sh || echo "efivarfs selftests: [FAIL]"
clean:
rm -f $(test_objs)
but I'm not sure I did it right :(
The general ruleset for selftests is: do as much as you can if you're not
root and don't take too long and don't break the build on any
architecture and don't cause the top-level "make run_tests" to fail if
your feature is unconfigured.
Does this code pass all that?
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 3/3 v3] selftests/efivarfs: Add create-read test
2013-02-06 14:48 [PATCH 0/3 v3] selftests: Add efivarfs tests Jeremy Kerr
2013-02-06 14:48 ` [PATCH 1/3 v3] selftests: Add tests for efivarfs Jeremy Kerr
@ 2013-02-06 14:48 ` Jeremy Kerr
2013-02-06 14:48 ` [PATCH 2/3 v3] selftests/efivarfs: Add empty file creation test Jeremy Kerr
2 siblings, 0 replies; 10+ messages in thread
From: Jeremy Kerr @ 2013-02-06 14:48 UTC (permalink / raw)
To: linux-kernel; +Cc: linux-efi, Matt Fleming, Lingzhu Xiang, Andrew Morton
Test that reads from a newly-created efivarfs file (with no data
written) will return EOF.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
---
tools/testing/selftests/efivarfs/Makefile | 2
tools/testing/selftests/efivarfs/create-read.c | 38 +++++++++++++++++
tools/testing/selftests/efivarfs/efivarfs.sh | 7 +++
3 files changed, 46 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/efivarfs/Makefile b/tools/testing/selftests/efivarfs/Makefile
index 1a943ee..b4a7aca 100644
--- a/tools/testing/selftests/efivarfs/Makefile
+++ b/tools/testing/selftests/efivarfs/Makefile
@@ -1,7 +1,7 @@
CC = $(CROSS_COMPILE)gcc
CFLAGS = -Wall
-test_objs = open-unlink
+test_objs = open-unlink create-read
all: $(test_objs)
diff --git a/tools/testing/selftests/efivarfs/create-read.c b/tools/testing/selftests/efivarfs/create-read.c
new file mode 100644
index 0000000..7feef18
--- /dev/null
+++ b/tools/testing/selftests/efivarfs/create-read.c
@@ -0,0 +1,38 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+
+int main(int argc, char **argv)
+{
+ const char *path;
+ char buf[4];
+ int fd, rc;
+
+ if (argc < 2) {
+ fprintf(stderr, "usage: %s <path>\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ path = argv[1];
+
+ /* create a test variable */
+ fd = open(path, O_RDWR | O_CREAT, 0600);
+ if (fd < 0) {
+ perror("open(O_WRONLY)");
+ return EXIT_FAILURE;
+ }
+
+ rc = read(fd, buf, sizeof(buf));
+ if (rc != 0) {
+ fprintf(stderr, "Reading a new var should return EOF\n");
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/tools/testing/selftests/efivarfs/efivarfs.sh b/tools/testing/selftests/efivarfs/efivarfs.sh
index 3af4b37..880cdd5 100755
--- a/tools/testing/selftests/efivarfs/efivarfs.sh
+++ b/tools/testing/selftests/efivarfs/efivarfs.sh
@@ -70,6 +70,12 @@ test_create_empty()
fi
}
+test_create_read()
+{
+ local file=$efivarfs_mount/$FUNCNAME-$test_guid
+ ./create-read $file
+}
+
test_delete()
{
local attrs='\x07\x00\x00\x00'
@@ -125,6 +131,7 @@ rc=0
run_test test_create
run_test test_create_empty
+run_test test_create_read
run_test test_delete
run_test test_zero_size_delete
run_test test_open_unlink
^ permalink raw reply related [flat|nested] 10+ messages in thread* [PATCH 2/3 v3] selftests/efivarfs: Add empty file creation test
2013-02-06 14:48 [PATCH 0/3 v3] selftests: Add efivarfs tests Jeremy Kerr
2013-02-06 14:48 ` [PATCH 1/3 v3] selftests: Add tests for efivarfs Jeremy Kerr
2013-02-06 14:48 ` [PATCH 3/3 v3] selftests/efivarfs: Add create-read test Jeremy Kerr
@ 2013-02-06 14:48 ` Jeremy Kerr
2 siblings, 0 replies; 10+ messages in thread
From: Jeremy Kerr @ 2013-02-06 14:48 UTC (permalink / raw)
To: linux-kernel; +Cc: linux-efi, Matt Fleming, Lingzhu Xiang, Andrew Morton
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
---
tools/testing/selftests/efivarfs/efivarfs.sh | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/tools/testing/selftests/efivarfs/efivarfs.sh b/tools/testing/selftests/efivarfs/efivarfs.sh
index e8c0d27..3af4b37 100755
--- a/tools/testing/selftests/efivarfs/efivarfs.sh
+++ b/tools/testing/selftests/efivarfs/efivarfs.sh
@@ -58,6 +58,18 @@ test_create()
fi
}
+test_create_empty()
+{
+ local file=$efivarfs_mount/$FUNCNAME-$test_guid
+
+ : > $file
+
+ if [ ! -e $file ]; then
+ echo "$file can not be created without writing" >&2
+ exit 1
+ fi
+}
+
test_delete()
{
local attrs='\x07\x00\x00\x00'
@@ -112,6 +124,7 @@ check_prereqs
rc=0
run_test test_create
+run_test test_create_empty
run_test test_delete
run_test test_zero_size_delete
run_test test_open_unlink
^ permalink raw reply related [flat|nested] 10+ messages in thread