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
91ed8b0de5SPeter Jones	rm $file 2>/dev/null
92ed8b0de5SPeter Jones	if [ $? -ne 0 ]; then
93ed8b0de5SPeter Jones		chattr -i $file
94455ce1c7SJeremy Kerr		rm $file
95ed8b0de5SPeter Jones	fi
96455ce1c7SJeremy Kerr
97455ce1c7SJeremy Kerr	if [ -e $file ]; then
98455ce1c7SJeremy Kerr		echo "$file couldn't be deleted" >&2
99455ce1c7SJeremy Kerr		exit 1
100455ce1c7SJeremy Kerr	fi
101455ce1c7SJeremy Kerr
102455ce1c7SJeremy Kerr}
103455ce1c7SJeremy Kerr
104455ce1c7SJeremy Kerr# test that we can remove a variable by issuing a write with only
105455ce1c7SJeremy Kerr# attributes specified
106455ce1c7SJeremy Kerrtest_zero_size_delete()
107455ce1c7SJeremy Kerr{
108455ce1c7SJeremy Kerr	local attrs='\x07\x00\x00\x00'
109455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
110455ce1c7SJeremy Kerr
111455ce1c7SJeremy Kerr	printf "$attrs\x00" > $file
112455ce1c7SJeremy Kerr
113455ce1c7SJeremy Kerr	if [ ! -e $file ]; then
114455ce1c7SJeremy Kerr		echo "$file does not exist" >&2
115455ce1c7SJeremy Kerr		exit 1
116455ce1c7SJeremy Kerr	fi
117455ce1c7SJeremy Kerr
118ed8b0de5SPeter Jones	chattr -i $file
119455ce1c7SJeremy Kerr	printf "$attrs" > $file
120455ce1c7SJeremy Kerr
121455ce1c7SJeremy Kerr	if [ -e $file ]; then
122455ce1c7SJeremy Kerr		echo "$file should have been deleted" >&2
123455ce1c7SJeremy Kerr		exit 1
124455ce1c7SJeremy Kerr	fi
125455ce1c7SJeremy Kerr}
126455ce1c7SJeremy Kerr
127455ce1c7SJeremy Kerrtest_open_unlink()
128455ce1c7SJeremy Kerr{
129455ce1c7SJeremy Kerr	local file=$efivarfs_mount/$FUNCNAME-$test_guid
130455ce1c7SJeremy Kerr	./open-unlink $file
131455ce1c7SJeremy Kerr}
132455ce1c7SJeremy Kerr
133123abd76SMatt Fleming# test that we can create a range of filenames
134123abd76SMatt Flemingtest_valid_filenames()
135123abd76SMatt Fleming{
136123abd76SMatt Fleming	local attrs='\x07\x00\x00\x00'
137123abd76SMatt Fleming	local ret=0
138123abd76SMatt Fleming
139123abd76SMatt Fleming	local file_list="abc dump-type0-11-1-1362436005 1234 -"
140123abd76SMatt Fleming	for f in $file_list; do
141123abd76SMatt Fleming		local file=$efivarfs_mount/$f-$test_guid
142123abd76SMatt Fleming
143123abd76SMatt Fleming		printf "$attrs\x00" > $file
144123abd76SMatt Fleming
145123abd76SMatt Fleming		if [ ! -e $file ]; then
146123abd76SMatt Fleming			echo "$file could not be created" >&2
147123abd76SMatt Fleming			ret=1
148123abd76SMatt Fleming		else
149ed8b0de5SPeter Jones			rm $file 2>/dev/null
150ed8b0de5SPeter Jones			if [ $? -ne 0 ]; then
151ed8b0de5SPeter Jones				chattr -i $file
152123abd76SMatt Fleming				rm $file
153123abd76SMatt Fleming			fi
154ed8b0de5SPeter Jones		fi
155123abd76SMatt Fleming	done
156123abd76SMatt Fleming
157123abd76SMatt Fleming	exit $ret
158123abd76SMatt Fleming}
159123abd76SMatt Fleming
160123abd76SMatt Flemingtest_invalid_filenames()
161123abd76SMatt Fleming{
162123abd76SMatt Fleming	local attrs='\x07\x00\x00\x00'
163123abd76SMatt Fleming	local ret=0
164123abd76SMatt Fleming
165123abd76SMatt Fleming	local file_list="
166123abd76SMatt Fleming		-1234-1234-1234-123456789abc
167123abd76SMatt Fleming		foo
168123abd76SMatt Fleming		foo-bar
169123abd76SMatt Fleming		-foo-
170123abd76SMatt Fleming		foo-barbazba-foob-foob-foob-foobarbazfoo
171123abd76SMatt Fleming		foo-------------------------------------
172123abd76SMatt Fleming		-12345678-1234-1234-1234-123456789abc
173123abd76SMatt Fleming		a-12345678=1234-1234-1234-123456789abc
174123abd76SMatt Fleming		a-12345678-1234=1234-1234-123456789abc
175123abd76SMatt Fleming		a-12345678-1234-1234=1234-123456789abc
176123abd76SMatt Fleming		a-12345678-1234-1234-1234=123456789abc
177123abd76SMatt Fleming		1112345678-1234-1234-1234-123456789abc"
178123abd76SMatt Fleming
179123abd76SMatt Fleming	for f in $file_list; do
180123abd76SMatt Fleming		local file=$efivarfs_mount/$f
181123abd76SMatt Fleming
182123abd76SMatt Fleming		printf "$attrs\x00" 2>/dev/null > $file
183123abd76SMatt Fleming
184123abd76SMatt Fleming		if [ -e $file ]; then
185123abd76SMatt Fleming			echo "Creating $file should have failed" >&2
186ed8b0de5SPeter Jones			rm $file 2>/dev/null
187ed8b0de5SPeter Jones			if [ $? -ne 0 ]; then
188ed8b0de5SPeter Jones				chattr -i $file
189123abd76SMatt Fleming				rm $file
190ed8b0de5SPeter Jones			fi
191123abd76SMatt Fleming			ret=1
192123abd76SMatt Fleming		fi
193123abd76SMatt Fleming	done
194123abd76SMatt Fleming
195123abd76SMatt Fleming	exit $ret
196123abd76SMatt Fleming}
197123abd76SMatt Fleming
198455ce1c7SJeremy Kerrcheck_prereqs
199455ce1c7SJeremy Kerr
200455ce1c7SJeremy Kerrrc=0
201455ce1c7SJeremy Kerr
202455ce1c7SJeremy Kerrrun_test test_create
203033a1a7fSJeremy Kerrrun_test test_create_empty
204d974f67aSJeremy Kerrrun_test test_create_read
205455ce1c7SJeremy Kerrrun_test test_delete
206455ce1c7SJeremy Kerrrun_test test_zero_size_delete
207455ce1c7SJeremy Kerrrun_test test_open_unlink
208123abd76SMatt Flemingrun_test test_valid_filenames
209123abd76SMatt Flemingrun_test test_invalid_filenames
210455ce1c7SJeremy Kerr
211455ce1c7SJeremy Kerrexit $rc
212