From 6a9b662b50927b2dbe3c8d383f04d1d7b649b28f Mon Sep 17 00:00:00 2001 From: Bryce Kwon Date: Sat, 8 Aug 2026 12:49:57 -1000 Subject: Gather page output into one buffer --- tests/t0020-validate-cache.sh | 49 +++++++++++++++++++++++++++++++++++++++++++ tests/t0111-filter.sh | 16 ++++++++++++++ 2 files changed, 65 insertions(+) (limited to 'tests') diff --git a/tests/t0020-validate-cache.sh b/tests/t0020-validate-cache.sh index 657765d..7e6334c 100755 --- a/tests/t0020-validate-cache.sh +++ b/tests/t0020-validate-cache.sh @@ -75,4 +75,53 @@ test_expect_success 'verify cache-size=1021' ' test_cmp output.full output.second ' +# --- A cached page must hold everything the uncached one produced ----------- +# Page output is buffered, so the slot is only complete if the buffer is +# emptied before the generated content is measured. The blob here is larger +# than one buffer, so a missing flush would truncate the cached copy. +test_expect_success 'set up a repo with a page larger than the output buffer' ' + mkrepo repos/bigpage 1 && + ( + cd repos/bigpage && + awk "BEGIN{for(i=0;i<20000;i++) print \"line \" i \" of the big file\"}" >big.txt && + git add big.txt && + git commit -m "add big.txt" + ) && + { + echo "virtual-root=/" && + echo "cache-root=$PWD/cache2" && + echo "cache-size=64" && + echo "enable-tree-linenumbers=1" && + echo "repo.url=bigpage" && + echo "repo.path=$PWD/repos/bigpage/.git" + } >bigrc && + rm -rf cache2 && mkdir cache2 +' + +bigq() { CGIT_CONFIG="$PWD/bigrc" QUERY_STRING="$1" cgit; } + +test_expect_success 'the first request fills the slot and the second replays it' ' + bigq "url=bigpage/tree/big.txt" >big.first && + test $(wc -c big.second && + strip_headers big.first.body && + strip_headers big.second.body && + test_cmp big.first.body big.second.body +' + +test_expect_success 'the cached body matches one generated with the cache off' ' + sed -e "s/^cache-size=64$/cache-size=0/" bigrc >bignocache && + CGIT_CONFIG="$PWD/bignocache" QUERY_STRING="url=bigpage/tree/big.txt" cgit >big.nocache && + strip_headers big.nocache.body && + # The footer carries the time the page was generated, which differs + # between the two runs by construction. + sed -e "s/generated by .*//" big.nocache.body >big.a && + sed -e "s/generated by .*//" big.second.body >big.b && + test_cmp big.a big.b +' + +test_expect_success 'the page ends where it should, so nothing was dropped' ' + tail -c 200 big.second.body | grep "" +' + test_done diff --git a/tests/t0111-filter.sh b/tests/t0111-filter.sh index 2fdc366..da4172f 100755 --- a/tests/t0111-filter.sh +++ b/tests/t0111-filter.sh @@ -41,6 +41,22 @@ do test_expect_success "check whether the $prefix email filter works for committers" ' grep " commit C O MITTER <COMMITTER@EXAMPLE.COM>" tmp ' + + # Page output is buffered, so anything written before a filter opens has + # to leave the buffer before the filter takes over stdout, and anything + # written while it is open has to leave before stdout is handed back. + # A missed flush reorders the page rather than losing it, so check that + # the markup around the filtered text is still on the right side of it. + test_expect_success "the $prefix source filter output stays inside its cell" " + cgit_url 'filter-$prefix/tree/a%2bb' >tmp && + tr -d '\n' flat.out && + grep 'a+b HELLO' flat.out + " + + test_expect_success "the $prefix about filter output stays inside its div" " + cgit_url 'filter-$prefix/about/' >tmp && + grep \"
a+b HELLO\" tmp + " done test_done -- cgit v2.8.0