commit a9c0a12c5e9658f3f46a39a74dfc22a8ca23b16e from: Stefan Sperling via: Thomas Adam date: Fri Apr 12 13:39:40 2024 UTC add test for read-only access on empty repository commit - e28ceabf9e2d8ad71b5cec0f4cba20ec0a3bd06d commit + a9c0a12c5e9658f3f46a39a74dfc22a8ca23b16e blob - 00f69c40c6fd31670fde808184134e4ac98ce8e1 blob + 0167d899f41c288d28cb4fec97714f37f9b48bc9 --- regress/gotd/Makefile +++ regress/gotd/Makefile @@ -4,8 +4,8 @@ REGRESS_TARGETS=test_repo_read test_repo_read_group \ test_repo_read_denied_user test_repo_read_denied_group \ test_repo_read_bad_user test_repo_read_bad_group \ test_repo_write test_repo_write_empty test_request_bad \ - test_repo_write_protected test_email_notification \ - test_http_notification + test_repo_write_protected test_repo_write_readonly \ + test_email_notification test_http_notification NOOBJ=Yes CLEANFILES=gotd.conf @@ -247,6 +247,12 @@ test_repo_write_protected: prepare_test_repo start_got @$(GOTD_STOP_CMD) 2>/dev/null @su -m ${GOTD_USER} -c 'env $(GOTD_TEST_ENV) sh ./check_test_repo.sh' +test_repo_write_readonly: prepare_test_repo_empty start_gotd_ro + @-$(GOTD_TRAP); su ${GOTD_TEST_USER} -c \ + 'env $(GOTD_TEST_ENV) sh ./repo_write_readonly.sh' + @$(GOTD_STOP_CMD) 2>/dev/null + @su -m ${GOTD_USER} -c 'env $(GOTD_TEST_ENV) sh ./check_test_repo.sh' + test_request_bad: prepare_test_repo_empty start_gotd_ro @-$(GOTD_TRAP); su -m ${GOTD_TEST_USER} -c \ 'env $(GOTD_TEST_ENV) sh ./request_bad.sh' blob - /dev/null blob + 9bfba2cfd281497c7e9b811178f4b534d191cc7e (mode 644) --- /dev/null +++ regress/gotd/repo_write_readonly.sh @@ -0,0 +1,87 @@ +#!/bin/sh +# +# Copyright (c) 2024 Stefan Sperling +# +# Permission to use, copy, modify, and distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +. ../cmdline/common.sh +. ./common.sh + +test_send_empty_readonly() { + local testroot=`test_init send_empty` + local commit_id=`git_show_head $testroot/repo` + + (cd ${GOTD_TEST_REPO} && find . > $testroot/repo-list.before) + + # The gotd-controlled test repository starts out empty. + got ref -l -r ${GOTD_TEST_REPO} > $testroot/ref-list.before + echo "HEAD: refs/heads/main" > $testroot/ref-list.expected + cmp -s $testroot/ref-list.expected $testroot/ref-list.before + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/ref-list.expected $testroot/ref-list.before + test_done "$testroot" "$ret" + return 1 + fi + + got checkout -q $testroot/repo $testroot/wt >/dev/null + ret=$? + if [ $ret -ne 0 ]; then + echo "got checkout failed unexpectedly" >&2 + test_done "$testroot" 1 + return 1 + fi + + # send contents of $testroot/repo to ${GOTD_TEST_REPO} + cat >> $testroot/wt/.got/got.conf < $testroot/stderr) + ret=$? + if [ $ret -eq 0 ]; then + echo "got send succeeded unexpectedly" >&2 + test_done "$testroot" 1 + return 1 + fi + + echo "got-send-pack: test-repo: Permission denied" \ + > $testroot/stderr.expected + grep '^got-send-pack:' $testroot/stderr > $testroot/stderr.filtered + cmp -s $testroot/stderr.expected $testroot/stderr.filtered + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/stderr.expected $testroot/stderr.filtered + test_done "$testroot" "$ret" + return 1 + fi + + # Server should not have created a new reference. + got ref -l -r ${GOTD_TEST_REPO} > $testroot/ref-list.after + echo "HEAD: refs/heads/main" > $testroot/ref-list.expected + cmp -s $testroot/ref-list.expected $testroot/ref-list.after + ret=$? + if [ $ret -ne 0 ]; then + diff -u $testroot/ref-list.expected $testroot/ref-list.after + test_done "$testroot" "$ret" + return 1 + fi + + test_done "$testroot" "$ret" +} + +test_parseargs "$@" +run_test test_send_empty_readonly