matrix-commander/tests/test-upload.sh

299 lines
11 KiB
Bash
Executable File

#!/bin/bash
# just in case PATH is not set correctly
PATH=".:./matrix_commander:../matrix_commander:$PATH"
# One may set similar values in the terminal before calling the script.
# export MC_OPTIONS="-d --room \!...some.room.id:matrix.example.org "
# getting some optional arguments
if [ "$MC_OPTIONS" != "" ]; then
echo "Exellent. Variable MC_OPTIONS already set. " \
"Using \"$MC_OPTIONS\" as additional options for testing."
else
echo "Optionally, set variable \"MC_OPTIONS\" for further options."
fi
echo "Python version is: $(python --version)"
echo "GITHUB_WORKFLOW = $GITHUB_WORKFLOW"
echo "GITHUB_REPOSITORY = $GITHUB_REPOSITORY"
echo "MC_OPTIONS = $MC_OPTIONS"
if [[ "$GITHUB_WORKFLOW" != "" ]]; then # if in Github Action Workflow
echo "I am in Github Action Workflow $GITHUB_WORKFLOW."
fi
failures=0
# in order to make it uniform and consistant between local execution
# and remote Github Action workflow, let's create the files on the fly
# even though we have test files locally.
MYDIR="" # "tests/"
if [[ "$MYDIR" != "" ]] && [[ "$MYDIR" != "." ]] && [[ "$MYDIR" != "./" ]]; then
mkdir ${MYDIR}
fi
echo "test.txt" >${MYDIR}test.txt
echo "test.1.txt" >${MYDIR}test.1.txt
echo "test.2.txt" >${MYDIR}test.2.txt
echo '<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg width="2in" height="2in" viewBox="0 0 192 192" version="1.1" id="svg5" inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" sodipodi:docname="test2.svg" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"> <sodipodi:namedview id="namedview7" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageshadow="2" inkscape:pageopacity="0.0" inkscape:pagecheckerboard="0" inkscape:document-units="in" showgrid="false" inkscape:zoom="1.6234774" inkscape:cx="26.486356" inkscape:cy="95.166092" inkscape:window-width="1471" inkscape:window-height="1088" inkscape:window-x="1486" inkscape:window-y="346" inkscape:window-maximized="1" inkscape:current-layer="layer1" /> <defs id="defs2" /> <g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1"> <rect style="opacity:1;fill:#ff0000;stroke-width:100;stroke-linejoin:round" id="rect868" width="244.53682" height="250.08047" x="-25.254433" y="-24.63847" /> <ellipse style="opacity:1;fill:#0000ff;stroke-width:100;stroke-linejoin:round" id="path1332" cx="161.99794" cy="215.58661" rx="104.09753" ry="91.778305" /> </g> </svg> ' >${MYDIR}test.s.svg
ls -l ${MYDIR}
function test1() {
echo "=== Test 1: uploading and downloading a text file without encryption ==="
TMPFILE="test.txt.tmp"
mxc_key=$(matrix-commander --upload ${MYDIR}test.txt --plain)
if [[ "$mxc_key" == "" ]]; then
echo "FAILURE."
let failures++
return
fi
echo "$mxc_key" # has the URI, like "mxc://... None"
mxc="${mxc_key% *}" # before " "
key="${mxc_key##* }" # after " "
echo "mxc is \"$mxc\""
echo "key is \"$key\"" # None in our case, because plain-text
rm -f "$TMPFILE"
# download knows it is plain because we do not specify a key dictionary
matrix-commander --download "$mxc" --file-name "$TMPFILE"
res="$?"
if [ "$res" == "0" ]; then
echo "SUCCESS."
else
echo "FAILURE."
let failures++
fi
diff "$TMPFILE" "${MYDIR}test.txt"
res="$?"
if [ "$res" == "0" ]; then
echo "SUCCESS"
echo "Let's look at the text."
cat "$TMPFILE" # look at the text file
else
echo "FAILURE"
let failures++
fi
}
function test2() {
echo "=== Test 2: uploading and downloading an image file with encryption ==="
mxc_key=$(matrix-commander --upload ${MYDIR}test.s.svg)
if [[ "$mxc_key" == "" ]]; then
echo "FAILURE."
let failures++
return
fi
# echo "$mxc_key" # has the URI, like "mxc://... {some key dictionary}" # leaks keys
mxc="${mxc_key% *}" # before " "
key="${mxc_key##* }" # after " "
echo "mxc is \"$mxc\""
echo "key is \"***\"" # "key is \"$key\"" hide for privacy, don't leak keys
rm -f "$TMPFILE"
# download knows it is encrypted because we specify a key dictionary
matrix-commander --download "$mxc" --file-name "$TMPFILE" \
--key-dict "$key"
res="$?"
if [ "$res" == "0" ]; then
echo "SUCCESS."
else
echo "FAILURE."
let failures++
fi
diff "$TMPFILE" "${MYDIR}test.s.svg"
res="$?"
if [ "$res" == "0" ]; then
echo "SUCCESS"
if [[ "$GITHUB_WORKFLOW" == "" ]]; then # skip in Github Action Workflow
type eog >/dev/null 2>&1 && {
echo "Let's look at the image."
eog "$TMPFILE" >/dev/null 2>&1
}
fi
else
echo "FAILURE"
let failures++
fi
rm -f "$TMPFILE"
}
function test3() {
echo "=== Test 3: uploading and downloading 2 text files without encryption ==="
N=2 # 2 files to test
TESTFILES=("${MYDIR}test.1.txt" "${MYDIR}test.2.txt")
TMPFILES=("test.1.txt.tmp" "test.2.txt.tmp")
rm -f "${TMPFILES[@]}"
mxc_keys=$(matrix-commander --upload ${TESTFILES[0]} ${TESTFILES[1]} --plain)
if [[ "$mxc_keys" == "" ]]; then
echo "FAILURE."
let failures++
return
fi
# echo "$mxc_keys" # has the N URIs, like "mxc://... None" # leaks keys
MXCS=()
KEYS=()
for ii in $(seq $N); do
echo "Handling file $ii"
mxc_key=$(echo "$mxc_keys" | head -n $ii | tail -n 1)
mxc="${mxc_key% *}" # before " "
key="${mxc_key##* }" # after " "
echo "mxc is \"$mxc\""
echo "key is \"***\"" # "key is \"$key\"" # None in our case, because plain-text # leaks key
MXCS+=("$mxc") # append mxc to array
KEYS+=("$key") # append mxc to array
done
rm -f "${TMPFILES[0]}" "${TMPFILES[1]}"
# download knows it is plain because we do not specify a key dictionary
matrix-commander --download "${MXCS[0]}" "${MXCS[1]}" \
--file-name "${TMPFILES[0]}" "${TMPFILES[1]}"
res="$?"
if [ "$res" == "0" ]; then
echo "SUCCESS."
else
echo "FAILURE."
let failures++
fi
for ii in $(seq $N); do
((ii = ii - 1))
diff "${TMPFILES[$ii]}" "${TESTFILES[$ii]}"
res="$?"
if [ "$res" == "0" ]; then
echo "SUCCESS"
echo "Let's look at the text."
cat "${TMPFILES[$ii]}" # look at the text file
else
echo "FAILURE"
let failures++
fi
rm "${TMPFILES[$ii]}"
done
}
function test4() {
echo "=== Test 4: convert MXC to HTTP URL ==="
TMPFILE="test.txt.tmp"
rm -f "$TMPFILE"
mxc_http=$(matrix-commander --mxc-to-http "${MXCS[0]}")
if [[ "$mxc_http" == "" ]]; then
echo "FAILURE."
let failures++
return
fi
echo "$mxc_http" # has the URI and the URL
mxc="${mxc_http% *}" # before " "
http="${mxc_http##* }" # after " "
echo "mxc is \"$mxc\""
echo "mxc_http is \"$http\""
wget -O "$TMPFILE" "$http"
diff "$TMPFILE" "${MYDIR}test.1.txt"
res="$?"
if [ "$res" == "0" ]; then
echo "SUCCESS"
echo "Let's look at the text file."
cat "$TMPFILE" # look at the text file
else
echo "FAILURE"
let failures++
fi
rm -f "$TMPFILE"
}
function test5() {
echo "=== Test 5: uploading and downloading 2 text files with encryption ==="
N=2 # 2 files to test
TESTFILES=("${MYDIR}test.1.txt" "${MYDIR}test.2.txt")
TMPFILES=("test.1.txt.tmp" "test.2.txt.tmp")
rm -f "${TMPFILES[@]}"
mxc_keys=$(matrix-commander --upload ${TESTFILES[0]} ${TESTFILES[1]})
if [[ "$mxc_keys" == "" ]]; then
echo "FAILURE."
let failures++
return
fi
# echo "$mxc_keys" # has the N URIs, like "mxc://... None" # leaks keys
MXCS=()
KEYS=()
for ii in $(seq $N); do
echo "Handling file $ii"
mxc_key=$(echo "$mxc_keys" | head -n $ii | tail -n 1)
mxc="${mxc_key% *}" # before " "
key="${mxc_key##* }" # after " "
echo "mxc is \"$mxc\""
echo "key is \"***\"" # "key is \"$key\""# a key dict # leaks keys
MXCS+=("$mxc") # append mxc to array
KEYS+=("$key") # append mxc to array
done
rm -f "${TMPFILES[0]}" "${TMPFILES[1]}"
# download knows it is encrypted because we do specify a key dictionary
matrix-commander --download "${MXCS[0]}" "${MXCS[1]}" \
--file-name "${TMPFILES[0]}" "${TMPFILES[1]}" \
--key-dict "${KEYS[0]}" "${KEYS[1]}"
res="$?"
if [ "$res" == "0" ]; then
echo "SUCCESS."
else
echo "FAILURE."
let failures++
fi
for ii in $(seq $N); do
((ii = ii - 1))
diff "${TMPFILES[$ii]}" "${TESTFILES[$ii]}"
res="$?"
if [ "$res" == "0" ]; then
echo "SUCCESS"
echo "Let's look at the text."
cat "${TMPFILES[$ii]}" # look at the text file
else
echo "FAILURE"
let failures++
fi
rm "${TMPFILES[$ii]}"
done
}
function test6() {
echo "=== Test 6: deleting MXC resources from content repository ==="
echo "Note: This will FAIL if you do not have server admin permissions!"
matrix-commander --delete-mxc "${MXCS[0]}" "${MXCS[1]}"
res=$?
if [ "$res" == "0" ]; then
echo "SUCCESS"
else
echo "FAILURE, normal because server permissions are usually not available"
# don't increment failures because this is expected
fi
}
function test7() {
echo "=== Test 7: deleting old resources from content repository ==="
echo "Note: This will FAIL if you do not have server admin permissions!"
matrix-commander --delete-mxc-before "20.01.2022 19:38:42" "1000000"
res=$?
if [ "$res" == "0" ]; then
echo "SUCCESS"
else
echo "FAILURE, normal because server permissions are usually not available"
# don't increment failures because this is expected
fi
}
test1
test2
test3
test4
test5
test6
test7
rm -f ${MYDIR}test.txt
rm -f ${MYDIR}test.1.txt
rm -f ${MYDIR}test.2.txt
rm -f ${MYDIR}test.s.svg
if [[ "$MYDIR" != "" ]] && [[ "$MYDIR" != "." ]] && [[ "$MYDIR" != "./" ]]; then
rmdir ${MYDIR}
fi
echo "Finished test series with $failures failures."
exit $failures