Revision control
Copy as Markdown
Other Tools
#!/bin/bash
# Remove the temporary data path on all exit conditions
cleanup() {
if [[ -n "$datapath" ]] && [[ -d "$datapath" ]]; then
rm -r "$datapath"
fi
}
trap cleanup INT ABRT TERM EXIT
TMP="${TMPDIR:-/tmp}"
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
WORKSPACE_ROOT="$( cd "$(dirname "$0")/../.." ; pwd -P )"
cd "$WORKSPACE_ROOT"
# This is a valid Rkv safe-mode file,
# with exactly one key-value pair: `key1=value1` in a store called `store`.
# This is NOT a valid Glean database, but that doesn't matter.
MINIMAL_DATA_SAFE_BIN="010000000000000001050000000000000073746f726500000000010000000000000004000000000000006b6579310f0000000000000007060000000000000076616c756531"
CORRUPT_DATA_SAFE_BIN="010000000000000001050000000000000073746f726500000000010000000000000004000000000000006b6579310f0000000000000007060000000000000076616c7565"
write_minbin() {
out="$1"
data="${2:-$MINIMAL_DATA_SAFE_BIN}"
echo "$data" | xxd -r -p > $out
}
passed=0
failed=0
test() {
msg="$1"
res="$2"
if [[ $res -eq 0 ]]; then
passed=$(($passed+1))
printf " ${GREEN}PASS${NC} %s\n" "$msg"
else
failed=$(($failed+1))
printf " ${RED}FAILED${NC} %s\n" "$msg"
fi
}
finalize() {
total=$(($passed+$failed))
printf "\n%d tests run, %d ${GREEN}passed${NC}, %d ${RED}failed${NC}\n" "$total" "$passed" "$failed"
if [[ $failed -eq 0 ]]; then
printf "${GREEN}pass${NC}: test run succeeded\n"
exit 0
else
printf "${RED}error${NC}: test run failed\n"
exit 101
fi
}
cargo build -q -p glean-core --example rkv-open
test "building test binary" $?
cmd="target/debug/examples/rkv-open"
if [[ ! -x "$cmd" ]]; then
test "missing test binary: $cmd" 1
finalize
fi
export RUST_LOG=debug
# Empty directory - Glean creates a new database
{
testname="empty dir"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
log=$($cmd $datapath 2>&1)
echo "$log" | ( ! grep -q "rkv failed" )
test "$testname: no rkv failure detected" $?
echo "$log" | grep -q "Database initialized"
test "$testname: Database init" $?
echo "$log" | grep -q "Glean initialized"
test "$testname: Glean init" $?
rm -rf "$datapath"
}
# Minimal valid Rkv database. Glean starts and uses it.
{
testname="minimal db"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
mkdir -p "$datapath/db"
write_minbin "$datapath/db/data.safe.bin"
log=$($cmd $datapath 2>&1)
echo "$log" | ( ! grep -q "rkv failed" )
test "$testname: no rkv failure detected" $?
echo "$log" | grep -q "Database initialized"
test "$testname: Database init" $?
echo "$log" | grep -q "Glean initialized"
test "$testname: Glean init" $?
rm -rf "$datapath"
}
# Empty file in place of the database. Glean logs and creates a new database
{
testname="empty db"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
mkdir -p "$datapath/db"
true > "$datapath/db/data.safe.bin"
log=$($cmd $datapath 2>&1)
echo "$log" | grep -q "rkv failed: invalid file"
test "$testname: invalid file detected" $?
echo "$log" | grep -q "Database initialized"
test "$testname: Database init" $?
echo "$log" | grep -q "Glean initialized"
test "$testname: Glean init" $?
rm -rf "$datapath"
}
# Corrupted Rkv file. Glean logs and creates a new database.
{
testname="corrupted db"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
mkdir -p "$datapath/db"
write_minbin "$datapath/db/data.safe.bin" "$CORRUPT_DATA_SAFE_BIN"
log=$($cmd $datapath 2>&1)
echo "$log" | grep -q "rkv failed: invalid file"
test "$testname: invalid file detected" $?
echo "$log" | grep -q "Database initialized"
test "$testname: Database init" $?
echo "$log" | grep -q "Glean initialized"
test "$testname: Glean init" $?
rm -rf "$datapath"
}
# Existing but inaccessible database file. Glean fails to initialize.
{
testname="inaccessible db"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
mkdir -p "$datapath/db"
dbfile="$datapath/db/data.safe.bin"
true > "$dbfile"
chmod ugo-rw "$dbfile"
log=$($cmd $datapath 2>&1)
echo "$log" | grep -qE "Failed to initialize Glean.+Permission denied"
test "$testname: Glean fails to initialize (Permission denied error)" $?
rm -rf "$datapath"
}
# Existing but inaccessible temporary database file. Glean initializes, but can't write metrics.
{
testname="inaccessible tmp db"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
mkdir -p "$datapath/db"
dbfile="$datapath/db/data.safe.tmp"
true > "$dbfile"
chmod ugo-rw "$dbfile"
log=$($cmd $datapath 2>&1)
echo "$log" | ( ! grep -q "rkv failed" )
test "$testname: no rkv failure detected" $?
echo "$log" | grep -q "Database initialized"
test "$testname: Database init" $?
echo "$log" | grep -q "Glean initialized"
test "$testname: Glean init" $?
echo "$log" | grep -qE "Failed to record metric.+Permission denied"
test "$testname: Can't record metric (permission denied)" $?
rm -rf "$datapath"
}
# Database directory is a file. Glean fails to initialize.
{
testname="db path is a file"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
true > "$datapath/db"
log=$($cmd $datapath 2>&1)
echo "$log" | grep -qE "Failed to initialize Glean.+File exists"
test "$testname: Glean fails to initialize (File exists error)" $?
rm -rf "$datapath"
}
# Database directory is not writable. Glean initializes, but can't record metrics.
{
testname="db dir is not writable"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
mkdir "$datapath/db"
chmod -w "$datapath/db"
log=$($cmd $datapath 2>&1)
echo "$log" | ( ! grep -q "rkv failed" )
test "$testname: no rkv failure detected" $?
echo "$log" | grep -q "Database initialized"
test "$testname: Database init" $?
echo "$log" | grep -q "Glean initialized"
test "$testname: Glean init" $?
echo "$log" | grep -qE "Failed to record metric.+Permission denied"
test "$testname: Can't record metric (permission denied)" $?
rm -rf "$datapath"
}
#
# Minimal valid Rkv database in tmp location. Glean starts.
{
testname="minimal tmp db"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
mkdir -p "$datapath/db"
write_minbin "$datapath/db/data.safe.tmp"
log=$($cmd $datapath 2>&1)
echo "$log" | ( ! grep -q "rkv failed" )
test "$testname: no rkv failure detected" $?
echo "$log" | grep -q "Database initialized"
test "$testname: Database init" $?
echo "$log" | grep -q "Glean initialized"
test "$testname: Glean init" $?
rm -rf "$datapath"
}
# Empty file in place of the database. Glean logs and creates a new database
{
testname="empty tmp db"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
mkdir -p "$datapath/db"
true > "$datapath/db/data.safe.tmp"
log=$($cmd $datapath 2>&1)
echo "$log" | ( ! grep -q "rkv failed: invalid file" )
test "$testname: no invalid file detected" $?
echo "$log" | grep -q "Database initialized"
test "$testname: Database init" $?
echo "$log" | grep -q "Glean initialized"
test "$testname: Glean init" $?
rm -rf "$datapath"
}
# Corrupted Rkv file. Glean logs and creates a new database.
{
testname="corrupted tmp db"
datapath=$(mktemp -d "${TMP}/glean_rkv_behavior.XXXX")
mkdir -p "$datapath/db"
write_minbin "$datapath/db/data.safe.tmp" "$CORRUPT_DATA_SAFE_BIN"
log=$($cmd $datapath 2>&1)
echo "$log" | ( ! grep -q "rkv failed: invalid file" )
test "$testname: no invalid file detected" $?
echo "$log" | grep -q "Database initialized"
test "$testname: Database init" $?
echo "$log" | grep -q "Glean initialized"
test "$testname: Glean init" $?
rm -rf "$datapath"
}
finalize