162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci
462306a36Sopenharmony_ciefivarfs_mount=/sys/firmware/efi/efivars
562306a36Sopenharmony_citest_guid=210be57c-9849-4fc7-a635-e6382d1aec27
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
862306a36Sopenharmony_ciksft_skip=4
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cifile_cleanup()
1162306a36Sopenharmony_ci{
1262306a36Sopenharmony_ci	chattr -i $1
1362306a36Sopenharmony_ci	rm -f $1
1462306a36Sopenharmony_ci}
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cicheck_prereqs()
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	local msg="skip all tests:"
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	if [ $UID != 0 ]; then
2162306a36Sopenharmony_ci		echo $msg must be run as root >&2
2262306a36Sopenharmony_ci		exit $ksft_skip
2362306a36Sopenharmony_ci	fi
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	if ! grep -q "^\S\+ $efivarfs_mount efivarfs" /proc/mounts; then
2662306a36Sopenharmony_ci		echo $msg efivarfs is not mounted on $efivarfs_mount >&2
2762306a36Sopenharmony_ci		exit $ksft_skip
2862306a36Sopenharmony_ci	fi
2962306a36Sopenharmony_ci}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cirun_test()
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	local test="$1"
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	echo "--------------------"
3662306a36Sopenharmony_ci	echo "running $test"
3762306a36Sopenharmony_ci	echo "--------------------"
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	if [ "$(type -t $test)" = 'function' ]; then
4062306a36Sopenharmony_ci		( $test )
4162306a36Sopenharmony_ci	else
4262306a36Sopenharmony_ci		( ./$test )
4362306a36Sopenharmony_ci	fi
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	if [ $? -ne 0 ]; then
4662306a36Sopenharmony_ci		echo "  [FAIL]"
4762306a36Sopenharmony_ci		rc=1
4862306a36Sopenharmony_ci	else
4962306a36Sopenharmony_ci		echo "  [PASS]"
5062306a36Sopenharmony_ci	fi
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_citest_create()
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	local attrs='\x07\x00\x00\x00'
5662306a36Sopenharmony_ci	local file=$efivarfs_mount/$FUNCNAME-$test_guid
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	printf "$attrs\x00" > $file
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	if [ ! -e $file ]; then
6162306a36Sopenharmony_ci		echo "$file couldn't be created" >&2
6262306a36Sopenharmony_ci		exit 1
6362306a36Sopenharmony_ci	fi
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	if [ $(stat -c %s $file) -ne 5 ]; then
6662306a36Sopenharmony_ci		echo "$file has invalid size" >&2
6762306a36Sopenharmony_ci		file_cleanup $file
6862306a36Sopenharmony_ci		exit 1
6962306a36Sopenharmony_ci	fi
7062306a36Sopenharmony_ci	file_cleanup $file
7162306a36Sopenharmony_ci}
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_citest_create_empty()
7462306a36Sopenharmony_ci{
7562306a36Sopenharmony_ci	local file=$efivarfs_mount/$FUNCNAME-$test_guid
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	: > $file
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	if [ ! -e $file ]; then
8062306a36Sopenharmony_ci		echo "$file can not be created without writing" >&2
8162306a36Sopenharmony_ci		exit 1
8262306a36Sopenharmony_ci	fi
8362306a36Sopenharmony_ci	file_cleanup $file
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_citest_create_read()
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	local file=$efivarfs_mount/$FUNCNAME-$test_guid
8962306a36Sopenharmony_ci	./create-read $file
9062306a36Sopenharmony_ci	if [ $? -ne 0 ]; then
9162306a36Sopenharmony_ci		echo "create and read $file failed"
9262306a36Sopenharmony_ci		file_cleanup $file
9362306a36Sopenharmony_ci		exit 1
9462306a36Sopenharmony_ci	fi
9562306a36Sopenharmony_ci	file_cleanup $file
9662306a36Sopenharmony_ci}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_citest_delete()
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	local attrs='\x07\x00\x00\x00'
10162306a36Sopenharmony_ci	local file=$efivarfs_mount/$FUNCNAME-$test_guid
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	printf "$attrs\x00" > $file
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	if [ ! -e $file ]; then
10662306a36Sopenharmony_ci		echo "$file couldn't be created" >&2
10762306a36Sopenharmony_ci		exit 1
10862306a36Sopenharmony_ci	fi
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci	file_cleanup $file
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	if [ -e $file ]; then
11362306a36Sopenharmony_ci		echo "$file couldn't be deleted" >&2
11462306a36Sopenharmony_ci		exit 1
11562306a36Sopenharmony_ci	fi
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci}
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci# test that we can remove a variable by issuing a write with only
12062306a36Sopenharmony_ci# attributes specified
12162306a36Sopenharmony_citest_zero_size_delete()
12262306a36Sopenharmony_ci{
12362306a36Sopenharmony_ci	local attrs='\x07\x00\x00\x00'
12462306a36Sopenharmony_ci	local file=$efivarfs_mount/$FUNCNAME-$test_guid
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	printf "$attrs\x00" > $file
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	if [ ! -e $file ]; then
12962306a36Sopenharmony_ci		echo "$file does not exist" >&2
13062306a36Sopenharmony_ci		exit 1
13162306a36Sopenharmony_ci	fi
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	chattr -i $file
13462306a36Sopenharmony_ci	printf "$attrs" > $file
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	if [ -e $file ]; then
13762306a36Sopenharmony_ci		echo "$file should have been deleted" >&2
13862306a36Sopenharmony_ci		exit 1
13962306a36Sopenharmony_ci	fi
14062306a36Sopenharmony_ci}
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_citest_open_unlink()
14362306a36Sopenharmony_ci{
14462306a36Sopenharmony_ci	local file=$efivarfs_mount/$FUNCNAME-$test_guid
14562306a36Sopenharmony_ci	./open-unlink $file
14662306a36Sopenharmony_ci}
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci# test that we can create a range of filenames
14962306a36Sopenharmony_citest_valid_filenames()
15062306a36Sopenharmony_ci{
15162306a36Sopenharmony_ci	local attrs='\x07\x00\x00\x00'
15262306a36Sopenharmony_ci	local ret=0
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci	local file_list="abc dump-type0-11-1-1362436005 1234 -"
15562306a36Sopenharmony_ci	for f in $file_list; do
15662306a36Sopenharmony_ci		local file=$efivarfs_mount/$f-$test_guid
15762306a36Sopenharmony_ci
15862306a36Sopenharmony_ci		printf "$attrs\x00" > $file
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci		if [ ! -e $file ]; then
16162306a36Sopenharmony_ci			echo "$file could not be created" >&2
16262306a36Sopenharmony_ci			ret=1
16362306a36Sopenharmony_ci		else
16462306a36Sopenharmony_ci			file_cleanup $file
16562306a36Sopenharmony_ci		fi
16662306a36Sopenharmony_ci	done
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	exit $ret
16962306a36Sopenharmony_ci}
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_citest_invalid_filenames()
17262306a36Sopenharmony_ci{
17362306a36Sopenharmony_ci	local attrs='\x07\x00\x00\x00'
17462306a36Sopenharmony_ci	local ret=0
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	local file_list="
17762306a36Sopenharmony_ci		-1234-1234-1234-123456789abc
17862306a36Sopenharmony_ci		foo
17962306a36Sopenharmony_ci		foo-bar
18062306a36Sopenharmony_ci		-foo-
18162306a36Sopenharmony_ci		foo-barbazba-foob-foob-foob-foobarbazfoo
18262306a36Sopenharmony_ci		foo-------------------------------------
18362306a36Sopenharmony_ci		-12345678-1234-1234-1234-123456789abc
18462306a36Sopenharmony_ci		a-12345678=1234-1234-1234-123456789abc
18562306a36Sopenharmony_ci		a-12345678-1234=1234-1234-123456789abc
18662306a36Sopenharmony_ci		a-12345678-1234-1234=1234-123456789abc
18762306a36Sopenharmony_ci		a-12345678-1234-1234-1234=123456789abc
18862306a36Sopenharmony_ci		1112345678-1234-1234-1234-123456789abc"
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	for f in $file_list; do
19162306a36Sopenharmony_ci		local file=$efivarfs_mount/$f
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci		printf "$attrs\x00" 2>/dev/null > $file
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci		if [ -e $file ]; then
19662306a36Sopenharmony_ci			echo "Creating $file should have failed" >&2
19762306a36Sopenharmony_ci			file_cleanup $file
19862306a36Sopenharmony_ci			ret=1
19962306a36Sopenharmony_ci		fi
20062306a36Sopenharmony_ci	done
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci	exit $ret
20362306a36Sopenharmony_ci}
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cicheck_prereqs
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_circ=0
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_cirun_test test_create
21062306a36Sopenharmony_cirun_test test_create_empty
21162306a36Sopenharmony_cirun_test test_create_read
21262306a36Sopenharmony_cirun_test test_delete
21362306a36Sopenharmony_cirun_test test_zero_size_delete
21462306a36Sopenharmony_cirun_test test_open_unlink
21562306a36Sopenharmony_cirun_test test_valid_filenames
21662306a36Sopenharmony_cirun_test test_invalid_filenames
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ciexit $rc
219