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 19:15 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
* 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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.