git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 3/3] test-parse-options: --expect=<string> option to simplify tests

From
Stefan Beller <sbeller@google.com>
Date
May 6, 2016, 00:41 UTC
Message-ID
<CAGZ79kY+9BUjcbpSA8sAqd=qZ5niZ2CDsPeGuXhK+yqZY4hL9Q@mail.gmail.com>
In-Reply-To
<20160505215056.28224-4-gitster@pobox.com>
On Thu, May 5, 2016 at 2:50 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 87 quoted lines
> Existing tests in t0040 follow a rather verbose pattern:
>
>         cat >expect <<\EOF
>         boolean: 0
>         integer: 0
>         magnitude: 0
>         timestamp: 0
>         string: (not set)
>         abbrev: 7
>         verbose: 0
>         quiet: 3
>         dry run: no
>         file: (not set)
>         EOF
>
>         test_expect_success 'multiple quiet levels' '
>                 test-parse-options -q -q -q >output 2>output.err &&
>                 test_must_be_empty output.err &&
>                 test_cmp expect output
>         '
>
> But the only thing this test cares about is if "quiet: 3" is in the
> output.  We should be able to write the above 18 lines with just
> four lines, like this:
>
>         test_expect_success 'multiple quiet levels' '
>                 test-parse-options --expect="quiet: 3" -q -q -q
>         '
>
> Teach the new --expect=<string> option to test-parse-options helper.
>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  t/t0040-parse-options.sh |  1 +
>  test-parse-options.c     | 68 +++++++++++++++++++++++++++++++++++++++++++++---
>  2 files changed, 66 insertions(+), 3 deletions(-)
>
> diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
> index dbaee55..d678fbf 100755
> --- a/t/t0040-parse-options.sh
> +++ b/t/t0040-parse-options.sh
> @@ -45,6 +45,7 @@ Standard options
>      -v, --verbose         be verbose
>      -n, --dry-run         dry run
>      -q, --quiet           be quiet
> +    --expect <string>     expected output in the variable dump
>
>  EOF
>
> diff --git a/test-parse-options.c b/test-parse-options.c
> index 3db4332..010f3b2 100644
> --- a/test-parse-options.c
> +++ b/test-parse-options.c
> @@ -14,6 +14,7 @@ static char *string = NULL;
>  static char *file = NULL;
>  static int ambiguous;
>  static struct string_list list;
> +static struct string_list expect;
>
>  static struct {
>         int called;
> @@ -40,6 +41,62 @@ static int number_callback(const struct option *opt, const char *arg, int unset)
>         return 0;
>  }
>
> +/*
> + * See if expect->string ("label: value") has a line in output that
> + * begins with "label:", and if the line in output matches it.
> + */
> +static int match_line(struct string_list_item *expect, struct strbuf *output)
> +{
> +       const char *label = expect->string;
> +       const char *colon = strchr(label, ':');
> +       const char *scan = output->buf;
> +       size_t label_len, expect_len;
> +
> +       if (!colon)
> +               die("Malformed --expect value: %s", label);
> +       label_len = colon - label;
> +
> +       while (scan < output->buf + output->len) {
> +               const char *next;
> +               scan = memmem(scan, output->buf + output->len - scan,
> +                             label, label_len);
> +               if (!scan)
> +                       return 0;
> +               if (scan == output->buf || scan[-1] == '\n')
Does scan[-1] work for the first line?
Show 55 quoted lines
> +                       break;
> +               next = strchr(scan + label_len, '\n');
> +               if (!next)
> +                       return 0;
> +               scan = next + 1;
> +       }
> +
> +       /*
> +        * scan points at a line that begins with the label we are
> +        * looking for.  Does it match?
> +        */
> +       expect_len = strlen(expect->string);
> +
> +       if (output->buf + output->len <= scan + expect_len)
> +               return 0; /* value not long enough */
> +       if (memcmp(scan, expect->string, expect_len))
> +               return 0; /* does not match */
> +
> +       return (scan + expect_len < output->buf + output->len &&
> +               scan[expect_len] == '\n');
> +}
> +
> +static int show_expected(struct string_list *list, struct strbuf *output)
> +{
> +       struct string_list_item *expect;
> +       int found_mismatch = 0;
> +
> +       for_each_string_list_item(expect, list) {
> +               if (!match_line(expect, output))
> +                       found_mismatch = 1;
> +       }
> +       return found_mismatch;
> +}
> +
>  int main(int argc, char **argv)
>  {
>         const char *prefix = "prefix/";
> @@ -87,6 +144,8 @@ int main(int argc, char **argv)
>                 OPT__VERBOSE(&verbose, "be verbose"),
>                 OPT__DRY_RUN(&dry_run, "dry run"),
>                 OPT__QUIET(&quiet, "be quiet"),
> +               OPT_STRING_LIST(0, "expect", &expect, "string",
> +                               "expected output in the variable dump"),
>                 OPT_END(),
>         };
>         int i;
> @@ -117,7 +176,10 @@ int main(int argc, char **argv)
>         for (i = 0; i < argc; i++)
>                 strbuf_addf(&output, "arg %02d: %s\n", i, argv[i]);
>
> -       printf("%s", output.buf);
> -
> -       return 0;
> +       if (expect.nr)
> +               return show_expected(&expect, &output);

On a philosophical level this patch series is adding a trailing "|grep $X" for the test-parse-options. I think such a grep pattern is a good thing because it is cheap to implement in unix like environments.

This however is a lot of C code for finding specific subsets in the output, so it is not quite cheap. Then we could also go the non-wasteful way and instead check what to add to the strbuf instead of filtering afterwards, i.e. each strbuf_add is guarded by an

     if (is_interesting_output(...))
        strbuf_add(...)
Show 12 quoted lines
> +       else {
> +               printf("%s", output.buf);
> +               return 0;
> +       }
>  }
> --
> 2.8.2-505-gdbd0e1d
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous: Junio C HamanoNext: Eric Sunshine
Message 36 of 53 in “t0040-test-parse-options.sh: fix style issues”
  1. 1/7 t0040-test-parse-options.sh: fix style issuesPranit Bauva, Apr 30, 2016
  2. 2/7 test-parse-options: print quiet as integerPranit Bauva, Apr 30, 2016
  3. 3/7 t0040-parse-options: improve test coveragePranit Bauva, Apr 30, 2016
  4. Eric SunshineMay 4, 2016
  5. Pranit BauvaMay 5, 2016
  6. 4/7 parse-options.c: make OPTION_COUNTUP respect "unspecified" valuesPranit Bauva, Apr 30, 2016
  7. 5/7 t7507-commit-verbose: improve test coverage by testing number of diffsPranit Bauva, Apr 30, 2016
  8. 6/7 commit: add a commit.verbose config variablePranit Bauva, Apr 30, 2016
  9. 7/7 t/t7507: tests for broken behavior of statusPranit Bauva, Apr 30, 2016
  10. Junio C HamanoMay 2, 2016
  11. Pranit BauvaMay 3, 2016
  12. Eric SunshineMay 3, 2016
  13. Pranit BauvaMay 3, 2016
  14. Eric SunshineMay 3, 2016
  15. Pranit BauvaMay 3, 2016
  16. Eric SunshineMay 3, 2016
  17. Pranit BauvaMay 3, 2016
  18. Junio C HamanoMay 3, 2016
  19. 0/7 config commit verbosePranit Bauva, May 5, 2016
  20. 1/7 t0040-test-parse-options.sh: fix style issuesPranit Bauva, May 5, 2016
  21. 2/7 test-parse-options: print quiet as integerPranit Bauva, May 5, 2016
  22. 3/7 t0040-parse-options: improve test coveragePranit Bauva, May 5, 2016
  23. 4/7 t/t7507: improve test coveragePranit Bauva, May 5, 2016
  24. 5/7 parse-options.c: make OPTION_COUNTUP respect "unspecified" valuesPranit Bauva, May 5, 2016
  25. 6/7 t7507-commit-verbose: improve test coverage by testing number of diffsPranit Bauva, May 5, 2016
  26. 7/7 commit: add a commit.verbose config variablePranit Bauva, May 5, 2016
  27. Junio C HamanoMay 5, 2016
  28. Pranit BauvaMay 6, 2016
  29. Pranit BauvaMay 6, 2016
  30. Eric SunshineMay 6, 2016
  31. Junio C HamanoMay 5, 2016
  32. 0/3 test-parse-options updateJunio C Hamano, May 5, 2016
  33. 1/3 test-parse-options: fix output when callback option failsJunio C Hamano, May 5, 2016
  34. 2/3 test-parse-options: hold output in a strbufJunio C Hamano, May 5, 2016
  35. 3/3 test-parse-options: --expect=<string> option to simplify testsJunio C Hamano, May 5, 2016
  36. Stefan BellerMay 6, 2016
  37. Eric SunshineMay 6, 2016
  38. Junio C HamanoMay 6, 2016
  39. Stefan BellerMay 6, 2016
  40. Junio C HamanoMay 6, 2016
  41. Junio C HamanoMay 6, 2016
  42. t0040: remove unused test helpersJunio C Hamano, May 6, 2016
  43. Eric SunshineMay 6, 2016
  44. SZEDER GáborMay 6, 2016
  45. Junio C HamanoMay 6, 2016
  46. Jeff KingMay 7, 2016
  47. Ævar Arnfjörð BjarmasonMay 7, 2016
  48. Junio C HamanoMay 8, 2016
  49. Jeff KingMay 9, 2016
  50. Junio C HamanoMay 9, 2016
  51. Pranit BauvaMay 6, 2016
  52. Ævar Arnfjörð BjarmasonMay 6, 2016
  53. Junio C HamanoMay 6, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.