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
73d974f67aSJeremy Kerrtest_create_read()
74d974f67aSJeremy Kerr{
75d974f67aSJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
76d974f67aSJeremy Kerr	./create-read $file
77d974f67aSJeremy Kerr}
78d974f67aSJeremy Kerr
79455ce1c7SJeremy Kerrtest_delete()
80455ce1c7SJeremy Kerr{
81455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
82455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
83455ce1c7SJeremy Kerr
84455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
85455ce1c7SJeremy Kerr
86455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
87455ce1c7SJeremy Kerr		echo "$file couldn't be created" >&2
88455ce1c7SJeremy Kerr		exit 1
89455ce1c7SJeremy Kerr	fi
90455ce1c7SJeremy Kerr
91455ce1c7SJeremy Kerr	rm $file
92455ce1c7SJeremy Kerr
93455ce1c7SJeremy Kerr	if [ -e $file ]; then
94455ce1c7SJeremy Kerr		echo "$file couldn't be deleted" >&2
95455ce1c7SJeremy Kerr		exit 1
96455ce1c7SJeremy Kerr	fi
97455ce1c7SJeremy Kerr
98455ce1c7SJeremy Kerr}
99455ce1c7SJeremy Kerr
100455ce1c7SJeremy Kerr# test that we can remove a variable by issuing a write with only
101455ce1c7SJeremy Kerr# attributes specified
102455ce1c7SJeremy Kerrtest_zero_size_delete()
103455ce1c7SJeremy Kerr{
104455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
105455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
106455ce1c7SJeremy Kerr
107455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
108455ce1c7SJeremy Kerr
109455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
110455ce1c7SJeremy Kerr		echo "$file does not exist" >&2
111455ce1c7SJeremy Kerr		exit 1
112455ce1c7SJeremy Kerr	fi
113455ce1c7SJeremy Kerr
114455ce1c7SJeremy Kerr	printf "$attrs" > $file
115455ce1c7SJeremy Kerr
116455ce1c7SJeremy Kerr	if [ -e $file ]; then
117455ce1c7SJeremy Kerr		echo "$file should have been deleted" >&2
118455ce1c7SJeremy Kerr		exit 1
119455ce1c7SJeremy Kerr	fi
120455ce1c7SJeremy Kerr}
121455ce1c7SJeremy Kerr
122455ce1c7SJeremy Kerrtest_open_unlink()
123455ce1c7SJeremy Kerr{
124455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
125455ce1c7SJeremy Kerr	./open-unlink $file
126455ce1c7SJeremy Kerr}
127455ce1c7SJeremy Kerr
128455ce1c7SJeremy Kerrcheck_prereqs
129455ce1c7SJeremy Kerr
130455ce1c7SJeremy Kerrrc=0
131455ce1c7SJeremy Kerr
132455ce1c7SJeremy Kerrrun_test test_create
133033a1a7fSJeremy Kerrrun_test test_create_empty
134d974f67aSJeremy Kerrrun_test test_create_read
135455ce1c7SJeremy Kerrrun_test test_delete
136455ce1c7SJeremy Kerrrun_test test_zero_size_delete
137455ce1c7SJeremy Kerrrun_test test_open_unlink
138455ce1c7SJeremy Kerr
139455ce1c7SJeremy Kerrexit $rc
140