| This directory contains most tests for gorelease. Each test runs gorelease (the |
| `runRelease` function) with a given set of flags in a temporary directory |
| populated with files specified in the test itself or files from the module test |
| proxy. The output is compared against a golden `want` file specified in the |
| test. |
| |
| ## Test flags |
| |
| A specific test may be run with a command like: |
| |
| go test -run=TestRelease/basic/v0_patch_suggest |
| |
| where `basic/v0_patch_suggest` matches the file |
| `testdata/basic/v0_patch_suggest.test`. |
| |
| The `-u` flag adds or updates the `want` file in each test to match the output. |
| This is useful for fixing tests after an intended change in behavior. |
| |
| go test -run=TestRelease/basic/v0_patch_suggest -u |
| |
| The `-testwork` flag instructs the test framework to leave the test's temporary |
| directory and module proxy in place after running the test. This is useful |
| for debugging. |
| |
| ## Test format |
| |
| Tests are written in `.test` files in `testdata` subdirectories. Each `.test` |
| file is a valid txtar file (see `golang.org/x/tools/txtar`). The comment section |
| contains the test parameters, which are a series of `key=value` pairs. Blank |
| lines and comments starting with `#` are allowed in this section. Valid keys |
| are: |
| |
| * `mod`: sets the module path. Must be specified together with `version`. Copies |
| the content of a module out of the test proxy into a temporary directory |
| where `gorelease` is run. |
| * `version`: specified together with `mod`, it sets the version to retrieve from |
| the test proxy. See more information below. |
| * `base`: the value of the `-base` flag passed to `gorelease`. |
| * `release`: the value of the `-version` flag passed to `gorelease`. |
| * `dir`: the directory where `gorelease` should be invoked. Useful when the test |
| describes a whole repository, and `gorelease` should be invoked in a |
| subdirectory. |
| * `error`: true if the test expects a hard error. False by default. |
| * `success`: true if the test expects a report to be printed with no errors |
| or diagnostics. True by default. |
| * `skip`: non-empty if the test should be skipped. The value is a string passed |
| to `t.Skip`. |
| * `proxyVersions`: empty if the test should include all `mod/` entries in the |
| proxy, or else a comma-separated list of the modpath@version's it should |
| include. |
| |
| Test archives have a file named `want`, containing the expected output of the |
| test. A test will fail if the actual output differs from `want`. |
| |
| If the `mod` and `version` parameters are not set, other files will be extracted |
| to the temporary directory where `gorelease` runs. |
| |
| ## Populating module contents |
| |
| When building a test in `testdata/`, there are two ways to populate the module |
| directory being tested: |
| |
| ### Option 1: inline |
| |
| You can inline files in the `.test` folder as described in |
| https://pkg.go.dev/golang.org/x/tools/txtar#hdr-Txtar_format. For example, |
| |
| ``` |
| -- some.file -- |
| the contents |
| of the file |
| ``` |
| |
| ### Option 2: specify an existing file |
| |
| Often, multiple tests want to share the same setup - the same files. So, users |
| can write these common files in `testdata/mod/`, and use one of these files as |
| the module directory contents. |
| |
| To specify a file in `testdata/mod/` to use as the module contents. |
| |
| ## Module format |
| |
| Tests run with `GOPROXY` set to a local URL that points to a test proxy. The |
| test proxy serves modules described by `.txt` files in the `testdata/mod/` |
| subdirectory. |
| |
| Each module is a txtar archive named `$modpath_$version.txt` where `$modpath` |
| is the module path (with slashes replaced with underscores) and `$version` is |
| the version. If the archive contains a file named `.mod`, that will be used to |
| respond to `.mod` requests; otherwise, `go.mod` will be used (`.mod` is only |
| necessary for modules that lack `go.mod` files). If the archive contains a |
| file named `.info`, that will be used to respond to `.info` requests; otherwise, |
| `.info` is synthesized from the version. All other files in the archive are |
| packed into a `.zip` file to satisfy `.zip` requests. |