From: Junio C Hamano <gitster@pobox.com>
To: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Cc: git@vger.kernel.org, Jeff King <peff@peff.net>,
Taylor Blau <me@ttaylorr.com>
Subject: Re: [PATCH v4] test-lib-functions: use test-tool for [de]packetize()
Date: Mon, 19 Jul 2021 11:54:32 -0700 [thread overview]
Message-ID: <xmqqh7gqkuc7.fsf@gitster.g> (raw)
In-Reply-To: <patch-1.1-546974eed59-20210716T153909Z-avarab@gmail.com> ("Ævar Arnfjörð Bjarmason"'s message of "Fri, 16 Jul 2021 17:41:33 +0200")
Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:
> The shell+perl "[de]packetize()" helper functions were added in
> 4414a150025 (t/lib-git-daemon: add network-protocol helpers,
> 2018-01-24), and around the same time we added the "pkt-line" helper
> in 74e70029615 (test-pkt-line: introduce a packet-line test helper,
> 2018-03-14).
>
> For some reason it seems we've mostly used the shell+perl version
> instead of the helper since then. There were discussions around
> 88124ab2636 (test-lib-functions: make packetize() more efficient,
> 2020-03-27) and cacae4329fa (test-lib-functions: simplify packetize()
> stdin code, 2020-03-29) to improve them and make them more efficient.
>
> There was one good reason to do so, we needed an equivalent of
> "test-tool pkt-line pack", but that command wasn't capable of handling
> input with "\n" (a feature) or "\0" (just because it happens to be
> printf-based under the hood).
>
> Let's add a "pkt-line-raw" helper for that, and expose is at a
> packetize_raw() to go with the existing packetize() on the shell
> level, this gives us the smallest amount of change to the tests
> themselves.
>
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> ---
>
> I ejected changing/adding test code for this v4. This keeps the
> compatibility wrappers and just narrowly changes the things that need
> a packetize_raw() to use that new helper.
>
> I left the simpler packetize() case as a "printf", it could also use
> the test tool, but in case someone cares about process overhead on say
> Windows this entire change should be strictly better than the status
> quo.
Thanks, all. Will replace. Let me mark this for 'next'.
> Range-diff against v3:
> 1: 67aa8141153 < -: ----------- serve tests: add missing "extra delim" test
> 2: 64dfd14865c < -: ----------- serve tests: use test_cmp in "protocol violations" test
> 3: 92bfd8a87b8 < -: ----------- tests: replace [de]packetize() shell+perl test-tool pkt-line
> 4: 9842c85d1f3 ! 1: 546974eed59 tests: replace remaining packetize() with "test-tool pkt-line"
> @@ Metadata
> Author: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
>
> ## Commit message ##
> - tests: replace remaining packetize() with "test-tool pkt-line"
> + test-lib-functions: use test-tool for [de]packetize()
>
> - Move the only remaining users of "packetize()" over to "test-tool
> - pkt-line", for this we need a new "pack-raw-stdin" subcommand in the
> - test-tool. The "pack" command takes input on stdin, but splits it by
> - "\n", furthermore we'll format the output using C-strings, so the
> - embedded "\0" being tested for here would cause the string to be
> - truncated.
> + The shell+perl "[de]packetize()" helper functions were added in
> + 4414a150025 (t/lib-git-daemon: add network-protocol helpers,
> + 2018-01-24), and around the same time we added the "pkt-line" helper
> + in 74e70029615 (test-pkt-line: introduce a packet-line test helper,
> + 2018-03-14).
>
> - So we need another mode that just calls packet_write() on the raw
> - input we got on stdin.
> + For some reason it seems we've mostly used the shell+perl version
> + instead of the helper since then. There were discussions around
> + 88124ab2636 (test-lib-functions: make packetize() more efficient,
> + 2020-03-27) and cacae4329fa (test-lib-functions: simplify packetize()
> + stdin code, 2020-03-29) to improve them and make them more efficient.
> +
> + There was one good reason to do so, we needed an equivalent of
> + "test-tool pkt-line pack", but that command wasn't capable of handling
> + input with "\n" (a feature) or "\0" (just because it happens to be
> + printf-based under the hood).
> +
> + Let's add a "pkt-line-raw" helper for that, and expose is at a
> + packetize_raw() to go with the existing packetize() on the shell
> + level, this gives us the smallest amount of change to the tests
> + themselves.
>
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
>
> @@ t/t5411/once-0010-report-status-v1.sh: test_expect_success "proc-receive: report
> then
> printf "%s %s refs/heads/main\0report-status\n" \
> - $A $B | packetize
> -+ $A $B | test-tool pkt-line pack-raw-stdin
> ++ $A $B | packetize_raw
> else
> printf "%s %s refs/heads/main\0report-status object-format=$GIT_DEFAULT_HASH\n" \
> - $A $B | packetize
> -+ $A $B | test-tool pkt-line pack-raw-stdin
> ++ $A $B | packetize_raw
> fi &&
> - test-tool pkt-line pack <<-EOF &&
> - $ZERO_OID $A refs/for/main/topic1
> + printf "%s %s refs/for/main/topic1\n" \
> + $ZERO_OID $A | packetize &&
>
> ## t/t5562-http-backend-content-length.sh ##
> @@ t/t5562-http-backend-content-length.sh: test_expect_success 'setup' '
> @@ t/t5562-http-backend-content-length.sh: test_expect_success 'setup' '
> {
> printf "%s %s refs/heads/newbranch\\0report-status object-format=%s\\n" \
> - "$ZERO_OID" "$hash_next" "$(test_oid algo)" | packetize &&
> -+ "$ZERO_OID" "$hash_next" "$(test_oid algo)" |
> -+ test-tool pkt-line pack-raw-stdin &&
> ++ "$ZERO_OID" "$hash_next" "$(test_oid algo)" | packetize_raw
> printf 0000 &&
> echo "$hash_next" | git pack-objects --stdout
> } >push_body &&
> @@ t/t5570-git-daemon.sh: test_expect_success 'hostname cannot break out of directo
> test_expect_success FAKENC 'hostname interpolation works after LF-stripping' '
> {
> - printf "git-upload-pack /interp.git\n\0host=localhost" | packetize
> -- printf "0000"
> -+ printf "git-upload-pack /interp.git\n\0host=localhost" |
> -+ test-tool pkt-line pack-raw-stdin &&
> -+ test-tool pkt-line pack <<-\EOF
> -+ 0000
> -+ EOF
> ++ printf "git-upload-pack /interp.git\n\0host=localhost" | packetize_raw
> + printf "0000"
> } >input &&
> -+
> fake_nc "$GIT_DAEMON_HOST_PORT" <input >output &&
> - test-tool pkt-line unpack <output >actual &&
> +
> + ## t/test-lib-functions.sh ##
> +@@ t/test-lib-functions.sh: nongit () {
> + )
> + } 7>&2 2>&4
> +
> +-# convert function arguments or stdin (if not arguments given) to pktline
> +-# representation. If multiple arguments are given, they are separated by
> +-# whitespace and put in a single packet. Note that data containing NULs must be
> +-# given on stdin, and that empty input becomes an empty packet, not a flush
> +-# packet (for that you can just print 0000 yourself).
> ++# These functions are historical wrappers around "test-tool pkt-line"
> ++# for older tests. Use "test-tool pkt-line" itself in new tests.
> + packetize () {
> + if test $# -gt 0
> + then
> + packet="$*"
> + printf '%04x%s' "$((4 + ${#packet}))" "$packet"
> + else
> +- perl -e '
> +- my $packet = do { local $/; <STDIN> };
> +- printf "%04x%s", 4 + length($packet), $packet;
> +- '
> ++ test-tool pkt-line pack
> + fi
> + }
> +
> +-# Parse the input as a series of pktlines, writing the result to stdout.
> +-# Sideband markers are removed automatically, and the output is routed to
> +-# stderr if appropriate.
> +-#
> +-# NUL bytes are converted to "\\0" for ease of parsing with text tools.
> ++packetize_raw () {
> ++ test-tool pkt-line pack-raw-stdin
> ++}
> ++
> + depacketize () {
> +- perl -e '
> +- while (read(STDIN, $len, 4) == 4) {
> +- if ($len eq "0000") {
> +- print "FLUSH\n";
> +- } else {
> +- read(STDIN, $buf, hex($len) - 4);
> +- $buf =~ s/\0/\\0/g;
> +- if ($buf =~ s/^[\x2\x3]//) {
> +- print STDERR $buf;
> +- } else {
> +- $buf =~ s/^\x1//;
> +- print $buf;
> +- }
> +- }
> +- }
> +- '
> ++ test-tool pkt-line unpack
> + }
>
> + # Converts base-16 data into base-8. The output is given as a sequence of
> 5: 7ca83c5a551 < -: ----------- test-lib-functions.sh: remove unused [de]packetize() functions
>
> t/helper/test-pkt-line.c | 12 ++++++++
> t/t5411/once-0010-report-status-v1.sh | 4 +--
> t/t5562-http-backend-content-length.sh | 2 +-
> t/t5570-git-daemon.sh | 2 +-
> t/test-lib-functions.sh | 38 ++++++--------------------
> 5 files changed, 24 insertions(+), 34 deletions(-)
>
> diff --git a/t/helper/test-pkt-line.c b/t/helper/test-pkt-line.c
> index 5e638f0b970..c5e052e5378 100644
> --- a/t/helper/test-pkt-line.c
> +++ b/t/helper/test-pkt-line.c
> @@ -26,6 +26,16 @@ static void pack(int argc, const char **argv)
> }
> }
>
> +static void pack_raw_stdin(void)
> +{
> + struct strbuf sb = STRBUF_INIT;
> +
> + if (strbuf_read(&sb, 0, 0) < 0)
> + die_errno("failed to read from stdin");
> + packet_write(1, sb.buf, sb.len);
> + strbuf_release(&sb);
> +}
> +
> static void unpack(void)
> {
> struct packet_reader reader;
> @@ -110,6 +120,8 @@ int cmd__pkt_line(int argc, const char **argv)
>
> if (!strcmp(argv[1], "pack"))
> pack(argc - 2, argv + 2);
> + else if (!strcmp(argv[1], "pack-raw-stdin"))
> + pack_raw_stdin();
> else if (!strcmp(argv[1], "unpack"))
> unpack();
> else if (!strcmp(argv[1], "unpack-sideband"))
> diff --git a/t/t5411/once-0010-report-status-v1.sh b/t/t5411/once-0010-report-status-v1.sh
> index 1233a46eac5..297b10925d5 100644
> --- a/t/t5411/once-0010-report-status-v1.sh
> +++ b/t/t5411/once-0010-report-status-v1.sh
> @@ -28,10 +28,10 @@ test_expect_success "proc-receive: report status v1" '
> if test -z "$GIT_DEFAULT_HASH" || test "$GIT_DEFAULT_HASH" = "sha1"
> then
> printf "%s %s refs/heads/main\0report-status\n" \
> - $A $B | packetize
> + $A $B | packetize_raw
> else
> printf "%s %s refs/heads/main\0report-status object-format=$GIT_DEFAULT_HASH\n" \
> - $A $B | packetize
> + $A $B | packetize_raw
> fi &&
> printf "%s %s refs/for/main/topic1\n" \
> $ZERO_OID $A | packetize &&
> diff --git a/t/t5562-http-backend-content-length.sh b/t/t5562-http-backend-content-length.sh
> index e5d3d15ba8d..05a58069b0c 100755
> --- a/t/t5562-http-backend-content-length.sh
> +++ b/t/t5562-http-backend-content-length.sh
> @@ -63,7 +63,7 @@ test_expect_success 'setup' '
> hash_next=$(git commit-tree -p HEAD -m next HEAD^{tree}) &&
> {
> printf "%s %s refs/heads/newbranch\\0report-status object-format=%s\\n" \
> - "$ZERO_OID" "$hash_next" "$(test_oid algo)" | packetize &&
> + "$ZERO_OID" "$hash_next" "$(test_oid algo)" | packetize_raw
> printf 0000 &&
> echo "$hash_next" | git pack-objects --stdout
> } >push_body &&
> diff --git a/t/t5570-git-daemon.sh b/t/t5570-git-daemon.sh
> index 82c31ab6cd8..b87ca06a585 100755
> --- a/t/t5570-git-daemon.sh
> +++ b/t/t5570-git-daemon.sh
> @@ -194,7 +194,7 @@ test_expect_success 'hostname cannot break out of directory' '
>
> test_expect_success FAKENC 'hostname interpolation works after LF-stripping' '
> {
> - printf "git-upload-pack /interp.git\n\0host=localhost" | packetize
> + printf "git-upload-pack /interp.git\n\0host=localhost" | packetize_raw
> printf "0000"
> } >input &&
> fake_nc "$GIT_DAEMON_HOST_PORT" <input >output &&
> diff --git a/t/test-lib-functions.sh b/t/test-lib-functions.sh
> index b2810478a21..e5b80e0f88e 100644
> --- a/t/test-lib-functions.sh
> +++ b/t/test-lib-functions.sh
> @@ -1453,46 +1453,24 @@ nongit () {
> )
> } 7>&2 2>&4
>
> -# convert function arguments or stdin (if not arguments given) to pktline
> -# representation. If multiple arguments are given, they are separated by
> -# whitespace and put in a single packet. Note that data containing NULs must be
> -# given on stdin, and that empty input becomes an empty packet, not a flush
> -# packet (for that you can just print 0000 yourself).
> +# These functions are historical wrappers around "test-tool pkt-line"
> +# for older tests. Use "test-tool pkt-line" itself in new tests.
> packetize () {
> if test $# -gt 0
> then
> packet="$*"
> printf '%04x%s' "$((4 + ${#packet}))" "$packet"
> else
> - perl -e '
> - my $packet = do { local $/; <STDIN> };
> - printf "%04x%s", 4 + length($packet), $packet;
> - '
> + test-tool pkt-line pack
> fi
> }
>
> -# Parse the input as a series of pktlines, writing the result to stdout.
> -# Sideband markers are removed automatically, and the output is routed to
> -# stderr if appropriate.
> -#
> -# NUL bytes are converted to "\\0" for ease of parsing with text tools.
> +packetize_raw () {
> + test-tool pkt-line pack-raw-stdin
> +}
> +
> depacketize () {
> - perl -e '
> - while (read(STDIN, $len, 4) == 4) {
> - if ($len eq "0000") {
> - print "FLUSH\n";
> - } else {
> - read(STDIN, $buf, hex($len) - 4);
> - $buf =~ s/\0/\\0/g;
> - if ($buf =~ s/^[\x2\x3]//) {
> - print STDERR $buf;
> - } else {
> - $buf =~ s/^\x1//;
> - print $buf;
> - }
> - }
> - }
> - '
> + test-tool pkt-line unpack
> }
>
> # Converts base-16 data into base-8. The output is given as a sequence of
prev parent reply other threads:[~2021-07-19 20:59 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-07 10:21 [PATCH 0/5] tests: migrate to "test-tool pkt-line" Ævar Arnfjörð Bjarmason
2021-07-07 10:21 ` [PATCH 1/5] serve tests: add missing "extra delim" test Ævar Arnfjörð Bjarmason
2021-07-07 10:21 ` [PATCH 2/5] serve tests: use test_cmp in "protocol violations" test Ævar Arnfjörð Bjarmason
2021-07-07 10:21 ` [PATCH 3/5] tests: replace [de]packetize() shell+perl test-tool pkt-line Ævar Arnfjörð Bjarmason
2021-07-07 10:21 ` [PATCH 4/5] tests: replace remaining packetize() with "test-tool pkt-line" Ævar Arnfjörð Bjarmason
2021-07-07 10:21 ` [PATCH 5/5] test-lib-functions.sh: remove unused [de]packetize() functions Ævar Arnfjörð Bjarmason
2021-07-12 16:44 ` [PATCH v2 0/5] tests: migrate to "test-tool pkt-line" Ævar Arnfjörð Bjarmason
2021-07-12 16:44 ` [PATCH v2 1/5] serve tests: add missing "extra delim" test Ævar Arnfjörð Bjarmason
2021-07-12 16:44 ` [PATCH v2 2/5] serve tests: use test_cmp in "protocol violations" test Ævar Arnfjörð Bjarmason
2021-07-12 16:44 ` [PATCH v2 3/5] tests: replace [de]packetize() shell+perl test-tool pkt-line Ævar Arnfjörð Bjarmason
2021-07-13 20:50 ` Jeff King
2021-07-13 23:41 ` Ævar Arnfjörð Bjarmason
2021-07-14 1:12 ` Jeff King
2021-07-12 16:44 ` [PATCH v2 4/5] tests: replace remaining packetize() with "test-tool pkt-line" Ævar Arnfjörð Bjarmason
2021-07-13 20:58 ` Jeff King
2021-07-13 23:52 ` Ævar Arnfjörð Bjarmason
2021-07-14 1:16 ` Jeff King
2021-07-12 16:44 ` [PATCH v2 5/5] test-lib-functions.sh: remove unused [de]packetize() functions Ævar Arnfjörð Bjarmason
2021-07-12 20:41 ` [PATCH v2 0/5] tests: migrate to "test-tool pkt-line" Junio C Hamano
2021-07-13 21:00 ` Jeff King
2021-07-14 0:54 ` [PATCH v3 " Ævar Arnfjörð Bjarmason
2021-07-14 0:54 ` [PATCH v3 1/5] serve tests: add missing "extra delim" test Ævar Arnfjörð Bjarmason
2021-07-14 0:54 ` [PATCH v3 2/5] serve tests: use test_cmp in "protocol violations" test Ævar Arnfjörð Bjarmason
2021-07-14 0:54 ` [PATCH v3 3/5] tests: replace [de]packetize() shell+perl test-tool pkt-line Ævar Arnfjörð Bjarmason
2021-07-14 4:04 ` Taylor Blau
2021-07-14 16:22 ` Junio C Hamano
2021-07-14 0:54 ` [PATCH v3 4/5] tests: replace remaining packetize() with "test-tool pkt-line" Ævar Arnfjörð Bjarmason
2021-07-14 0:54 ` [PATCH v3 5/5] test-lib-functions.sh: remove unused [de]packetize() functions Ævar Arnfjörð Bjarmason
2021-07-16 15:41 ` [PATCH v4] test-lib-functions: use test-tool for [de]packetize() Ævar Arnfjörð Bjarmason
2021-07-16 16:53 ` Taylor Blau
2021-07-16 19:08 ` Jeff King
2021-07-16 19:03 ` Jeff King
2021-07-19 18:54 ` Junio C Hamano [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqh7gqkuc7.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=me@ttaylorr.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).