Add syscall test framwork from gvisor

This commit is contained in:
LI Qing
2023-05-29 13:29:53 +08:00
committed by Tate, Hongliang Tian
parent 8e199f46ef
commit e2f3932cb8
18 changed files with 256 additions and 43 deletions

View File

@ -0,0 +1,43 @@
TESTS ?= open_test read_test
MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
CUR_DIR := $(patsubst %/,%,$(dir $(MKFILE_PATH)))
BUILD_DIR := $(CUR_DIR)/../build
SRC_DIR := $(BUILD_DIR)/gvisor_src
BIN_DIR := $(BUILD_DIR)/syscall_test_bins
INITRAMFS ?= $(CUR_DIR)/../build/initramfs
TARGET_DIR := $(INITRAMFS)/opt/syscall_test
RUN_BASH := $(CUR_DIR)/run_syscall_test.sh
BLOCK_LIST := $(CUR_DIR)/blocklists
.PHONY: all clean
all: $(TESTS)
$(SRC_DIR):
@if ! type bazel > /dev/null; then \
echo "bazel is not installed, please run $(CUR_DIR)/install_bazel.sh with sudo permission to install it."; \
exit 1 ; \
fi
@rm -rf $@ && mkdir -p $@
@cd $@ && git clone -b 20200921.0 https://github.com/jinzhao-dev/gvisor.git .
$(BIN_DIR): $(SRC_DIR)
@rm -rf $@ && mkdir -p $@
@cd $(SRC_DIR) && bazel build --test_tag_filters=native //test/syscalls/...
@cp $(SRC_DIR)/bazel-bin/test/syscalls/linux/*_test $@
$(TARGET_DIR): $(RUN_BASH) $(BLOCK_LIST) $(BIN_DIR)
@rm -rf $@ && mkdir -p $@
@# Prepare tests dir for test binaries
@mkdir $@/tests
@# Copy blocklists
@cp -rf $(BLOCK_LIST) $@
@# Copy bash script
@cp -f $(RUN_BASH) $@
$(TESTS): $(TARGET_DIR)
@cp -f $(BIN_DIR)/$@ $(TARGET_DIR)/tests
clean:
@rm -rf $(BIN_DIR) $(TARGET_DIR)

View File

@ -0,0 +1,15 @@
OpenTest.AppendConcurrentWrite
OpenTest.CanTruncateReadOnly
OpenTest.CanTruncateWithStrangePermissions
OpenTest.CanTruncateReadOnlyNoWritePermission_NoRandomSave
OpenTest.CanTruncateWriteOnlyNoReadPermission_NoRandomSave
OpenTest.FileNotDirectory
OpenTest.MustCreateExisting
OpenTest.NameTooLong
OpenTest.Null
OpenTest.OTrunc
OpenTest.OTruncAndReadOnlyDir
OpenTest.OpenNoFollowStillFollowsLinksInPath
OpenTest.OpenNonDirectoryWithTrailingSlash
OpenTest.SymlinkRecurse
OpenTest.Truncate

View File

@ -0,0 +1,2 @@
ReadTest.EofAfterRead
ReadTest.ZeroBuffer

View File

@ -0,0 +1,17 @@
#! /bin/bash
set -e
if type bazel > /dev/null; then
echo "Bazel has been installed already"
exit 0
fi
apt update && apt install curl gnupg -y
curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg
mv bazel.gpg /etc/apt/trusted.gpg.d/
echo 'deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8' | tee /etc/apt/sources.list.d/bazel.list
apt update && apt install bazel=5.4.0 -y
echo "Bazel is installed successfully"

View File

@ -0,0 +1,60 @@
#!/bin/sh
SCRIPT_DIR=$(dirname "$0")
TEST_BIN_DIR=$SCRIPT_DIR/tests
BLOCKLIST_DIR=$SCRIPT_DIR/blocklists
FAIL_CASES=$SCRIPT_DIR/fail_cases
BLOCK=""
TESTS=0
PASSED_TESTS=0
RESULT=0
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'
get_blocklist_subtests(){
if [ -f $BLOCKLIST_DIR/$1 ]; then
BLOCK=$(sed ':a;N;$!ba;s/\n/:/g' $BLOCKLIST_DIR/$1)
return 0
else
BLOCK=""
return 1
fi
}
run_one_test(){
echo -e "Run Test Case: $1"
ret=0
if [ -f $TEST_BIN_DIR/$1 ]; then
get_blocklist_subtests $1
$TEST_BIN_DIR/$1 --gtest_filter=-$BLOCK
ret=$?
else
echo -e "Warning: $1 test does not exit"
ret=1
fi
echo ""
return $ret
}
rm -f $FAIL_CASES && touch $FAIL_CASES
for syscall_test in $(find $TEST_BIN_DIR/. -name \*_test) ; do
test_name=$(basename "$syscall_test")
run_one_test $test_name
if [ $? -eq 0 ] && PASSED_TESTS=$((PASSED_TESTS+1));then
TESTS=$((TESTS+1))
else
echo -e "$test_name" >> $FAIL_CASES
TESTS=$((TESTS+1))
fi
done
echo -e "$GREEN$PASSED_TESTS$NC of $GREEN$TESTS$NC test cases are passed."
[ $PASSED_TESTS -ne $TESTS ] && RESULT=1
if [ $TESTS != $PASSED_TESTS ]; then
echo -e "The $RED$(($TESTS-$PASSED_TESTS))$NC failed test cases in this run are as follows:"
cat $FAIL_CASES
fi
exit $RESULT