1455ce1c7SJeremy Kerr#!/bin/bash
2455ce1c7SJeremy Kerr
3455ce1c7SJeremy Kerrefivarfs_mount=/sys/firmware/efi/efivars
4455ce1c7SJeremy Kerrtest_guid=210be57c-9849-4fc7-a635-e6382d1aec27
5455ce1c7SJeremy Kerr
6455ce1c7SJeremy Kerrcheck_prereqs()
7455ce1c7SJeremy Kerr{
8455ce1c7SJeremy Kerr	local msg="skip all tests:"
9455ce1c7SJeremy Kerr
10455ce1c7SJeremy Kerr	if [ $UID != 0 ]; then
11455ce1c7SJeremy Kerr		echo $msg must be run as root >&2
12455ce1c7SJeremy Kerr		exit 0
13455ce1c7SJeremy Kerr	fi
14455ce1c7SJeremy Kerr
15455ce1c7SJeremy Kerr	if ! grep -q "^\S\+ $efivarfs_mount efivarfs" /proc/mounts; then
16455ce1c7SJeremy Kerr		echo $msg efivarfs is not mounted on $efivarfs_mount >&2
17455ce1c7SJeremy Kerr		exit 0
18455ce1c7SJeremy Kerr	fi
19455ce1c7SJeremy Kerr}
20455ce1c7SJeremy Kerr
21455ce1c7SJeremy Kerrrun_test()
22455ce1c7SJeremy Kerr{
23455ce1c7SJeremy Kerr	local test="$1"
24455ce1c7SJeremy Kerr
25455ce1c7SJeremy Kerr	echo "--------------------"
26455ce1c7SJeremy Kerr	echo "running $test"
27455ce1c7SJeremy Kerr	echo "--------------------"
28455ce1c7SJeremy Kerr
29455ce1c7SJeremy Kerr	if [ "$(type -t $test)" = 'function' ]; then
30455ce1c7SJeremy Kerr		( $test )
31455ce1c7SJeremy Kerr	else
32455ce1c7SJeremy Kerr		( ./$test )
33455ce1c7SJeremy Kerr	fi
34455ce1c7SJeremy Kerr
35455ce1c7SJeremy Kerr	if [ $? -ne 0 ]; then
36455ce1c7SJeremy Kerr		echo "  [FAIL]"
37455ce1c7SJeremy Kerr		rc=1
38455ce1c7SJeremy Kerr	else
39455ce1c7SJeremy Kerr		echo "  [PASS]"
40455ce1c7SJeremy Kerr	fi
41455ce1c7SJeremy Kerr}
42455ce1c7SJeremy Kerr
43455ce1c7SJeremy Kerrtest_create()
44455ce1c7SJeremy Kerr{
45455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
46455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
47455ce1c7SJeremy Kerr
48455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
49455ce1c7SJeremy Kerr
50455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
51455ce1c7SJeremy Kerr		echo "$file couldn't be created" >&2
52455ce1c7SJeremy Kerr		exit 1
53455ce1c7SJeremy Kerr	fi
54455ce1c7SJeremy Kerr
55455ce1c7SJeremy Kerr	if [ $(stat -c %s $file) -ne 5 ]; then
56455ce1c7SJeremy Kerr		echo "$file has invalid size" >&2
57455ce1c7SJeremy Kerr		exit 1
58455ce1c7SJeremy Kerr	fi
59455ce1c7SJeremy Kerr}
60455ce1c7SJeremy Kerr
61033a1a7fSJeremy Kerrtest_create_empty()
62033a1a7fSJeremy Kerr{
63033a1a7fSJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
64033a1a7fSJeremy Kerr
65033a1a7fSJeremy Kerr	: > $file
66033a1a7fSJeremy Kerr
67033a1a7fSJeremy Kerr	if [ ! -e $file ]; then
68033a1a7fSJeremy Kerr		echo "$file can not be created without writing" >&2
69033a1a7fSJeremy Kerr		exit 1
70033a1a7fSJeremy Kerr	fi
71033a1a7fSJeremy Kerr}
72033a1a7fSJeremy Kerr
73455ce1c7SJeremy Kerrtest_delete()
74455ce1c7SJeremy Kerr{
75455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
76455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
77455ce1c7SJeremy Kerr
78455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
79455ce1c7SJeremy Kerr
80455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
81455ce1c7SJeremy Kerr		echo "$file couldn't be created" >&2
82455ce1c7SJeremy Kerr		exit 1
83455ce1c7SJeremy Kerr	fi
84455ce1c7SJeremy Kerr
85455ce1c7SJeremy Kerr	rm $file
86455ce1c7SJeremy Kerr
87455ce1c7SJeremy Kerr	if [ -e $file ]; then
88455ce1c7SJeremy Kerr		echo "$file couldn't be deleted" >&2
89455ce1c7SJeremy Kerr		exit 1
90455ce1c7SJeremy Kerr	fi
91455ce1c7SJeremy Kerr
92455ce1c7SJeremy Kerr}
93455ce1c7SJeremy Kerr
94455ce1c7SJeremy Kerr# test that we can remove a variable by issuing a write with only
95455ce1c7SJeremy Kerr# attributes specified
96455ce1c7SJeremy Kerrtest_zero_size_delete()
97455ce1c7SJeremy Kerr{
98455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
99455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
100455ce1c7SJeremy Kerr
101455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
102455ce1c7SJeremy Kerr
103455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
104455ce1c7SJeremy Kerr		echo "$file does not exist" >&2
105455ce1c7SJeremy Kerr		exit 1
106455ce1c7SJeremy Kerr	fi
107455ce1c7SJeremy Kerr
108455ce1c7SJeremy Kerr	printf "$attrs" > $file
109455ce1c7SJeremy Kerr
110455ce1c7SJeremy Kerr	if [ -e $file ]; then
111455ce1c7SJeremy Kerr		echo "$file should have been deleted" >&2
112455ce1c7SJeremy Kerr		exit 1
113455ce1c7SJeremy Kerr	fi
114455ce1c7SJeremy Kerr}
115455ce1c7SJeremy Kerr
116455ce1c7SJeremy Kerrtest_open_unlink()
117455ce1c7SJeremy Kerr{
118455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
119455ce1c7SJeremy Kerr	./open-unlink $file
120455ce1c7SJeremy Kerr}
121455ce1c7SJeremy Kerr
122455ce1c7SJeremy Kerrcheck_prereqs
123455ce1c7SJeremy Kerr
124455ce1c7SJeremy Kerrrc=0
125455ce1c7SJeremy Kerr
126455ce1c7SJeremy Kerrrun_test test_create
127033a1a7fSJeremy Kerrrun_test test_create_empty
128455ce1c7SJeremy Kerrrun_test test_delete
129455ce1c7SJeremy Kerrrun_test test_zero_size_delete
130455ce1c7SJeremy Kerrrun_test test_open_unlink
131455ce1c7SJeremy Kerr
132455ce1c7SJeremy Kerrexit $rc
133