pax_global_header00006660000000000000000000000064136723072550014524gustar00rootroot0000000000000052 comment=b2e1ee62a465dfa80894872624b541519f8d8b00 gotestsum-0.5.0/000077500000000000000000000000001367230725500135605ustar00rootroot00000000000000gotestsum-0.5.0/.circleci/000077500000000000000000000000001367230725500154135ustar00rootroot00000000000000gotestsum-0.5.0/.circleci/config.yml000066400000000000000000000061221367230725500174040ustar00rootroot00000000000000version: 2.1 orbs: go: gotest/tools@0.0.13 workflows: ci: jobs: - go/test: name: test-go-1.11 gotestsum-format: short-verbose executor: name: go/golang tag: 1.11-alpine - go/test: name: test-go-1.12 gotestsum-format: short-verbose executor: name: go/golang tag: 1.12-alpine - go/test: name: test-go-1.13 gotestsum-format: short-verbose executor: name: go/golang tag: 1.13-alpine - go/test: name: test-go-1.14 gotestsum-format: short-verbose executor: name: go/golang tag: 1.14-alpine - go/test: name: test-windows-go1.12 executor: windows pre-steps: - run: | git config --global core.autocrlf false git config --global core.symlinks true - go/lint: golangci-lint-version: 1.24.0 - build - run - update-windows-golden: filters: branches: {ignore: '/.*/'} - build: name: release publish: true filters: tags: {only: '/v[0-9]+(\.[0-9]+)*/'} branches: {ignore: '/.*/'} executors: windows: machine: image: windows-server-2019-vs2019:201908-06 resource_class: windows.medium shell: bash.exe commands: install-goreleaser: description: Install goreleaser steps: - run: name: Install goreleaser command: | command -v goreleaser && exit wget -O- -q https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | sh jobs: build: parameters: publish: type: boolean default: false executor: go/golang steps: - go/install: {package: git} - go/install-ssh - checkout - go/mod-download - go/mod-tidy-check - install-goreleaser - unless: condition: << parameters.publish >> steps: run: name: build binaries command: bin/goreleaser --rm-dist --snapshot - when: condition: << parameters.publish >> steps: run: name: build and publish binaries command: bin/goreleaser --rm-dist --skip-validate - store_artifacts: path: ./dist destination: dist run: executor: go/golang steps: - go/install: {package: git} - go/install-ssh - checkout - go/mod-download - run: | mkdir -p dist go build -o dist/gotestsum . - run: dist/gotestsum update-windows-golden: executor: windows steps: - checkout - go/install-gotestsum - run: | git config --global core.autocrlf false git config --global core.symlinks true - run: | /go/bin/gotestsum ./testjson ./internal/junitxml -test.update-golden - store_artifacts: path: testjson/testdata/ destination: golden gotestsum-0.5.0/.gitignore000066400000000000000000000000471367230725500155510ustar00rootroot00000000000000vendor/ .dobi/ dist/ junit.xml .plsdo/ gotestsum-0.5.0/.golangci.yml000066400000000000000000000020241367230725500161420ustar00rootroot00000000000000linters-settings: gocyclo: min-complexity: 10 goconst: min-len: 2 min-occurrences: 4 lll: line-length: 120 issues: exclude-use-default: false exclude-rules: - linters: [golint] text: 'should have comment .*or be unexported' - linters: [stylecheck] text: 'ST1000: at least one file in a package should have a package comment' - linters: [errcheck] path: log/ text: 'Error return value of `out.WriteString` is not checked' - linters: [unparam] text: 'result .* is always' - linters: [unparam] text: 'always receives' linters: disable-all: true enable: - bodyclose - deadcode - depguard - errcheck - gocognit - goconst - gocyclo - gofmt - goimports - golint - gosimple - govet - ineffassign - interfacer - lll - misspell - nakedret - prealloc - staticcheck - structcheck - stylecheck - typecheck - unconvert - unparam - unused - varcheck - whitespace gotestsum-0.5.0/.goreleaser.yml000066400000000000000000000004541367230725500165140ustar00rootroot00000000000000 project_name: gotestsum release: github: owner: gotestyourself name: gotestsum builds: - binary: gotestsum goos: - darwin - windows - linux goarch: [amd64] env: [CGO_ENABLED=0] checksum: name_template: '{{ .ProjectName }}-{{ .Version }}-checksums.txt' gotestsum-0.5.0/.plsdo.sh000066400000000000000000000033601367230725500153150ustar00rootroot00000000000000#!/usr/bin/env bash # plsdo.sh, version 0.1.1 set -o errexit -o nounset -o pipefail _plsdo_run() { case "${1-}" in ""|help) _plsdo_help "${2-}" ;; *) "$@" ;; esac } declare -A help help[list]="Print the list of tasks" list() { declare -F | awk '{print $3}' | grep -v '^_' } _plsdo_help_task_name_width="${_plsdo_help_task_name_width:-12}" _plsdo_help() { local topic="${1-}" # print help for the topic if [ -n "$topic" ]; then if ! command -v "$topic" > /dev/null ; then _plsdo_error "No such task: $topic" return 1 fi printf "\nUsage:\n %s %s\n\n%s\n" "$0" "$topic" "${help[$topic]-}" return 0 fi # print list of tasks and their help line. [ -n "${banner-}" ] && echo "$banner" && echo for i in $(list); do printf "%-${_plsdo_help_task_name_width}s\t%s\n" "$i" "${help[$i]-}" | head -1 done } _plsdo_error() { >&2 echo "$@" } # shellcheck disable=SC2016 help[_plsdo_completion]='Print tab completion for $SHELL. Redirect the output to a file that will be run when the shell starts, such as ~/.bashrc. $ ./do _pldsdo_completion >> ~/.bash_complete/do ' _plsdo_completion() { local shell; shell="$(basename "$SHELL" 2> /dev/null)" case "$shell" in bash) cat <<+++ _dotslashdo_completions() { if ! command -v $0 > /dev/null; then return; fi if [ "\${#COMP_WORDS[@]}" != "2" ]; then return; fi COMPREPLY=(\$(compgen -W "\$($0 list)" "\${COMP_WORDS[1]}")) } complete -F _dotslashdo_completions $0 +++ ;; "") _plsdo_error "Set \$SHELL to select tab completion." return 1 ;; *) _plsdo_error "No completetion for shell: $shell" return 1 ;; esac } gotestsum-0.5.0/.pre-commit-hooks.yaml000066400000000000000000000003731367230725500177220ustar00rootroot00000000000000- id: gotestsum name: gotestsum description: | `go test` runner with output optimized for humans, JUnit XML for CI integration, and a summary of the test results. entry: gotestsum types: [go] language: golang pass_filenames: false gotestsum-0.5.0/Dockerfile000066400000000000000000000012741367230725500155560ustar00rootroot00000000000000 ARG GOLANG_VERSION FROM golang:${GOLANG_VERSION:-1.14-alpine} as golang RUN apk add -U curl git bash ENV CGO_ENABLED=0 \ PS1="# " \ GO111MODULE=on ARG UID=1000 RUN adduser --uid=${UID} --disabled-password devuser USER ${UID}:${UID} FROM golang as tools RUN go get github.com/dnephin/filewatcher@v0.3.2 RUN wget -O- -q https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s && \ mv bin/golangci-lint /go/bin FROM golang as dev COPY --from=tools /go/bin/filewatcher /usr/bin/filewatcher COPY --from=tools /go/bin/golangci-lint /usr/bin/golangci-lint FROM dev as dev-with-source COPY . . gotestsum-0.5.0/LICENSE000066400000000000000000000261361367230725500145750ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. gotestsum-0.5.0/NOTICE000066400000000000000000000011141367230725500144610ustar00rootroot00000000000000 Copyright The gotestsum Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. gotestsum-0.5.0/README.md000066400000000000000000000252721367230725500150470ustar00rootroot00000000000000# gotestsum `gotestsum` runs tests using `go test --json`, prints friendly test output and a summary of the test run. It is designed for both local development, and running tests in a CI system. See the complete list of [features](#features) below. ## Install Download a binary from [releases](https://github.com/gotestyourself/gotestsum/releases), or build from source with `go get gotest.tools/gotestsum`. ## Demo A demonstration of three `--format` options. ![Demo](https://i.ibb.co/XZfhmXq/demo.gif)
[Source](https://github.com/gotestyourself/gotestsum/tree/readme-demo/scripts) ## Features - [Format](#format) - custom output format - [Summary](#summary) - summary of the test run - [JUnit XML file](#junit-xml-output) - for integration with CI systems - [JSON file](#json-file-output) - may be used to get insights into test runs - [Post run command](#post-run-command) - may be used for desktop notification - [Re-running failed tests](#re-running-failed-tests) - to save time when dealing with flaky test suites - [Using go test flags and custom commands](#custom-go-test-command) - [Executing a compiled test binary](#executing-a-compiled-test-binary) - [Finding and skipping slow tests](#finding-and-skipping-slow-tests) - using `gotestsum tool slowest` **Integrations** - [Run tests when a file is modified](#run-tests-when-a-file-is-modified) - using [filewatcher](https://github.com/dnephin/filewatcher) ### Format Set a format with the `--format` flag or the `GOTESTSUM_FORMAT` environment variable. ``` gotestsum --format short-verbose ``` Supported formats: * `dots` - print a character for each test. * `pkgname` (default) - print a line for each package. * `pkgname-and-test-fails` - print a line for each package, and failed test output. * `testname` - print a line for each test and package. * `standard-quiet` - the standard `go test` format. * `standard-verbose` - the standard `go test -v` format. Have a suggestion for some other format? Please open an issue! ### Summary A summary of the test run is printed after the test output. ``` DONE 101 tests[, 3 skipped][, 2 failures][, 1 error] in 0.103s ``` The summary includes: * A count of: tests run, tests skipped, tests failed, and package build errors. * Elapsed time including time to build. * Test output of all failed and skipped tests, and any package build errors. To disable parts of the summary use `--no-summary section`. **Example: hide skipped tests in the summary** ``` gotestsum --no-summary=skipped ``` **Example: hide failed and skipped** ``` gotestsum --no-summary=skipped,failed ``` **Example: hide output in the summary, only print names of failed and skipped tests** and errors ``` gotestsum --no-summary=output ``` ### JUnit XML output When the `--junitfile` flag or `GOTESTSUM_JUNITFILE` environment variable are set to a file path, `gotestsum` will write a test report, in JUnit XML format, to the file. This file can be used to integrate with CI systems. ``` gotestsum --junitfile unit-tests.xml ``` If the package names in the `testsuite.name` or `testcase.classname` fields do not work with your CI system these values can be customized using the `--junitfile-testsuite-name`, or `--junitfile-testcase-classname` flags. These flags accept the following values: * `short` - the base name of the package (the single term specified by the package statement). * `relative` - a package path relative to the root of the repository * `full` - the full package path (default) Note: If Go is not installed, or the `go` binary is not in `PATH`, the `GOVERSION` environment variable can be set to remove the "failed to lookup go version for junit xml" warning. ### JSON file output When the `--jsonfile` flag or `GOTESTSUM_JSONFILE` environment variable are set to a file path, `gotestsum` will write a line-delimited JSON file with all the [test2json](https://golang.org/cmd/test2json/#hdr-Output_Format) output that was written by `go test --json`. This file can be used to compare test runs, or find flaky tests. ``` gotestsum --jsonfile test-output.log ``` ### Post Run Command The `--post-run-command` flag may be used to execute another command after the test run has completed. The binary will be run with the following environment variables set: ``` GOTESTSUM_FORMAT # gotestsum format (ex: short) GOTESTSUM_JSONFILE # path to the jsonfile, empty if no file path was given GOTESTSUM_JUNITFILE # path to the junit.xml file, empty if no file path was given TESTS_ERRORS # number of errors TESTS_FAILED # number of failed tests TESTS_SKIPPED # number of skipped tests TESTS_TOTAL # number of tests run ``` To get more details about the test run, such as failure messages or the full list of failed tests, run `gotestsum` with either a `--jsonfile` or `--junitfile` and parse the file from the post-run-command. The [gotestsum/testjson](https://pkg.go.dev/gotest.tools/gotestsum/testjson?tab=doc) package may be used to parse the JSON file output. **Example: desktop notifications** First install the example notification command with `go get gotest.tools/gotestsum/contrib/notify`. The command will be downloaded to `$GOPATH/bin` as `notify`. Note that this example `notify` command only works on macOS with [terminal-notifer](https://github.com/julienXX/terminal-notifier) installed. ``` gotestsum --post-run-command notify ``` ### Re-running failed tests When the `--rerun-fails` flag is set, `gotestsum` will re-run any failed tests. The tests will be re-run until each passes once, or the number of attempts exceeds the maximum attempts. Maximum attempts defaults to 2, and can be changed with `--rerun-fails=n`. To avoid re-running tests when there are real failures, the re-run will be skipped when there are too many test failures. By default this value is 10, and can be changed with `--rerun-fails-max-failures=n`. Note that using `--rerun-fails` may require the use of other flags, depending on how you specify args to `go test`: * when used with `--raw-command` the re-run will pass additional arguments to the command. The first arg is the name of a go package, and the second is a `-run` flag with a regex that matches all the failed tests in that package. These additional args can be passed to `go test`, or a test binary. * when used with any `go test` args (anything after `--` on the command line), the list of packages to test must be specified as a space separated list using the `--packages` arg. **Example** ``` gotestsum --rerun-fails --packages="./..." -- -count=2 ``` * if any of the `go test` args should be passed to the test binary, instead of `go test` itself, the `-args` flag must be used to separate the two groups of arguments. `-args` is a special flag that is understood by `go test` to indicate that any following args should be passed directly to the test binary. **Example** ``` gotestsum --rerun-fails --packages="./..." -- -count=2 -args -update-golden ``` ### Custom `go test` command By default `gotestsum` runs tests using the command `go test --json ./...`. You can change the command with positional arguments after a `--`. You can change just the test directory value (which defaults to `./...`) by setting the `TEST_DIRECTORY` environment variable. You can use `--debug` to echo the command before it is run. **Example: set build tags** ``` gotestsum -- -tags=integration ./... ``` **Example: run tests in a single package** ``` gotestsum -- ./io/http ``` **Example: enable coverage** ``` gotestsum -- -coverprofile=cover.out ./... ``` **Example: run a script instead of `go test`** ``` gotestsum --raw-command -- ./scripts/run_tests.sh ``` Note: when using `--raw-command` you must ensure that the stdout produced by the script only contains the `test2json` output. Any stderr produced by the script will be considered an error (this behaviour is necessary because package build errors are only reported by writting to stderr, not the `test2json` stdout). Any stderr produced by tests is not considered an error (it will be in the `test2json` stdout). **Example: using `TEST_DIRECTORY`** ``` TEST_DIRECTORY=./io/http gotestsum ``` ### Executing a compiled test binary `gotestsum` supports executing a compiled test binary (created with `go test -c`) by running it as a custom command. The `-json` flag is handled by `go test` itself, it is not available when using a compiled test binary, so `go tool test2json` must be used to get the output that `gotestsum` expects. **Example: running `./binary.test`** ``` gotestsum --raw-command -- go tool test2json -t -p pkgname ./binary.test -test.v ``` `pkgname` is the name of the package being tested, it will show up in the test output. `./binary.test` is the path to the compiled test binary. The `-test.v` must be included so that `go tool test2json` receives all the output. To execute a test binary without installing Go, see [running without go](./docs/running-without-go.md). ### Finding and skipping slow tests `gotestsum tool slowest` reads a jsonfile and prints the names of slow tests, or update tests which are slower than the threshold. The list of tests is sorted by slowest to fastest. The json filecan be created with `gotestsum --jsonfile` or `go test -json`. See `gotestsum tool slowest --help`. **Example: printing a list of tests slower than 50 milliseconds** ``` gotestsum --jsonfile json.log gotestsum tool slowest --jsonfile json.log --threshold 50ms ``` **Example: skipping slow tests with `go test --short`** Any test which runs longer than 200 milliseconds will be modified by adding a `t.Skip` when `testing.Short` is enabled. ``` go test -json -short ./... | \ gotestsum tool slowest --skip-stmt "testing.Short" --threshold 200ms ``` Use `git diff` to see the file changes, and `git add;git commit` to save them. The next time tests are run using `--short` all the slow tests will be skipped. ### Run tests when a file is modified [filewatcher](https://github.com/dnephin/filewatcher) will automatically set the `TEST_DIRECTORY` environment variable which makes it easy to integrate `gotestsum`. **Example: run tests for a package when any file in that package is saved** ``` filewatcher gotestsum --format testname ``` ## Development [![GoDoc](https://godoc.org/gotest.tools/gotestsum?status.svg)](https://godoc.org/gotest.tools/gotestsum) [![CircleCI](https://circleci.com/gh/gotestyourself/gotestsum/tree/master.svg?style=shield)](https://circleci.com/gh/gotestyourself/gotestsum/tree/master) [![Go Reportcard](https://goreportcard.com/badge/gotest.tools/gotestsum)](https://goreportcard.com/report/gotest.tools/gotestsum) Pull requests and bug reports are welcome! Please open an issue first for any big changes. ## Thanks This package is heavily influenced by the [pytest](https://docs.pytest.org) test runner for `python`. gotestsum-0.5.0/cmd/000077500000000000000000000000001367230725500143235ustar00rootroot00000000000000gotestsum-0.5.0/cmd/cmd.go000066400000000000000000000004001367230725500154070ustar00rootroot00000000000000package cmd // Next splits args into the next positional argument and any remaining args. func Next(args []string) (string, []string) { switch len(args) { case 0: return "", nil case 1: return args[0], nil default: return args[0], args[1:] } } gotestsum-0.5.0/cmd/tool/000077500000000000000000000000001367230725500153005ustar00rootroot00000000000000gotestsum-0.5.0/cmd/tool/cmd.go000066400000000000000000000011621367230725500163720ustar00rootroot00000000000000package tool import ( "fmt" "os" "gotest.tools/gotestsum/cmd" "gotest.tools/gotestsum/cmd/tool/slowest" ) // Run one of the tool commands. func Run(name string, args []string) error { next, rest := cmd.Next(args) switch next { case "": fmt.Println(usage(name)) return nil case "slowest": return slowest.Run(name+" "+next, rest) default: fmt.Fprintln(os.Stderr, usage(name)) return fmt.Errorf("invalid command: %v %v", name, next) } } func usage(name string) string { return fmt.Sprintf(`Usage: %s COMMAND [flags] Commands: slowest Use '%s COMMAND --help' for command specific help. `, name, name) } gotestsum-0.5.0/cmd/tool/slowest/000077500000000000000000000000001367230725500170005ustar00rootroot00000000000000gotestsum-0.5.0/cmd/tool/slowest/ast.go000066400000000000000000000111211367230725500201120ustar00rootroot00000000000000package slowest import ( "fmt" "go/ast" "go/format" "go/parser" "go/token" "os" "strings" "golang.org/x/tools/go/packages" "gotest.tools/gotestsum/log" "gotest.tools/gotestsum/testjson" ) func writeTestSkip(tcs []testjson.TestCase, skipStmt ast.Stmt) error { fset := token.NewFileSet() cfg := packages.Config{ Mode: modeAll(), Tests: true, Fset: fset, BuildFlags: buildFlags(), } pkgNames, index := testNamesByPkgName(tcs) pkgs, err := packages.Load(&cfg, pkgNames...) if err != nil { return fmt.Errorf("failed to load packages: %v", err) } for _, pkg := range pkgs { if len(pkg.Errors) > 0 { return errPkgLoad(pkg) } tcs, ok := index[normalizePkgName(pkg.PkgPath)] if !ok { log.Debugf("skipping %v, no slow tests", pkg.PkgPath) continue } log.Debugf("rewriting %v for %d test cases", pkg.PkgPath, len(tcs)) for _, file := range pkg.Syntax { path := fset.File(file.Pos()).Name() log.Debugf("looking for test cases in: %v", path) if !rewriteAST(file, tcs, skipStmt) { continue } if err := writeFile(path, file, fset); err != nil { return fmt.Errorf("failed to write ast to file %v: %v", path, err) } } } return errTestCasesNotFound(index) } // normalizePkgName removes the _test suffix from a package name. External test // packages (those named package_test) may contain tests, but the test2json output // always uses the non-external package name. The _test suffix must be removed // so that any slow tests in an external test package can be found. func normalizePkgName(name string) string { return strings.TrimSuffix(name, "_test") } func writeFile(path string, file *ast.File, fset *token.FileSet) error { fh, err := os.Create(path) if err != nil { return err } defer func() { if err := fh.Close(); err != nil { log.Errorf("Failed to close file %v: %v", path, err) } }() return format.Node(fh, fset, file) } func parseSkipStatement(text string) (ast.Stmt, error) { switch text { case "default", "testing.Short": text = ` if testing.Short() { t.Skip("too slow for testing.Short") } ` } // Add some required boilerplate around the statement to make it a valid file text = "package stub\nfunc Stub() {\n" + text + "\n}\n" file, err := parser.ParseFile(token.NewFileSet(), "fragment", text, 0) if err != nil { return nil, err } stmt := file.Decls[0].(*ast.FuncDecl).Body.List[0] return stmt, nil } func rewriteAST(file *ast.File, testNames set, skipStmt ast.Stmt) bool { var modified bool for _, decl := range file.Decls { fd, ok := decl.(*ast.FuncDecl) if !ok { continue } name := fd.Name.Name // TODO: can this be nil? if _, ok := testNames[name]; !ok { continue } fd.Body.List = append([]ast.Stmt{skipStmt}, fd.Body.List...) modified = true delete(testNames, name) } return modified } type set map[string]struct{} // testNamesByPkgName removes subtests from the list of TestCases, then builds // and returns a slice of all the packages names, and a mapping of package name // to set of failed tests in that package. // // subtests are removed because the AST lookup currently only works for top-level // functions, not t.Run subtests. func testNamesByPkgName(tcs []testjson.TestCase) ([]string, map[string]set) { var pkgs []string index := make(map[string]set) for _, tc := range tcs { if isSubTest(tc.Test) { continue } if len(index[tc.Package]) == 0 { pkgs = append(pkgs, tc.Package) index[tc.Package] = make(map[string]struct{}) } index[tc.Package][tc.Test] = struct{}{} } return pkgs, index } func isSubTest(name string) bool { return strings.Contains(name, "/") } func errPkgLoad(pkg *packages.Package) error { buf := new(strings.Builder) for _, err := range pkg.Errors { buf.WriteString("\n" + err.Error()) } return fmt.Errorf("failed to load package %v %v", pkg.PkgPath, buf.String()) } func errTestCasesNotFound(index map[string]set) error { var missed []string for pkg, tcs := range index { for tc := range tcs { missed = append(missed, fmt.Sprintf("%v.%v", pkg, tc)) } } if len(missed) == 0 { return nil } return fmt.Errorf("failed to find source for test cases:\n%v", strings.Join(missed, "\n")) } func modeAll() packages.LoadMode { mode := packages.NeedName | packages.NeedFiles | packages.NeedCompiledGoFiles mode = mode | packages.NeedImports | packages.NeedDeps mode = mode | packages.NeedTypes | packages.NeedTypesSizes mode = mode | packages.NeedSyntax | packages.NeedTypesInfo return mode } func buildFlags() []string { flags := os.Getenv("GOFLAGS") if len(flags) == 0 { return nil } return strings.Split(os.Getenv("GOFLAGS"), " ") } gotestsum-0.5.0/cmd/tool/slowest/ast_test.go000066400000000000000000000007201367230725500211540ustar00rootroot00000000000000package slowest import ( "bytes" "go/format" "go/token" "testing" "gotest.tools/v3/assert" ) func TestParseSkipStatement_Preset_testingShort(t *testing.T) { stmt, err := parseSkipStatement("testing.Short") assert.NilError(t, err) expected := `if testing.Short() { t.Skip("too slow for testing.Short") }` buf := new(bytes.Buffer) err = format.Node(buf, token.NewFileSet(), stmt) assert.NilError(t, err) assert.DeepEqual(t, buf.String(), expected) } gotestsum-0.5.0/cmd/tool/slowest/slowest.go000066400000000000000000000133501367230725500210310ustar00rootroot00000000000000package slowest import ( "fmt" "io" "io/ioutil" "os" "sort" "time" "github.com/spf13/pflag" "gotest.tools/gotestsum/log" "gotest.tools/gotestsum/testjson" ) // Run the command func Run(name string, args []string) error { flags, opts := setupFlags(name) switch err := flags.Parse(args); { case err == pflag.ErrHelp: return nil case err != nil: usage(os.Stderr, name, flags) return err } return run(opts) } func setupFlags(name string) (*pflag.FlagSet, *options) { opts := &options{} flags := pflag.NewFlagSet(name, pflag.ContinueOnError) flags.SetInterspersed(false) flags.Usage = func() { usage(os.Stdout, name, flags) } flags.StringVar(&opts.jsonfile, "jsonfile", os.Getenv("GOTESTSUM_JSONFILE"), "path to test2json output, defaults to stdin") flags.DurationVar(&opts.threshold, "threshold", 100*time.Millisecond, "test cases with elapsed time greater than threshold are slow tests") flags.StringVar(&opts.skipStatement, "skip-stmt", "", "add this go statement to slow tests, instead of printing the list of slow tests") flags.BoolVar(&opts.debug, "debug", false, "enable debug logging.") return flags, opts } func usage(out io.Writer, name string, flags *pflag.FlagSet) { fmt.Fprintf(out, `Usage: %[1]s [flags] Read a json file and print or update tests which are slower than threshold. The json file may be created with 'gotestsum --jsonfile' or 'go test -json'. If a TestCase appears more than once in the json file, it will only appear once in the output, and the median value of all the elapsed times will be used. By default this command will print the list of tests slower than threshold to stdout. The list will be sorted from slowest to fastest. If --skip-stmt is set, instead of printing the list to stdout, the AST for the Go source code in the working directory tree will be modified. The value of --skip-stmt will be added to Go test files as the first statement in all the test functions which are slower than threshold. The --skip-stmt flag may be set to the name of a predefined statement, or to Go source code which will be parsed as a go/ast.Stmt. Currently there is only one predefined statement, --skip-stmt=testing.Short, which uses this Go statement: if testing.Short() { t.Skip("too slow for testing.Short") } Alternatively, a custom --skip-stmt may be provided as a string: skip_stmt=' if os.Getenv("TEST_FAST") { t.Skip("too slow for TEST_FAST") } ' go test -json -short ./... | %[1]s --skip-stmt "$skip_stmt" Note that this tool does not add imports, so using a custom statement may require you to add imports to the file. Go build flags, such as build tags, may be set using the GOFLAGS environment variable, following the same rules as the go toolchain. See https://golang.org/cmd/go/#hdr-Environment_variables. Flags: `, name) flags.SetOutput(out) flags.PrintDefaults() } type options struct { threshold time.Duration jsonfile string skipStatement string debug bool } func run(opts *options) error { if opts.debug { log.SetLevel(log.DebugLevel) } in, err := jsonfileReader(opts.jsonfile) if err != nil { return fmt.Errorf("failed to read jsonfile: %v", err) } defer func() { if err := in.Close(); err != nil { log.Errorf("Failed to close file %v: %v", opts.jsonfile, err) } }() exec, err := testjson.ScanTestOutput(testjson.ScanConfig{Stdout: in}) if err != nil { return fmt.Errorf("failed to scan testjson: %v", err) } tcs := slowTestCases(exec, opts.threshold) if opts.skipStatement != "" { skipStmt, err := parseSkipStatement(opts.skipStatement) if err != nil { return fmt.Errorf("failed to parse skip expr: %v", err) } return writeTestSkip(tcs, skipStmt) } for _, tc := range tcs { fmt.Printf("%s %s %v\n", tc.Package, tc.Test, tc.Elapsed) } return nil } // slowTestCases returns a slice of all tests with an elapsed time greater than // threshold. The slice is sorted by Elapsed time in descending order (slowest // test first). // // If there are multiple runs of a TestCase, all of them will be represented // by a single TestCase with the median elapsed time in the returned slice. func slowTestCases(exec *testjson.Execution, threshold time.Duration) []testjson.TestCase { if threshold == 0 { return nil } pkgs := exec.Packages() tests := make([]testjson.TestCase, 0, len(pkgs)) for _, pkg := range pkgs { pkgTests := aggregateTestCases(exec.Package(pkg).TestCases()) tests = append(tests, pkgTests...) } sort.Slice(tests, func(i, j int) bool { return tests[i].Elapsed > tests[j].Elapsed }) end := sort.Search(len(tests), func(i int) bool { return tests[i].Elapsed < threshold }) return tests[:end] } // collectTestCases maps all test cases by name, and if there is more than one // instance of a TestCase, finds the median elapsed time for all the runs. // // All cases are assumed to be part of the same package. func aggregateTestCases(cases []testjson.TestCase) []testjson.TestCase { if len(cases) < 2 { return cases } pkg := cases[0].Package // nolint: prealloc // size is not predictable m := make(map[string][]time.Duration) for _, tc := range cases { m[tc.Test] = append(m[tc.Test], tc.Elapsed) } result := make([]testjson.TestCase, 0, len(m)) for name, timing := range m { result = append(result, testjson.TestCase{ Package: pkg, Test: name, Elapsed: median(timing), }) } return result } func median(times []time.Duration) time.Duration { switch len(times) { case 0: return 0 case 1: return times[0] } sort.Slice(times, func(i, j int) bool { return times[i] < times[j] }) return times[len(times)/2] } func jsonfileReader(v string) (io.ReadCloser, error) { switch v { case "", "-": return ioutil.NopCloser(os.Stdin), nil default: return os.Open(v) } } gotestsum-0.5.0/cmd/tool/slowest/slowest_test.go000066400000000000000000000037631367230725500220770ustar00rootroot00000000000000package slowest import ( "bytes" "strings" "testing" "time" "github.com/google/go-cmp/cmp/cmpopts" "gotest.tools/gotestsum/testjson" "gotest.tools/v3/assert" "gotest.tools/v3/env" "gotest.tools/v3/golden" ) func TestUsage_WithFlagsFromSetupFlags(t *testing.T) { defer env.PatchAll(t, nil)() name := "gotestsum tool slowest" flags, _ := setupFlags(name) buf := new(bytes.Buffer) usage(buf, name, flags) golden.Assert(t, buf.String(), "cmd-flags-help-text") } func TestAggregateTestCases(t *testing.T) { cases := []testjson.TestCase{ {Test: "TestOne", Package: "pkg", Elapsed: time.Second}, {Test: "TestTwo", Package: "pkg", Elapsed: 2 * time.Second}, {Test: "TestOne", Package: "pkg", Elapsed: 3 * time.Second}, {Test: "TestTwo", Package: "pkg", Elapsed: 4 * time.Second}, {Test: "TestOne", Package: "pkg", Elapsed: 5 * time.Second}, {Test: "TestTwo", Package: "pkg", Elapsed: 6 * time.Second}, } actual := aggregateTestCases(cases) expected := []testjson.TestCase{ {Test: "TestOne", Package: "pkg", Elapsed: 3 * time.Second}, {Test: "TestTwo", Package: "pkg", Elapsed: 4 * time.Second}, } assert.DeepEqual(t, actual, expected, cmpopts.SortSlices(func(x, y testjson.TestCase) bool { return strings.Compare(x.Test, y.Test) == -1 }), cmpopts.IgnoreUnexported(testjson.TestCase{})) } func TestMedian(t *testing.T) { var testcases = []struct { name string times []time.Duration expected time.Duration }{ { name: "one item slice", times: []time.Duration{time.Minute}, expected: time.Minute, }, { name: "odd number of items", times: []time.Duration{time.Millisecond, time.Hour, time.Second}, expected: time.Second, }, { name: "even number of items", times: []time.Duration{time.Second, time.Millisecond, time.Microsecond, time.Hour}, expected: time.Second, }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { actual := median(tc.times) assert.Equal(t, actual, tc.expected) }) } } gotestsum-0.5.0/cmd/tool/slowest/testdata/000077500000000000000000000000001367230725500206115ustar00rootroot00000000000000gotestsum-0.5.0/cmd/tool/slowest/testdata/cmd-flags-help-text000066400000000000000000000037261367230725500243110ustar00rootroot00000000000000Usage: gotestsum tool slowest [flags] Read a json file and print or update tests which are slower than threshold. The json file may be created with 'gotestsum --jsonfile' or 'go test -json'. If a TestCase appears more than once in the json file, it will only appear once in the output, and the median value of all the elapsed times will be used. By default this command will print the list of tests slower than threshold to stdout. The list will be sorted from slowest to fastest. If --skip-stmt is set, instead of printing the list to stdout, the AST for the Go source code in the working directory tree will be modified. The value of --skip-stmt will be added to Go test files as the first statement in all the test functions which are slower than threshold. The --skip-stmt flag may be set to the name of a predefined statement, or to Go source code which will be parsed as a go/ast.Stmt. Currently there is only one predefined statement, --skip-stmt=testing.Short, which uses this Go statement: if testing.Short() { t.Skip("too slow for testing.Short") } Alternatively, a custom --skip-stmt may be provided as a string: skip_stmt=' if os.Getenv("TEST_FAST") { t.Skip("too slow for TEST_FAST") } ' go test -json -short ./... | gotestsum tool slowest --skip-stmt "$skip_stmt" Note that this tool does not add imports, so using a custom statement may require you to add imports to the file. Go build flags, such as build tags, may be set using the GOFLAGS environment variable, following the same rules as the go toolchain. See https://golang.org/cmd/go/#hdr-Environment_variables. Flags: --debug enable debug logging. --jsonfile string path to test2json output, defaults to stdin --skip-stmt string add this go statement to slow tests, instead of printing the list of slow tests --threshold duration test cases with elapsed time greater than threshold are slow tests (default 100ms) gotestsum-0.5.0/contrib/000077500000000000000000000000001367230725500152205ustar00rootroot00000000000000gotestsum-0.5.0/contrib/notify/000077500000000000000000000000001367230725500165305ustar00rootroot00000000000000gotestsum-0.5.0/contrib/notify/notify-macos.go000066400000000000000000000020571367230725500214730ustar00rootroot00000000000000package main import ( "fmt" "log" "os" "os/exec" "strconv" ) func main() { total := envInt("TOTAL") skipped := envInt("SKIPPED") failed := envInt("FAILED") errors := envInt("ERRORS") emoji := "✅" title := "Passed" switch { case errors > 0: emoji = "⚠️" title = "Errored" case failed > 0: emoji = "❌" title = "Failed" case skipped > 0: title = "Passed with skipped" } subtitle := fmt.Sprintf("%d Tests Run", total) if errors > 0 { subtitle += fmt.Sprintf(", %d Errored", errors) } if failed > 0 { subtitle += fmt.Sprintf(", %d Failed", failed) } if skipped > 0 { subtitle += fmt.Sprintf(", %d Skipped", skipped) } args := []string{ "-title", emoji + " " + title, "-group", "gotestsum", "-subtitle", subtitle, } log.Printf("terminal-notifier %#v", args) err := exec.Command("terminal-notifier", args...).Run() if err != nil { log.Fatalf("Failed to exec: %v", err) } } func envInt(name string) int { val := os.Getenv("TESTS_" + name) n, err := strconv.Atoi(val) if err != nil { return 0 } return n } gotestsum-0.5.0/do000077500000000000000000000032301367230725500141060ustar00rootroot00000000000000#!/usr/bin/env bash source .plsdo.sh binary() { mkdir -p dist go build -o dist/gotestsum . } update-golden() { _update-golden GOLANG_VERSION=1.13-alpine ./do shell bash -c 'go build; PATH=$PATH:. ./do _update-golden' } _update-golden() { gotestsum -- . ./testjson ./internal/junitxml ./cmd/tool/slowest -test.update-golden } lint() { golangci-lint run -v } go-mod-tidy() { go mod tidy git diff --stat --exit-code go.mod go.sum } help[shell]='Run a shell in a golang docker container. Env vars: GOLANG_VERSION - the docker image tag used to build the image. ' shell() { local image; image="$(_docker-build-dev)" docker run \ --tty --interactive --rm \ -v "$PWD:/work" \ -v ~/.cache/go-build:/root/.cache/go-build \ -v ~/go/pkg/mod:/go/pkg/mod \ -w /work \ "$image" \ "${@-bash}" } _docker-build-dev() { set -e local idfile=".plsdo/docker-build-dev-image-id-${GOLANG_VERSION-default}" local dockerfile=Dockerfile local tag=gotest.tools/gotestsum/builder if [ -f "$idfile" ] && [ "$dockerfile" -ot "$idfile" ]; then cat "$idfile" return 0 fi mkdir -p .plsdo >&2 docker build \ --iidfile "$idfile" \ --file "$dockerfile" \ --build-arg "UID=$UID" \ --build-arg GOLANG_VERSION \ --target "dev" \ .plsdo cat "$idfile" } help[godoc]="Run godoc locally to preview package documentation." godoc() { local url; url="http://localhost:6060/pkg/$(go list)/" command -v xdg-open && xdg-open "$url" & command -v open && open "$url" & command godoc -http=:6060 } _plsdo_run "$@" gotestsum-0.5.0/docs/000077500000000000000000000000001367230725500145105ustar00rootroot00000000000000gotestsum-0.5.0/docs/demo.gif000066400000000000000000006225371367230725500161420ustar00rootroot00000000000000GIF89aNM"'PH!6{D /e@344#$%*+,stt&'(WXY;<=ccdTTUKLMCDD'()[\\GGH678kkl{{{GHI_``wxx< <J>q,1]M#j*t^'iV%40x.›7ݯ<5̢9֪;1Ҧ:Ǟ82! NETSCAPE2.0!.,N@pH,Ȥrl:ШtJZجvzxL.zn|N~ Z!&TP !#YĨJ'!B (&Ѻ!CB  B B $~I('˜ iE$4w =fo`B-8; ]ɓm0@ ID͕ǖ \Y;Xq- \ʴ#FL2"g$VxÐ)&ϯRp*I:KQ9] @f9 54zdpEl+1Rv#KmFo (1bBm$ΌXK_AǷNMkt,kZ`y-F!j˯BM:1LZνI"Ի蟀M˟}{_}h  6F(&NhᅑTa LJ"h$i0~b4XŌ68㏈ D_H&L6PF)TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐F*餔Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:P !5, {@pH,ȤR9X:= QF`k0DXDvÇ2Eu1k,0~B.bB,p2j4~ F~A! ,& @pH,Ȥrl:ШtJZجv EZq8!A)9 nVjF#mr )BbQEfOx Cu BxB $r)!sCB"t_$ $)K G i}y‘DqQ  B CE""r!j^@As=x"%0A J@PwDBPr@u{njnjT"D0\Ә?͔<B`T as*$ ) FС X]Fp`ˁY\/er(rዾBh,Ҟy1 J34~J#P8R!,_Jk SsLN|)Ӄʮs>j 4PIE.lo΅,dqc@cDcHrdLF1dP.dTʴdXZveYN%^~ eb2! ,6P@pH,Ȥrl:ШtJZجv˅>>ّK.?W+n DZyx +GCR`~ZiPrB  CJ G r}%qD V+Q  $ JH"!DR*$vBc"JFBĈE&!KH @ɂ},-TҊhp( FPm\E>h6@o 27Ep nߦ`C'@eX }uX`>2Q,qTk'aL 65MHJHxr"&߿ LÈ+^̸e>./Z&{$9QL&'lh`f|<W{Ug\.{J[ѷr6R%]LĺΎ't6t'؆f1D 7o,K6fQΦI*D;ULWǎDsE8).|- *qw<)x$u涝p*nPRP NJ*g7de(Yeu F8hإE]ɟ;VXPp4E X*F@P⣌ac)"4a.S]0%#f2f[ Q}8s BPb,8x̣'xrep@Q prBfLԜrLGiuj5a[2XB|L ?jq \s{$p.xhWTAWoyocȤS.LKzFvB1̣X$":Li 0Xb jV;~ i*md K,_Ԛ\uJmD$$cl\EN!ˈ4W1/yGtzJK, QIfHesNJB\4мH!R9E? {b n:^0%*8pL@K P}gd., gȑG#O^] C,AC8_R!l(= -SKMO$}p˂A]PĪ,ɖl,0F>hC F̒=gMƌy-l#- ns;vVn+! ,vV @pH,Ȥrl:Шt8( !2GjuPp7DZy .RNC oVgQEdOWBIVFD ]%njB+SJC`D 'D*~aLF] & !yDq#zH&E[# R$/, '}D6$7N!" Gk@5քd5Bn Ţo$*0ޭL(%`@16HIAJիXj5B֯LKXe9LZnߞ.]v~ͫW+߾X*x0†"Nt1c?sW ! ,s @pH,Ȥrl:ШtJZpBy(GE!kEm] `GpBSEjP#!Z nt[Zn J l { $ayC D+Q(c C $eEsBB% | ĸCD*ID- j}$k%­#!.A8Éẋȁ:"@ H "s S8„!(8عd1錌PG'ɑU$% T l7@60Y_?g]U;GE%%"BeNiK5k$!\=Y 6B{A)iT`)L=v'SRiJhv|KKN/%s1!`N# bs¶ȓ+_.Б;G k}*ݿ~%ϫ7~{߫/<U` HrA! ,0@pH,Ȥrl:ШtJZجvAҍeV px<*Z0CЋ4zB~MC {ckGmx|FlCfD Bu gRDsOgd  !B ${)#BBEBhviJ Fy߫C+LAqH?(Fa_"3e(bdp'NUD]P  .XDa7NAat# XpT $AuqS8-i(j;E3A5p+%Aa 7l(vIqj5ob_).%G۴,}k6WE,x5gC\xg`vՏYulm|rA)!R u['GtlوzbO١oow+C/*C3͞9YQ_B R&x+4z@ 6A%t3EQ&U>*`1[_uIc!\!GU|t&0 @zK@r4\C^\/qR0 oĿx=&1Ы|Ǟ|c1}O}x}/}q~>O~Oߏ?O}! ,] @pH,Ȥrl:ШtJ=.H,r/j"ԉ@M(Tm4Ո[0 $R hCdP o!lZ {(K!Gr aCQkxBJG) #"BǀtB*RԒBFtzXwS!E 4.)]"\T"yyP~`B G" T _B0 ۔ )+pC<]?D,$b%-0 ZE&E8 $f`@,ђ XȕS/[py ]{D"߿?)KX)^<81&Ɛ:LYrʘ8~Θ?,zɦO_N͸4kî_-/{o! ,p@pH,Ȥrl:ШtJZlRRKHt,*ZxD &OLB$R ]hXtK_J C v nRsUkOu~c tI!G|DDxDQ+S\)t JG"$ā#`"|ØQr@mB*P( C>uK)gAPBh(GN؄m /2:( CN0%\ʤTqdD&yk1P *Ȧd*6` v'c}Mc\?B " 9WG$€{U(9+tР,:VR37@1ͻ Nȓ+_Eh `iDd )mU0r,EXƌB莵: B(0b ,#e0-JU$ AW8x5R;$rZ-{T&XaiиH @!͉;PL#%5K џ( Leu B*(ai(BGBɦiVzb2gdr'D@I%L@U$Ƞ?IL5 U O#&*D`_#Y FJ׀:Z7# 0ةMQVE 1Veyh1#&z@"Ҥ|`ェ'i)svYP3[K-9k\"*B jb~ݵf >ҠqYو g Fz P"S|.bjA4J$e2ʍ1sV.t3?-@RWmXg\wMs1jμ@UhwlK`7p&Yh)&kRG}?&Rv)y'<{AޑOq . +V@ r1R̦!\CO𭪡>b] z9!d:``$ 9dsu+۲͡K)>’X9Dei 4ũ! )qusF,c"|1)[̦2 n&u,Aa}Ur'^JȐDD =) Ǿ S؀\=-,zC-p˕'Y<cؼ`eZ̖ng Ge? :;i6 >sgcMPXkۺ _خe2L2h&plol $\>gsY@=ȩPOަtO(.S0P"ꄝx8_̘W;KԨNWHӸqi`M Y֎u&q}]:5&m-a˺w%6e{AήBhS[ Ӿ6m'pL! ,&`@pH,Ȥrl:ШtJZجvzxL. йd?|NWW+-V)S |L B# R%vtY}GK $R#ZyO!~DCB, "B~pH!G$$͌!DI+Q&E† [PAe h¸rD`PuF Rx]+°ɓ ߆DAB@RRdc3وRR: |̭`"(J-CLTעj"3@~mE&P%*d#Z Hʷo ZaHCD Txr3C{7nS '8lHӯ XPC`@ fP#1m2 ]!wNI̭-"j >.ٲ]9DC2@Yg=7}C"U'bWoA jt F(Vhfv ($h(,0(4h8<@)DiH&L6PFib 0C\\::PTB1YnI @ehEDpe*Ѓs6%2@ @C6.؉T)霃pCx}& 8B pH 4x7 {1=5@*'9| /̐H)8{lBf9F<-v->JĕlCp 8C e)7'޿6ÛeʻnʚFkğ^˯f D'Cx;#dzC14(6% Vwl; s.ɺn .wht)TW;:T5W`-dmOSM<6}#̍< c{: ƞq+~Ϩ7p)a @kUNZ/!y(p꺬 d@E`DDn;#4].Z Yݘ#DF9tA%S)E36ܨ*e`\[_# JMMHObp9( g ܚu\xsv,axG "/:ɉ4hHLӢJv A_H&hm-$!&x %M8XaV8ZCQ荄␠wDv B!(ڐ`)Gj0y(6P@%n!S 4̑$ծ`svҁz(-q/ Iij*N"(r@<Ĩ^:l+@4"й@$-dt2ĥ-ml YZFN:LuPx#6;. z&v#tS.O|u[e/yaLSA6.=%؁n8O(KIPb2$. FI%vɻ)䓔6ϋeDZTP, * '8@7S|@L&k5d./=e pkǐ1YOٙ| %X P;adsohXR)8j̅_Jj5@*@rX"̵ ?'Nh)=85(, /t3`r;V!.!٠KP+RMAN5~59ǺcqfR8Rd.2&.t^ (K cνm谉6% yk'L [ΰ7öb4V/@qEp(ZZ'|:À/{ԋQ8  ehMxT,l! g<EH9>si5; tGw}6(EH`Pּ^W+ݒ!J |n2 zc'\K-RCy*2y NTӡ:znɌOs0N%MTØ i9dYzIiKʝŢke H<]|кp)"x90/ՅPC!0K|b*sV&0N=|w.6-mpj4%!)f [$-cCDMCAfiCS,js>"QfGRN21cQb~zR۩[#IuQFhq:Epz% Cӱ+yVOzQ< Yfu!zb֣8"%# ;ޮC hy-Apgi 1љ52\Fxj)]@ھ6"p]ndZ~ml pOeȧPG7 sD]uc D]{j9ꐀvlG? %]Q]%O_wh#(J#^Vc0l`gW #cwXOb 8w_"_{-aE2d5gG#0dNrbpK8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8XxB7K AYF5 r 3}Jה4XN~!H2-Y?8^/6rx9BCeOG& h2Wr{pb$_^j0`pSY x8B8%V66g7 hF Da:"_ʑg#j "t"vzz!|ڧzdn:"j!*!  ZrZ!(,`pH,Ȥrl6;J@Zجvఘ 9znۭ Ɲver}vy^amS Ue"# z$Q [u} U "!QZT 'T͂e# T||֟FU "X(⁀ -T-T'>l|A2}u<I) 3p(T jfb̳|HR6G*{ֲá\*eV$X(aT&ڳ۞P ].O&X,CLĝw֫P+UoQR="oݘU;5!̱ު^}8S:,r]eג#n.5X֣m 2X\c͎v̚&JOwJ̆Eu9agf *}7[xgA(aZ -Ppݳ4-Y_LUN)Ủ8<@)DiH&*餔VJEf|b駠kjꩨe~Vx 무r*k譺+*k&6F+Vkfv+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH: x̣ǃ!5,0 @pH,Ȥrl2(w^Pj`C_{cej+y:P,9Kmo53.0vrsB2;DwlnC1w,3/BC 9QT9 1^:3 EY,2bP ^5PCRsFD˽EcOdėBJ  RLRQD>"Lo@d"E#/ɨQǎ58bɈA!-,@pH,Ȥrl:ШYzLÀ`0ؙh vܼ@p ATk+sPjG_q C !oP K ` KWR]H"f"BkF I!pgKCJeC! KӆMz|B**[KH OD" ʛ׈B*4XHVQՁGW!<&$5a \e^S/'}\)ZH|Vܚ\AS$iqFTaa'EI`=b"+AXQ1ezOwlb~tl[%*HdjZc(z\Ԯjm)a#Fh!Bk ]Q'cƴp /S5#!mZhHTzmeDR/1/XLV?򆱥Efeokr aqaHjw|$jڔz#h_{yMAx ~9{4!jp"Ψr'#uanhnp҃U6670 t8ݮyg-U{lWg`f~k'jU>0)yy}RStxMQPb/=< p#FZD.#\(o t Z& 4J-4 i>)̂f7B4\'ta ^BW5fIBJH9C1.!R"@K-un/Ce%8č M:ص!S#2f \(Jgͻp6HM,p?!R>^ &ŕSCaV1JZ'SPP{ˢeҠ)XnU֯b860^c53`\Ǚ0x̣_}U@1=U Qq}֙'sSWǾ: jt q\p麨(HSN"jP([#x6 J, I[PH7z:&FGJRNC"nqpV&ĉ\v=oeVCmm_lihb.Őp WPjZFǴޮ` :P2}E>CIYtVq·!p.@NV]eE%`#L^݉*VkblhK!NảVt"znB"sa/^e,/$(B^vO$M^u%1,12p .ԖMhpV+akzl;iQ._I]{aj yA;4ԏr,G Z ox#9!6ח|8TZ0P8by6;~!Y ,_1M[8V7`X ԛuJE[ Zuv4pxq-sdI[+zElxIr+g$j5t|1!ѮyT@%t$[rvHXtuZ3/1"YdDnS޼ 8˘]r5]6~uGXoΤM,SS \"(>k!!o#ct;[NzE )f[5#=KO{1sw{S%y$Q8>2I$;ЏO[Ͼ˿IZ3$.)rIp6f4VYl`9"QsBl68^57X Fd7 Zmp87Bԉ)3`RHoFe!uY=8 p$p=niΓvi:05q7iqd ;a>|q;Ŗ/&60r y2 ? ,UX0s7ctCDŽj=GW<4Ls%_PW?!Pu#WG^awpXȵvfvE/swAxFfU9wvUWy/DxoyxԖx֠TtUw yRdY^vO]*yx0zhJzJ1zNGWrJ򷦠4Gznz} |P|X )|tH:ZzU%h˧~`~~'lL6M `SЩ^fDa* 6+ȑA m}-8qF:8;Ճ%FT;qTW'B1[f2EUP WZ]d!i9VT>*ueWa1үY&6b gJ֋:) <e t##38uow Dg8w9ԣRdiNAbDcl$vl$w x 4KzZ> 6?/0;sH (7 iz<vġY\|Uvej;B9AAƊ%lX(ᓷc12@uc¢yD#,A wA;%2;5<Ik ?69=a)d[a{6fEm-s -Ia<*G#q0ғ!&$Cr](`Fcfegj-S)b_+uvkqiSm_zXDP qg;=6Y١~;_U=2"uE YܚT2[a⻸|^Vw|g|w|85BY<0\EiWj#C{ g=F+;qw[9$5<c-#D"# `@z3 C 8(ۼ>uR TG zu.ᴄ, /hm\Adzr盡]Do\uVF_f.ĪZoG*j0Ĥ]\wP{q\fO^\2|rE6~8DJ9L%C^JLNPRN:~_NsLs&nC*K^;g 3 ORBdXA LL e[Pm t%h,]]E_]j՝VYln4p=U#|{؈c> [4.٬v񍙹ىѺ:f)ڄo[ wvHb(:\;m޻ܳ;+Yӽ1Fڎ/,޶]t~--x]H"&?0_W43Q}p( q쮞>x6cgD I1NW>Rp_ȟʿ*X̯ XPe<_ado0Sx1(}[$h?|~~0NX4Dh$Z^ H@"A`rp61q^y04 V .(4&(B',*(׆.$2D&GP:!,2,0@T>:>2!@'M=4PCX'*"$L/-6"EB00<, 0/I5y $"gAJi1"f.*i\%ڐz[v5Ӳ|BRI4u3",PYT&u[l|ҡ+W@nOc1Uą brHk!G<0 ң͗ 9 ɼTZ_*H9AR&݈xrK] {Bq}Q  -Y<k-<~cD ՈTl-/d P+Wֿ=PA 8K+FꑅDE/:b{.^7 RВ F޾'=`)댻VQn/"왤D ⚆F1" d Ŋо|O-@sCB, qj.3E#ɶ#B7mWJR ȩCoP9~'Q) U+|499SQM/?(4ȼ>J"`ivm.:s4Sĕk Eg {S uɈ)- İ`l;!-=tJ&\Π/Y4zOmU X` DB,L3vHyLGVIڎJ6ZBgdWyeP @d$lUtoұrs#x S4!GrZRm-୹:vԯ([VU'`h\ /O\o!\rKF?_&s#0{ɌI#S@އYrOjQ̡X熞rS?OqY2W舳TH-T(lk7Y0LNk<Ϟμ1ENU^!.)י1ƝrV,^|e'lb !bKY6H0]2׽2 mC,UވL!Ph; @j/;0jGiFIZ(U.N Z P0 !DpwLAR[5kZ1%G1\/&b1(wٞS!R0Q y\``hS2XyR,h,Lu#\IAyю9}0̈ W=r'wz=]'ǎ/ q[DE@VDsIV4-,LhJĘEMCDi19pJ9$(_^{p>tٝ +m7U"2FWI cJ"pOjp)q+Gn N=zB&::t #geᰙ&ELY9>xd"k 8\3SФ+t3LI J *d@ Y薄%bKy -]rQF1Ǡ阑/ɉ2=kDDō5pM9AwkM<,W=NGn&TfsጨD՝Q>FF=t`7|0u"] j^D!EvkЋ80_.@ M.#T>7 ş, (j|Sjzg4ѧ+>RjɴS⹧U+ xYA/K:NgF/IiCMzdN$L'X}a!/ I~ d1 JnUmq1uqy}v,lK6$(#hLyRK"¹fGEv^qwzP&Qzl=ͻ@$!"Q1 "Cȧ2G˕+z+V`QM&ϵ^gfl &O?!R!ZҼL"@2 F@9n2ê(b0b Z^lkAahF r p"j)el8gaP0\c2NΡ/ L60 B,֌ nL^S]p-uȘ*.q) (?Jv2 CTZ+ń 2 m3p+y(~\E`ҤN8Mq,ԤI*|#&M+bXPwLRCx0VFת/7PmR+kټ-m|vl,n%b9C$ͺ༾%%N08 SRj$+3 a-A6mIDPO/D kr3d4NRC*+*nv4A$ɓ6Y۴f#[Ƒ@IqҶ c8_D>h BDEs/sϖߢD.QOI0p]N>ҮgKbpS NnIn >?aB⅝-hGV/E4tTJL`O-'//DMod4ư܉diTtZez5[^oN fOIc/ WݰHqҳ:4ĕ_JkPTKDtuP|6W*\p:b"&UUbe@fiv:J+QHTj!$BJZ[/\[u[ bV%sj. u/\o26pNPX&b\'q <?W dB&4 r*&E@: 8JB#*tDp 0ddS^Sc A&bffu&g"$P e&Э*L ]!Qwj/%joՈU,[5DV]Bq)RHb *lKzbi##p.qf"!#R% #Cm qБU}o\qd~7g.~x!8%x!K t22n?ԕ~$q!J6"yK*Q"biz;+ޑ~,N݃|?O"uYv' g'!0K%U"k"3 ^T&5FJNU"C#ڄ*nG}'d(eR있5)ϫB)5(ҁt r=rrL+At+L,8>'-XK-"cu.G .l6l b"71 4Sd ƓU3  Y@ofSŎUqZS##bvJvr$MlKR`'@EH[_ NM<[X-@ _9 h ;G+<)ؚv؂V=B3wɎeug -vIal%0:`W兀!NidD]YߦGiQEUo`ZCh89F `ԄGZ[!v@[n`C.~U)ڇᎨMqo,(a=MyvyTN_ Q ZOVR4(QYdQads{RvG΃0^>UG赧GI:EmSԱAkb+(N1UOX_O9p$^p*OLIa՜Dl"M[MԗƊ'9 .Iεry3.tma/So_=yƆj:sL=bCEvp8Y/XP"W@_` aP{h'fCct{vJrV8<–gSE;!Ƴggvv|XD`?E\;c0 Yfd2f>|Кk1'=|:ݿhǘW@?9|Ɗ;5C!zؿ&{Ę|9`$}oC(}M2C#bۇ&&'Q'ĊO 296ӑz7&Y- -ssb0,'B2>2 .&\/m N90/Ӏv7N/6b*R)f6|6*V[M59$$4m91z-͜l98Y899Q-+y):(n;;րѳ#ZݬՄjnT(&'b=aĘ:dۺ]n>[Ÿ:䯓;`3z z++{c2L4Q:JN JaXCj-JdYW~"ZJ)T1ٽMe0QR%me55 ZJzQ\@LR^dl TT8=p~*̎{8% é$98AXP0b-0 X"fC#,/ؙg&3m>5b,T9D=آ0*~8X >S88Z_ &10L0E^3(!#`D$w@B/zW$ LX&AhӢ8GlG p H16\zEˆ +& orZ$;O* o?LqF3)c)Xx\T̓@'W0b~(9<A0bD 9c~ V17M( )Z$&$ǁtL+ƒNwfM 4AJm~F0ۭÆ Lfȸ`zПcB`O+3f" ш6:HAWYESh.NOYy*9qTZBTR>f"ZAAj ,РSPV62D>P@=SEA JS!-0LMt4jE9cg-`L+i&A@T5ԉ%L jA#hQ  իl" "gOB*K0y\J$B@=Nja{S<!SIhPUsF])(E8 Fj.&OTB,( 1skkkk3)X<)%9G2S ݷ+"mظA mcf+̵w ]%-ع]48*^1[821kl;t:f0p3 ܹ[ScIqzދLʂێ] kT5&. ԅVc(di`wٽdO3c+f&--X"̺4/NMSzEmʽ{,}nGgbr7,jx1{ā?ZCr%@I<Q :PW AC(T.PqP9J3|>зfl%O2<+-C 4ڻܢCV.JEUC6YNADL$+I$*ыL̈qhO"vJT/GcJ^(|89~AlTB*I(C' jnHc2{goK~׫TILr`֘E \L$LNb2m)~JZ鞬48hc s%gӡ\=eB~c'X2 ]{dobFI7 }ѳ>6C9!}f,fMypJUs<.<8XGV3 `\ԍG1ml8:t߼E:žB2DۮpTd^$Y_MhHmߜ]TElt M\KM[TOхM ^TN 1 k^,)^vXH@̒BU_<#_] )|P k&l4s IN~^^pGQfP VX[͔z8@z{ܕ&e`p(V 51<ָQAC V}m<7tKM&BU`1P`؄(tb!U)~a/hD@akZJl1O Yn}Ҝ`o*X@ vm,[}ٮ߳pe`WWG!I˳WSJ{W8r{۷Mc|OwY~yjĨYmbʞHc>(=)$ҥX*d XD<Z ĬH i Ҙ L꤅ՐNeQQ"eR*R2eS:SBeTRx2: -ceR(!WYE0N$¨cZfGud;٤X<`vṱa DeօwB@](A:' Q!pLhQO9'ڢ#T@!b i($^qn'IڒRO a1OteI`C\e%U`) kji$u.BR遝OLqBنb5Z\SQy7۽>K^Pym~=iM#]8QĶqJT>W:ʫIPcl>'#nFrOd= U#aJKqBwZB^h\@nIkeOJ.JUnV>otdIfMoЎ ooo UF懵üdƌ Xced[Rު˨&_B0ЗL]IexiuIC!@v֙H b&n,y00jyoI& ZeZEf:x4vpvD&Ԩf9mF/\r'ʸ\ncqZr<gEAt6p!NbPYw.g!*Dxv" Qz" {Nrz|)JA*W׭BOhvIC[`УfHa 6XEk/1(0(@D$m܅ Qy"ƍ=gZYah"2H\Khђ)+ho) gȶAslf,]aTb1!dWGHNfR$!n7Z^-Nݙ-͵؎𹒤RŠpZn /Rˆ^T!f,ŬF-CgI */ ,,.%Lc*unMBnI_ ;ت@).`ȇpF+*>T*Z+fgki1g|ke<^*NEBXjW|\&7Y7 Z;ZS1u4ͭWH `K&R\d _BFZ/2V8;iBYT0)`nt\z^5tVghWCXRgXj00.Ml:13nU!~" %8!,~HUEbgXfebҾU)n "s-.@C-;"'C.m  Qͪ5iҒkZlU19!N-Tsm/HB4%k^TXE0 Ôc*/(vLn :լP~gLڹ/ z{{{.Y +/8YoWyXXNX[{t<Ϯ {ďTf/%0]1Nbpcp8p |Ɠfr&:p &{Nږ[ԩy'*'q˲&Flos Ogui rvV[w&r $H:}#hz*|Z `r`ErL} 52si_Oxzs'gV s1C֔d(g1(A`, qVEZSEZR I*Y'h5nׅt}Lޔ dfp}yΣcE6%p:;ΥV|Ӛj,kiV[gMKs3=`kG[ J-+7R~$bUO{.+o٭cGLVb`Lcw @~iq0!*@b C9t.Ju<* 3J ڤ3 UnTMI,zK ӀBZWZMt ͅ$U&f՘`Xg@4qS.QIcZTlL3<BXZ">&`f l="Cڬ؁,cE;?x&J8#0Ne_9fEFyf>3y`m9h&hF:ifi:jj:k'l`o?*Yx;+4QxdYqՌA;pًw^'H\ҽkAVQJ/z#!}4c/0 ۞{B=Y!AN I NXQH``079>u0.b۾"R-4@57qvv{ܑG5'~(ɽӰ>6.w%VF<L2&6KM56\2 t W%HRX蕙R3PTҡ[j9z @|Gn0%.؂ٜ\@= PRfԽ܂^.y#nnϠBNP х#&+H?)T! D@jDu#f9p` J# QBVDعC'c<#EʜmJtFf4ec뚩YvC Hn<Җdħ*Br ['iS~ĜIcjEWfu"2R/ WN/DeI3_W)WiPUiSD"FSn\&E=2IʽP'iH39dCnn*¨ KV !?E8{*4o53pL_y5K 6!&I2Z釿VN X/\4NZ)ȈxfOY ڴv*t`2R`^I1_T[C2~<i@[6 Aa bw-<0jmsu|j8wiѨMRtOzԥ>uWWzֵuw_ΧIlPzx0YZ 0Lܭnw_y).F<'氷]ȡ,— ݅G9`̻&boj/3&3hA;wyE8xcY5dNn;iUʎ̰k:Me3v0WWAVg6dMHQpV`X썲 B܃C9)P8!8bK?r?:(Q¯XP$7*%Q"BtK„S%/?++') @;F*VJ ۥP@b@$S3@2%DB.&-r:iY&J{h:#S{ʦ&DIjYj<8C() S*CWƐ@'SFSjr5z5+""j+(랳z( S0iBM@ ^j?#rH(0Qx7)4 C J0m I E8뒈0j  0i䈶>kr++ /&+ۘ y/ q #*w2묘 ,P,o҉l=+ܲ;iȭjkb'J  QJ5R-@_lś?((gɱ;`ƌ J0/F,;&H0zLI 0'ò$ D;)wCis& I;g$p1f<˸H,(M졗dZL>ˀ?> 3!(sBT2x )5 HXK4-/gFYm)3A[Z3]ǒS3k ;s3> 4@[$4H;bΐE{&~z9"K^ 뜦H18Y8TUcƂJX+Zs sA ܺ1626d] La39@lߩ65n5 $4%g1*2p,Q Rzh|6&+-G2 7D1CA.Ňz@W[Si4K:/K1q99QKùj _;c:;c :Fk5sEtUuevuwxyהq/zJ=x(s"TT/q)}׉ث`˝٤J4=@< Qc4Hu>E#3/?PS X4}ZS! j6i -A8B ̿GE{$d9ObBgpBڧB"B@AYF,ąCEEXC3|V'ېEq07%O(/<0H\D ķ%B%׽byy'F_Y\ۨ9ƀ+(fD{H>k saфnM3еLTtܐu\GH)y MKHÏr= ⦒ԝT,^BWIj  I$Db!%S#.=RʱkJ͊Jt x%ևA|TUM]_uRF4 ʴһLD, .h^aOь/K74Lhc y͗MMD_ +H̜%> NtIVOh4RP*$ $ Ϡ2-IS_,,Va0P2k9/ LP%PJ%ܞ-IZ>91V;()=*EZq]S& 6J865}62 ܒTCk?}Sbۥ%f(ȟ`͔Z)[ge֌aU{|FܗkV~V6h VVS=v臆舖艦芶 P)>5ec8s=ރ;X)%1XT䞄=éS>W'^>gH=;UԤSW%YiSٱirjb ^NdO+ q8ዷ_qH#Z bRhZeF [ vZ͵w#C :2(@ekTJiQ 6`Sm 8DR=kZ>xyI¸ͣE@3†4-%\? EvQ\K\T0Gm܉$mdQn?D+̹2o9Or HԬDIRB'R"Ŭ`X34 |QCדNƃXsƲn(ilc@d ƏAm+wWao?($,aK0J+NJ,.1d z`.]EU$: ni`lrX(cnlS _;!-b $֩JΤϼ^J/SbJu MI @S:y.{vk`r''=YBtNaV:1xv=~OZO)4OefEFS|*PEy]CSId0!uz.Hn64P&3ݎ4(t2D7d8QR5TV.]~^R-}Jcd nVb#5M B7eK8isr;]7m x&gI-rJK6@;ԤfU}h*/rt3#36]UgI!krkViYe8ӫg{{r7|Ysn=LJȗɧʷWN8fc՞ ה^WByiiE؛!!=xɑNji V8Wew=V=µKٔYY\jjnEz~'9>I~mN@(`gck XCL.CCdL(!"hji ?`NH dB̂2a(551ᠤ6Q x!28t6pgXHԐIUD;T2DrI DQє5ɻ@wa!:F+@;)&| Jq6%Ye(F WҖWo GRq(D`$$rCF ɔ*(c/%{?Yz ̀)L]\&jN*@JL"^ ґC*}&)$HTD|Y\k1i[RL' BT^zpAᐲ>K *֮!ߐc2,DMpnݠɢ%!.p"Bg.x#v ;^P*rѿu/7L(eCDtCՙݒ;xDJ* MF5˻@sR0(#:SZ2UAn51N*Z *1AݕBwIjŇ^Ցa1-Wve0B-)Lrf,m!(>9Q|H%eMQ!opɘhćyy:Q#b`6FP-~:cLEA{e8RM3(#:ǿaCX,7A큼 ! yYD[ļ$*qLl(JoxE0\EqdE2qCvo<{l>֑V؜BBgR$"HJr%/Ljr'? Pr,)OTrdq.RYhe=I @N%-uqRlRrmQ*ޖhNMfsLGsEV)Mb\U6% L(U&KPzʳHBvdfάxqMjCRӡ N4߳uȫ7\ g5\()Wк&@) m(0rbR(ebL p+6#:JDN a?QNYL31wT D)ˇH;3U&)p@PXlK E24WشEi=ִ&%}C\IsOR`R^e.2HV+*IG@ vbl 7DTݮκE@=YL2(C8/d7K_&8nFg@sr-lؕ"@6K~4@Vi]3szeJON! |"4Kl݀~ʔ *..%ŻnB,!̉2͈䡛(`Vbe@^\TȖ2;_--ԣtln@wCL- ;ڛR'5Fk`4Y@oL^m7Ώn"K-ϢV (#"܃> }AuV wKHg^%5 Hqyի#Sq}.1[1 BA3S}66gf. #DښkO.xhtO:%oAn.ֽ Ѭ"1h Ȟ#h6f2QUAS[ ncIjdl6g]\6&FkHdV{38nݘ2KmpvHn 7n# fi+(7̽Ӗ/3rF=3͹^[pɤ`GX\Cs0ZzsfF:Wi ;4> {84Ky!6dytQ*~%%HX-;'nԗ5+kD~+kϏoWNe%XVK GFD݁.e7LlbLYtMEt?t?D(MJMMD6N"S#MaR axEՁDg2GOLOrbOuP`F4d\XhbmEO<˕&%EfEX{.b!d U $ V|4`|a@h51-SF"SbX4YoTSfSiT@7?zL% OuQ7VxU{&#zUV{UC*f1jVg!o%quzUW'"ϲ@۵()OV6%%j 8 /h؊ct?PU38e55#c~HtRYuY01KZu`:eqM`DMHP!oqWZ["v>[\}R9eE^3"]2R83ە ];nb8G(qc[n"2(L̈́ .7]hQ0xݠ__h h< .Tv 0`PV:aNNvaxavmMq $?#boZbYco0c7mcc` .?vg#C.x+ؐ39TwJ/]Ebo9[UrU&0<e:Bi<)&xHy5Vb'mVgrjdP8n'3& ~[ U*vRm)v hh ivv2y]BH"YdƘ F -WAOhЂir]i,)gugRo9p'R}ӲVYրl$alN}nlG4 :vH$lPm9UwcږRm6g5n:ǖѵyt 13ogUe*}ib R@YV-J#AJ-yp-"I.pp.U5u'5 KnH6!6$6\&tuC0*w1sN 7$@s[Z:3ys`w9"Yt*jbq~*/K\ nH-"q,٩Vr)~m5ix Y'چQV)e.`prvՃ lnwDM%w{Pw>|\zMx`e @|@g@(yAjCDwP,ሤs1I{Yx^i<ϲVGxS MH8qKAԕfO!H3k~[B.ǚJŇ}N)I8F~hrԠDIȴ'`෠HŨIRmKۜHM˵]_ a+cKekgi;IcԂ)xEWT] Q5ۅ<& HLɔGZS4"12M2!S􂸐N鉸,H M\kmOzzE@kFU8LDDK.VMm dL( aF\EA&Cw8֡Rvp8v|؉xH߀HwCՈ,JGryUUqUnK&@گPn9N+0@>qES tˆ/Pʨθvr AVSߐ'<87? !JlFp)%'h.f$\Dx[u^2Qr2<ӿU)/ĥ2Z3wXi9E<-Xd]<8ђ&:'b o|&EvSgRʑ&6Cu:xHܷT.:j&6',cCazll'*+˸ VHh bs>z!w9$25n |,-RrrəP)!A43H1LILn9 7Im q%\FVkEX'l'ff'UT/w0`(֜$LŒՙI1zhh݉AlV6f+)gGd̫6 Пi,#,`};ӍX$AT䩦oeIREl۾~(EHbkCTZ hޤ^GVS sAQS4G GL|yY@9Z&օCQ 4s Ǘ2*Y Րm\9oL̊:1^~y= IY'd@2,"/HF`Ի}2 V|/,1Z|{9"Hj҂ͷ^kWYr0> &[Vztaxk&g'ĩ7{om-cͅ)opx,Mi1Zk-yf]_":qg:%ut-a %/0|M V |I6Wbpl?IJF]e V,7WZmM˿}Gz܂8ׇ:8"gsmZnh6Xߥ`-~"Cy;Id{5"I($?d;ԲG>PxĄs>ӎum^3[un*C !I(C"K}^v|FB'U Fd KƠh!" C "J DBG#UDOŢ^Q0o=³@ՄgJH@\&<4a oRT˗0i4!W+Rl8R*KBWa9p Br:tիbjʕ(`yJP:ePĝQy(c[(_0] xU YZ݉LP7Qع+1俠C#LtiSǖJB PTln DJξ}b,Kΐ(H~& 6F(Vhfv ^;`@/h,X{TR !@QNHcSOGDL5HL6yj8pr=qc>'$2 aB,O)L$Nd2O2LNPc?qsATH5Ml QG;8AHkvD&ě7ݚn"UASFT) Е^gw9rzؠ'bSU[,]DAVtmQhAAXv+ z4jOl'[t5HjP#…O2[t )E%5-JU+9'}UXҙۮ*kK+.]80z$%q&\p2z92s|pYJq|oq漅49L:Ԋm4\v,6s t2XR.@oD'YOQP iv.hR8ofuhؐ#k?+VuٝeݣSȃf3(p94{Xuk}w^n\x: `av'o7b.Wogw/%%h#ڍzÌ@ `Hyg):I' QVhY׷1b_ xfXH6}+3B8L:_-ۈh!e2~44nK$pÜXJ a&#e_m. &2Q$[ ɒIJHB֚)a*x%O.XiW4I{4IMW6̦6nz 8ǙM\ <#κ!()B5RK6Lد5dqHr& UԇA]!\X)=qxlnyO;* H#l& bQ56Z4eG׳2,HψF섹<}*F€@ːS4hLcG.Df^\q;x(JDsF٧ :4jJ֠Rgғ2pf$qCj.!{MldՖQ`av%$뒚Tq"TDNk DnwJv l\ T izbHF= K{in]OS Zu3U]ٲE5;&[6Nf)pcS+o? H œ[~VŮl/wY%uiH[݉ iΩ8qr2R#K1We`yH beCK#/ARRd ޥe٪u2(U/-ICWF氊L,KN.҉U3mc .RZʪ§T ^v%;wƱN+*L' @IfhR5Gq$ɧ[-k;kЄQx:Ed!,9E-fNz.*4jFZ<(lyhG&;9w25`H9F5Qk|s̞z @Oާ~ <2UKI&"97{ GNkuB:EN_2}Lpվ eAfP,\P>_rtv<(fsciV )-P'L`g1_`8 o׼@MHfDV/qsl8T;]xڔ [$LjoO i ̊VEm%W: Uuyu*J-^J$ #D*Pt|*=`%Db*dF*\Xo~8 C]e[%1L ӆYjmUQ[2vl\qѝؑzm1# v&}nt971^%XN*.fQD ɲ, \qD3ׇCP.l$#)$^rbT}7aB(wt_IDS_"`V7KhH%1Gs$Uhf8uTƧk4yT0H)fyk'd3gZ-s3Lb `Ajk0ӁC59ТqZ8'WYTdG:H)edX`_TgEkc#Ȃ_H:1o6VceDwVe^ôbFfVB(jg2ƉtzgnP-v.WD9`?VH.#Bޥ)z7dBhq1fugP&XdVf$SX 3Dx;ziSbc2$iՉ?S9'SR#CU)iQ^iD 2cf`hsfxvU/Tl9҆ @($(imUmm~2K(d7Uۥ!CX ibhD{;s4]yf'jc; dYV':9"$Mn'%(x wQр04sQxy.V @q@RqWgw*ifr9Yy[Ff>v4H>Y " ݒsznQkAt#tuK|YOPw 9rxE\Bƛ".8RYHR&vEGNtg[Qup_TA^Rk%yJ/2eg?PZUWWVDzpqUzteWQ'XZcL%Zie $XDe+jo^2eG w~XZUfTgYD&igejE[a&g[]]BO vNL(D0-P3BAgGU53X*Qei_8_FmǞgHRJ7@mբq*GW*dx0ngaa^š"և>z*FF2/cՈSXNƇy1cLY1W)C)Tv#3F3&vJbW>\?ȪXf\f Y4ȍ\I33Vog+ꨋD$2F&) @iPaie୚IdUf\zVȪ.ի0,Y:PJƃ~w8&8^8$+l mv4mj }?:VK9{ys Ivc)zbaUER$W 1l))޲  h- 皢qq{-"8=i"x;[{]G(;-gH NEc _-y PjlP%] QJ7AӺ_u!LuG`\ vHX6'YJ8 j e2{9xRdUxa  (d%k骠dW2W`,HıE@&z;y n)D6*VuH<җXԧl7]J,;~PzCʰjc@a)E gkuUdKfXʒP"xU$c5U(qz2XG15fy*DHhBFHhiƨjGh|/mV4"ctEiiӦY I\Z{ab}ULDxf4Fe !#HCj:{2X3QCɘؼᥬeH"ŠAH^׉Ҋ \Gʨz^izyIJz'F깼Wb/Z&X| xH_ai$,j9jW=fP0JP#Wej/c(*xb4(5ı&kЉ2K4Kzpy )fI5J90JYm{ft&kؿ\4͹;B=fait):Ŷ!#uk0 V=\[[sYvuBǪĩ t̴{ pyJRa0O7v-Z:eAѫwM֜-I%'V'K7KUVU3VLgy( {V˧UD | lW@ۓDY*}g1T'w=&ܸ銍e B Q\[%H~.4@3ulZ5n:Lqj8hLkBdXgy|:bFfa8#x8UPYVwƉ\w~F=+H+5ˠSh[cT.ۜ+5nS:ZʨV|Xyortv'NQ0Ő^> g=x>^~ꨞ ]V+} > A}' ]AWw#<Tn] ]q 7-r.$I7}V1k(+j{,yY հAج2}M. jN h q|vS1A 5۰7Xww"51n#hyBoޕf!w%񵊟%Ox\ 0O`\dm&s:Ξ]|9-?GܺNjK2ʈE|C^t;w :$9oT\O`Kc WXKadP, L'Sk Zujhc@-G/WzC?9oZekͰUn;aNy|ƒw)??_&p`Zo`lfob+R#ʾ̎_.] `HTP6GpL.ѡ#^YK|a\6ivq5 ;'A!;,(8 && -J&C.A"$.> J@f FPns<"5<)F23Lt3"0P*AT( ?#$T=dJN5&s aED0wpqι*֎eԸqH<AYPXU!ʈE3.+!@JMRA pԊKr(D|uKfbkW_ym=&ˁhĠ`KZ|Xѿ0x$ uU]:2^˗1;+^3-_KaiB?i[8e fw*e3'W\  ,x:2mxɆԙeY?4])Bv&yr; B5Jr:@cKPA@#tq E*iWx NCns6$Q ÄTpzx`&BȐKG,LR%02#shJ)R-/ S143LS5l7S9;S=? TA -CLUF4?xIl_CS.N"7>*R2C& *;*[h0\+a92u2ԶAE8(ȁ7]W6LJɩrb@IĒY`6mЅN}EW"dcXN@CAޙ}N&ZQ4$.iH?$U" xH i C"XeRh:S 6BQdʸ3B4簘,z֤Aea]s䚐FUwtLLP]AӣhnjEL9hy"3L3B4zé ldSMŭIڛJeJAxlt".J`B\ b.,\o,cDiqq> $iըi!4Pp4ƲBN,(DIrx *r dCk2_Rz2S^.efK\$Lb '2c.|-;Ko)0p숣 jC+K,/-1rך1FէЁ3%f 0m&pG7,_P?Ysjs%;hf-s/ Q8>jc8JM2j* ܪj{ - _,t-‹qZ A#0 m7l74%ݳC}pVLCM\DUT6YdtFiFmFq4GutGyG}G iE4 l`Nk H$0_!ָQEtJ}ޘх܎7ˋ 0KTJ[mkf{B'lp:EՄMtNP^$tOIO{®&4,WÂ+OtOuEFܮ6 ΀R=zdf퉊=o"PTO TCS2, !dD@HMHW;K5Y]HYY5ZuZZZQ¥|Jl GIYXC$5 /- cpO<}H7]oJn+h2p gJ^@m,"_QZgv"Moc!Q.l.N 0 FCĎ'pJ("."[e\eH!b{-GO Ɩ60P),mWdj'!u\Hb0m'Mͧg 픈0si'a( yUn%H4'f#찋5,lUd i̯KSGlr!7,Ur'F <#'ԕKġ?b`k4'ra]:.pCtXp@Dl@  J} NBGG&4^E͵w[\Y6 Yx[ 8x!̴udgtDD x 6W ]5STx+ʄcUvIiσI7trA_ɇSJ# 7#NXRX3UUդyedia, م%%^sܢa tb j _)]-SJ7LMl*x"^?fs6aftÅv&MgR%Tjpv,2z`" tsNB0vNgѠk@wfۘqn-3g獊wRqtOIe64-.}u-9\&Хn(첖8F}wf recQ"QikN812uϔ]PG T -;s y %엉dy- Y{ְ*l9y(Fԙϔ$rƢb gt5(wht'˾lȢ;jRe^VX!!8Uwu=UZ-z XC7tps (){㈅# 9Ì@yŲIWvTxbe*4]zG1HZa;$tsI19=A;E{Id58LЀ@0J Qd~A䜒:ѶH~ͭ-ESLe _|D*䠔W /:A{'wQt-w z܂\9 ܺ*D\viŻNֶ/ߧ { \=nW9Σjb,6/(m0/`)t:I!h}r|9Zy0ߧ^0Q)[ ^vEu0;Q2S.XU_U6Qz:C_ ŗm"GE59B ȴ]]Jؽ?9d[+H1 eYK'x!,/]_!h<"#xgUFJb$c &Q~ 7Q\fxáCrY%l)ӦN* Hb`k(\Y ev]&~0Lfȥ#(P~jxA@F0S#XY+U-b D+ȹ' (M K^ ѪC, IƏ#Oh!X#o~"FD\WR0LaQLk2{H Oq= T|€Js޹ 'қꫳެ;IN>.A޻_#3߼C|?~s7/ď `b<ܳ~iƝD-,s.Щ?03u` mBL)A  D4@ ꦕ`bL`ZE\! =u"Z"εrJaZG &ȠAí(Z%xx= B1_e I\I1bԃH5?aU&p]|c#pl$1WFǥف qc 9ƆPOv($! H(ᑒ$%MKb2$';O2%)KiS2\%+[W2LE >Raz[,{JrOCP 2e;bR.EǦ@/=A eZ#r%gR3&ԞfG@rLI#T BMdg;hp< N8.vO;*q4A I Edhz{)ь0X;2p!pjQPnBLU*Kԡ±ixֆu͖ѣh"ZXS"bְDuHR$L4ź݄5Db +a]X'%텩ZjsNCdH%F`1cUuӽ b!I_dr@6&bx!IOE9 ӄ| @HN+50zm+}[7qB7ҝ.ukb7.w AMAS :1=f\[I-ͤ\^:X7Ueǁpµ+v!IaIs#N +;N 84^jMczRA+0բYT57|Elf1C:X+QM~Úhbz/*qԈX61G, Q(-im"&>L. MJz8ٙ ,IųSa0yc+1Nbx"rMQhv.6Cͬ*]Q:C`V ^ձk^&DZI'֫GZdlۧP7E9>\MyF&=>w:wλ7m{;7Upe81ߐ<"x=&ڰULj"%XJGDmtȊz3H܁YA}AYEfD[&,ރ𠞡y 1W%i[n b:Q :;c<>B6 ;*:)]DBЎӅ}m#|ٚ I E$հ`Hv! Jbݘe2 -hЃFH H@|!(6(&dt'CިkSlR$T ޥbF/ꗴՅMʏ=AOMӡCFѨy՞-j)t1 =Q#(]VRW2XG.FȆ Y]*ois+v(2*%V%yd(d` Zb~EHeBI.d檦'jhg ß^jԨچ`_34+fIѨWuٝh᢮Bo.h ҍ&S htVչUsKi"2#ga嫭FK%4JiIk\F>U^d b5 }*~z0N~  C!. bKR¤\^mE[F baH+Oٵuv`WldA+ DI0D^1"qXW? @saZ7X5# sX!NS-#G?.M4xĂ$i4Sahx[l N$AMD0$ޙhyO^x((D!w}DX* !`9" %x'VDa9<eh)ш'H<)=Z"DHpdt!L:$L0:aR0i s1M aF+-%nJ?WAuf*n疳R!Xݎ P1g(*,Ba"[\Kbkn _Am[rh* J Ftd<9Rz$,ne0.H0R; tHTMɺ̫LKunvNH=ۇLI$ΡqGtg&W+ݪ,+xK_IDj71 aG/8J Z xaAA-,t3l:v0b0ּF 2asH9*OúC1WS ee+I6{H.cGH {D:򑐌$'IJZ (GIRL*WV򕰌,gIZeG),B&X%K, ^D'qn@=tIjF Jt$+FyH L@4p`M#1\̼HX7Md[PH9E F4R@F3>#HGʏDH+LU,`-]"]삗.,}Y"&I"˘!e\UodJh3h |+^ҊhM'Rx#`{~LÏHb1A)!QH_SB2uCl_5|"h3H:dE Jȷm ٙMSvšO 5D#napƫך׵)ֵ:@nqv*I\C2iKWTG(+^06vTG5wpTWQI`= ;zevС* &i8zrE=I}Zd]i7 K$r}n +AuaΚkc_9, :-<ۜgc-Y4 Wul:&8m<`d;2·AGg MYc%|% {~wCjlcP OH8:NrQugՃ0#\%Qr5e u1S4!D5pH1 P52`raS!M@C,X|6YT>r! ^k00}xzfWUN!tpsSvlA/eW' ڔڑNqtqebKoƇzvM@g hqS3#|E!D5 21YAv*5 'jF^H*B$[b.2.nh;u'A5_%7_aX%8!hP# &UqCZwTw*!0Z񈍒7q5D&U.5ȅPy5Q ;w[e$ 1(>^6**,x(Ru+sby/N 9&^" 5])+2wq?4e g\F7BfRTPMb\P '(18_%4˜?+c1 -Ɛy $"YibW.`!5]euV01s?"LsKq5>#yBLoi4R @aBwc&㢕d)a *Oؔ2w$&@)–C=4V9:( R#͘]8(ԙthP[BxUReLQ 152Mv(CcAaP;zўRP=xamRgQAk vGapj@$!AG8&-$ Ltx z(hDڨ޲#Oig8Atl(Ѧg"slZGG (ౢZI o:IG:Zz蚮꺮QDzki_0)I ]gjn@hfy] N@D [@\q iO:Wg38F6xlډG0ǰ":P}pVxEҲvV(6+ІlX-w?#?be bV H;AB|#(P0pPk5T/z'勔8.H"8a D-$Fa~3(dkaC+$1 gKEcR؋jrKwcO7ب֡S y#l{ ";@hԢ7a'-2S 1>S/(*iY 9bu ť(6.ā$q#Lx(:!2yJ_Ja)'[-)3CZpS=AvHCr呔Y츄63KZ)d!iK:SZ$A %PR.Sȅb[\w9z,}daTi é*a%4|k8@{[ϵ{|_㚾NyMyrhY3( 1 lW)1f'/!D?CrF}Y`wY_i)p+(k۝:K]{Ce[cý @K`LKPCKbb2sͭ0@6(aƙ+•p FA;K D$L8e ?LVf=@6%A/\}zi2fNȞKb4 z5eq`f$'M<&YiX1 Q *g+qعszDbKAק[:>@UP>Rp)aPׅ ﰩoSOJF[ck3-{Xkz?BBAlq{1_*E[b [\Ҷ~XT(]Tu1z|Kd0ȺlB眚-lUD/'瀮s\U 8{G_a:eE92ֈ<8:s9F[B\K*5<ˌb8!} ;aqvD>1CH>uNR35Z@^®+#luZyC M̬>,CY.c9\La Ύl*@Bj#zEē̟gSeJ(_$T^-J p9\98nlY, ^B?^,x]|L[vÅ I0ؚR'u/ 064a ;_.>Erߐ4?7ʴ\&B 4y#q@+oJ#̴]6H0\ CEX\Ž_|;LMml:=y֟NLZ&0rbj9ބ'0dbq֫$/&͖`=gXx"2 h$` P7'ҭ|*?G8dC(#IbIĄVY>v_5(IJ$nGR8:蠴@& .8&F*-/13579;=?ACEG==,(2 (,>2&Ik+G\͈D2N8Cz+fKfP,7"V]QV(XҒ>\I,=OE,yp`.b=w K5_\3b&zd1BqNY]HF$qHI7/fR7KB JN9U!4ZVSOF dUWfպkW_rlYgі0/-uRƕ;նwջj|}ZEi[H<< <;xwxW+RyW3BZr \ɬ`o s 0ʂx+90:Jji va̽kCs*7+<9`d0>=?:9#"q</A lp-J,%RHKHH ၢVtGd,*p f#,g!$|J v*ja$c(ǧvET2`^ 4d%| HR$VΓ伩A'H25VqѠ$=@t: )Y4YdaW j/.1`*W\ gM66 R3s%*ctET$Rk ("RPU1d88E"p^}dHI738,NA%$ߌA,C<섒$?B?LɩFS YZ.*Ogdz`lkzНFmfRU`ߍr dd#],Tr,q s%6zU x']:0Gܓ(A)= BFP*~[% "1}`;\@8lo &*5D tC5TE7r> O%$\ GI{_y3m{UX bpu=I~JGfQD2N +- aR0G:r ;I!r'!d8' D !H=R tWҐt-;eMNJ! t4@o<KµD C;=EdY5D<(x#Ma0DsOhP+;10]/(ᧇS3xT|ÆE'.+C)/+K'ˢMBz)H'B3uTII]B%%;س0i6R$uV,U)$=kCJ3\yK(ƪZh ẽ~*/md| ܖmp{$7-+sF f*S`h^;V5yћ^u{_ΗxA_`>W6{K/ ~,a O4&-1a A%6Ob8+v3|_Ϙ5qc=d!E6\SpXWt~Ok?s^"NCVgB|DqьfH>] K.TR'y@Aq8 yK B;ry}\=,O)f󩆰$eC]akPa!bGx" ꬡ^q] *iBO hꬓ" Dv\ 9Y9=J r.EQіK&5!-DPtTi뫶 EU` '2,]OB7h=Ȇʒvk,C F7wIц.m7> : LĥLqJ,k +Q zOP:Y7%X_CP2oo :!3mJ V![ I[.K؈ N=DPTAk.iFNdE&?xD}Vh5-9rB;oDX-ЕT Sײս"tPln^t]TH&Xʣ [DhQ>:SPWQyU#0`?hdgp$7Ilrq^އQ:Ca|y$pr\4!''Xkwށ@HOHΝ8p,!fH^\DXBf l%nC؊|NoP( ᅸX*O2jGЏO=hO2 t` v<6"ډ->kȈ|pLhd .þIRuPG ʯkOJ("\LpmfA}IԴ)(6/NDI_jN :T*)*+9ɠnJ`HZ %fV`).!(z8J$06'im(o&V.wL`0NADHf( +La a]jRǫMIjF lށ܊&J.檮""U&pE! `*!! #z8_&UBoEB'NN-Ąr!UjT 1+-,D$+k̦c,,br-ߌْ4k2RC0x.2/r///6, Mբ@ilP:kP 4̔80׾v.#-,Ͳ氒9쬡NGlϼ2+ܬ K vm1Zs+ -0nE2If U:33+z+NM~R-(%[ ,K'6<" 7:"8{;58Gv"ؒMH#p MP..XDWQMRDR-SذX:Ѕ*]E$sZ@< Db47 pȲ nAQe+ *RĪ9j% BNvY.SDN@T:Bv,P6?05 KҠ2b,)+B&0H#G`&j%<oFc|F}ʎѧN?/r 2 `;9".&p'Hnj&IQ) /nsre o6q" 0t^Or _0=`N7?krO vϡVF`ڊpbϘJBx~)NTPӘpR / Հp|(ZUz|[yTjg7\Oє*W<IV.uX$.15 ={c*լ*|N4HZ'[((Fp n!U@*A[f0 jʲPЅd)`M&Vqjcm1:ֆ*Uap.Nxɦ!rX9kw[*: 0*,@ m1[f´\\PВOb֓Gq(u9IMQ9UysCX`yhWJyŜ mĀO.7Livٙy~ѥ6sy~x!7̕9yɹ9yٹˀc^*,8'F7/m{Id'8(My{MKv%eW-e5( `d,fy8'g+W#$EE,Ki3sҪ*{)n5oioX7pԏ{wrv!UK98r|:> 3I|xJyKYxOd7 7GD6uWWSIK'| `sqnzpρ+퓢N6tn[ra;:{Onyc[鎇qSn(O4nn ȷXQtcGaʹ1Phq@Wܾ +h1Auпso|v \1|w\W\}!% B$! 4l‡iL 5@3;VFG Y5~Õ9n=i -DA-51 >@0h<0QTiR:XUJYll Y1 8ptsBXnQd  *SAh.ԚmavQ2h! +VMfϢ˜E Ua–uČqyA+ޯE+.2Tb:!5«Srr <rb SCXg r2VV6dȫ/8gB!x֯};P/~</0r;}?JDÓOX")ؠ*Qq/{R5\4 e`?B6!D! [( !bܬ8z-l_zQ^ bR &gc|B.S Lz jZ2gTtԧuL_dHXq]?!Ff2́4㱺OH0,(II-ڰmN;#!iJxq(,h, @iwh*>O:e(GJ{%-k2%/{_3&1ic"3\&3?%F={mu9@ĐȔYI 8W,pQ^w>}AʚԔ %aR >YX*lBmb:Huu DA3Ց#2" .khà`i8.*rjuԥ3;MMSQ(FoLR`kUJ<Stm 8zvr\) [x#4.B"VOgH ;MbAx8Tc*Z[:)9.Sb2. ı'K>ŋ<@O|E_stkQSҫkHŒcdTkK5 `n+ZDnY_аZ-d4bQYlnγ.gUaߴed<&4"+5ܳ(1K kYl^S\BI( $쎈ʇm:;B 0Mkk ujI׵ G@l3FSͱi)Q+o-*@7JbZnfLJގmSs|9#` P݇!.WʼnEN;1njI~fLAH4qTi8i5z+ɑBRLri:lȊQtV4 ץhl4zJ[8W'e*.3n }4T i"S2ziO-SgK.UYǫ]935U{ rv=~dBP&jHoD|8vq/hВ vSd!zjJ-HT NN]*=x+}KEQD;^vIu>GIk cM". !Wl]6?]N0iv`01]JPÂ;-2@*M_D G;z]SpO\d._J=k7By?4HCZ0=y3ҷuVEko{x3Ն iH>o#?_>hb$Q9͋ƒx}c]oѤڡg=O8t-%|OZ h_;zAK >TmO L6AMl6iJJYMWRmYj1THDE <`SԂSQ`8G Qd_XKGI2 yUȌmed^jE$ZҴp"XY!Zig偢 9@ZK!GFEZ`*9\L%bEܟȍP) R)}^BWnyYKjɬد\tWX] Xob]]a+X/>íN5g`ܴFb[hA'j qRA(la#Q=[)`Žspe)ļXM'mއ=PY&ZWG#'d]Mw\|YǥP>|} ej*b\bEs Up kQ !P7{]fWPD c\Q:Ѩ8B2ѱh)gm@]o֡zQW$Aؕq/]iaC 䉀OݨabU c e"2&r!!چ` ]eإB{4qzaƅaÓLтnJA;^2~Nj8>j. UF|(kkJRkZbkjr+XES% !d(]iO>TwJȊ,&-@0b@ `jc,( X\$O(;pu`vk:+mP {ɦڤP0lǮ6N} ll5,Z ,I%U-bW|EXIZYW DQX `1!~Ujr\V:@ Αl-^z,d ,G" h⦭#Jv ~b 0܁~V*V T䖚%.0Nj_dpqQ0c=$cdwqzx5\&\,ͤORM=[ ܄}#%c"NdTo3b(v #l e EM`ح;M$Fnnt2#$η~dMF%Iw:iK(LF)/{4ʗBgQF-0n=%g6,N{`Vv#c;q)ňoaYpƥ ?aUe.,|кc'^bT`H4O o&Afbߦ, VRnBFB)ؑQrMsud'*bz˭grF}rP2,FgL,!E4j vP}E1 \5L//@"U$;2i-T|Q)e 6|֥'^ KxBr5O5o i}-O!,;=b/'z)Z"5\:3IĤ"?B^֕2\Ħ߅ԒA􅡱^;qujtSiG*'%=Gnl~^@v+Euǭ:+AuTTs5duWDZ>fdz*,XuZZu[[u\õAS w]7uGϺΫM/j^uYߚl4u@L^!d= ^k*PQjcCdG$;ˢ lgAv RuMIxYHk v7m0iSBD@4VՕK2YVah`ab؞ f *r4'm 1ߢ, ঊފVRbo!VaWrl=F"ng=]QF^Q8ti.PlE"n)Ԓb>WL;BGs]1b~?3d Rpd0{6i/Z966B弅:zu_#eg?MBF?6 MO-VL+ TC@D rn"-Z1y)tR0WAI ;00e%crH mzRHDwĎO hr=rE XNV'O oݰy% e E[.?Y@H"٥#^x:FEDaCY%y)jlF4_Y&L.aueB$&oqgT{:or0k3p*Gv 3Z<ǧ%D&;wirz/)w& (z ztv{#|ZbkUނBkL +4(-2g8}4WO nRF·>)/s 3ʓyڡΝ6h>>*s}>53kU&SlPz(I|A yLftu3et5+uJǧt׉4I# eOtߩDc-t =9ЃF3}8mAK &C#4L(I#HC`P8RvVaY!;B܈~m'ؐ+ F]rG֛CAJ6[z~c4$b +PcӆP65y\9)O(-`F]%d?N{#H[dbﮣ" ,of|pRC3C[b9^' 2t i75 z B!f?鍄NË$<m>}q Bp ю,Q?xJwd  <ѐ0d"Hv03AfHd&5INvғe(E9JRDe*UJVM# _KL.x1yrT88\bA4Ca 2EqyLc"yҗd(G%l _)d!r&@\AY&X -B FJR|&LBXI"%D7|f 4w1 yڒix& AD8.F|'ʒҌ/5ڀ:c6d&DYDr09t2 PX cu4R'=P**?b5iC2tQBC{n;P-By*]Ŋ01OiPSL&ĪKҴ 4V"Z;U cdUpHB isxc 7r)JԬO.=-qভךV1 藗uBrRqM܎[qI xVHw0zp%n8ǿޤ=0L.FCd2!%3-C%H{mYݼ~Qh9(1H ۲e76y!+vYR~ uDe۷=:W!8^A干 vtWnzɮ }u>f}[7Ywwά~K neo2;LMe6T0q\qew sԥ;Xk'ә8J Ay% F>3 fs <4 . =h?;8NˍS8}5ޮVX0YAutߤwN @ g|k|kZ@1È0&63! (=<>VJ -P x+TGRNhKz(Y$j !$"4#DKH)[ q^Ԫr.€& {zcjҨnjija9t5C)D2,%q;Y;ap1၀ʉH?*ڡS *+ɶa8hLlC0Jh2rHI ,qɑxÑ؃1_q];{$,: :Jei_!Q8H+.XeQ@A;_؆|<ˈ=3 pܶQ1RX4ulz#H6hH!Q?| |;!7s29Hu6l+,DJ8BIt1!70IN˧s!A8 ?s 3ZӌkFV j\hRpŸ 7͢+K!IkD}|랧t2@<,Ҁ:/OL,EX@̣^Aߤ DEK7ҩV"-bI$K3*ӽѼcڵE:]D#B>|)<,̚YD? LB\@aP\bT]lP Q!d'n$EAhJ E$U%e&u'()lBIRR&H#*KP 3CiB.3xTh(  H}t) Dm5*mXeSa`H`V8 `= v,h:!C6FVfva1]B%E^ EU18m"Կ;78!)ALiTxI5br[I'v82XTUE*$*ᩯWZZl[Z\]mXtN)xH ^)6CFĹA۴[s-RW!vw]GEWCWpW'ܥJDV3[V飍ێL% Е-_ ͔E])-7GN2XcNѮTb-gCKKLڨZkf]+EpMt7|GHΕ̮ϤTl}Mav\b\qgN@}Q]=N;cjbX窣Ϭ~Dݠ콽? (8PZH m E-&I$o6FVfv꧆@($ f6&=T>= Ss/&,t(ji*0>\hݔoa/Xy8Q:̓5mo̞T1^{n0 IV2WIV sRųC"CoM\Njf=+ר_}$m|NS }j`؆>'!txxUD'7GWgy#\Lxf'2x0Čl@Oi kB kbˎZhLh\%=T*y:yTw3z>u^fl-~TP@ObfOePDVzt:vvVպbVϪ>l#^UВ!v\^Q-'1|vת/m tVd{Ͽ(H0̩X.cBQӝ-}s;S$gr78'`=.=yU\ʇ}Lt ĢL*̦ JԪ|JI<EVq9ݾ]e4Ұ%TG(֥@4Q70AQg2EtG$@Gh5"0Iy A (([y}FR(M1]8!AAP! @/?O_o\.haH1J .ҝ8qMA\8$`[L"U N͓<@<$\W[b͚/z\&1c0XCeE. &ODUp{d˚=6m== M ZK.vh!6I!jMW76VkoAcF脺Jdſpx89V;ݼiVhvsݩ)P~ߎZSF N T' J\R7V"xӒTvohFK@| m_3vpYWpx34'\"pHo"Hb V7 (3_"Hu(/T"|agy!P'-BY3AHQ5 @iTLFİ&uf-Iʚ=WCkR2|@AqZ> iNJi^injiliz:\1S kJkӨ.*jNKlll@}TNKm^mnm~ nKn枋nn뮍h!Ջkڪ pDE"BVH<@U |{\ZLFr[jEE-j(`e1 }Ep. sVƏ2\vǏqj  k<1pfp /6mȌuZotRL%$5P-f1%Dʜb%ٽz"ՅyF+'xVMe|8 A?Uu馟n:!I+rlH0<6ByC䈧e~C`L.,o$,YA#bTmQ@bѿHI8r~%)Hy &nFmĺI&x-&p TFi{@t-2Q̓7-s|F 0$2@;' &I  H7^pa2?7 YOzNބ'TY+M\>}miP-+B'"d*(ʀ"3akGe+w^i}ŚyT&V<#KLz|%%)nیPM~Û #Є BIZE/OG?.]t$-IOҔt,mK_ Әt4MK̜tY6vZD-QI F =S U#x۽l96xMmsC=@ $#?9մuS^"Z̷יqQAJEFBZ X0OAE HN6 ie;ƾR4P<)% Fd6d@aSjԪ6kbN>֎w~`׌uX|MDЩvR[^#Wv-Q3y'-FT6I*p*tmot[[w=VF#w=V~ +!-,@@pH,Ȥrl:QRbBrM INm<ܪ~sLKXOFIB kC}WEQ cHbEDID˜G%D(J !"K!QlhݺB DPƆ»akNzFN"8Ȇd  lPa[ɲ˗z a@-,4ąZ5%Xš@J 陓1"ܓ RB p4ĵw (XC Rqrsfѧ"@Jm̜. ‡zGς9u5iA6MD2U(Rи̌2Czv3UNz#Lt0ZB1N`P0{-b@&EHN2I!ՅeL c[ޖ؊ؚ5hb-@`dw a A G2RH4 A a%'RUt eu'ټcQeh8^U:#4PKgpXDL xx ,(!0h@Y'<,RM@ݓ 8y$SwY7}dc%O}tll%b;䨤=ɢ3S\:K5>di'\`jjUJ9>**$$[:xB})1``ݜn`If V,+ξVA, Y(Qy*6찏¯' I«%l0[~,!M_h=Aǔ$A@kYc1nعJlT!Z8/mҡ5A]&|iἰwuKJ`sXp? `SG.%۬ȝ(A lz)gakG 0i*+PE,yDkUݪƫ똡EyBءۢei ,z&5_/8! wT5TΕhXl_tZWE#4;k*l/Ŕ##fYAΆӍ =yIsw O}>W 0iuCI hbt7=BK W0 g *Tqw@ H"HLH9PH*ZX̢.z` H2h,#d$Dm\cBIi`,n1<*#xȅ4!7)Tٌ KR2pR>Rx}_kɼ ;1O%W$E#߅^ gR0O8u$Ǎ;Pu-X&/A4+ay=.]J0`JĴ]8 ? VAғ~/Q!'O;.[ϸ7{ GN(OʑҰ[KAs7shv4IQ전)Rȓ=sL#Cu7WSbUp{dI|%K/Ɍ;TLw%%I-مiu/d'إ:h\`o PꤙجˇЫ@))ۦ2W vESy%[̗+W;`$2UXNXc.R2;Q[S>79x)~ YhSc-gS^%[!AcebhL#YuZ(ւ%uC)\&|\RN 2]P]xU] ]Ƣf?:A^B9!-e-yƃ._9}8+صZ2[W_DcKg{25zu`X2 V'HJvhMAa!X \v$:,{l>59;c2c47G\&sDFU@VQHdu|d8='haueeĕ!"i78#fA7s7fSiFXQfqb(tP(gn+J|FKg}fhh`u W9PhVwK@&@%wd(}jx lͥ`Gj//zu%gk_m:Pm/eWD $ a2a|@4%- .qE3^ªw4`95hB: R$[?Z+x8f0Q3d`QP>`RNxDA#F|Xq(A9f-⏘:SKtvTg ~F(F{6UH ij5{fm ?b75i ޘ=QMv;䑒~[[YV?YNglA>ǖP p bv*{MԕU냌a8K"Q/Z?Xi?>hҦm!&TtAќ#jtՙqYBYqԀ\&šj,.02<4\6|r B|8<ǚ@{tGv!Io+vC2'@oRAC+ y]`N $C6 %mf0gLԞY,`F=m1.{(3y{ôݻ,pYoף.+};({ ur_7X9Z{iaz1]6t P92hd:UQ4ѻb2#8 `JOzr;Ǫ| (bK]V@ VK"P?+*KjYKg U&xLь+ֵ+HʮʒE µG1L\Tg$ڈW7w4:͠h!3'xϠljC!fc·xeX-Jc0<t̴~+eWK%mr:7WK.*(( F2DE7g6g;h+Lx$0L+h&<y ɼF I 2I3X'bMu`AMMk0P5ɓ댶!@˕|k֞١*à]ڦ}ڨڪڬڮڰ۲=۴].xC5@l2 ى؉'KPf`Et,ȻwW|3$ܕfpłspЯD7(i"i-I`޽Cn6Mz<=XzZ&("w^y(U mm ;S8:퍚iBMdr}W֌'ĭh=K ˝QUA!2SV!̓#N%Jڪ-P$͔2P 5Vܛe߯;9;] ϖ yAL+PYL]l͠]Nrb,A 1>3<HQ,dw̫Af/wk7\ұM;,>6tIvF ^wvB#rF f嗣ԑ~ $Sk56%ִHiM#qg߽˫9s]Nnk} tIV,b7^ \@~o)Fw@O &tmۿC_ "?0  $/G0Iď`ܢ&kȠ {GP!WLF+'lL'LϼU_Qe; , [OmP'Da=j z:ٽQD<ޓhzj^qyY#B*1 %`j`4qq j-#)6#Fi(rg;]oLC:9^8gklt׬/;CE2 s8eع%S(vH$M|7ŷ>rg$l_=2t&N aQ!ND%9M^F2z>@EdZ%^y !>ʞ4"<&D8$">:R5PB$&&<@YH|^FN+".8H/X;+f: "*/Q(&7aR2å3lAZVI Ml9`5 ze`?T)8/D*!|ܤ&UiSOFצfպkW_;lYgѦUm[oƕ;n]wջo_L L(, %łr`i1>5KB#:3" 2ÐQO "^t<@3WHZ OrW 4¢L' } +aIЎ?׀"9@f>dD}փRAV(&L 7^:p"6 "Jbʹ6Y5T+qXį[tD¡pc)X 8Et[GZ>h*J%}N]{62]2P Z,?(-P 9nZ=k"]4`H$E87x`64j7tۉx4"3PB2YH aCΐ5 qC=D!E41> fsἐ{l]#!Ԩ5vHsH2X +h,Mdׄp04d"P5Eh㙝"y n,%It\p|co )i JU Qc,n,C@# b6+I9(< sH#,G7Hx%MaGp% ub)Ql +љU!l$jERҕKņQ 06LyS/Ҡ3i Oh3%͚a$JJ5P̛MUjU'$@jċ:QR/&Mm˂\*a'm #U7qiCA7˿)P]KNO,v뉮6/ $xIR5Xh!ehY3$Dw3Dӳ]aT pe^be9ȑOzNn 56;-PrJ_J@]O8VEc̠-AoRТ4 Qi@ҐyH'068.rsWٯtpSHtnM-lHnĩ~j@UO^㰲]89 e@IdJfs]~I nD S!#X!c:D]lHANb}#C`FO%t*S2 &46*:Mae)S򕱜e-o]91bAybc3`y@U{mT4&5-΁g'ҷ識eڈNYGtH%+h:$̃#M0d hmc#ENJNX2{5$&[P v4׫:&%} TYշ>}o~qx@s01@W_0aw'Oob쥾AxϊP(s9O:::)db4C g2$Mޣ!Ft:':*@fAA@&e5LD%CD:,biCNd$RbLZ|fl%b!JN`Gd M&9ҀKds: yևNF ֊z*e宍p]8Ppn m [  @mTJ>"@<bEF`o@vz|ƧHp͛ЦYmmrk.js8ǽxE{QicKT!FfZT jg|%=a$oӲ'tJKg_W'X )#(1˩ Č0|j& L/5Bo&"Nv,0K8hZ I'p',2j/ms.6}37srs8839s99V Rh:,L)z?8o;;RcF!ibdv쭰̘׎;s?ӕjP? \/)+v>)(&<`B-@ 2aDiH%Y q~1P1l&iF#ACEMo'\A J.HM TR4ʒ@!z&,g"d+$ș4m','8.$mHN %y b4R ) 1ɠG Zep֔p0.&wl.K4TEՐOFF_nx"1DWDʆ?H&fҊ4\*Ss$Z`"kVF5ZIQ˵4OPq򷂓W!`fR?$\oՙH VtZ5_8+``K,[y,N"k-}7dfJ_Aq]: z$T*G'S_UV_= S$,\),0cX3>"$N.$%ElFe#L$b.#Vz>gSj9ٮ8޺.3)k9k" l6-"ďֶmnn6ovoS(:Cj-pDbe7qCuPP2z_pzQ5yXJAҬI+{Eb>A>q~mhxXJ5X3PuOQ c)ixKXWa$D:]+D惄Ke1y)y5uG8[U\2ЄlU5!/oEXًVc}~՛In`V r`,E&%P3bk =9lژ\ʃyFlMin"XcY*w[6'E fG,g;S  {4kG &zEcغ [&7hEs HQZqmlSaڌlo͉ }:zZAW$`p)b;@H7jVSE s3Ds7wvqzP7umӢAZ< :whh4?TYB4qDy Q+eWOYa%*(FY]hF)zZ[L2yK@Km  `U*[OQ*"@R*L5[IQچ]%t#E9Jض/`ٖO*ƊCn&fٹϘ՘4QU8UdVě{.@Ue~uV;)\/UνԓY{GYWIaVF B]muy+nwY9,[™,Ԓr p+Le!cƵw1CxoV3HgQlk @A&""<LYQ^β| ]g:^hс9ћknt:$}1=5}9=zSaL/ȬR*B+;Z%)W:ß<(6~]t!wE+p<"ֹR3āεvP=7a}IE@Rz&v֩zC;tȜ[[MF&M\zD`| lHy {=}w%н˗ W w:S6Pt`ᄁޗ.IuRW uĀx{T{}N;VPeM}J1]!\f礄mST=_RV> |?ME@>5vonXO׺9K ~pkLQP'b\ pĊ+lx}ͤx5 rMR(p=v_ O͕WJnpEo7^U6Dz`{*%J` ]S܏mҠOAb /m4BB-!\$Qr!(+W;d0"nV2&6OvAR%y**>a=L|0pytv mv=\RJ,LJ<:,),.>12BjJ&+/33>CGKOSW[_cgkoskoij|m9R +4M WD?ѧ'PB!@S\`1a06a| G2%;8IPxTD0ܓ]K&n L2J SƔ׮^t +v,ٲf"e`&`5-C5xŁH1 ,X]X qr3Ӊ L @[KG c`dž5H,BN *H"UIaQ)*뀘]1 [d!MfeQe?mZ.!o3@u<ϣO~=|/>} RcXw ~u_{+iƠRXbQ {JMp#X'+آ/3X7☣;أ?355[1!>_RVVե_n#S^nQ!bzRPR LoiQoz (E\ Z_ iP2YNՉ(]][r#gjCgL.UAIyE.m1`8BNRM jI k \vb}N[\iI.&BotI#|5TJ$!hoR`<9 |U1{U :pu.db@`2c(YnH\i&MJM:᳙N,-)1 .a@QL*őBzY[@gmmy>D %_k,bDh0x "(ՅBEVY]QCVwP# .mZiApnb3CzwE׽!jsl~4::s+p"~o8fRT.4s|>-*A0zl^MHCuZr^ke:yph@аČbB@UL` Ѱ* Tt - /_L3LC7-re-51bu`v:4?0J7( yhÿi׮gQlfmHÅ)7 c"gF=yG  e/Ka 3##d5ٌ8b,08a]")5%jXP:H-$$ZoYNk3B967b|#I%l)HjwqZaR$$ aAB( `YS !*A&λ*m&KO! KGQ.Rcȅ4'.TԺ`HM?:@O%ra :v@5)TPFO2`,;nhpC&1k9(3k0\p8zmx *.P~hC^?* lY.A dvpϨV}%h+Eg4xOyQzj`w@!AY݀L9՜B279>ow2&jS,yzjs` ~5FObGRQyj:_ 3sr}m&CDyW5'8Xia$P(`!B'>beXfgrrܥs}vYI(NC&ξ8뉗]`GhU%CtZ,{lL+%OXV2$(QI?XP~wrq|gݤFG|[,g8މ#㪐oOcՙӼ:j?_FUEYFT’=;DwMg!ޕ;TIF b_!5!O\Z! ı Z4LQHI KY)Xu Z9aX  J`0D 1G2 Ιږm|EHh7<%yW!oeeXdiaJNћ/:J鉞ԑ>x Ym "TAq^BI CuwEP0-cɡd,edkbK;0ۼ7%CVcc:]e;c}cTc==c>>c??>^Ł ObC;&ZxuG#e ే &I^2 ؜I~W :d,ҖW4BG2R^}y(CraֵD=Dq]^KaQOaTR]桌@¾䠺̅UOcU]LTHnǂA>|FCCYRTފx <e#1 L&eAEHMW_ ٍ@.4bPЋ&d\>I nI>fNk <`橬 =UX:eRa4 \5A蒿OH4 6BY 5QjсqgYR&lc< = q'r)BdeLrСYpєQ'vҢjxdH^Uv'  njn2[La@ m(K6 Q$ MR(IV9&\4q\b_ X(a&1&`! Q*EbpZ'.e9-Q :O@)s1_&S 4%#P'ZYtQ\]V_̏ hQ=FXXF$:Ƶg"lOJ$Cű%1dEIJ5-dȯHBLj}j kz@"k*2k:Bk@$9YT֡j> je᝶JEIMnMbnz(6 %xTb2@+4$GGcGfH0(ePndQR(EX^EV]b&Oe(%eUjaG aVl؎PQ^lTVj0͍Bװ"~"Ѵ} Qgjm6k‚ /Aln4C)&8em#I<dd=.Npn-v. 8`Xi$Fb燉e\%I-;}.]=ųk= \(h wd?Gr(Qj)&#ET6ʥ gU2LhJAd#tcu=Cy1w{{w||w}}w~#k:C%ϲ҆9 p#+3kEVG {_,ro{<ç U'jq]$oQds+JeG(WBeԡRNv8ze`PC1)?s@vgؒgwH@va0]9T/K<ɒH0v7dU6X!ȗd:A3ي4Qc-٠te:ڿ5f&'6M|Mh6Qhz ?u xJXx})~CޖsH4GhNV6X tzm:U$csf|#ö@F4^{-\SPISsb YL;:"FV2B_`hjVz&DVZP\NBj0hKK)Mû?(Xe]0ջ5d.̓౳Ly 0TO{)TpzIP&[6vɏ4{NycSouŰw3)['(|Kֱv!+t˨QLMaOlc4$ =}"e(_[ưnO#E76Y<7=fkb"r[r3sC24i'{L~vP7=s  pu]C4FR5[GmJɔ9xc#xos~ވz:j.zk5-C@ ?8zG4OICA  G@a%R:6B :UnTzGX}l- X/cw70|@ 9 - KLMNOPQR75="(W-G>- Z4_Eb/?h;,)$ ]*ntuvwuUVCDpH-H~p$pܡl &{ф fKD sDH+7NhG,gI"$Hp·t$TRp-ij,rE"Z fS kւ2`PՅ[Ţ@WX gFhq @X4aĉ#WĩܼeӲ h͚   xYI\.H8g@q䉲X36)PF6yBB^ ժIMDjU'pߦ@4 :Pn?TpA⃚rۧ FPGRjȳHv*`8@q~RQ"eQBn+.H;+ $3Є/Ӑ{ 8"p0"opqlܧ$sN:GJ"9n"tHdil0 $Џ}Yq%6DP9ǯ"D/P I8E\+~z=90/Po\g Q{P&i>8Nhv1."'BPn%m2o;Ѫ -KY6&-8I|ݖU1׹q_Lj$b/C7W Eߚvc;6E<6$)Pu%Gr,]]eBEYᄎ{Dd:}x(zYUtXf'KOg YŪHCy3iܳ@`MW' ީcFB,(3fŅ&Huk!8= }<@mE|b"= DFx Kq/3ܜ6*qt9(emk#}`RRUY- ?ÙRS|7|W}w}`~o@P$` x@&PFP`-xA fP`=AP#$a MxBP+da&> }SP78P;4J$ > "j#cx1AApri2pTLR@C0Q (3J0+vBN4ʐ 1Iai@`Gcp$d!TFqp?$0ebs&8Ȅ&`NFL0Ŗ1k Ih1ǀKfv>bxB~ Z L$f1DԙQ/0p< Fs%,5LR H1λ ̥K'-lL$Fpoy1_ݵtɀhPG8N_yQ$;l81=RZ LZfX0i>vX#&qM|bX+fq]bX3qm|cX;q}lČ$'erC2q VV7ЀHE](^preåAh3`Zy ,3MbK] lA_oft1H 'X*9,}2 衐)]QQ JKH>o 6[V |Ok{bߞ7YC*hh7:IgE"LmY˸Rڔ Y-X]5\Ef==EAJGFΟ\޻u"gtcZti+'wPTd`*8./jmCB6eonĈ1m1Y#^kq*tLi% jvhgzxle}Bjˋﰆ )Y ,6〗'R:+-s!W59D",݉ܭm4gmx~浲=+nYw6\+v@iyˊ5I+;'.*nݢs'bŴ-–l=ijZw7r2N3۰"6M(U#ZVjD$SnɛlA͂>M[or q4*4k0Nɳ>@6I-39AX_%Ìy#aS?=QNy@WhAL ![̫Aܱdi,B#(&Ӱz 9B(B)B*B+B,B-B..D)z, )4!3{Ā&B"{7+#,(i_XA0IU4 D\CL|ҳSʫq QmXE<B33%D\DH EF4˴74K8P!J3RK<`ӎP%56:83}5ش`$ %03 XF#B+tTnQ::Ә\RȘ k-Ѷ}6&y۹ 53sCtEhm\cySpGj9({q5F 8m{-m,ȎҫE.Qd9JЈ |Pø¢ D."RE,ظHFl90 й9@(A)>I$ â=A2 69̷;JǬ;k,ƻBƭCR< Yk1 GiƳ;9y=>XZYEM#cŶ$e!|KPKc yRt %<A*_5o2x4جPb>x>p : ؼKY6I-\<4Q\=[Z3̿j'-ZQA[X뜍ؘ̎  B|K&FCHY C@Jaf$=5JIdN/\T"DԱ5|aTK]:"KTO͟$T*B pBHOMUU]UVmUW}UXUYUZu>Gd@R_D9t):t;<|݃>?O)c"esk}Un=DڃE-DA@!D cŶVym]D&1"Fga$XkQ50Sk}R\Ui|攂<rO`ZWi[dH6аdzcHGHuc7:RVxby:LJSBa8S M6Jya/TĆ ,o9c [}XdM6N舼]5[&{:לL,yK;5,4MMM$)XϳUΓ֚@\˸ђNNl{OMN:T*KPh]ЋXΒEGI]֐=>i8MYtt 57s]=zm"J^ٮ.]E(%40դ%u)e ұ-T@01ZK Jb5ԕSGlF (°Z}`G]]` L ` !,@pH,Ȥrl:P$hB جv9Ѱ\Ài`3||݌ёxlB G}ft$ D!&BECgEjJDcDxSqMGT"C(KxP F%ipBt·JFUg*\((h((X։ /|"Éq\pbA w _\rr%ED.R8WE% $2XC>s wBd<,p^@GT8}ydP5 ,!`Ċd"@ߪzOu86v4 Bgm&+Jw0"YNWu5fOx@^RzvCi5Mx;СĄ";t$8a'˟O 1p=2d hć58"e~HTrP o~_GCX1ŞFy(tca7ċ z<T^5daѸ^_ ^Sr!@g~4"reD&lWC\8cgJknypg&')h! Gc;;a=%(}ߓz߅}Fafq6(hRd {f  \RB|`lPjUP0J87i]wYצRySjcrtN]j(VeX%dxlS4!+ n(;MTJ,+SOG H\p)&1abQ4[oUEeD=r`Z$s\E TkʒGC /<t)Iw81`)`^\/D1Lca =G.e,o'7G/WogH:ZH,0 > XD(E D$6$XCq]APH_XNJQ\>bٰdR GBemvN @a^rO F* X'(e[88abd KI HiCDmp]K GU@, (2π0հ+J ]NXr &^x=.~C!ANTh: a N΀xS9)̇Ք, ,՟EQb:\m*IyH$QqhDME :Ԋpvgq H,c')6RHO)ef9!EAU0pQ$i!s>+jfg>,"dgl';W3?/9V<'8ScL+6L44t&.0$ӂVezT5u4MHO@qv5*:c$euVBޱ4z,T+RJݠ@Fu`{Ԁvi:aT%SjBYt\$چΒ$t֕1"QY`1E]'X&]ϢM#јztC)M]d`DP (t \DCKR?jNIאf-ZڭM> -YcZФU?C! #,jA g%gLwմ /@r#r,"HN2刬&;PL*[Xβ.{uwLWhށu#kOQzF)Y*/!B9l]m `HyT&Kϥ=9f / ;\6LQLl.40N%@|$EfHTLN@Vt[54Iւ7er8ob;(J'$,l 9 *Źއ4gx.t-KԢvEG)9T %uuziH.SN/QX8ZŴڦh'ET00:En>?(k שD19Nsg\`]f"&) /ڻmĀ b|lRmz`%0Ӧj6== 9?QDEIc.yn^F,M"<KB{ ZӨ7HIg-;zP;o;\V2+O}C$[\{nNOk2OǯY kF@rzoF! Ph%A 89ubxb3rP@hwp&ZZ9Fyh1iuiI`i Miu2QG@ xGE0HG&8'Xq%}1R v5h7 gl`WK0 m, @6!4I "&Vyul'sn`0PMf'_a(pPo*\hIU'mC0_quY[WqpqdRWh 80r^'l/e,muˑ&"RF0`ȇXtB7YDgVl_is(X9[,iΖtv8 H1_uuDFg e'ZO6@y؍MwRHw wy@ H! wh 1Cq #XJ}ƂKry18L2`( zs b)>Vz=WQ{Tsi?54[`z'|5bzGcŢ?*XIbXF}Z9Gh7~3(vjpr9tYvyx_)9O9cx:jf}79ԗs0eJ5;G-QH[$-ɒ9hb;Bu3`ב^W9)y maz-X3b *ms95a?u tVLA)EJxM.kF9Y85Ay2tYp@`0 fL "]h8-EE mq3;t MBmV NRQVtO].وƔshO5#&?x؞;,t0֟,a%9v~@1$W))RP(by>2@ri*`jgws64ݔv%Fs%j=C?z~uX\OD'5UJcGХPVg5y $r6HV♦XF`WŞb!E$ RXE ƦDž~ iXقt^;3SPYɨ],ca9#R|:Yf!J냙)5OY /yFPP|a@(ɇ@Ƨz9}S6I*ٮ*zگ~|9:W䔋ev@A`ɃzJPAM9 '9o@59v` SOOdñ3}'C^bSyV۸Hʄ`g))kheH470I8QzryF) Y!kYIӚ@S+a^flFsTt+nj3X9M2 q@!zJ֑{R/ho Ē)hijڡA妓*b hyv/ۀN f%ɂkהqh[CC"]D F:H crPC r!vbt{qN~u[;$.aU7Ez3j`Z]e@; Ocr{IvT;?5liB()^mRHSK-u:C DT%'+܉B/4gCY BR wy]ߵT=9;H** 洶WU+390:Kzc_T)ڜtKy3 bBBL)kv?hǖ<ʤ< Wʪʬʮʰ@ƴ\ˆt`} JLcy3 ̌x˹ <#wh͜v ;*L>mgWk(i:<ܙ:`IиyVN-uǡh@)>(|G"Ѿ| ;* 9 n {;+@ź*R|ܓB DsWjKr:zـTzY ׼u>h7Tl g ]N?͞,])"Am9{\l0Y"Rp4ס Nu33.N<9Qk$}kAK˧rS\ll)s-Jy*kzݚUsMݻhEuuC'sԛOL.03W/߫u,K]PP*R;+-ɪ9ϨS} ~@_ckM`Vw7u#WxZҤGHҔ ,= T^ƒ.ө I}9C:z}|ӍCEmm~}:t[K>&p,P>>ⅴC+ǂBQ|DiΚ5 x})Tp1=ׂ-Is!5WmdT+ }'El]! &"XKW+Nu*Vk{Α]JՌ$ٻMؽoHZ]_acegikmoqsk5b *,0,$d8XZ}W.]=!3;65G/~$")?U$X6G1c *uFJ zFaZ<{teԸc]J&MvC_@h(,pwjz)"Nt̥S@1Kg'G&M/U "ʜ7le2+Ĩu\pY C$‰aa+PN9o"fMK&hl pg(cY֥= gpo %PdXEbnqV/#3VB_8Q)nnE,|$<߁O6)Yit mqr ~TGVJg*Ԅ +i/j $'U8#,Z%d'ml:Y4)~A9W0,juSq'$рzN5(-t!Bm5 qC=D!E4D%.Mt%!kER~!~]{$'o!2P= bH]OA/HD8ǝQ>#Lw6.F$鸫>n\ڍX uV$a9dY &Rl:"FRj0E׉'L+!(ѳ!RnjJ*3l֕vk@+R{-~CO܂bIJ:xKDK'/v3,iĄbaGk/Hc>HV 2l,hroP.K?7f 0x,"jLqdi,e 36JdNšYW"  NҝC@@RjxiÛ_t 7Mh.)xG> Siέq!> *KI z(\TOh ⒯: c'saSł;j{n E3KN-A#>`?Ӆ\tw؄jpl@]ؑ΋dp疀ov:)6X> ZPB[_KK8zqr';U foTd;Η2,=3\s"㩏<9wZZ4C .gjQQ ]eǸjeаm&"BiI tm{(u-bc'K[Lc!yB }}H#݈Mve)OU*{X x8D_5 o3"iu RK:XOĥ5j!eDYϠn\?h}`Vd?]\:J;OJ0Ѥ(iG$2y+XZ۠kpW]flb&a pcEӓAŪ=3U/vLi5xR}H 5W!u<{Jz-|.^!l7#>Gݧv3wVsDžu Y[Wu7>(҄D Pau8(j~ajm'7L ݓ.rur5ʨ88آҢ' Z~A7{b7 wkp8TrLwvڲ+EI : ӵGP A{ë+xv:?sƖ]</`$Ǧw#]>Xz :GSwR L[ݤDR2F +HmC渀1olCp5;BCK7,zzm;dM?(%Xo #\)3L@HdhTCHVɀM0  7t"dQxN"^8NQΚ4eP++b,/r_.&L"@PȲ1].\Zl;2hi &"莵4Ajc̲kNR]>xkǪj/ƪppDt' ~QL O\dosp2Tl8xO"  k܂;(M%'ȯf*FF*3GqÔ|b DmrlXq00+w,;ɚLQ$c N誀邨k , +7mЦ p5cRHQD 5iSAʐ.k37 N7}738s888rŖr:SslS;3<ӈS]S:ϳ,ӳ==3>s>>>3?s?GxHp ^ tt@4vbEBJ1 4Hp@"llA[E4 ,T @tzdDC>dD p;NE_ ,`@F]Es d``F E @Y2ZmxP5J @H#TLǥŘΊn90tIGKtF}tjTK!!΄L<>ãCQl C qeӄ'j6f–Jq4Xdfգ.pWE 4b|4 AuYg @t ,fL-@q DV1@'SHd0I46'X1QDR%tbYuFE-R V  Ag~,@OQJ@Jmµ$ |FaÔ${:2/pEꪠ@uEuvJ`qV`aa༆g ,/6c*rc5&N,ip$cgU_gVCjn`Tggg\xJk2.O4)PV\qD1KB^~W@D{t6E@c`ls5|6=^P m`k4 0\`K.JN;ZM=`e:.hvgk#ɸAT I&.yV)X5nSz$LY{w|ɷ||SxHJGWAbs29Y?'+X=`bǖ@A-2MVcRLbSe>$T.Ag,I8E0+=SjD |Oq!\^5I7fi+2s2T!aY;A3 ټM58lEL,;QNӂVX*e T&twBؚJ3m.+c8:ҢNzjןcxСouwHOh6}t~ADt:z麮 J RAnGz AӋ|K^Y~x1č"dp@BNOR쁭B~0Q2XyNQD,p}5{/9ySl-sٗX\崏2?EOD5(k'#0 & Ҝq+Ҷպ7 '%pp\Y(ڏp#k8:U> UGwJp=Tmwl1 7c 2rz9%z{i*ˋ2Yn[U n0Co.j3(E#ێ&&jpǕtSVJV\E@vȁ`μ@Ucac 5d-7 b%v$w`584;'[tmuo9yHyڮ/k?[etZG6IR{BE{$ĻPDY]a>[dOh d>PD +'1a#A`v' a&&(DW+C#0u~ XBc;gҞ-[Co{}oQ Z^l2눹]-kY=[mC@5 C>8`tJ,@Ej>|A Zz)h͠dY&E/n6[,Y`!;d \Μ`s{:!Nhb88 F(j̗?8\đ*\oYsd|hs< &0R2@$2FtDG1RDTH8qA :,u5BFJNRVZ^bfjnrvjQ6~XU8XAXP@qEUY)^a1;5E6c9N p1LL`z5-pK3k%=;6YTQQVP<|$p %RT)N lk;#> ''>@ENthL F:DVԈQ( tZ 'IB*u*QL*RidatVkhD|$3hsuHh싐ɫN%*1.\ *h=]vRgg̼^m3=K9zSQmF\tQ打 &;{g'E'Z,K<<r-Y_=Bk@ ,XdEi PPpD\ZZvn5(;6z&4cPTAWXJhW7a y#7ȷn`7֊ pr=X8б`漊 İR0i%p8#2H`R<=X ;Yb( ':`IZܢEqD^"h^1j\#-71r#h;1z#A IҼ$`v3 AkB2F~ڑ#O "KHP@L©|/lm33ڕDdͰ  㬼UqHJ/塋zg~x ׶I!6l,哰Y Of- 612F(VXR"hр%\A0v`:Ύf=aV}@ fU'U #?w ,4-BEJ+jv0 a|nRT*̧3g.~I4OҪhseC"4\SzW1V5GR'KwuNc 4JN+QNri l| MG-q3?D&0Z8\FAؤ-e=xf\ -?iChl{ۗ^\%ne 08C4WB.˰|τgk{BWga ׃Ó7P/(xI!$H#N1[\821kl8:1H&2]yhtxp⃰"5$&I p2 -o? 2*aiE7UǙ QKe FN!$F5=}1M Ο'l3@89+ES8`a] *dAB]n2"Nn(E4Us4<ǕFHEqNX–LE^%k*OnUje &~.l-qp7;YLj1B'^i9aǚ;7{sH ](Oݼ3=Se_Iiw#ֿv6v괡&7*,ޟ"0HMbqVg/[Z٩O:2\/m8T훸3Dodڸ*Q{f/fq}^L+NfwOܥH0n]?o \?Y7 ra㡂[c%]f;jʯܔnor^TlQiDnl+%[?ˠYּUֽhZTDV!́ŇNaqr К_4 Ǥ`x\MAHR=Ae(ŝT8ĊD^\Q*;i CrR[̓y}Ki /L |  &3prgP*pGOxQG9}!Qܷ [ z{LMQ]B}aYTt]'.aEiVx*}b. +&P@b0 0c11"c2*.MYS`a4UR\-RFB3 #R=lj!Cέ[`I 5*  6!SX(=a'S(N؊c!lSڨtߧm٧=YdԆX vWQj>>R0 eW#J1CiBbx!1 o³G#Am5`ҰY N4C"IIڑ)!H弔|bK0K]Z^o̡6de\ 8CrDBdBA ]B0r^͉"jx+x]]Fw|Q tnq(6,%[F=%ՙ@3 P"xtAHcH(S\r!b0ө_Q }lɝJ4rRd@@Q-DJCmO|cޤ :n߭ "ĢezNz"SeM.a&u+@Th)NF7BLZfg0,ŔG=B%XE *M Y)'QP} G^ L-ċR_"Bh^1 #6, D*gƕ^}xnRƏCn*$PQ'{,k6BFI iB yM)WL¤ltZ W2ٗ!6~qr( 1sXun!eXT2j[0_peo,f)i4l&b%*ױɥ2+޿>6 Н(I+LYR2/޽QCrȇilpȢ삔,qĦll,2P 4RpBF6L@16B 9^Y-R;.aFPACycACR/2ev#/F^-ōڹY E@ 6pgw&آ 85tܥjF:^ߠƯfދnnChv,]6(j~[1)>NqT0toTp -kL)ZFdvrPHxb$n .fZ*n=̼dJWq0p^>X*jsצI14(i2yo1>jV79ME8Pg.xsr2n ӯWV"e~U-j+Iqǹ*&V^8|ւ"`53v<".L|=Ql) (ņL~ВlКs;s>X*3D4@C^ZHܺPpMZ86B:Q.LdҙHV^E<JFG\ZmnZ @$44bm`ZP{AUs2A<OէFd;|>HF>o@NB.MWҍtSK4/8Pq==l4T^ϞUV7kRu0vxhbI*km_j㮃!SYM, \c6@5Q&5Mܺ2߸,sZRA[H0o 8rC4>Wh zm.UK[(X2XHlm-DEnarsGo36CFvIodo_\ms;1]BQ 𘎑cyji]pd'ZZJfTw8wy,`U7MXXA7K3~gqZQ-ˆǰ6\w꩔rn+"9@A,@B0ާ^y10)hg;a}_t82#[戞nمFy֨rd8֎x$WfJZMZ6j n;hzϤF %FyVl8"-R2vc#mG9yĨ\Scr.򒦁hu:'lGnb'a tnr [!1RkE,(s3U2+e~!Uf>V<:ɍ})n;9,RJ|ŊZ[<UOWH* .3< |v+3};C1 ۋ(4o@,ґDσEǀ"X,2F_TlA uR/Qy=AL4oߚAOlLrr咩y5Y a'ZZkni ˵ECe7BBvcErXVYr^L[i_˺8n~oSM闡gHKz5_9lmGt/w {4'7VXwk%?wfqzA۳ mvW'bKOtKA' U Wo(\ѰBK@2L&3oKJq`?U|'p.oP*]}`"c1ՅyU3j>DOj !!gjܐ]>H$~Z#Tzلv+`1k,RxZjOGħ5,. !tC9?.^0A |!꒕2*<~,͏( H(:YԓG֏G9'8"lGl/tG}G}G}G0N= Aɒm-@s$ ػ,#A?fJg-%TK&ʁJ4AZ{YiP7>USu8P5?8}?uV;nZ~^ft!Y\ƫWf@| =hKⳛ[te)z S^%T+ۯϫ¨3DcG%wGjv&>fmsXW]jl5.{۠)u.S(슄ezQ.@;|:C۳)rMF)'*o$qXZH$CV@`z<Ԑ Rpg/gȌg :Vuǜ(1TGksN9] $P7)2֢8͈'].3fw\m.U;*C) '`Zhb'\,f -!R.z{*(Ӷr/]!cq'?_?͗ܭAw<+a9/PP-&k9.ztľ#\6t9F}:s$RטE}G}G}G}G}Կ+Hbm}J5اȒmm9tCػl.vTMK Rhh k5Fs&DګoQÙd?n- le:yD?Bp`Ŷ}j1nmB;SOti+;HwH-(Mo:"uwͿAd5& ȠLBGG \B d8P6|leTӋt: 򱈚Z[2°a0y zh#Q(0cc ʘȫ0SthK@m;k]U}X6ڠn;tM|( '/7?GO qTȒ@`R ,DB0go hH*/1:xHAo:DE  DUaL ,"aE<EXW*e2QL idzKw&p~5:mݾu ]!0&aO)fU *JqIr܇ƄV4x67YScA|^&$d 10:`hVFTD2ֻ\խ Sܻ]*zˉ 63͠h:oq g,q0-.)a#BqC$[R@β4ag)& wˆZM/X7)L( 3*'9̱QG59n@4զ?Wb \E @Q[:q2Y5b͂( +#f:N'OHj 4oJqɔXPDH ʤCS{4^yAKS Q|"?] '@vrIZj@KKȔP(` \[E!]mPDB ccAHb5_tK(fDVQfT ^|'I9T'9>*$)(!Ek;l&E{R!wet[n;oNoG;p'pooq;! ?,@pH,Ȥrl:Шtz|#GIA;Jn|N~D \JD [G E!_BEDJ S~G }FQB#F^!EHPvZB$Bd`!"iC Ci E Z(@Am0;~El4aNZx(xDĄqD8)7pyC^F0m| iabʕ)]ʴim Bn0P0i>H L9VVmK)¶?Z8 %+rjj"8$ K/jC$CYݐ!鴴A .W|agHZ!ɗR!ɾ w:Z+S:|y.GDܫX7v ⾙e \% PHe7x _ .wB a]Dmq"z("#EH|塋-pO1k(w%wXV"m(Vq،h`e%fYLK|vjqg.5<Յ]'LioCnXJzDE`ۡS"OtNa>)VFSO^dftEXfhAl#k0$J#Xd!DeXO2!.cλJ٫EX)J 7G,Wlgw ,8k8펼b|!a92alnsgDItQK\1ˌb? %sV@*:(Nm3A6RO}6>Bm7ls<Ĉ`кFcΙ-)^ݒDBX7)mGaQ-֦Tebz&oBVgSqxB{r(@^%Am0.[*UڏԳzy4!;($:M[&: ǒA8п!a\cqpC 8@HI_qc#YsaIw* . :/ADz; @ML$i~Qc%NΒ=9n)cB$u?hUsNf5nFq~ya2qҺ%|e (2!2䫎)+>6Ǣ8HOҗgSZ.)1+ +W0)iq9SbL`, ^ ћ՞!BM(,='\LcM|v]FtK_} zaqD_1gt5OاO7~V_֤gg ä)XL?$VQq ikt "^4m֜xbDr𵦰#:MnڽH^*kτ ^P@s}+҇$@@K$ h 9+T oCw鑄87}Ki 0DVe'(%-io'eD9m0.^v99:|XLv ޡ)p [ iT}=uR󓅆emL'GGWRapH9e4yӃyy~HLhzljxq]\ct&UcAܒ>dDhpgA6yzwot iMY7/א9Yyّ9RPWLfMwz2kzuP_rbwW3r4VvgH2'0̦y$MM1ѳYx\J3M|JRXq{bJmμj[\ʙYѫҭӓ@ۃuΦOV[#lr{ eˢؼS&SӉڱ|m݈IdfMrcZW+H4b%ƃ*˭^L qw-) .|{Q0Y\~ͺiR IL{]=ߵXUNuήnݮhc"m!bTފm"F<نM#G1j~ƅr*ևp&zZ(|z.#P-23K;t0?!DOOG./.@4c?„LHڻR[/u[.=]n_Pr .( .KJP@aͲ,80uW?( /Yo+p()7s6Zo[aa p|~It>QZ&Ǥ-+4q`lH:@E RlEe<,(&.26.JRO"F2=D*F.8)Ξ$,D^&G@ZP@FiE 'Hτ$,%!H4?f3 G1M#Ą<1He &pw锬:,ɓ4bB!tL?1BB #.tPImT% l<4Rݺ}PgN@+ K9HaZh.E\@ j &a'"ջǜ!A(}:gW-,b#"fFn79f͊vp&KbrI4SAE\D53I JZIZX׀;g9I\Kټ 0b1JDѧg//ZU eU[=!/ʰG̨EFCL+ @(Odž3*@K 4DُE;PcƲ!) M@QO%G k2ﳈM<%JG̱+"{1M6nʎ%bky6L# $G>]9F`.4*82l+bn:B&9t ';;9J7C, JB\15X"yb2׏> !PXՖ=s79c٬٫Պ98s̃-KdiKىEY#P&Z$5P >,7CľմpNH[p AD@֥d{zMCXŠ#'*QC8)R9Fc9yyn@8]ؔ#}[$$ 8VqN[nFѸ[ ӾA$ /ߞӖ!\)Oz QU@da *A mcJږ y"ѶzgKH08P/GEkC@!.oT9 pC*AB4V (~1 E }aDLa*d2 +g;5GF6g(-}%g@ah('L x" S>wk=Q:xrmLRDWIPHj8 Z;)AF6g-a#F8`w jim.}*<v8eT?z?ZF&9.Rh%a/-kPd9Iy4ED7Rb-- O).mse!yf8̚(AP@@ 5L"`TaZ83A fPVmxw60'$B "CTPFRnpw{K老]jjrNݍK<2= H;5(I(}Gu>rpH7cNq;a*/0J8°"aԢV!U(+ f_lR6gA 3>Ls(2ͻl\;gKRjV]b) *%OoA5*BYD־P^ ,0B=&f_*2eq-[$% А\eCn8PTBl_ALCUP䞜hb°xMmamt ` eE$vHj Him̥Ko cl?WWa64-Z֮Q`̠\4gokޚl39nHnj8 hAЅ6hE/эvҮUC>IfveiaX/5T[jSa τt{-ˎ)] ZL1!Qx6Mo&zq"X@]wĹH'S cfg}Aw81A@5^!d9jmn n7*z` `Rd>`&ș@=yMMD0XODjG*SJRW,уv^Y-Qt)=Cb:& l6a--(6g] lCyBc l!w4FT9֡l)LnTS=_ro`'[I(H>{}q\BL Sꭦ어ϽD ka˜~:)H^] P ¾鹜MH,bm]RbV,cfljs88^ն jb:Zep¬ƪ%e@.laD 30fRCD71P@J35M*aG/q°9JH`*e~IƮQ JlxVd DjKNeP!s/ c Jo&K+>e9)T9N0 L⺞"6n/8!٧8鳄 FK%prDCwI&H?\PWeb.Zb'M:XRb.|A_4"~ zՎd  rLm!F݊3[(U3q 5Q =6%U>pTHi0"Ia>RبQ !`b8'p~&h\#RYЛT26tdt,Ȗg0>ȯ9 j(i%\QHl֨ ȧɞU80EFˌ,Vn$qqc1<dI60vKveYe]ea6fevfiuBvFH(#G:5hn!m_ y#JY(q5 (!REhhRjݦ.vlQr(.!݇&sd9k&f*24 hi29DH$ ^tfd3J_H?l^!b1RG9k-̒d96u Pmr,,͎jp]-e)x \I)إVOEe 07!,?id54:BFs"< e{ 8zXuOGNOfvpAw-|ztNK4@ꁝwGUOBɤx9eH4H!Ȅ:L08GE,K1Exo|CjDqTRNtl)x %"8.I+l:QFq=MIG8qS>zX`zT`fo3+"]Fp3 22*7e:b Q␁'4yX$\CcմX;b Z&@:Y͖Wf/e0ADw1WUW#I8OOq%πv_b5I>{YZ:`y`@j@*7g/NL3*/ak~t;FD@ M%K/+>_ BPOFW ZuUسa Ԃ@E4*sU|Ck{DKсTRM-+F{ `§D,%HXzsD/Qz.-YNlHHDf\+.@LsK |;%`: ΧکxNX#pg0x &@l6Q<:z{iF&˖%!uU<圤y3;֕aYde0Q /hV<(2bq}*=Yr/fyfBFJNRVZ^bfjnrvzR^Q(t9pm LE=(E4 }X(XɦadEn2 @p 5R!ѕaptR ") 1Z8Qem]pc=3׏$7 r] 1.b̨q#Gt,N9 #20+6 [u(fnłK[=l- %r >Xs7?g%X`C7PUku+w.ݺ~aVȃ?Tp*MĐ mIX,[t &j'T>Ԭ8Xq +|Z$[OK6AUsZ Z$\3gs͵bϮ}%[v!! BzJ4 1/pFyhϦ^kШs. ,M S_*内5@x2A<\ 4`lo(Kpz!(AEU`ȍBpG"K2٤OBS""Wb)e,YbQicYgb%k^"lsYVڙ'#pקZ"2ڨBRZbIKnZWN0[)AaY C ʨ66%/mq=tqu|cۯ ۭk"2J㡱MCVVG \u~5-T;Wysz@kzIB t H OmVs(G t[VBu87*[⡖o!Cw2+3EMAg1Ⱥ@ܯID#)Mk ܌U6Z&W{: gqb~=+-AM'q}A޴l86懯lgxAtZЌpa^*ݍ]D2CS'kZs߽߃O磟߾_?o0h@K0;  +h JЂf! $0*\! [02! kh0:!{1B"T{asUVqx%?˞R@Z!I vqBB%IWIޓRA٨Y4&8Hc DS:rf2䱎ےHl#J@)lR@A%h@ڈ- Kz14" 8'W?@NZ‘#rJZ}4J2pt! B*5x  Hb8@͂DE*4!Ͷ ;Bcy ]AGeڊ6C[ fG񱌚88`)-90~&{]3Kݴ W#rbLMZ=4{$ΙҕVcD‹N mq*]T +8 l4 X`C2t 0A320-ab,^Frv=ͣfsW] q^Ek^ry*^PN1߯mBY2k=y߳U!hT)'OmI$ٞC,DMDxOKoFx&WT#8PPDֽX@֨@YQ5l5 CzYiGWWR]ja ? MmazVh[@I~I( Av>m @lyjX$A DpaW4HIZN`p\Eb\iE!=͘!VTl oPXFY_eDKt-r< >aǚݙU"Z!#Y٨+:M٩ٰMDkĥCQ96bdY+:#WUAhSb|Ԕ@TȈja \,:چ@[ZDjE2ɮ}FrdG4ydHHdIIdJIU)V 6UM[[Q[)C+"q}x\1ùD&PEeLF R)Up(Q=)he琅IeJ8˽S$$сH5|cB8艹UJt(KE69Q_&bQ)k9=DxYN½M)QjFNEHXX ƸTa&AI?E_eZa5Z?UVp_UūfMeCJ(ښc[ %zYW]JQsl-j vn^kN`!rd\ 5W[-|>+&"'YrySavC7}gX2f:țIrW5V`#5icSrx8!cB6"e-+[$dJDBۢIM2iZ*H^rjz꧂j[KK.nLƢJ!|U%$%PVj!eїlReB9Ģ|j>IQ P!d]\^QZeGyBVnRbF^+8+jJŲ6Uj!1SMFf R^B+e&rJ`+ }_#xR)ek:Q2GCɃIm(e(뵜S^Y _Z,]B2 xb9 j)k1Ynǒ˚ɠBzX5E_ FΒWځBIao4r޹ă3!ZjrIiN/GTa-kTmLAWFz]-/2]rw qA-M-1ij4]Խ\l!Z$ަZ*o֍s a LX5.eu46'tF3U^9_xÈֶ8cnBDrhZ-@Dp:ց J?no. дB'$LeQ{6 : #ח~JRoeheopUqWptkp /oo8@Hٯϔ%|Z <\3=eǷ{0r⇈°}n܌ty%kpz8K4oN0a0mp[ͮ~ˊcxrNq4e+z~aۨ-6n!XE#4_ؑE:q&LoU1U]X̖~q29Ncbqܭ3[1%æn\/-)fMe6433nZ&5 &'#Sru%L&32NS9:M>Ehdz))$#|ce"e@eUy-*-Z:1W ^G#i5*'yB*>QT>46:P1ks:H1?Po*4<||}Я<7O7j=oO 3=;tP*=*Ht+N\tƫGc H+7[i`tN\\k})Q/.]A| fTg4CDypVV,Bdp0Xg޳cc'%q7Veinnvfk|ZXP6OKA}f3_.7d>AN\Z+ƔzÍ%x{ ?hܖF_Ex}V3g88օC?l'Ca9nā*(qVL4v`wF1b@BCJP Ì9Xc <"IDl,(Z 1A %-5=LS]emu},䄻rpeԠR$㭢n]. dR>1 ˍ{ pSԿGP@B DP ܒ#.U" bPå@%"0]7xqȹrfXmIDIPLA_B#LDN,+DxeN'\pѕv]aXe.DVrr餟/=,8P,nT%`ă6W4aqEC5qZhU8UBRo q/%'#n޽}*\pō} ˝?Si_Ǟ]vݽ`w͟G^zݿ_|ǟ_~pDi*>t$?li;2bo Rl&@$ASP7v1)&3.:'eB+pB& D-EXL$B!@6S$-ࢌg)ѱ4;` NPo<OTSHiڠ+DfH O󕶰 :gR&Ppk0ݎ2 *2@ВYU.V;D*_htW'9*@MM'p\q~WS'M͆ cicRg5QfpGfriTDŜd#,880=|9@T Օ cʉqjxfHFBh)`o^X-b hq))hWtIYrvPbeix3ځgKZaMz/+ )G51J Qh.`_D`ux cYfCQDŽ v29VGv4C^pAxbijb8DyRC"3I'UfAZ!7+(KAIfr^ Msg"fo6VIR/ĆWd/TO'@`7gJV]lkVQj(OX[H@i]$q\/=E6ׁ'J' t$7BmEՍ V5a)L 6$Na@2F7oB\gď%2|"-:cU@d];EI9`N,FeL $9bdo* a\3!(gմEN8 IQBCTAu)Lh`jN1GqqZO'F6unnZmҔRָs<#g؏ Ww@;oJ9hUWL5Q/aE=rD bzǕWyN)`[Tզ,UScډkm5{(j(%f2Bj, 8% cBQP7?p1F#$s'6`CCud #D"Yqu]Xp$HГ!P痯m{`Oַ@Ï~;\X Enr\6׹υnt;]VJ+ 4CVrn:^׼bJvs&"HRkZ%':Fw`P,lDhA!Py`ϑL=tTK5n$},8 ,T0+j{,V5/,rJ^1F ^YQ ]zV7WSUee@ŽS_V :7\VjP2:3f'0Lw2A,`sĘ,ӭ# udّ`y N ɸIkv;T(c. uB |$lVdo{Q`ՆQ<)3Ѷ#`boRˌ Urt1w[[.!,}ݽW6&6# H2Iz^e\' F/ Ecd^^T_+ Hs̋FjNm*aʼnJ:(D*Jb5.Vd"1` O'kvwd5*i[\3}71_*c:J{ڣV4*(>xz.z\b$Ʋύu}{uwKq0ض7Oѿ~hawf <σ4l;3i>T$0!Q O*@:? @|04;a@8- <ɐhr ~C4±Hȡ 2,A҆z.y r  1փC ;Y bv= #rB88싏I:,I+IJSiڑ@dmp8<yʊL6 ]J(FmvR uĔb47y[zJwº)K=lB_2CLK'XC@ 0$Ar=3% AkA>x`l.T|M2?˹t=>N!-,@pH,HagB$ШtJ1=GJ,=ynÖ|N~ϧS`!C lC Cb aLa R^UL(O !NB"P p}vƇ-H ѺQM`YCMG$#VJiIH̭yHDXM7 C커HS)(y`B\B@,0tA8-(KGQT (dF+J R-<)}2Eؤǵ.|`깩 ve=)GL,C64;GĊQPGj1/3'}P3Y&ZA_b0Ꝫ:ܠ%B"-B S kUQ^sf#o9ʞlaFMꀒw)Z,Rx"ە7T|UbI[H19pn:OF5bq46 AI&Rf >dt}9`?dy5We^4:vn*!6Uc%(~tťWQ(ViN1ڌ~I3s+HHqlH?EjArSY)n'xx_2ށyʆ(epsr4WUBA]SyyQUEUI* p2!|R^hˤw^"7eTz_jPYm vvL8F1B]Ad W]i賹%*X)X,r~# Ld )Rd"8 qHӥ$!w´- %%xj84IU'Qޒp|{Ŷ$w9riqeWJ,fC!b+4l 13-DmH'L7PG-TWmXg\O;?^Qw4OoθO\PgE26Kfh;8p>RA1a{\{9;|'TTؾ-]'PΑӐ\NL#d J"_&lgx Vtj{ҵDL-QN=O/%K-jo (T>+]O`aFZV748 MO dH,5O6y7:i7tDassA(0Ga Yq^2МzP4"ar,'@OUIA 4ZdARބ.e!JG]$N0aH/A!b n aQ$#Բ^!K!!?-)wDsZK(yXu1 #6̈FǙDМ9ifL'ݥx w'iXDL]oԪf@=%Z* TT jI%&WR"{IWDl]uK5Q8]"e[Y90Ir\zvwC!f9 ^`KIl:a@w[bq*TQ*xe:n֖X`:Y,d'KZͬf7z hGدf@DId\ICNg{Inm#_+lB1 */vΞ<_"vv0nt ]ۙ6 "«%wr5#W0i#} M8zsE4yQ| 5_Fe&I[Rqp/'/1vOJ-4 JC$ݻHTulګa(AjC@|" iJ8&V8lTkjiFX=&oD DPA6 l>+7ݒLΌBuY+ka=`Tc0~2vJےuJvZaM_ P|~(򇠂C!@g!ӘC `'nZr#djl @mBUr]F(R/@:_~{B~7|#8~Gn!PWe@TpcdGpCב+1)dByGGf1NdVHÁyP~'|DžYh p5rfg2(g#B'.WmNQcmlIDLG!#qi`gVhY ~{F$ %Vg@!gIDjjc`Ut 6s(LEV_MDK^9THYh~7yUc8]5j(VmDaeoGmv)4{wSNw8b)[8|0~]w1#do$pKtP2!P8)eC,&ARpp,y(\GyBp")62h4-2vcTTsL.tIb>L/p b` Zzs .I{d7;LđR3YX27Zt^kPrdYfyhjlٖnpp}x:X6rXX(MZ6JGG8s3ab8@ f\OS\\#v '{PL9l]Ayf0arepf?? ҅xG}1}bK#Ts3%X1&)v+)=5?S]0wg3g+<,1+ &t'SlYvXqQS9מ; NIobo=&Щ4h ddFW4 N )PEBD!tq=Hg+k!Wh"×8%FKGV/jl* 0hjD4(b'[+?D'PIC.id@] T\$cգEQ;:YuYW;-6]D9Lp]pEٜrh{n"0!rWt:GxZaTAHFX4jFj֡ [ivtxzeR8s!*| "7/jRpkr/WWBJCEno##ڶUpj4&aIi66'$k ;^G0pB>*N3z҅<*hF%nd#kJ|8J4c(u 6B$B8`G&C FBuEfcHuyH)Ǯ'fy;('G"Qg fz#^Ti@R!20!8ZE @9꒔TƔ1dA77qgUR+}”V"ʞV'XWs- 2}IK钩I3{]ѕ~ظ^aXKWy33I;[{ۺ(+wZ}EN™ ]O/s-  g 0u@e%Лϧ6Pqֻ9%H›0v D\௯S&4RWy}vPދS`q ;xUXAj>CAn"zSqg01$f`6,!4qV&?)l$&, .I'S"2*NM-D} )Vbdt'E{˲hz]ucş6Ddڒ$zBp?W l$ 1Hl|=(' `deb kpeqVb[e,fnPȇkǴ.QnpJr "f, >(vv#,J QQDnu;;zLJ!4{]jH5R u=nojb)‹,0\'d6+2\VlL}Bּ ʗb0ؓ0xjJG ֹ69+{+ΏCCwɬbRࣿQ]D&#b|\=iP.ـsT9shU,)tEWcQ^~} #x {$@֏[ظNMэڍCs{ zHwkp]NCrE Ӯ:&lIخ`qS /$GٕoMI$'PAYab[O/ o/s?) .Ib`zzTu;(b>i+cOu3Mh#*bv9$i+~jPO%(-k! 7]UzcȌ "m)qlF 7Gۦ0i(N vܨ>.e{lER#­»~jÇݜ ni& ::͢\E'A*ɰJNe11ЕDWlD "a<^# nOX&QixoeQ+QП]l(2ze7>gC23N; HIQ|\#rT202ivq^/A!r>"4,RJ(&02&&*$DLTC596^WMNM@z`+2Q_VHF/>9TN(0%0X7L><P338BBWk~1µ @͚F r?" 8IFK&|50 oX ctc>B C2/(YޏDZ@HF R Lwt aŬd#d 䥙c-󠖍ٺ髱Nc0ܲk;.N[nℍר˵{ nT 8k@n*ޤE0ۥi ]r+Jx*e-JO]uM MVfϹL"nCNYM-ޛq[][,|iF:`OᕨuJhbe} 'A Nzvv2f4~=n0-Z E_U/3Z)"UN>xž`v85a%-"wsĄerHiх J!&2+ ".U#[Ĺ10-nTph I zax0'SO[Id\qSwPxY"wŐ 'YÐ>8aDPTUb.\ o"0.E+cBC8Y / "2N*XI"cx%mvIn.fe"5\p٦s ""b06a&Z$iՠᙐ(%x1<@ ֎+c8rbM.dѥGZV|&:iIISud=PcF3tII%l~ȏHIh/6QE5\xT8( USUΆSUUB5edEVe5YњV Frij&9+7@HYZb*=>5 A8 4lK) fx@̵J\NG,$9WlxΦh WP,Qv$x =%G&P$gSl<ZO%Bġ}owy}| cnw7ԝ[i: ln:&$/ E$/B'tc5"`x jUּ%b)й#Cb+ jN> (H"̥òϻiNx )S閄  h&o ((kԬg J`ڣP4"ҥ4 VPtǹ0 Z-SxhkP͔ 5*PD00`WvhTXɕᙶKwKťҰ @#"k4 iM04qQL@q:0yL-F  >0&:PbQ gq481!B u# KZWdBp=tfqqufq1/q2  m 2!f!!m r" !)""1r#Q#9#1#Ar$lH$c$Qr%Y%]%a2&er&i&m&q2'ur'y'}'J𳬪kgNWq.OuJ*(c4+[+- +j09 'ep*ezrhV+I*g(npqPq|KS <,80)A 1E+N5eA43oR`gR+ 4o@VmLfbbLtTf07i@JT""KVl H҆ABlV$cf"23R)瑾!j&G@J_)d)%d%He9hDɈ.M=(wRkŬ,a +T21( EXoeLA̬` hn;)R (gbLWtTX@pL>SVl(,)!nF,VE=4Pl@Q0,,)=G ՠמL{>F!KAIUq֨#M;FdXtԪDC5 T*EfEM !Sp>bBv"sj40$AL TU'q,tsk2)rn" ZZ=% ֳ[۳ob4A>5t\?Z|'88H/<6ȎhF ',|eː ޜĀ oLxTKGU)7!G'VG@OkJa@*UE^X8 JvFSټs0 %gpqxT"ՉpuU"N1>G$G$ZU k>~,P +JbQ8ަs+SIvؑ_ |+10ECVR[ᴎ۪9V)CxC:W$@7NO yvtbjTњev`kZB€yYxUÐQ,Tļ7$T\?&J>ﺎ5. ԡ]t U*5Yz3hb5K f^Y;_Isx?8(v+5 0V*h4Í1697 eIeyĊ`Dp Cf&` fO (|u:?zs(T,g֧~-VuOzkmں)rlAڮz;[!VpJ<Z"b"q)pR9s W,r5wq]D5t+ĺs9L3#j*6.s1KD)C#@vØ/ῸKJF7 v!hǷ|ky_yic9nS9{68 8/9Ob3sI#݅΁3V *,g>Y =$!SdN<ե@Q!Dt8LuK/utL\_quAlRJy)QaScHa@ |юf-&]7#|p ßxVfT=5xSZ 2H_FwH4cdy w"%|"X"nJK\cYՀ!׾miV;%u@j|߫8*~"{)!|&~Q.>2NY e0ƮnJ?|ǻci k_GW/TmAQZ iZ=Ⱦ!Xsۃ?[nT&D,$¹ދIEFI_`!$AnCӾ#3%}OӑDP|˂K0p9ml)<)d֣X27̀%X~ 4QD8|AÌṲ-=⫡Nژc0EcmL+ :"%|B)U  d#7 : !2|?!w d;= \tddm&*IdY1 Qx@E9}YP@MVE=FbDP i<ʶj`)rbz[*O hQ7[t _2R]T?mGs|oiLQK 3Z /Gљ,[hXpb*,1`a1] 2 KHن,9&2C>j OFK}1 zVb=mS6N Փ (IdmD,2Q O\loY ҆z4LSV ]H*|H,qY$ZQ0.[D-,IK͙l< SX*GI2䎧h52RNp) R(I-nIR,A~1 W5շ;wtD)}2#yYr' wQ.N#]ti* $|Q*lLVɳŇ6cZI0 )$ė4%J5m3-|* )!/gYj '׫L3VmX̄P[kV}P/11үq&A6Qtbvb\a灍Wv[0isP4.Mg'ʬ%#´Aq'4f9mUfotE2ܽ{3C҇kQ؊G})<\b?ҩ@awhh}C oxhs*3" ͅ˘BBh RBYC a8HFȄ T6A/"rYq@l  /c&" -e0zX~Q-0$) J"BC1b0f6' #%j:&nHh  ,f" J?v'E/[T@Qr"霪(`E#6TU.y>_QJHD%TQR9y0Q.g"AJ+dFG  wʋ=+ kQ!i*8fgcTA90xi[vxȰzi m322" Mb 5!l8HHS R\v ` …x7䀘 ŞmEعNQ0nMWl1PՈe)V8:MaԘ Gш{0)'9c@,[N݄?yUh~,/y9`o #.o n!$i(l09UHM\D1ԡV"+&YϒcpLs@c <]!UtΉҪ^6j%KcD˒YtL6 ׼N&miXmUSo%lI>V[ \"̽I 4V[uQ^7w;7m{;7o!#I&iM&! :Ztc:y,E*bE  # eÉD HA)wK]TgP=D[ NzEEJP5 m5>j9r-R@Wl #(s5<5\T'1Od3j'LF+B9@o;%d@b8@[Ӭd\&ZFmJ6hn H?g"BìK*"nL2,ڡ/?bѯ>>Dqb]kIG5U]?tPS!EPL2ofs7ḡa2eSЋRn-T$A] \_C}8]EP3uP+̌=\=%%Q]EsZ^ BF[<-BQD5,P<^Flj mT0n*Z͠rX_2  }T29TDx%+ _+Q,{,j J oaBN q0 .(mqJ$1$v/k )$Ks-Hrq-rP] ctpcoqEdjqBDFsd$/-h2~n2')^ )qnxm.sr54Ss5[5cFsds{mt3{}7z3:|s;sųyͳճsw3sq@tAA#tB+B3tC]yI_?ȩVH*g432γ~, ܩJU 癏0 I2K% UtGe\Q-Xw/ W H8T!4mKIm4"O m^Kzߕ'MX`fzM~ ,_ĕʋ;%щ @zR8c5*V` ߄Hy*v*?KGW\!Pv CpNݐ^QOӊivjgY aB*|g4HNm9E6 nEip﹒O%#ˆ˱E[ VUk7Jw^&7ATߩo _|8Rv6oQK$DA_}3*FsӀj[kbwnvnc*N8MxymS~F ^Vqݘtg 20=U' [!p@IK!/4AN(q#lQ#mwx!ߓy"ExÕ~Z,n_ߛ-1 \1KmDk B88M:lTN&vV8A,+.~D$BxP|X89TxXkS(')r;6A8f?J,wyTb<9J ڧE`8_GQգKD8x*Y, 7lD#$wbmP,*qˠWvl:5K5+huГzA˄8_7~dUXei*Calued2zxU4,,Qy.55Ec R՜p.x2}ٛXMڳ}ۻ}ӽ&jHF=ku$Fr\dt_ɥ/!Ez˛K` يڮ6@V5-OB8HJ-45X T4`uoul +Ua٪[Ԁaac]q$K$`l݆(gVb<{`h*_BL=᫰% X#Hh%I@Ӳi. 1jN((RE`4?C7).V: 4j"ʚ SHJT\dlt|TtjbppP sxl|b1u,P0:9dؤ@ؠL(Kt֌z` }4y5 [j`<#8ҵa@a=KLN휍:M($Rl0LYp"Xv+8 ;e%%Ma! $va3#Xv1\D /0 dI4y ]k2 ;^SLsy!h0Qr΅eegC8s dʕ!}m,|WZ&1hRh_@c.r¾R(lkm˖hYO(q1ۋV Ьrn]6)P ܤĄ{fqYM"ZƟq9G* "\*`;& ݜ:(~x ׃0 L˩n XZ&8 "=|PCqdr/d(xıŽtbB8FdFR1):,E,0T.9Q(t(r62)o G뛋:(3$xaO M KIYgU4BD?h&pe +x ,HY%-IA0: c(L06&H oUF5%ip f2q" r Mb% q=) F (`ip0j mS† q,ikBͦde_9fgR9gwgR.F:=Vi:jj:kk;l&lF;mfm߆;n7H˾D)GVMj!fP $[>vi#9vwo?2[We^Lt1seWfh^/Fc^Oֽ6&1|TH5ʗDkyGfK2fM}Oz1$u_h_DtP` τ_~|݅V%0lH] k+YՄ$6vWyNe36BpDr\dbh IgxXDu٧uDTH?EzDˮH (b_PC 4{ QBx?.&IԈH\,H*LXti j!=`|) ɃQڔ dM'#(]e pƁH50E1 辗7h`x'bUᛄ `TpD$ˈ\FDz\ՅdJ!ibpYqWOtM.(2&XFE`y!KE4nA\MȢ,M! Y_'@QFN$B@P0e7`C" I.3 #@B)25K84(,4do3R٘3"Bt M:cI)~, i2C"0K5( RNz+ުഎЅ>;NT}斨Qgegg H`U4Sqt97M jLecbDg#HH\ʐBQ@ibXjJ@D.?e#M_6V*EM\R4LNӳSW[MOJ/ְT)`xI%zRÛF"(NiL#W^LauZkLP| ] ]U `>;dk]~* [Yl:˿g/,BP(2wdMD-̟~(2HMgc*d`=+H r@УKӕ꤭wZd6f=kpːGZruXE WL'k$@scidz<5fE. z8JC)%%S}<h8*FD9hL69TViXf\v`) F mvfxm%[cJ`Q WEcd)~|3lVAvfA8.EHUďi秜d`\|);TթBgNĝKT'.ڑ,N6Q 4 Q33Idhp& \A!JeXUP0Hb;Z-Hh InY1r$U4P~艃N&E޹9F!LfKq $T_,(UiqS%b" pmWC|\V$Vv|8;n{X AoΦw4]얣Zs;~ݜBp W$gQUL+g᪡ٝ4N\H] H=o&̨(Cp;uE_Zg s&tJaV{lY5y֭{* W ?\ƿ}uOJIs?| ʂ9O'N-ӵSx]zz[fB"hr;;OH5;-tķLF_^2*|aݐT ZA 9EXx U~8Xh :ua* 8$ER()*؂.$'28g4x8H7"r 2~B7I `*q(RR~Aj ҋR#F.'`W.4=-^}!QS]0ɰY@ ަsy`e$gE0Iu|zqoP Pex(O#!5,f|a{2c#Rp5bUU#:u]_ %d` ~j@r01)E6|r_YV˅ EIY^OQ; A5A`47:ô_e18Qe=P^ |_1Zq~c#p0GPDZ(c س6\3yi996=t0fz9$)]@89ۇW7_R;YNлX:zkG:֠M#V19a=[iٜ]51䝰> ȤZ:W_(*~z~Rǒ=e?9I||g2be J^ (eU]WA[KN+)yyUfHG$2Ym K}tIiH@p:Zi%bk1AQN7cE HZ[ȤN(l>fVBF-7qsrj(!.)"3"Um> U=Ceۖ:KfYhʀis=xɞɠʢ<ʤ\ʦ`.zEBEjpgL% I:J,hhH*W,)AfjL gʪj wjej\ʬP=Wˀ廯ipaBYK]qd&bVOrHሯ`p;W ͷq\o f;* )4  /f{;@T=TrŭBXWat6W(RmE{e#2sYR'SUɴƃ5)"Cy5gK= <9mEx{U{2īxT{PYhաV|z9ZK7Ma]E;bGh݊}[C;?sVvT @[h }(v6oe@ѳ2n؞}bO s'\,,f<̞#MJ"8)aŲ!NlJdyjpe]fkCfJe Eϼ=E|Ut^~ Nol*s܃l@(ҫJD$7%@+36J -/|-D8h*Ht7fκ rR~'fjsI}t3YNGm"X<' XhBۘv@`l!lVa|OmlZSJ^Q}JMbQD;9^`LMYv,, dBxxI*-JMfaJ,sKYF0} J(&D"(B('*B"$8* 0D*]_acegikmsuwy{}!Ĉgސ+B/y;2A0J?&\oJ"Rp<6"=A %[AFq!BtEd 5u)e ɳGW]7٬LqJXH{=*GEZ%F!+,>q EQ`חz McVYk 5@_X5EHeJ)[Vr0 XTQ̀>R"Bc='CD0p7Qo/cRщe$0IbjM%-h~{0ItX[7Y s87-̒ڌ) !e8(4#y=(얚 n@@[q,!쉏 ժPN m[*zH᥽? 38/P|C%@,q + #{Ƚ"1# z2&ܲ>))dDKM:c#8ʴ ҄R;AXQȉqajP( 0ʱ@/XjUT  .e 0  (XrLpڼ{$Ņ ލ' HF:s Z:YCyway9ӥ1vw5JyAlSn?@ٶF]Xդ\x cg֒)^:sgEbSSgJƄq4vP.,K׾Bx|^SͲGV-"giLqs>eiycn]q9$Z8;p*N>9>%Գl  b"4f 3ﳥ$o1QޒK?iC|`I'0-ЊO.tNb@# P'@ϕ~x{ˣؒAӱĢ!T&q^Ԭq804}hU+dbÝ pfV9Ft QzXd|iCaH)2pa'6*SBC2a'J#~63#Ficwl%d*PR(x+ܚ6r$!d:5lF.JQ}|VhJUrd+aKYΒ-qK]H||8$!mڴQ^.Saٛ/FЂ0J^QH/lkJŐbJN 1$0{<(=X[Z"I2b.DFI .#17{%h* "BN>UJ`i #) zFĮA<)A4sC=U B2xXpR%y8J;z4 c 84 LXpa>Il:ՁQT"LvTrC}%fKn!TQeE^n!PzJUd44:`YI`辜P++72T0uWZt PiH 2'R% ɜJUCXR V.m-(v\kskU ZvnMgݠ "]H6Y 1j4r'zN"XNF_ U5Û@GGF4WrX !oP>yIst=[6F k)|]2_"VLi'b-[C(1;UB,wZ”U#">]׬r*S$ҏ 4 ZX|iF2kl"b s2L;T.Ѕ6hE/эv!_>U,81a|un =iZDvg2:Q nd))Nwƛ0 2vA $t0.3FQM N$9efZ@LD%ih.Y @`v>b[iQR9rn& :(tN OK>ESmQ/&a*f3F)3&U2?Z rCSb}iɛ )7oqw3#4f@!Mm@+7N2v{=UlU&]A+ͧPO !he88OBJ!>;ޒ&ȴ&v`5MoG_ހƠa_`i(zWo4\mG[^嬪K+Zy-[yv?56 nUF9c4NNލ&gXt>;⯀ ngrbʺo*ed" L"2`D'&:jďblFc~ àn\k>fN+ aji~lG^R`PYN;\Odeh,l" ?h$ )Re>sz&e<}V/Ieǫ ͋~gGok|&t4')K&t+$˴ Ai> "}@Z qJAeQ4}Pqq*PyfFpgs `V+`=c" &*LcJ ~JA,ǀ8{rVLJ'}NL&'&Τ0VZ(ՑCXL$A $~pcgM8!ucr$2Lz,LB@G>l*M `j"obc : L0f!|UD kI;on"q6oƸi0 Ԡ{r=lb92/6Rٸ<ސ D\#<.<ߎ |;c#(ڴ"ͯ->/L%q2_<08S24;4Q35Us5Y5]5aDBAb3nv!@FRA+fB"R*,.s1폮-zn,B25F17`cCo%h%mq;}#n~PCzG`m.踦*:k,#-9NbrS*vDb/.*e0t88Omv( sк?)Xd\dU:q.pOԅ4*i ݋iI*>r&sj}.AL sr -4ԣ/NŮ%6s\_p'UȋC-.H˯VB+W4[p6+Zc9KAu%M:(b9 l@HNSaORF 8N#ep0ft0+0 Kee^ 1 s<\&=V} WM[0tڴƇXHTummʫ7@fJHEK(4fqe4"MR!?|w4BURi`FsJFQU3EMx 2tHNP-z'>GrxPc@q AhZ]Ќ%;*2H=(޼va SPPrJp ox |ZaU(Anʌ2c-q)k\A֎CXjr'ꃬ3hscAV&ܓx3pl3w0qEi 7r17s5ws9s=sA7tEwtItMtQ7uUwuYu]ua7vewvivmvq7wuwwyw}w7xwx/0mfSw8by7v[ Hi!4:)`MF!z|M9C ٪UfGM*}n,~};w#TpNB@.#G= Jg%6XeN 8EGp]7ExnJshyzd3d椦bģ!mncC nZݖDE9:~ڦgQF!THN3r4EKY#xMIftA׺ o!֭qVcp',::tN_(fH5OUbg[-˶nB5fl8`fmVAq [i;/V+ユ `B 8̅ 6{Ktq ě6,a F@cvt!1֓7Khy잌v$iKo@0 F?>R9qj͓\ѩ H$\4z!qS\Jdmx)/n|y}ǁ<ȅ|ȉȍtȍ\iɝ\Uvʇʭ<ȱ<|˹\'ʾ'wͼ|ټ<|A2Y3H܊w9T0`:իºҡ,猋7Xsv0Z@3e8)b4 {Ku9|[1Zxa#-msOϩi0VH7)~m2@ SEbVCM@kjlSnf^WP4B榐ݬ 5=8PA*q-R>C ߮.c]K=bFߵ>LERXۛ/uXe hq:MԻv" 0|K&G'AY[ș"d7 X"y{ze%M{6j0'!Z7w.7f] OeãeaE3P'_]e@%JxZUiFqOSϜ^Qz>/BTM[BE׾lLWE+kMq3ӞHezUM^Wym5_QuRPxuL'fg;0VZ>[!4_]A1JEcJ*к8ܾCF#.ו^rB1HpDq:d)Pc,+kr>~/1πtU5:>B=l)\,M`|AE1 2t < B(M)L@ʱU5FM ij,p- imv.) ~4cQy9%=Sl} @nW򍉇ӥp A:NyMHxO>4S`$$r L LeR er5H*IL-0M ?B8iR0re0!UԂ"3v%'D'(0,!gLTR y<_o&F)Q@К.OJmP%UלZnd`|iLkYD49ڶo]$7޾.<,!4#y|:!Q%q:޿/~ȷɣO~=Ï/>ϯ?cW1''h`oR'S}p :'vX5eHZZm(v&P#S]S*vEG3D_"tќ$^!!ht+tH5#o 6$Q;s\9{Ɓ^BuuAEAh|zERv^h5!.iKr]Շ`I0BTZ!̌gYURou]EaTXm4& 7(X_l4"h(2Ȇʊ -5߃ 0Ѷy3?N7`ѣz@T]uŽd4FȈB,J KzdqIř ;ZEeqq\A ˁ-;oKp֮♧S^,;e&Bm,2M]u'P'E[ZQ /͊e2Z<lH 2K#= 28ȍP+b ߹2MVx3QW 8F U[+EmǸrk.4ꍷ[v. vD+0f4TA,ڨ zղ; Θs^}*U%mxri<7lf* ; [c[RS^zH#oi GlT{$Ađy4D.h|] zd"K:k`Tc:k͛b/hHB4};P26!jJL1D9?H" ;=0;ʲ8ҤAaHH=lhCdm zܡ{bX51 OIGTT0[Q,bb&nuA7A& U9`0ȇ X`k$2J]n7"k7ș1"dy3 cqrgD';w3'=i{3'?}Z!H GʍC&|궇aD ΂/Ww" bD&-N@8h4LϠx'O9`{RsdK FR_7MM0.)6(x)pT7aAXbǿTǑa"yV0U(QbIHH@JiB%ˮA+hzT2I+Wg\ Q[1kȼ]x"#u!ۘYjeI q KV NUsP8 ziU8(9ampp/ U=.2~Q# .* kÌP-`1K=Koӣ>_=[zʗ3 }=Q_G8mp{gs=֕u5ylCkFi%5eտrj_ U?\WtMKKt,cUou䠦b]ߋ_˔)uY٩E 3N晢IY,V=9OMڊXeۗ >Gۓ 1N A *o e-j#$PFY&MUet!;aym,aaaab b!!"b"*"2b#:#Bb$J$Rb%Z" H15 %( YCpiGن߼)O).^Ip$pЃȢHR$n=aݞ=ALLHiTkyp5ӚHg'$>D̹A(FxcN#?:j;2ІZ \O B-(ץ-Z/Ƥ`QUZݣ>Cc66B QL!0D<y@δhNYXu?}$d/8tgh}-`N-TBvPO `DH(R.\OPa(6dmPTJ`APڃQq%;^+W[4%>I!!ى+@H RdlAU1vLV øh'54=يJ,&*H Y萋f GLe0B_0cņVL%ʖ,>H.f=f!buurw¦CxgyygzzƹAZz qbLohup{^.6@J)$0JmjS SkHpⅡ@LuwoX!C_D.(}q!DB8dhw$ް9^W*$[nit#}u%0d.ygdبXI dŏS;&WBO~Y[(a(E `lmO<˫H}&}F RBC XE@ecvkR4!# RɧV1D=əJW(Q~|CN :9E[XpԴc"eSrɒiۮz ̩ NWLR%GΪs+@j:T<XUЧC쪳i)ⴐofrh/&)| (́cf曊dBa N-Α $kkr֜=jf^kׁ٦8k4nXfs)h0 72Atf/|&ITBldMVtFnbʎvb-z0׊mؚ٢mڪڲ4n(G|BNpGyhs-2xd2J/3}zuJa~H݊ ntn9**ȩ.F9hocPRr, UTM, ٨U.7zfکIK!܉)iY4)\&スA [,I&DCkZ8oC,aRAU`>-䱃R++)q)bF©ҐRń0n'Q#l$ͰѮfih,) AvQE("M4Vq@MDXĔ (+%ŋ]O'c^j>pbX&닽,T@e SnKF)XЕfLvp2/_L֭<攚r[EVZ B,i(W. %&G.m\DHZjltCZf`$+Zau0tE+>+8Nrfpnq,M<1AobO/"Mmz"! ?"=>CNƶ^ tP@ ۹e3?<>?CcMpc1} @"ȞAޱR1ee,Hn/H *DyFS"VvNO>ږTJfh38|!Ŵ 'IL #s֢/AJY_YB^Ijr[Uu` `vav<-UK^^޾K7~bH.f.[ⴁ9$nJn/mj6UKjCh|ukX(͙%FF2nĢHƁZ-6:G/rh#xo&o51xvef!*_N)0lm&α&nn+!67OX)G72Ni)4i~Q&-}4~8inG2ԟBCGEb1H0ACv`*7N3c1)k 8AxT ՄRE*1Nd4u![*ez/##[LZ93&Ww2}[9lch9I`^fw.!jy/+A00;?+2y9Bk9prbk9U8-qsX<=K¾Enj @IYA{x 4/z<0![[";K5C-tfլ`LKzMs>+n BVO5/ɜЎW_R#mJ(m|\{g\dtJ0…1F31Zncy5_suh6za#||||b?vބJ:xcx{Fg.T/w[o wr|aT &~|7mT{pzR&E.(r/tDX'JǂcJ,wC 3&?44?K;L$lxpB٫00(x0H<ۊTY%lǏssܐ 9Ϲ2w$Nσ8M9xjowy8Mi1AՏ &LhO4 ,q1}A1q`L`pg83DG||F-l"֔q6'-#ĭ@ ; ) &6EKˀF Ҧ7 N+ دԉ1ġ 4%G#ZQËպgڬ++EY@ fBCuvw- X1)[?#G1֚'4%Bd҄+$,UP֡4HR!R$K,cl:R :i@NAȑϟoQՄ̇@&YnTD0zW)ja#&@R ܊ݘb1KMė3ݟP_3vlщ-\I+]ZP.$(a\L)op P ^*I @.rBSe `+r0WI2 B[vjt? ګ!(G!?G̔h{wABea\yf$ŘaQJ6,+͜aBlh@&E^*22t,P &G>%mrbJ,rK.rPKNh"LBsM6tM6.83MsO>|'HtPB 5PDUtQFuQH#tRJ+K 03턾+zjc s\8dtHWr /"`)`XS"qGH/_TsJ\h6rw, #LjƤROWDϑIXvRfmZX̣1|Qj"*^劰#k٪R/aKM2եot$i_bP- HLRezFyR*f-Hh4^8O{53=SA1a6 #&:4\b#4!,@pH,H$q0ШtZqP@hʝ<ݰxLNzn|N<64b a!DC#^B !JWC(YOeFzF}bFBRD'[ H ˑPaޮ } V"PDV$&V l̠`@p^#aDB4l CFɓ IUZU_6_>0S7P0B뒲 K˘3o[ PsFѽI9`őa -BM ҘrDnog#`qR+_^w!1RKׄPc|5 `ȊDZy}҅9@FHTD.'0q[]l-? *~虖f&3wa;|@Bm,K 9^<;XP زCT`mDhyD0c$}3t4YXuO9H&wR 始T`NC x5A-Ԩk˙gfH[KB | 8t7m6b`^H~RFl&\]"D,.ed\>J0pBVb΀Ay, ꪱBs8sO 5Nxm`֩tk8LN "t  K*b%t&yG&Kin!'`=Z! MBՁ?pFmML9A44&UtvVꓠLB&ǐ!x)WX`IZr^ 0IbL2f:ӆ%|44.vo-5LknX g8 ?`~q)qSlE0.(̧-ɊMp%,IUsד$NjgdAW!?ƀWa"6MT I|Mi> /hbtQ?ҚԘNw*\@OJԢHMRԦ:qz@ITIqTU b´FQ/H&Vxa$)#9IPFbȺ ;Sh.)! "ibb & ڤF(CyXZ>E?Aj- wBR N&( ibP{$'`#{ U1,ڬV`URT}*հE~r e0v0E  YR޺ml>f\}CerVBY&@L*82g]5Ui LI@W (KwA2ŵi:cKǬh jUw€7fQ[D\:w!p0h0.sɣ@d%\;bgTUp3^,Ec .rA#3Wv:3r0TR%/0u][ߎZYNmFݝ•ݣ H]ȲE^Aj&?z`ѦYCC-[=}ܧTzFvh$b14feQ19чܲ/E HNd8Y*N ,,:ЂXÞ32E-Y mc•^㓭쮪Br/z]y 3 E@<+MHu)Uظq"B;2 ʐhKwiGvVNxϻ)հfWԊ w&{2u|cUt VRkJT%sbT=q+WJ5ům|2E@x?`Uw\/~ͣZ½я1#۩Z#-V&Pb2`5mU4_v!̰=i@*IdFP~.Z~7A#s '#V&^:`t196aScU^P&*_{F`VgL`.xG &k<1:(Ͳ1D@^\s`IȅRGIYpD{Fb%jlo6aܱgQG64ftB g>&,k FDdk6@eԡ}%@@dllEYށR(k7f AfF QeWxhgEчuYjqҳggg|q-$Tzhsvtt}sg&5V!+\c_MagXc1,9erxF@a.'p"d_s#lp @2zhz@_O d@GElȣDv3K)g9GGdx2KeXDl DyH#լPklX;Ǹ  i(]?]@:d&1ȣJrXԊOe$|^nC )jcVje&0F ɈLY@ppttcs;Ze28sn;z9řZuz|"HjÍƧvSAܶ-fC3+o0XOvm6T`Yj8Ks/AjWG>KYv{x#qAð^y*!64vMAěFEeS=ֵydrMIc<™KvS(ҽUЯ3tpU|;ʥe#asOYj%%L% "<$\&|(* )d¶"ùj%ys7%+L d5[GJ6 Bxfgozذ}<@DZc١A"jV&ڃ#6AhvUaaGq+:3oේ^\B{/1iB;In0[hiZcnd`zi2x3[#^Vtl734 1DP%PD'͢44eت-/W8;8{:Q kfSbnxs󴺱,q ȷ ,vRcp<$ZÆ#Wj q {ȔLѴ˴H:V%  rп6ɨ8 =.%C9>1͢&Cؔ-"Kҧvm|{Ps&s%_<:3 Dzb d! (;37EWD0- Ȓ+s+%H .b2;RązBa&XDIa+Tz`+xՍ kͮc " pcq'YSf!X#ROsP\= IH#Y־0*^Z=Y~cDDmuRv,CŴMkl ]pQ:ܭ@MKuum%2 M- cߐt%]'߯TL#֠1Gkz*lP,tֱB`&ccuçL] @ -!_J ~(sk1jF1*[I-"%0,Gkhz7H3]kqZ(<9'r'TZ\dI4XL]|3<ޘ<ks44̽Y8ABjP7aU3D.D̀cL &4&gPDkw>FN@~.86(\7"x'P,A0HDڤB/"4|gU'L3Y0`A. ,P2߻4T{%D) ( e$uc]1BliJL>l2;XM]Rw‹b 3;f&)$MV>myuP!$R:w(fɴ'5/sj# rHk3>8N`ѢhJ l. Q32HYcxBJ\8裑NZ+n駡έG+꫱Zx[.޳N[n[[\ UN\o{)r!M9ϭgAO]Cui]"̼߁7 {#䡏(Ვ^S^w_/|>_O_~ߟ_@h2\!a[~ENC>jƵzrA u Ya $Zԉd]G! YQ>hi(yha9aOF@v toB$ÉTe97P|Qiˀ@PDcLIJDĈ2 { @Qİ*<_PD  8Jǰ T\X*,?D[aF1ɂ@g2 GpcBF寍2K-c%fĐ3D;Vi!sD,* F'/% P4F,qYP`&O&ɜpK|A>Vq 4񡉳nbdD#l 0 " z`[jN1U,H;>]C9짛Jaδ;",Ѐ@HSYDQ!% „tlW ̱9"..=̠,Z"q(<~*i)C(".A/Ju*܌-Rt6?kj#-峉=W 0ϫ"᧤1SD~rSVxxUEiEh+QHgwnW+|_%},#gH݄ۜQE) KbK_6kuWORK6>([@s@i-տiIwd["+<'"v&Zw:a{ Usby@څ8Ōy5,`H_m TB(#i0{ ^j(fSUʵY^|*e(leI˙"x4.iƕ8|N,})(EY[<Ҟ} .K9RژOf1+mͦ$<' z N Rሬbsߍ{zLV#׼4|nt%w{Q[St*TV+Dk~#;>`ws(@нCowzs8=rrYܘLFC%㵰j\BI\f²o'Hr@"\cjltЏNX8]d.J`txVkb˻OnR(`#  |ʀگ'M6P2Wb#`d>cdP(vi ɹ3Л>.:) F%%͖Ab%.(p+.e<)e #R Ok%mH*ocDΉЛ,(|GR<@0%: Qi1q1 ^hFaR.҉BHnH Xh 2QC.ȎN@>Nd~g |f R(N?hh49ήNL !+R! m,P"AE D7 (1=Tcd! zN ~B M$z锂ԚCrhaidhIl{>~(ib^?0/"BR{!/K_BI0QEn)bҰl2 O7Ilbr.' /L,&g%JD¡*oG&R!i#*M lϐA~rX6 2C8i@$nJgHɜ6@V,D8:7dϧH/Rꖾޞ`f~ypPRQ6s WiKh*bVK$;,=|.E7?_Jd ٳ=O~M Xe 3kP'õjʹȅ"4&n/t(s?*aC*Xi4wdtFq UNKc0ذߋIs B5xpA}m#5?Sϡ5\,PtؑN\2k(0슷TOFpUt O4pV0pSHcL.! O"RDzr0@`&.N8j#U@P::"YW`(Lf=I\PpVBdLW/QE+jIL AtVҢ&M%^"0a4PBo& sh#saK23Ն0- 0e8R0/Mxii6jvjjj6k2)^!ה+*5Pi` HME iJfv6 xu<>,o`i{Ȗ+%)?3HmK2mJ,Xq-;n2p_jB <@psȓ!^I@or@,iN>Ksbv+7DO,}v%F--_2M!4r`bN`lO0֊\Aϙ,#z%g/V \b]NFُ{4єc19H% HAuQoT+]dC+Uq(05,dxKds-e*AxnhTW*GoMW U1wO5U8ˏ77P.OއRws+%{pR|ITdg2o`MPXU`%ńU ]Lb U Y98,L 5~9=AHjAu*o~"y1)gemuy[|݃{{^ <* H{`:uvllaį[]|[;;*4ul=埾ʣ>amaQ=*B=F.d2{ӗ-;O)p >W|ޝc\[oj/4CCo%#8Nÿz L7F泼пS3hVF0(Ήfhg( P(Sôme)Y@h鼇cI=՜\˾˲lu!q  !2pQQL@D.$x6(Ϩ0U.LRR2 "&*.26:>BFἀŴ ɸnm =iab 5u= M Y^i-0HZ_cgkosw_܄`jrz)Z8L8Hʿ} *t(ѢF"Mt)ӦNB*u*ժVer!DϢ X6{:-I V#y<9ۯOE# 3CS\cԢ5muV\se^r >@dYFfUѧT]sMN>HVJ:FP!u$$!D#BbuXB#sbcPu~xCeH!Li%+]ׄp*&o'Ͼh+J8"RoI]=`qjH$7 a΀,UBGc@"Ӭv@[%jljV?MQ}-\TKo[YT8 *~H%l  ;Iɴk=@gA⊎ SHqSB\ 8PՊG, 'BRAUtw.32NT8(ZZ@x&q ]I*„fSBR T+^WxoB1;KL?6ua<"=du \[ ]0M=9e@\ADAV@^ȕT8Ɇi>uH۸e=ƯˮCl׆eN3D97H;2d ^D,-Q|:E< ' 8;>Dk[Ny^1ʃ41zq&5asI^G𼃿o {e8Wmq0A?nφ/lv0FߖY>+rTvQF=ڷ }t==cZK^PAULiH}i"?-_j=U^9R]_ -Hddm% veYHfMgh}RVl=V%/Q`1XrxyM 堏 }IT~0Dr?X%;Jh_B@@*埏B:#N*ؒ0l`U! U"!xeEÔ-U2HO!iyH`YDlU}n  mYA2.= aZhP%^XR ͓E2 ZBY{iʯ"@$ DLx@ J[TՑ@V\%d%m `HBIVE"aFrdGzGdH^3I$(S"|]ƤdLd? mNd"ٚTq刨1'bLO2eSNAGH/M`UyL:Vr,u"_aR^LWeZV72] IBmI>aV.Ze^BTTeRyu[Yaa$"%K%rGi"]"e2eAQeZ5 uH~iEjfkkfllfmmfn foogp pgqq"gr*r2gs:sBgtJtRguL E]` @u؇p(L5x'x gI'{g]lPMk̀CJ  e|'}j}'v}ȁ8kF&4$((0]9:[ |zIh|J ;M/@,@|G2 ()!Z@lgдCN H{'2̇⑈  A? Є&XlT)[lAH{` i i',)m `(ʀ p' 0΄&h : yd' AXi©NnN b&}jjڪda mCD&x'e'Tj8(èPԙRdGr &c\ Tl6ۗ Q DB'̡fg .x4dJxk ؕ5kQ hޑj Dl.'^D'9'd3AvDYYJˆ%< ,c^qPG$eoQAz=1j-$Nb㉞FrܥN\VM|,g6IC>-_~M_ @)Y%Y#8yyshf)dŕ\*"2P0@͝IdaM-bB~np閎(i?w J#έYʞZZoyfjP; LȋZv+%b2"׾Mj'/_]3ě(Qq+WP"+dDK^amvĶކ+k覫+k,l' 7G,Wlgw ,$l(,0,4l8<@-DmH'L7PG-TWmXg\w`-dmhlp-tmx|߀.n'7G.Wngw砇.褗n騧ꬷ.n/o'7G/Wogw/o觯/o HL:'H Z̠7z GH(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` H2hL6pH:>x̣> IBL"F:򑐌$'IJZ̤&7Nz[!,,@ @pH,Ȥrl:ШtJZجvzxL.znZ,YctTz|KiH YohP DFGuX%PFQDsCz{C{ B C$DžD"# ¸sHfMuڸ9,O@OHk%(ШD AO, +\P!ڝўѣHtR$ɑ9se˗dJuesd)5pGSDqUS!cMzaZU8m6Ct[‡$@P@" $bqD"OٲbDCy˨34!UoRsi!tf}@nΫޚkܘu77g .BE SCq`OEx*EPҚ+찹ĞFVPj{7ъ'X|I1[ [8j L3)+mH*9K)nz{n4[N`F4y妉jwm\pak h#!jh:Z|ı,,̕ı4ci<8,Dm$tG7P_QWmWO4\wuZ3dlfڷp݇rm\Dv(xK"|n˭xGNWnyԔ_Bg砳y褗.覧z-A!', &p@pH,Ȥrl:ШtJZجVz۰xL.:E~YN;`~gm]kaze~GUd[o\cD $B(  B!B xC !Cʵ B C$媛[C! Ω#B b%Ò=HH"AඁQ2B.EB P$"!Pؐ? 9$&5r$1N)@D1 :"2J3OTjɄ  iLoھ5$rḅLҥسCX Xc[@͕d-\C2M@ܵn 5 a#KR!p@ԼΘ6X2Bd`  ]lꅬ)OEnbnK Qx\gk|i:/|xtǦ kV*>½&<Oy.vqQ};(Alxg$6Ş:7AiA|l@nfU6$_MD2392 8N,YLK5=_3@DE(&ʼnJ&IW!)P"A8#6eLn`6edi*clrH! ,v&PgI8m'd)*pltpp&PT ረrHRgxI0u=l5Mhˊ H =ϗ{u@<9! ,&@pH,Ȥrl:ÀtZجI =LJؙP6run]b4~=E yK|QqsDbB f!Ez~DtuDEE ECDDBCpCE¹*]՘ WV "TA>;)@2\ධbi,"!R? / I2Q(Lɒ !,&: @pH,Ȥrl:ШtJZجvzxL.zñ|N~rBC}Bw™ԇܼ &\C*\ȰÇ#JHŋ3jȱNjB ɓ(SL2rʗ0c8bB$Da0!"g JhGrJ PFJJFFa)֪`Ê]8h CAkε*ăD|:-\!" &*e$$ ")aĨS>` D )&tHE'7P@!^WKNL 9m tցY73ȀƙqtO]lǝx`[Et5E(Ƙl d7Z]ZZ ؕ}hteMИZlA`6(pWuu@<cKA&$UDF .)1u m%\ve[~)! *,U6@pH,Ȥrl:ШtJZجv; x^xL.z}C|AqsuF}N|YtCvDLkn_pFxzC)ELf"~WJgGCeDa[yDźүRεE#ػVQeB cGD|Crb !@` €A 03!=PX. Uy`. RC19PH@GR̘G"ID"U9S^*c'(ĪA+[ޡl "Mi0$K _ߨ o.\U|x]E8B D'Pwb &&W񠝞uCt c NtpW*אLlzk #fƸ"#(b A_?[t#Wr%a@3Lcp~fT!w|،1 G2p5a2xK A:"h܄6݉̃~Pu| Pe*8f Q@/n $ *r4&HZ(b`ajf"ur"〞 .Xfg2QyN'E3ShXĐf{INJhc29魕٦mf9$%.#_*A%ĥ. 6(ZP@"ۈ"~;ghdJ%W}J-!iRky0$,&ίR[ #@6Yɝ䉋~<.T`[aw~m^XP㳥b?kO@+# tz^IVU]s7Dl+S)MG1q8}¾w`j)@еivKR,4xxs\i8N!]m)j9mi{ '1!6D5[Snٮ7R_/?G/W_|gw=A!!,6= @pH,Ȥrl:ШtJZجvzxL.znSC|N~rBP CEKIG%LuTE"DLKGMû׍CƤJUzC(DF)H i„QX S9g[w3jȱcxB&H!LEU@$!!70> 3O^HѣHulAȈLil),&8" rzRUE&]˶۷qD;W$ dgL!G #҆qD2RlL2B(~ߐz*5R3Uy !:? /4rAaUfJ! Wkx7ڦ#A!V p˰eE|nsE)HssgTZQ#YYJž5۸ͻR7A!,F`@pH,Ȥrl:ШtJZجvz0r@.zn|N~_d~tgoG|kbD-0G0\./a >:r" ][Ȱa2,43jԸ z(=/fP)* B!.x|OFz9FțO!䍈,pl!1G4xj(L;DXcI| K6I5)4鐔BBl @G|kDqG{xAc||uV-tO#x !QS΢5VbXPzw̱_FDNͼyʑ)O~ĨVm][ 4'rWvξڛ[TStѲc D 4z% 6x؂FHNC<(jC!hv ($h(80x0ċ6@\`9O@\f7$VI D)eO HpTAAEYy@D M\bm%!X<\MT\xD_ €7!@VbyZ p g,X`&h @eh  مXf: I\tIR8Ч 9ZհC7Sy'<]+yF@BX(Z| X #K޻8-Zn 0skAf+c.Qi#A/+. Ph$+DTBWjM`ha yQhJI*uZ%NnzTrs|DIO`1+pj΀6 IIád亠x5m,YkVYNjͪvo1QDzp@׀,Nݞ?sk&0dx.4rs[r`$g4ځ? [ySJ5jo0LgJӚ8ͩNwӞ PPCa N}HPOpbcF:T#- &' @s'$ i U>N"Lk%؄&[dx$, *dl"ù٪SI0F/y$t7ыTeJ#`Ncfk*JZ"׼Υhn4ۯ92q"spլ4{==2W6˅5Z.fҺ䰬EݵULۺކ0oc< ́*9RXN(A-m}aTP'h4{jM(BRGxAڪ͕B4ɵґu6_y@DCJp6trU0Ơ¤%qr%\@ɿ$A||9jls:R[5̈́,}NZl# y-DtBX%߹o5;@Uu.:5?rֻMQ2r}s(-+`u8頩UVen3 *[ tPMs3 m+-b=\ fV}֯Ȅ|FaaEH|^ f~|El"̝&:\7lm9/Oweit Zbh('{GOқOWֻgOϽwOO;ЏO[Ͼ{OK oN_d{2T$/׭ duj E'wM rQyU ZH RY!`#L 0qms5fuJ4dT@)_   :,4E!SDp\OPJ%h[X\sO\yǀ؂MZV-r'fb 4VUFjd=Ng7PH?|Cfb__ΦU'!A(*&0j;mbNuI1"ZscArTT8*M2\2_x53l9(lH3nH^82qUX*vŊ&= @_f,fdr7n(lVdg+K".6K6GSeU-\Qv(b;\0"=)4pchKW+kEr7x!C֣U9h1 wBg281~mβL=@Kc%CvJuwHh(AvNn>EUE)6js*4gT!t!Hj涌;XLLrҍʆq*5MR1ISZ?yEpȳTR.L85؏ `_XO7͘r3v)?7)EFtz%yRPc#ۘ1%uqPׄ]-%ZbfUe__4p4LH2(e)fؘؖ5@L-Rx ]8/}p`l6~WܠÛ=)iTGSɩ˩SYyS9ٜ֙SՙԉiS4)SY0uR깞)Ҟy"%29"y!!d, \ڋ޼Z;gotestsum-0.5.0/docs/running-without-go.md000066400000000000000000000011731367230725500206200ustar00rootroot00000000000000# Running without Go `gotestsum` may be run without Go as long as the package to be tested has already been compiled using `go test -c`, and the `test2json` tool is available. The `test2json` tool can be compiled from the Go source tree. ```sh curl -Lo go.zip "https://github.com/golang/go/archive/go1.13.5.zip" unzip go.zip rm -f go.zip cd go-go1.13.5/src/cmd/test2json/ env GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -ldflags="-s -w" . mv test2json /usr/local/bin/test2json ``` Example: running without a Go installation ``` export GOVERSION=1.13 gotestsum --raw-command -- test2json -t -p pkgname ./binary.test -test.v ``` gotestsum-0.5.0/exitcode.go000066400000000000000000000016061367230725500157160ustar00rootroot00000000000000package main import ( "os/exec" "syscall" "github.com/pkg/errors" ) // Copied from gotestyourself/icmd // GetExitCode returns the ExitStatus of a process from the error returned by // exec.Run(). If the exit status is not available an error is returned. func GetExitCode(err error) (int, error) { if exiterr, ok := err.(*exec.ExitError); ok { if procExit, ok := exiterr.Sys().(syscall.WaitStatus); ok { return procExit.ExitStatus(), nil } } return 0, errors.Wrap(err, "failed to get exit code") } // ExitCodeWithDefault returns ExitStatus of a process from the error returned by // exec.Run(). If the exit status is not available return a default of 127. func ExitCodeWithDefault(err error) int { if err == nil { return 0 } exitCode, exiterr := GetExitCode(err) if exiterr != nil { // we've failed to retrieve exit code, so we set it to 127 return 127 } return exitCode } gotestsum-0.5.0/flags.go000066400000000000000000000050401367230725500152020ustar00rootroot00000000000000package main import ( "encoding/csv" "path" "strings" "github.com/google/shlex" "github.com/pkg/errors" "github.com/spf13/pflag" "gotest.tools/gotestsum/internal/junitxml" "gotest.tools/gotestsum/testjson" ) type noSummaryValue struct { value testjson.Summary } func newNoSummaryValue() *noSummaryValue { return &noSummaryValue{value: testjson.SummarizeAll} } func readAsCSV(val string) ([]string, error) { if val == "" { return nil, nil } return csv.NewReader(strings.NewReader(val)).Read() } func (s *noSummaryValue) Set(val string) error { v, err := readAsCSV(val) if err != nil { return err } for _, item := range v { summary, ok := testjson.NewSummary(item) if !ok { return errors.Errorf("value must be one or more of: %s", testjson.SummarizeAll.String()) } s.value -= summary } return nil } func (s *noSummaryValue) Type() string { return "summary" } func (s *noSummaryValue) String() string { // flip all the bits, since the flag value is the negative of what is stored return (testjson.SummarizeAll ^ s.value).String() } var junitFieldFormatValues = "full, relative, short" type junitFieldFormatValue struct { value junitxml.FormatFunc } func (f *junitFieldFormatValue) Set(val string) error { switch val { case "full": return nil case "relative": f.value = testjson.RelativePackagePath return nil case "short": f.value = path.Base return nil } return errors.Errorf("invalid value: %v, must be one of: "+junitFieldFormatValues, val) } func (f *junitFieldFormatValue) Type() string { return "field-format" } func (f *junitFieldFormatValue) String() string { return "full" } func (f *junitFieldFormatValue) Value() junitxml.FormatFunc { if f == nil { return nil } return f.value } type commandValue struct { original string command []string } func (c *commandValue) String() string { return c.original } func (c *commandValue) Set(raw string) error { var err error c.command, err = shlex.Split(raw) c.original = raw return err } func (c *commandValue) Type() string { return "command" } func (c *commandValue) Value() []string { if c == nil { return nil } return c.command } var _ pflag.Value = (*stringSlice)(nil) // stringSlice is a flag.Value which populates the string slice by splitting // the raw flag value on whitespace. type stringSlice []string func (s *stringSlice) String() string { return strings.Join(*s, " ") } func (s *stringSlice) Set(raw string) error { *s = append(*s, strings.Fields(raw)...) return nil } func (s *stringSlice) Type() string { return "list" } gotestsum-0.5.0/flags_test.go000066400000000000000000000016411367230725500162440ustar00rootroot00000000000000package main import ( "testing" "gotest.tools/v3/assert" ) func TestNoSummaryValue_SetAndString(t *testing.T) { t.Run("none", func(t *testing.T) { assert.Equal(t, newNoSummaryValue().String(), "none") }) t.Run("one", func(t *testing.T) { value := newNoSummaryValue() assert.NilError(t, value.Set("output")) assert.Equal(t, value.String(), "output") }) t.Run("some", func(t *testing.T) { value := newNoSummaryValue() assert.NilError(t, value.Set("errors,failed")) assert.Equal(t, value.String(), "failed,errors") }) t.Run("bad value", func(t *testing.T) { value := newNoSummaryValue() assert.ErrorContains(t, value.Set("bogus"), "must be one or more of") }) } func TestStringSlice(t *testing.T) { value := "one \ntwo three\n\tfour\t five \n" var v []string ss := (*stringSlice)(&v) assert.NilError(t, ss.Set(value)) assert.DeepEqual(t, v, []string{"one", "two", "three", "four", "five"}) } gotestsum-0.5.0/go.mod000066400000000000000000000012271367230725500146700ustar00rootroot00000000000000module gotest.tools/gotestsum replace github.com/spf13/pflag => github.com/dnephin/pflag v0.0.0-20200521001137-0f09ccd3add8 require ( github.com/fatih/color v1.9.0 github.com/google/go-cmp v0.3.0 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/jonboulle/clockwork v0.1.0 github.com/mattn/go-colorable v0.1.6 // indirect github.com/pkg/errors v0.9.1 github.com/spf13/pflag v1.0.3 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/sync v0.0.0-20190423024810-112230192c58 golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 golang.org/x/tools v0.0.0-20190624222133-a101b041ded4 gotest.tools/v3 v3.0.2 ) go 1.11 gotestsum-0.5.0/go.sum000066400000000000000000000077411367230725500147240ustar00rootroot00000000000000github.com/dnephin/pflag v0.0.0-20200521001137-0f09ccd3add8 h1:7JFEKdSKf4LLYMqIMxjwffbi7sdmW+SQU9Ec2vETFHs= github.com/dnephin/pflag v0.0.0-20200521001137-0f09ccd3add8/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42 h1:vEOn+mP2zCOVzKckCZy6YsCtDblrpj/w7B9nxGNELpg= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 h1:YTzHMGlqJu67/uEo1lBv0n3wBXhXNeUbB1XfN2vmTm0= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4 h1:1mMox4TgefDwqluYCv677yNXwlfTkija4owZve/jr78= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= gotestsum-0.5.0/handler.go000066400000000000000000000055421367230725500155320ustar00rootroot00000000000000package main import ( "fmt" "io" "os" "os/exec" "github.com/pkg/errors" "gotest.tools/gotestsum/internal/junitxml" "gotest.tools/gotestsum/log" "gotest.tools/gotestsum/testjson" ) type eventHandler struct { formatter testjson.EventFormatter err io.Writer jsonFile io.WriteCloser } func (h *eventHandler) Err(text string) error { _, _ = h.err.Write([]byte(text + "\n")) // always return nil, no need to stop scanning if the stderr write fails return nil } func (h *eventHandler) Event(event testjson.TestEvent, execution *testjson.Execution) error { // ignore artificial events with no raw Bytes() if h.jsonFile != nil && len(event.Bytes()) > 0 { _, err := h.jsonFile.Write(append(event.Bytes(), '\n')) if err != nil { return errors.Wrap(err, "failed to write JSON file") } } err := h.formatter.Format(event, execution) if err != nil { return errors.Wrap(err, "failed to format event") } return nil } func (h *eventHandler) Close() error { if h.jsonFile != nil { if err := h.jsonFile.Close(); err != nil { log.Errorf("Failed to close JSON file: %v", err) } } return nil } var _ testjson.EventHandler = &eventHandler{} func newEventHandler(opts *options) (*eventHandler, error) { formatter := testjson.NewEventFormatter(opts.stdout, opts.format) if formatter == nil { return nil, errors.Errorf("unknown format %s", opts.format) } handler := &eventHandler{ formatter: formatter, err: opts.stderr, } var err error if opts.jsonFile != "" { handler.jsonFile, err = os.Create(opts.jsonFile) if err != nil { return handler, errors.Wrap(err, "failed to open JSON file") } } return handler, nil } func writeJUnitFile(opts *options, execution *testjson.Execution) error { if opts.junitFile == "" { return nil } junitFile, err := os.Create(opts.junitFile) if err != nil { return fmt.Errorf("failed to open JUnit file: %v", err) } defer func() { if err := junitFile.Close(); err != nil { log.Errorf("Failed to close JUnit file: %v", err) } }() return junitxml.Write(junitFile, execution, junitxml.Config{ FormatTestSuiteName: opts.junitTestSuiteNameFormat.Value(), FormatTestCaseClassname: opts.junitTestCaseClassnameFormat.Value(), }) } func postRunHook(opts *options, execution *testjson.Execution) error { command := opts.postRunHookCmd.Value() if len(command) == 0 { return nil } cmd := exec.Command(command[0], command[1:]...) cmd.Stdout = opts.stdout cmd.Stderr = opts.stderr cmd.Env = append( os.Environ(), "GOTESTSUM_JSONFILE="+opts.jsonFile, "GOTESTSUM_JUNITFILE="+opts.junitFile, fmt.Sprintf("TESTS_TOTAL=%d", execution.Total()), fmt.Sprintf("TESTS_FAILED=%d", len(execution.Failed())), fmt.Sprintf("TESTS_SKIPPED=%d", len(execution.Skipped())), fmt.Sprintf("TESTS_ERRORS=%d", len(execution.Errors())), ) // TODO: send a more detailed report to stdin? return cmd.Run() } gotestsum-0.5.0/handler_test.go000066400000000000000000000034271367230725500165710ustar00rootroot00000000000000package main import ( "bytes" "os" "strings" "testing" "gotest.tools/gotestsum/testjson" "gotest.tools/v3/assert" "gotest.tools/v3/env" "gotest.tools/v3/golden" ) func TestPostRunHook(t *testing.T) { command := &commandValue{} err := command.Set("go run ./testdata/postrunhook/main.go") assert.NilError(t, err) buf := new(bytes.Buffer) opts := &options{ postRunHookCmd: command, jsonFile: "events.json", junitFile: "junit.xml", stdout: buf, } defer env.Patch(t, "GOTESTSUM_FORMAT", "short")() exec := newExecFromTestData(t) err = postRunHook(opts, exec) assert.NilError(t, err) golden.Assert(t, buf.String(), "post-run-hook-expected") } func newExecFromTestData(t *testing.T) *testjson.Execution { t.Helper() f, err := os.Open("testjson/testdata/go-test-json.out") assert.NilError(t, err) defer f.Close() // nolint: errcheck exec, err := testjson.ScanTestOutput(testjson.ScanConfig{ Stdout: f, Stderr: strings.NewReader(""), }) assert.NilError(t, err) return exec } type bufferCloser struct { bytes.Buffer } func (bufferCloser) Close() error { return nil } func TestEventHandler_Event_WithMissingActionFail(t *testing.T) { buf := new(bufferCloser) errBuf := new(bytes.Buffer) format := testjson.NewEventFormatter(errBuf, "testname") source := golden.Get(t, "../testjson/testdata/go-test-json-missing-test-fail.out") cfg := testjson.ScanConfig{ Stdout: bytes.NewReader(source), Handler: &eventHandler{jsonFile: buf, formatter: format}, } _, err := testjson.ScanTestOutput(cfg) assert.NilError(t, err) assert.Equal(t, buf.String(), string(source)) // confirm the artificial event was sent to the handler by checking the output // of the formatter. golden.Assert(t, errBuf.String(), "event-handler-missing-test-fail-expected") } gotestsum-0.5.0/internal/000077500000000000000000000000001367230725500153745ustar00rootroot00000000000000gotestsum-0.5.0/internal/dotwriter/000077500000000000000000000000001367230725500174175ustar00rootroot00000000000000gotestsum-0.5.0/internal/dotwriter/LICENSE000066400000000000000000000020701367230725500204230ustar00rootroot00000000000000MIT License =========== Copyright (c) 2015, Greg Osuri Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. gotestsum-0.5.0/internal/dotwriter/README000066400000000000000000000003161367230725500202770ustar00rootroot00000000000000This package contains a striped down and modified version of https://github.com/gosuri/uilive. The original package did not work with terminal colors, and had some bits that were unnecessary for gotestsum. gotestsum-0.5.0/internal/dotwriter/writer.go000066400000000000000000000015731367230725500212700ustar00rootroot00000000000000/*Package dotwriter implements a buffered Writer for updating progress on the terminal. */ package dotwriter import ( "bytes" "io" ) // ESC is the ASCII code for escape character const ESC = 27 // Writer buffers writes until Flush is called. Flush clears previously written // lines before writing new lines from the buffer. type Writer struct { out io.Writer buf bytes.Buffer lineCount int } // New returns a new Writer func New(out io.Writer) *Writer { return &Writer{out: out} } // Flush the buffer, writing all buffered lines to out func (w *Writer) Flush() error { if w.buf.Len() == 0 { return nil } w.clearLines(w.lineCount) w.lineCount = bytes.Count(w.buf.Bytes(), []byte{'\n'}) _, err := w.out.Write(w.buf.Bytes()) w.buf.Reset() return err } // Write saves buf to a buffer func (w *Writer) Write(buf []byte) (int, error) { return w.buf.Write(buf) } gotestsum-0.5.0/internal/dotwriter/writer_posix.go000066400000000000000000000004061367230725500225040ustar00rootroot00000000000000// +build !windows package dotwriter import ( "fmt" "strings" ) // clear the line and move the cursor up var clear = fmt.Sprintf("%c[%dA%c[2K", ESC, 1, ESC) func (w *Writer) clearLines(count int) { _, _ = fmt.Fprint(w.out, strings.Repeat(clear, count)) } gotestsum-0.5.0/internal/dotwriter/writer_windows.go000066400000000000000000000030071367230725500230340ustar00rootroot00000000000000// +build windows package dotwriter import ( "fmt" "io" "strings" "syscall" "unsafe" "golang.org/x/sys/windows" ) var kernel32 = syscall.NewLazyDLL("kernel32.dll") var ( procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") ) // clear the line and move the cursor up var clear = fmt.Sprintf("%c[%dA%c[2K\r", ESC, 0, ESC) type dword uint32 type coord struct { x int16 y int16 } type fdWriter interface { io.Writer Fd() uintptr } func (w *Writer) clearLines(count int) { f, ok := w.out.(fdWriter) if ok && !isConsole(f.Fd()) { ok = false } if !ok { _, _ = fmt.Fprint(w.out, strings.Repeat(clear, count)) return } fd := f.Fd() var csbi windows.ConsoleScreenBufferInfo if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &csbi); err != nil { return } for i := 0; i < count; i++ { // move the cursor up csbi.CursorPosition.Y-- _, _, _ = procSetConsoleCursorPosition.Call(fd, uintptr(*(*int32)(unsafe.Pointer(&csbi.CursorPosition)))) // clear the line cursor := coord{ x: csbi.Window.Left, y: csbi.Window.Top + csbi.CursorPosition.Y, } var count, w dword count = dword(csbi.Size.X) _, _, _ = procFillConsoleOutputCharacter.Call(fd, uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&w))) } } func isConsole(fd uintptr) bool { var mode uint32 err := windows.GetConsoleMode(windows.Handle(fd), &mode) return err == nil } gotestsum-0.5.0/internal/junitxml/000077500000000000000000000000001367230725500172465ustar00rootroot00000000000000gotestsum-0.5.0/internal/junitxml/report.go000066400000000000000000000124231367230725500211120ustar00rootroot00000000000000/*Package junitxml creates a JUnit XML report from a testjson.Execution. */ package junitxml import ( "encoding/xml" "fmt" "io" "os" "os/exec" "strings" "time" "gotest.tools/gotestsum/log" "gotest.tools/gotestsum/testjson" ) // JUnitTestSuites is a collection of JUnit test suites. type JUnitTestSuites struct { XMLName xml.Name `xml:"testsuites"` Suites []JUnitTestSuite } // JUnitTestSuite is a single JUnit test suite which may contain many // testcases. type JUnitTestSuite struct { XMLName xml.Name `xml:"testsuite"` Tests int `xml:"tests,attr"` Failures int `xml:"failures,attr"` Time string `xml:"time,attr"` Name string `xml:"name,attr"` Properties []JUnitProperty `xml:"properties>property,omitempty"` TestCases []JUnitTestCase } // JUnitTestCase is a single test case with its result. type JUnitTestCase struct { XMLName xml.Name `xml:"testcase"` Classname string `xml:"classname,attr"` Name string `xml:"name,attr"` Time string `xml:"time,attr"` SkipMessage *JUnitSkipMessage `xml:"skipped,omitempty"` Failure *JUnitFailure `xml:"failure,omitempty"` } // JUnitSkipMessage contains the reason why a testcase was skipped. type JUnitSkipMessage struct { Message string `xml:"message,attr"` } // JUnitProperty represents a key/value pair used to define properties. type JUnitProperty struct { Name string `xml:"name,attr"` Value string `xml:"value,attr"` } // JUnitFailure contains data related to a failed test. type JUnitFailure struct { Message string `xml:"message,attr"` Type string `xml:"type,attr"` Contents string `xml:",chardata"` } // Config used to write a junit XML document. type Config struct { FormatTestSuiteName FormatFunc FormatTestCaseClassname FormatFunc } // FormatFunc converts a string from one format into another. type FormatFunc func(string) string // Write creates an XML document and writes it to out. func Write(out io.Writer, exec *testjson.Execution, cfg Config) error { if err := write(out, generate(exec, cfg)); err != nil { return fmt.Errorf("failed to write JUnit XML: %v", err) } return nil } func generate(exec *testjson.Execution, cfg Config) JUnitTestSuites { cfg = configWithDefaults(cfg) version := goVersion() suites := JUnitTestSuites{} for _, pkgname := range exec.Packages() { pkg := exec.Package(pkgname) junitpkg := JUnitTestSuite{ Name: cfg.FormatTestSuiteName(pkgname), Tests: pkg.Total, Time: formatDurationAsSeconds(pkg.Elapsed()), Properties: packageProperties(version), TestCases: packageTestCases(pkg, cfg.FormatTestCaseClassname), Failures: len(pkg.Failed), } suites.Suites = append(suites.Suites, junitpkg) } return suites } func configWithDefaults(cfg Config) Config { noop := func(v string) string { return v } if cfg.FormatTestSuiteName == nil { cfg.FormatTestSuiteName = noop } if cfg.FormatTestCaseClassname == nil { cfg.FormatTestCaseClassname = noop } return cfg } func formatDurationAsSeconds(d time.Duration) string { return fmt.Sprintf("%f", d.Seconds()) } func packageProperties(goVersion string) []JUnitProperty { return []JUnitProperty{ {Name: "go.version", Value: goVersion}, } } // goVersion returns the version as reported by the go binary in PATH. This // version will not be the same as runtime.Version, which is always the version // of go used to build the gotestsum binary. // // To skip the os/exec call set the GOVERSION environment variable to the // desired value. func goVersion() string { if version, ok := os.LookupEnv("GOVERSION"); ok { return version } log.Debugf("exec: go version") cmd := exec.Command("go", "version") out, err := cmd.Output() if err != nil { log.Warnf("Failed to lookup go version for junit xml: %v", err) return "unknown" } return strings.TrimPrefix(strings.TrimSpace(string(out)), "go version ") } func packageTestCases(pkg *testjson.Package, formatClassname FormatFunc) []JUnitTestCase { cases := []JUnitTestCase{} if pkg.TestMainFailed() { jtc := newJUnitTestCase(testjson.TestCase{Test: "TestMain"}, formatClassname) jtc.Failure = &JUnitFailure{ Message: "Failed", Contents: pkg.Output(0), } cases = append(cases, jtc) } for _, tc := range pkg.Failed { jtc := newJUnitTestCase(tc, formatClassname) jtc.Failure = &JUnitFailure{ Message: "Failed", Contents: strings.Join(pkg.OutputLines(tc), ""), } cases = append(cases, jtc) } for _, tc := range pkg.Skipped { jtc := newJUnitTestCase(tc, formatClassname) jtc.SkipMessage = &JUnitSkipMessage{ Message: strings.Join(pkg.OutputLines(tc), ""), } cases = append(cases, jtc) } for _, tc := range pkg.Passed { jtc := newJUnitTestCase(tc, formatClassname) cases = append(cases, jtc) } return cases } func newJUnitTestCase(tc testjson.TestCase, formatClassname FormatFunc) JUnitTestCase { return JUnitTestCase{ Classname: formatClassname(tc.Package), Name: tc.Test, Time: formatDurationAsSeconds(tc.Elapsed), } } func write(out io.Writer, suites JUnitTestSuites) error { doc, err := xml.MarshalIndent(suites, "", "\t") if err != nil { return err } _, err = out.Write([]byte(xml.Header)) if err != nil { return err } _, err = out.Write(doc) return err } gotestsum-0.5.0/internal/junitxml/report_test.go000066400000000000000000000023021367230725500221440ustar00rootroot00000000000000package junitxml import ( "bytes" "fmt" "io" "io/ioutil" "runtime" "testing" "gotest.tools/gotestsum/testjson" "gotest.tools/v3/assert" "gotest.tools/v3/env" "gotest.tools/v3/golden" ) func TestWrite(t *testing.T) { out := new(bytes.Buffer) exec := createExecution(t) defer env.Patch(t, "GOVERSION", "go7.7.7")() err := Write(out, exec, Config{}) assert.NilError(t, err) golden.Assert(t, out.String(), "junitxml-report.golden") } func createExecution(t *testing.T) *testjson.Execution { exec, err := testjson.ScanTestOutput(testjson.ScanConfig{ Stdout: readTestData(t, "out"), Stderr: readTestData(t, "err"), }) assert.NilError(t, err) return exec } func readTestData(t *testing.T, stream string) io.Reader { raw, err := ioutil.ReadFile("../../testjson/testdata/go-test-json." + stream) assert.NilError(t, err) return bytes.NewReader(raw) } func TestGoVersion(t *testing.T) { t.Run("unknown", func(t *testing.T) { defer env.Patch(t, "PATH", "/bogus")() assert.Equal(t, goVersion(), "unknown") }) t.Run("current version", func(t *testing.T) { expected := fmt.Sprintf("%s %s/%s", runtime.Version(), runtime.GOOS, runtime.GOARCH) assert.Equal(t, goVersion(), expected) }) } gotestsum-0.5.0/internal/junitxml/testdata/000077500000000000000000000000001367230725500210575ustar00rootroot00000000000000gotestsum-0.5.0/internal/junitxml/testdata/junitxml-report.golden000066400000000000000000000211161367230725500254350ustar00rootroot00000000000000 sometimes main can exit 2 FAIL github.com/gotestyourself/gotestyourself/testjson/internal/badmain 0.010s === RUN TestFailed --- FAIL: TestFailed (0.00s) stub_test.go:34: this failed === RUN TestFailedWithStderr this is stderr --- FAIL: TestFailedWithStderr (0.00s) stub_test.go:43: also failed === RUN TestNestedWithFailure/c --- FAIL: TestNestedWithFailure/c (0.00s) stub_test.go:65: failed === RUN TestNestedWithFailure --- FAIL: TestNestedWithFailure (0.00s) gotestsum-0.5.0/internal/text/000077500000000000000000000000001367230725500163605ustar00rootroot00000000000000gotestsum-0.5.0/internal/text/testing.go000066400000000000000000000015741367230725500203730ustar00rootroot00000000000000package text import ( "bufio" "io" "strings" "testing" "gotest.tools/v3/assert" ) // ProcessLines from the Reader by passing each one to ops. The output of each // op is passed to the next. Returns the string created by joining all the // processed lines. func ProcessLines(t *testing.T, r io.Reader, ops ...func(string) string) string { t.Helper() out := new(strings.Builder) scan := bufio.NewScanner(r) for scan.Scan() { line := scan.Text() for _, op := range ops { line = op(line) } out.WriteString(line + "\n") } assert.NilError(t, scan.Err()) return out.String() } func OpRemoveSummaryLineElapsedTime(line string) string { if i := strings.Index(line, " in "); i > 0 { return line[:i] } return line } func OpRemoveTestElapsedTime(line string) string { if i := strings.Index(line, " (0.0"); i > 0 && i+8 == len(line) { return line[:i] } return line } gotestsum-0.5.0/log/000077500000000000000000000000001367230725500143415ustar00rootroot00000000000000gotestsum-0.5.0/log/log.go000066400000000000000000000026021367230725500154510ustar00rootroot00000000000000package log import ( "fmt" "os" "github.com/fatih/color" ) type Level uint8 const ( ErrorLevel Level = iota WarnLevel DebugLevel ) var ( level = WarnLevel out stringWriter = os.Stderr ) // TODO: replace with io.StringWriter once support for go1.11 is dropped. type stringWriter interface { WriteString(s string) (n int, err error) } // SetLevel for the global logger. func SetLevel(l Level) { level = l } // Warnf prints the message to stderr, with a yellow WARN prefix. func Warnf(format string, args ...interface{}) { if level < WarnLevel { return } out.WriteString(color.YellowString("WARN ")) out.WriteString(fmt.Sprintf(format, args...)) out.WriteString("\n") } // Debugf prints the message to stderr, with no prefix. func Debugf(format string, args ...interface{}) { if level < DebugLevel { return } out.WriteString(fmt.Sprintf(format, args...)) out.WriteString("\n") } // Errorf prints the message to stderr, with a red ERROR prefix. func Errorf(format string, args ...interface{}) { if level < ErrorLevel { return } out.WriteString(color.RedString("ERROR ")) out.WriteString(fmt.Sprintf(format, args...)) out.WriteString("\n") } // Error prints the message to stderr, with a red ERROR prefix. func Error(msg string) { if level < ErrorLevel { return } out.WriteString(color.RedString("ERROR ")) out.WriteString(msg) out.WriteString("\n") } gotestsum-0.5.0/main.go000066400000000000000000000225421367230725500150400ustar00rootroot00000000000000package main import ( "context" "fmt" "io" "os" "os/exec" "strings" "github.com/fatih/color" "github.com/pkg/errors" "github.com/spf13/pflag" "gotest.tools/gotestsum/cmd" "gotest.tools/gotestsum/cmd/tool" "gotest.tools/gotestsum/log" "gotest.tools/gotestsum/testjson" ) var version = "master" func main() { err := route(os.Args) switch err.(type) { case nil: return case *exec.ExitError: // go test should already report the error to stderr, exit with // the same status code os.Exit(ExitCodeWithDefault(err)) default: log.Error(err.Error()) os.Exit(3) } } func route(args []string) error { name := args[0] next, rest := cmd.Next(args[1:]) switch next { case "tool": return tool.Run(name+" "+next, rest) default: return runMain(name, args[1:]) } } func runMain(name string, args []string) error { flags, opts := setupFlags(name) switch err := flags.Parse(args); { case err == pflag.ErrHelp: return nil case err != nil: usage(os.Stderr, name, flags) return err } opts.args = flags.Args() setupLogging(opts) if opts.version { fmt.Fprintf(os.Stdout, "gotestsum version %s\n", version) return nil } return run(opts) } func setupFlags(name string) (*pflag.FlagSet, *options) { opts := &options{ noSummary: newNoSummaryValue(), junitTestCaseClassnameFormat: &junitFieldFormatValue{}, junitTestSuiteNameFormat: &junitFieldFormatValue{}, postRunHookCmd: &commandValue{}, stdout: os.Stdout, stderr: os.Stderr, } flags := pflag.NewFlagSet(name, pflag.ContinueOnError) flags.SetInterspersed(false) flags.Usage = func() { usage(os.Stdout, name, flags) } flags.StringVarP(&opts.format, "format", "f", lookEnvWithDefault("GOTESTSUM_FORMAT", "short"), "print format of test input") flags.BoolVar(&opts.rawCommand, "raw-command", false, "don't prepend 'go test -json' to the 'go test' command") flags.StringVar(&opts.jsonFile, "jsonfile", lookEnvWithDefault("GOTESTSUM_JSONFILE", ""), "write all TestEvents to file") flags.BoolVar(&opts.noColor, "no-color", color.NoColor, "disable color output") flags.Var(opts.noSummary, "no-summary", "do not print summary of: "+testjson.SummarizeAll.String()) flags.Var(opts.postRunHookCmd, "post-run-command", "command to run after the tests have completed") flags.StringVar(&opts.junitFile, "junitfile", lookEnvWithDefault("GOTESTSUM_JUNITFILE", ""), "write a JUnit XML file") flags.Var(opts.junitTestSuiteNameFormat, "junitfile-testsuite-name", "format the testsuite name field as: "+junitFieldFormatValues) flags.Var(opts.junitTestCaseClassnameFormat, "junitfile-testcase-classname", "format the testcase classname field as: "+junitFieldFormatValues) flags.IntVar(&opts.rerunFailsMaxAttempts, "rerun-fails", 0, "rerun failed tests until they all pass, or attempts exceeds maximum. Defaults to max 2 reruns when enabled.") flags.Lookup("rerun-fails").NoOptDefVal = "2" flags.IntVar(&opts.rerunFailsMaxInitialFailures, "rerun-fails-max-failures", 10, "do not rerun any tests if the initial run has more than this number of failures") flags.Var((*stringSlice)(&opts.packages), "packages", "space separated list of package to test") flags.BoolVar(&opts.debug, "debug", false, "enabled debug logging") flags.BoolVar(&opts.version, "version", false, "show version and exit") return flags, opts } func usage(out io.Writer, name string, flags *pflag.FlagSet) { fmt.Fprintf(out, `Usage: %[1]s [flags] [--] [go test flags] %[1]s [command] Flags: `, name) flags.SetOutput(out) flags.PrintDefaults() fmt.Fprint(out, ` Formats: dots print a character for each test dots-v2 experimental dots format, one package per line pkgname print a line for each package pkgname-and-test-fails print a line for each package and failed test output testname print a line for each test and package standard-quiet standard go test format standard-verbose standard go test -v format Commands: tool tools for working with test2json output `) } func lookEnvWithDefault(key, defValue string) string { if value := os.Getenv(key); value != "" { return value } return defValue } type options struct { args []string format string debug bool rawCommand bool jsonFile string junitFile string postRunHookCmd *commandValue noColor bool noSummary *noSummaryValue junitTestSuiteNameFormat *junitFieldFormatValue junitTestCaseClassnameFormat *junitFieldFormatValue rerunFailsMaxAttempts int rerunFailsMaxInitialFailures int packages []string version bool // shims for testing stdout io.Writer stderr io.Writer } func (o options) Validate() error { if o.rerunFailsMaxAttempts > 0 && len(o.args) > 0 && !o.rawCommand && len(o.packages) == 0 { return fmt.Errorf( "when go test args are used with --rerun-fails-max-attempts " + "the list of packages to test must be specified by the --packages flag") } return nil } func setupLogging(opts *options) { if opts.debug { log.SetLevel(log.DebugLevel) } color.NoColor = opts.noColor } func run(opts *options) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() if err := opts.Validate(); err != nil { return err } goTestProc, err := startGoTest(ctx, goTestCmdArgs(opts, rerunOpts{})) if err != nil { return errors.Wrapf(err, "failed to run %s", strings.Join(goTestProc.cmd.Args, " ")) } handler, err := newEventHandler(opts) if err != nil { return err } defer handler.Close() // nolint: errcheck cfg := testjson.ScanConfig{ Stdout: goTestProc.stdout, Stderr: goTestProc.stderr, Handler: handler, } exec, err := testjson.ScanTestOutput(cfg) if err != nil { return err } goTestExitErr := goTestProc.cmd.Wait() if goTestExitErr != nil && opts.rerunFailsMaxAttempts > 0 { cfg := testjson.ScanConfig{Execution: exec, Handler: handler} goTestExitErr = rerunFailed(ctx, opts, cfg) } testjson.PrintSummary(opts.stdout, exec, opts.noSummary.value) if err := writeJUnitFile(opts, exec); err != nil { return err } if err := postRunHook(opts, exec); err != nil { return err } return goTestExitErr } func goTestCmdArgs(opts *options, rerunOpts rerunOpts) []string { if opts.rawCommand { var result []string result = append(result, opts.args...) result = append(result, rerunOpts.Args()...) return result } args := opts.args result := []string{"go", "test"} if len(args) == 0 { result = append(result, "-json") if rerunOpts.runFlag != "" { result = append(result, rerunOpts.runFlag) } return append(result, cmdArgPackageList(opts, rerunOpts, "./...")...) } if boolArgIndex("json", args) < 0 { result = append(result, "-json") } if rerunOpts.runFlag != "" { // Remove any existing run arg, it needs to be replaced with our new one // and duplicate args are not allowed by 'go test'. runIndex, runIndexEnd := argIndex("run", args) if runIndex >= 0 && runIndexEnd < len(args) { args = append(args[:runIndex], args[runIndexEnd+1:]...) } result = append(result, rerunOpts.runFlag) } pkgArgIndex := findPkgArgPosition(args) result = append(result, args[:pkgArgIndex]...) result = append(result, cmdArgPackageList(opts, rerunOpts)...) result = append(result, args[pkgArgIndex:]...) return result } func cmdArgPackageList(opts *options, rerunOpts rerunOpts, defPkgList ...string) []string { switch { case rerunOpts.pkg != "": return []string{rerunOpts.pkg} case len(opts.packages) > 0: return opts.packages case os.Getenv("TEST_DIRECTORY") != "": return []string{os.Getenv("TEST_DIRECTORY")} default: return defPkgList } } func boolArgIndex(flag string, args []string) int { for i, arg := range args { if arg == "-"+flag || arg == "--"+flag { return i } } return -1 } func argIndex(flag string, args []string) (start, end int) { for i, arg := range args { if arg == "-"+flag || arg == "--"+flag { return i, i + 1 } if strings.HasPrefix(arg, "-"+flag+"=") || strings.HasPrefix(arg, "--"+flag+"=") { return i, i } } return -1, -1 } // The package list is before the -args flag, or at the end of the args list // if the -args flag is not in args. // The -args flag is a 'go test' flag that indicates that all subsequent // args should be passed to the test binary. It requires that the list of // packages comes before -args, so we re-use it as a placeholder in the case // where some args must be passed to the test binary. func findPkgArgPosition(args []string) int { if i := boolArgIndex("args", args); i >= 0 { return i } return len(args) } type proc struct { cmd *exec.Cmd stdout io.Reader stderr io.Reader } func startGoTest(ctx context.Context, args []string) (proc, error) { if len(args) == 0 { return proc{}, errors.New("missing command to run") } p := proc{ cmd: exec.CommandContext(ctx, args[0], args[1:]...), } log.Debugf("exec: %s", p.cmd.Args) var err error p.stdout, err = p.cmd.StdoutPipe() if err != nil { return p, err } p.stderr, err = p.cmd.StderrPipe() if err != nil { return p, err } err = p.cmd.Start() if err == nil { log.Debugf("go test pid: %d", p.cmd.Process.Pid) } return p, err } gotestsum-0.5.0/main_e2e_test.go000066400000000000000000000051111367230725500166230ustar00rootroot00000000000000package main import ( "bytes" "os" "path/filepath" "runtime" "strings" "testing" "gotest.tools/gotestsum/internal/text" "gotest.tools/v3/assert" "gotest.tools/v3/env" "gotest.tools/v3/fs" "gotest.tools/v3/golden" ) func TestE2E_RerunFails(t *testing.T) { type testCase struct { name string args []string expectedErr string } fn := func(t *testing.T, tc testCase) { tmpFile := fs.NewFile(t, t.Name()+"-seedfile", fs.WithContent("0")) defer tmpFile.Remove() envVars := osEnviron() envVars["TEST_SEEDFILE"] = tmpFile.Path() defer env.PatchAll(t, envVars)() flags, opts := setupFlags("gotestsum") assert.NilError(t, flags.Parse(tc.args)) opts.args = flags.Args() bufStdout := new(bytes.Buffer) opts.stdout = bufStdout bufStderr := new(bytes.Buffer) opts.stderr = bufStderr err := run(opts) if tc.expectedErr != "" { assert.Error(t, err, tc.expectedErr) } else { assert.NilError(t, err) } out := text.ProcessLines(t, bufStdout, text.OpRemoveSummaryLineElapsedTime, text.OpRemoveTestElapsedTime, filepath.ToSlash, // for windows ) golden.Assert(t, out, expectedFilename(t.Name())) } var testCases = []testCase{ { name: "reruns until success", args: []string{ "-f=testname", "--rerun-fails=4", "--packages=./testdata/e2e/flaky/", "--", "-count=1", "-tags=testdata", }, }, { name: "reruns continues to fail", args: []string{ "-f=testname", "--rerun-fails=2", "--packages=./testdata/e2e/flaky/", "--", "-count=1", "-tags=testdata", }, expectedErr: "exit status 1", }, { name: "first run has errors, abort rerun", args: []string{ "-f=testname", "--rerun-fails=2", "--packages=./testjson/internal/broken", "--", "-count=1", "-tags=stubpkg", }, expectedErr: "rerun aborted because previous run had errors", }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { if testing.Short() { t.Skip("too slow for short run") } fn(t, tc) }) } } // osEnviron returns os.Environ() as a map, with any GOTESTSUM_ env vars removed // so that they do not alter the test results. func osEnviron() map[string]string { e := env.ToMap(os.Environ()) for k := range e { if strings.HasPrefix(k, "GOTESTSUM_") { delete(e, k) } } return e } func expectedFilename(name string) string { // go1.14 changed how it prints messages from tests. It may be changed back // in go1.15, so special case this version for now. if strings.HasPrefix(runtime.Version(), "go1.14.") { name = name + "-go1.14" } return "e2e/expected/" + name } gotestsum-0.5.0/main_test.go000066400000000000000000000201201367230725500160650ustar00rootroot00000000000000package main import ( "bytes" "testing" "gotest.tools/v3/assert" "gotest.tools/v3/env" "gotest.tools/v3/golden" ) func TestUsage_WithFlagsFromSetupFlags(t *testing.T) { defer env.PatchAll(t, nil)() name := "gotestsum" flags, _ := setupFlags(name) buf := new(bytes.Buffer) usage(buf, name, flags) golden.Assert(t, buf.String(), "gotestsum-help-text") } func TestOptions_Validate_FromFlags(t *testing.T) { type testCase struct { name string args []string expected string } fn := func(t *testing.T, tc testCase) { flags, opts := setupFlags("gotestsum") err := flags.Parse(tc.args) assert.NilError(t, err) opts.args = flags.Args() err = opts.Validate() if tc.expected == "" { assert.NilError(t, err) return } assert.ErrorContains(t, err, tc.expected, "opts: %#v", opts) } var testCases = []testCase{ { name: "no flags", }, { name: "rerun flag, raw command", args: []string{"--rerun-fails", "--raw-command", "--", "./test-all"}, }, { name: "rerun flag, no go-test args", args: []string{"--rerun-fails", "--"}, }, { name: "rerun flag, go-test args, no packages flag", args: []string{"--rerun-fails", "--", "./..."}, expected: "the list of packages to test must be specified by the --packages flag", }, { name: "rerun flag, go-test args, with packages flag", args: []string{"--rerun-fails", "--packages", "./...", "--", "--foo"}, }, { name: "rerun flag, no go-test args, with packages flag", args: []string{"--rerun-fails", "--packages", "./..."}, }, } for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { fn(t, tc) }) } } func TestGoTestCmdArgs(t *testing.T) { type testCase struct { opts *options rerunOpts rerunOpts env []string expected []string } fn := func(t *testing.T, tc testCase) { defer env.PatchAll(t, env.ToMap(tc.env))() actual := goTestCmdArgs(tc.opts, tc.rerunOpts) assert.DeepEqual(t, actual, tc.expected) } var testcases = map[string]testCase{ "raw command": { opts: &options{ rawCommand: true, args: []string{"./script", "-test.timeout=20m"}, }, expected: []string{"./script", "-test.timeout=20m"}, }, "no args": { opts: &options{}, expected: []string{"go", "test", "-json", "./..."}, }, "no args, with rerunPackageList arg": { opts: &options{ packages: []string{"./pkg"}, }, expected: []string{"go", "test", "-json", "./pkg"}, }, "TEST_DIRECTORY env var no args": { opts: &options{}, env: []string{"TEST_DIRECTORY=testdir"}, expected: []string{"go", "test", "-json", "testdir"}, }, "TEST_DIRECTORY env var with args": { opts: &options{ args: []string{"-tags=integration"}, }, env: []string{"TEST_DIRECTORY=testdir"}, expected: []string{"go", "test", "-json", "-tags=integration", "testdir"}, }, "no -json arg": { opts: &options{ args: []string{"-timeout=2m", "./pkg"}, }, expected: []string{"go", "test", "-json", "-timeout=2m", "./pkg"}, }, "with -json arg": { opts: &options{ args: []string{"-json", "-timeout=2m", "./pkg"}, }, expected: []string{"go", "test", "-json", "-timeout=2m", "./pkg"}, }, "raw command, with rerunOpts": { opts: &options{ rawCommand: true, args: []string{"./script", "-test.timeout=20m"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"./script", "-test.timeout=20m", "-run=TestOne|TestTwo", "./fails"}, }, "no args, with rerunOpts": { opts: &options{}, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "./fails"}, }, "TEST_DIRECTORY env var, no args, with rerunOpts": { opts: &options{}, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, env: []string{"TEST_DIRECTORY=testdir"}, // TEST_DIRECTORY should be overridden by rerun opts expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "./fails"}, }, "TEST_DIRECTORY env var, with args, with rerunOpts": { opts: &options{ args: []string{"-tags=integration"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, env: []string{"TEST_DIRECTORY=testdir"}, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "-tags=integration", "./fails"}, }, "no -json arg, with rerunOpts": { opts: &options{ args: []string{"-timeout=2m"}, packages: []string{"./pkg"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "-timeout=2m", "./fails"}, }, "with -json arg, with rerunOpts": { opts: &options{ args: []string{"-json", "-timeout=2m"}, packages: []string{"./pkg"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-run=TestOne|TestTwo", "-json", "-timeout=2m", "./fails"}, }, "with args, with reunFailsPackageList args, with rerunOpts": { opts: &options{ args: []string{"-timeout=2m"}, packages: []string{"./pkg1", "./pkg2", "./pkg3"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "-timeout=2m", "./fails"}, }, "with args, with reunFailsPackageList": { opts: &options{ args: []string{"-timeout=2m"}, packages: []string{"./pkg1", "./pkg2", "./pkg3"}, }, expected: []string{"go", "test", "-json", "-timeout=2m", "./pkg1", "./pkg2", "./pkg3"}, }, "reunFailsPackageList args, with rerunOpts ": { opts: &options{ packages: []string{"./pkg1", "./pkg2", "./pkg3"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "./fails"}, }, "reunFailsPackageList args, with rerunOpts, with -args ": { opts: &options{ args: []string{"before", "-args", "after"}, packages: []string{"./pkg1"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "before", "./fails", "-args", "after"}, }, "reunFailsPackageList args, with rerunOpts, with -args at end": { opts: &options{ args: []string{"before", "-args"}, packages: []string{"./pkg1"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "before", "./fails", "-args"}, }, "reunFailsPackageList args, with -args at start": { opts: &options{ args: []string{"-args", "after"}, packages: []string{"./pkg1"}, }, expected: []string{"go", "test", "-json", "./pkg1", "-args", "after"}, }, "-run arg at start, with rerunOpts ": { opts: &options{ args: []string{"-run=TestFoo", "-args"}, packages: []string{"./pkg"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "./fails", "-args"}, }, "-run arg in middle, with rerunOpts ": { opts: &options{ args: []string{"-count", "1", "--run", "TestFoo", "-args"}, packages: []string{"./pkg"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "-count", "1", "./fails", "-args"}, }, "-run arg at end with missing value, with rerunOpts ": { opts: &options{ args: []string{"-count", "1", "-run"}, packages: []string{"./pkg"}, }, rerunOpts: rerunOpts{ runFlag: "-run=TestOne|TestTwo", pkg: "./fails", }, expected: []string{"go", "test", "-json", "-run=TestOne|TestTwo", "-count", "1", "-run", "./fails"}, }, } for name, tc := range testcases { t.Run(name, func(t *testing.T) { fn(t, tc) }) } } gotestsum-0.5.0/rerunfails.go000066400000000000000000000066071367230725500162720ustar00rootroot00000000000000package main import ( "context" "fmt" "strings" "github.com/pkg/errors" "gotest.tools/gotestsum/log" "gotest.tools/gotestsum/testjson" ) type rerunOpts struct { runFlag string pkg string } func (o rerunOpts) Args() []string { var result []string if o.runFlag != "" { result = append(result, o.runFlag) } if o.pkg != "" { result = append(result, o.pkg) } return result } func rerunFailed(ctx context.Context, opts *options, scanConfig testjson.ScanConfig) error { failed := len(scanConfig.Execution.Failed()) if failed > opts.rerunFailsMaxInitialFailures { return fmt.Errorf( "number of test failures (%d) exceeds maximum (%d) set by --rerun-fails-max-failures", failed, opts.rerunFailsMaxInitialFailures) } if err := hasErrors(scanConfig.Execution); err != nil { return err } rec := newFailureRecorderFromExecution(scanConfig.Execution) var lastErr error for attempts := 0; rec.count() > 0 && attempts < opts.rerunFailsMaxAttempts; attempts++ { testjson.PrintSummary(opts.stdout, scanConfig.Execution, testjson.SummarizeNone) opts.stdout.Write([]byte("\n")) // nolint: errcheck nextRec := newFailureRecorder(scanConfig.Handler) for pkg, testCases := range rec.pkgFailures { rerun := rerunOpts{ runFlag: goTestRunFlagFromTestCases(testCases), pkg: pkg, } goTestProc, err := startGoTest(ctx, goTestCmdArgs(opts, rerun)) if err != nil { return errors.Wrapf(err, "failed to run %s", strings.Join(goTestProc.cmd.Args, " ")) } cfg := testjson.ScanConfig{ Stdout: goTestProc.stdout, Stderr: goTestProc.stderr, Handler: nextRec, Execution: scanConfig.Execution, } if _, err := testjson.ScanTestOutput(cfg); err != nil { return err } lastErr = goTestProc.cmd.Wait() // 0 and 1 are expected. if ExitCodeWithDefault(lastErr) > 1 { log.Warnf("unexpected go test exit code: %v", lastErr) // TODO: will 'go test' exit with 2 if it panics? maybe return err here. } if err := hasErrors(scanConfig.Execution); err != nil { return err } rec = nextRec } } return lastErr } func hasErrors(exec *testjson.Execution) error { if len(exec.Errors()) > 0 { return fmt.Errorf("rerun aborted because previous run had errors") } return nil } type failureRecorder struct { testjson.EventHandler pkgFailures map[string][]string } func newFailureRecorder(handler testjson.EventHandler) *failureRecorder { return &failureRecorder{ EventHandler: handler, pkgFailures: make(map[string][]string), } } func newFailureRecorderFromExecution(exec *testjson.Execution) *failureRecorder { r := newFailureRecorder(nil) for _, tc := range exec.Failed() { r.pkgFailures[tc.Package] = append(r.pkgFailures[tc.Package], tc.Test) } return r } func (r *failureRecorder) Event(event testjson.TestEvent, execution *testjson.Execution) error { if !event.PackageEvent() && event.Action == testjson.ActionFail { r.pkgFailures[event.Package] = append(r.pkgFailures[event.Package], event.Test) } return r.EventHandler.Event(event, execution) } func (r *failureRecorder) count() int { total := 0 for _, tcs := range r.pkgFailures { total += len(tcs) } return total } func goTestRunFlagFromTestCases(tcs []string) string { buf := new(strings.Builder) buf.WriteString("-run=^(") for i, tc := range tcs { if i != 0 { buf.WriteString("|") } buf.WriteString(tc) } buf.WriteString(")$") return buf.String() } gotestsum-0.5.0/testdata/000077500000000000000000000000001367230725500153715ustar00rootroot00000000000000gotestsum-0.5.0/testdata/e2e/000077500000000000000000000000001367230725500160445ustar00rootroot00000000000000gotestsum-0.5.0/testdata/e2e/expected/000077500000000000000000000000001367230725500176455ustar00rootroot00000000000000gotestsum-0.5.0/testdata/e2e/expected/TestE2E_RerunFails/000077500000000000000000000000001367230725500232125ustar00rootroot00000000000000gotestsum-0.5.0/testdata/e2e/expected/TestE2E_RerunFails/first_run_has_errors,_abort_rerun000066400000000000000000000001431367230725500320530ustar00rootroot00000000000000 === Errors testjson/internal/broken/broken.go:5:21: undefined: somepackage DONE 0 tests, 1 error gotestsum-0.5.0/testdata/e2e/expected/TestE2E_RerunFails/first_run_has_errors,_abort_rerun-go1.14000066400000000000000000000001431367230725500327620ustar00rootroot00000000000000 === Errors testjson/internal/broken/broken.go:5:21: undefined: somepackage DONE 0 tests, 1 error gotestsum-0.5.0/testdata/e2e/expected/TestE2E_RerunFails/reruns_continues_to_fail000066400000000000000000000033731367230725500302450ustar00rootroot00000000000000PASS testdata/e2e/flaky.TestAlwaysPasses === RUN TestFailsRarely SEED: 0 --- FAIL: TestFailsRarely flaky_test.go:51: not this time FAIL testdata/e2e/flaky.TestFailsRarely === RUN TestFailsSometimes SEED: 0 --- FAIL: TestFailsSometimes flaky_test.go:58: not this time FAIL testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 0 --- FAIL: TestFailsOften flaky_test.go:65: not this time FAIL testdata/e2e/flaky.TestFailsOften PASS testdata/e2e/flaky.TestFailsOftenDoesNotPrefixMatch PASS testdata/e2e/flaky.TestFailsSometimesDoesNotPrefixMatch FAIL testdata/e2e/flaky DONE 6 tests, 3 failures PASS testdata/e2e/flaky.TestFailsRarely === RUN TestFailsSometimes SEED: 1 --- FAIL: TestFailsSometimes flaky_test.go:58: not this time FAIL testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 1 --- FAIL: TestFailsOften flaky_test.go:65: not this time FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky DONE 9 tests, 5 failures PASS testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 2 --- FAIL: TestFailsOften flaky_test.go:65: not this time FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky === Failed === FAIL: testdata/e2e/flaky TestFailsRarely SEED: 0 flaky_test.go:51: not this time === FAIL: testdata/e2e/flaky TestFailsSometimes SEED: 0 flaky_test.go:58: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 0 flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsSometimes SEED: 1 flaky_test.go:58: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 1 flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 2 flaky_test.go:65: not this time DONE 11 tests, 6 failures gotestsum-0.5.0/testdata/e2e/expected/TestE2E_RerunFails/reruns_continues_to_fail-go1.14000066400000000000000000000037151367230725500311540ustar00rootroot00000000000000PASS testdata/e2e/flaky.TestAlwaysPasses === RUN TestFailsRarely SEED: 0 TestFailsRarely: flaky_test.go:51: not this time --- FAIL: TestFailsRarely FAIL testdata/e2e/flaky.TestFailsRarely === RUN TestFailsSometimes SEED: 0 TestFailsSometimes: flaky_test.go:58: not this time --- FAIL: TestFailsSometimes FAIL testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 0 TestFailsOften: flaky_test.go:65: not this time --- FAIL: TestFailsOften FAIL testdata/e2e/flaky.TestFailsOften PASS testdata/e2e/flaky.TestFailsOftenDoesNotPrefixMatch PASS testdata/e2e/flaky.TestFailsSometimesDoesNotPrefixMatch FAIL testdata/e2e/flaky DONE 6 tests, 3 failures PASS testdata/e2e/flaky.TestFailsRarely === RUN TestFailsSometimes SEED: 1 TestFailsSometimes: flaky_test.go:58: not this time --- FAIL: TestFailsSometimes FAIL testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 1 TestFailsOften: flaky_test.go:65: not this time --- FAIL: TestFailsOften FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky DONE 9 tests, 5 failures PASS testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 2 TestFailsOften: flaky_test.go:65: not this time --- FAIL: TestFailsOften FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky === Failed === FAIL: testdata/e2e/flaky TestFailsRarely SEED: 0 TestFailsRarely: flaky_test.go:51: not this time === FAIL: testdata/e2e/flaky TestFailsSometimes SEED: 0 TestFailsSometimes: flaky_test.go:58: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 0 TestFailsOften: flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsSometimes SEED: 1 TestFailsSometimes: flaky_test.go:58: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 1 TestFailsOften: flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 2 TestFailsOften: flaky_test.go:65: not this time DONE 11 tests, 6 failures gotestsum-0.5.0/testdata/e2e/expected/TestE2E_RerunFails/reruns_until_success000066400000000000000000000041521367230725500274200ustar00rootroot00000000000000PASS testdata/e2e/flaky.TestAlwaysPasses === RUN TestFailsRarely SEED: 0 --- FAIL: TestFailsRarely flaky_test.go:51: not this time FAIL testdata/e2e/flaky.TestFailsRarely === RUN TestFailsSometimes SEED: 0 --- FAIL: TestFailsSometimes flaky_test.go:58: not this time FAIL testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 0 --- FAIL: TestFailsOften flaky_test.go:65: not this time FAIL testdata/e2e/flaky.TestFailsOften PASS testdata/e2e/flaky.TestFailsOftenDoesNotPrefixMatch PASS testdata/e2e/flaky.TestFailsSometimesDoesNotPrefixMatch FAIL testdata/e2e/flaky DONE 6 tests, 3 failures PASS testdata/e2e/flaky.TestFailsRarely === RUN TestFailsSometimes SEED: 1 --- FAIL: TestFailsSometimes flaky_test.go:58: not this time FAIL testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 1 --- FAIL: TestFailsOften flaky_test.go:65: not this time FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky DONE 9 tests, 5 failures PASS testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 2 --- FAIL: TestFailsOften flaky_test.go:65: not this time FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky DONE 11 tests, 6 failures === RUN TestFailsOften SEED: 3 --- FAIL: TestFailsOften flaky_test.go:65: not this time FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky DONE 12 tests, 7 failures PASS testdata/e2e/flaky.TestFailsOften PASS testdata/e2e/flaky === Failed === FAIL: testdata/e2e/flaky TestFailsRarely SEED: 0 flaky_test.go:51: not this time === FAIL: testdata/e2e/flaky TestFailsSometimes SEED: 0 flaky_test.go:58: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 0 flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsSometimes SEED: 1 flaky_test.go:58: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 1 flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 2 flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 3 flaky_test.go:65: not this time DONE 13 tests, 7 failures gotestsum-0.5.0/testdata/e2e/expected/TestE2E_RerunFails/reruns_until_success-go1.14000066400000000000000000000045341367230725500303330ustar00rootroot00000000000000PASS testdata/e2e/flaky.TestAlwaysPasses === RUN TestFailsRarely SEED: 0 TestFailsRarely: flaky_test.go:51: not this time --- FAIL: TestFailsRarely FAIL testdata/e2e/flaky.TestFailsRarely === RUN TestFailsSometimes SEED: 0 TestFailsSometimes: flaky_test.go:58: not this time --- FAIL: TestFailsSometimes FAIL testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 0 TestFailsOften: flaky_test.go:65: not this time --- FAIL: TestFailsOften FAIL testdata/e2e/flaky.TestFailsOften PASS testdata/e2e/flaky.TestFailsOftenDoesNotPrefixMatch PASS testdata/e2e/flaky.TestFailsSometimesDoesNotPrefixMatch FAIL testdata/e2e/flaky DONE 6 tests, 3 failures PASS testdata/e2e/flaky.TestFailsRarely === RUN TestFailsSometimes SEED: 1 TestFailsSometimes: flaky_test.go:58: not this time --- FAIL: TestFailsSometimes FAIL testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 1 TestFailsOften: flaky_test.go:65: not this time --- FAIL: TestFailsOften FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky DONE 9 tests, 5 failures PASS testdata/e2e/flaky.TestFailsSometimes === RUN TestFailsOften SEED: 2 TestFailsOften: flaky_test.go:65: not this time --- FAIL: TestFailsOften FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky DONE 11 tests, 6 failures === RUN TestFailsOften SEED: 3 TestFailsOften: flaky_test.go:65: not this time --- FAIL: TestFailsOften FAIL testdata/e2e/flaky.TestFailsOften FAIL testdata/e2e/flaky DONE 12 tests, 7 failures PASS testdata/e2e/flaky.TestFailsOften PASS testdata/e2e/flaky === Failed === FAIL: testdata/e2e/flaky TestFailsRarely SEED: 0 TestFailsRarely: flaky_test.go:51: not this time === FAIL: testdata/e2e/flaky TestFailsSometimes SEED: 0 TestFailsSometimes: flaky_test.go:58: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 0 TestFailsOften: flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsSometimes SEED: 1 TestFailsSometimes: flaky_test.go:58: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 1 TestFailsOften: flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 2 TestFailsOften: flaky_test.go:65: not this time === FAIL: testdata/e2e/flaky TestFailsOften SEED: 3 TestFailsOften: flaky_test.go:65: not this time DONE 13 tests, 7 failures gotestsum-0.5.0/testdata/e2e/flaky/000077500000000000000000000000001367230725500171525ustar00rootroot00000000000000gotestsum-0.5.0/testdata/e2e/flaky/flaky_test.go000066400000000000000000000023201367230725500216430ustar00rootroot00000000000000// +build testdata package flaky import ( "fmt" "io/ioutil" "os" "strconv" "sync" "testing" ) var seed int var seedfile = seedFile() var once = new(sync.Once) func setup(t *testing.T) { once.Do(func() { raw, err := ioutil.ReadFile(seedfile) if err != nil { t.Fatalf("failed to read seed: %v", err) } n, err := strconv.ParseInt(string(raw), 10, 64) if err != nil { t.Fatalf("failed to parse seed: %v", err) } seed = int(n) err = ioutil.WriteFile(seedfile, []byte(strconv.Itoa(seed+1)), 0644) if err != nil { t.Fatalf("failed to write seed: %v", err) } }) fmt.Fprintln(os.Stderr, "SEED: ", seed) } func seedFile() string { if name, ok := os.LookupEnv("TEST_SEEDFILE"); ok { return name } return "/tmp/gotestsum-flaky-seedfile" } func TestAlwaysPasses(t *testing.T) { } func TestFailsRarely(t *testing.T) { setup(t) if seed%10 != 1 { t.Fatal("not this time") } } func TestFailsSometimes(t *testing.T) { setup(t) if seed%10 != 2 { t.Fatal("not this time") } } func TestFailsOften(t *testing.T) { setup(t) if seed%10 != 4 { t.Fatal("not this time") } } func TestFailsOftenDoesNotPrefixMatch(t *testing.T) {} func TestFailsSometimesDoesNotPrefixMatch(t *testing.T) {} gotestsum-0.5.0/testdata/event-handler-missing-test-fail-expected000066400000000000000000000024051367230725500252050ustar00rootroot00000000000000FAIL gotest.tools/v3/poll === RUN TestWaitOn_WithCompare panic: runtime error: index out of range [1] with length 1 goroutine 7 [running]: gotest.tools/v3/internal/assert.ArgsFromComparisonCall(0xc0000552a0, 0x1, 0x1, 0x1, 0x0, 0x0) /home/daniel/pers/code/gotest.tools/internal/assert/result.go:102 +0x9f gotest.tools/v3/internal/assert.runComparison(0x6bcb80, 0xc00000e180, 0x67dee8, 0xc00007a9f0, 0x0, 0x0, 0x0, 0x7f7f4fb6d108) /home/daniel/pers/code/gotest.tools/internal/assert/result.go:34 +0x2b1 gotest.tools/v3/internal/assert.Eval(0x6bcb80, 0xc00000e180, 0x67dee8, 0x627660, 0xc00007a9f0, 0x0, 0x0, 0x0, 0x642c60) /home/daniel/pers/code/gotest.tools/internal/assert/assert.go:56 +0x2e4 gotest.tools/v3/poll.Compare(0xc00007a9f0, 0x6b74a0, 0x618a60) /home/daniel/pers/code/gotest.tools/poll/poll.go:151 +0x81 gotest.tools/v3/poll.TestWaitOn_WithCompare.func1(0x6be4c0, 0xc00016c240, 0xc00016c240, 0x6be4c0) /home/daniel/pers/code/gotest.tools/poll/poll_test.go:81 +0x58 gotest.tools/v3/poll.WaitOn.func1(0xc00001e3c0, 0x67df50, 0x6c1960, 0xc00016c240) /home/daniel/pers/code/gotest.tools/poll/poll.go:125 +0x62 created by gotest.tools/v3/poll.WaitOn /home/daniel/pers/code/gotest.tools/poll/poll.go:124 +0x16f FAIL gotest.tools/v3/poll.TestWaitOn_WithCompare (-1.00s) gotestsum-0.5.0/testdata/gotestsum-help-text000066400000000000000000000040451367230725500212610ustar00rootroot00000000000000Usage: gotestsum [flags] [--] [go test flags] gotestsum [command] Flags: --debug enabled debug logging -f, --format string print format of test input (default "short") --jsonfile string write all TestEvents to file --junitfile string write a JUnit XML file --junitfile-testcase-classname field-format format the testcase classname field as: full, relative, short (default full) --junitfile-testsuite-name field-format format the testsuite name field as: full, relative, short (default full) --no-color disable color output (default true) --no-summary summary do not print summary of: skipped,failed,errors,output (default none) --packages list space separated list of package to test --post-run-command command command to run after the tests have completed --raw-command don't prepend 'go test -json' to the 'go test' command --rerun-fails int[=2] rerun failed tests until they all pass, or attempts exceeds maximum. Defaults to max 2 reruns when enabled. --rerun-fails-max-failures int do not rerun any tests if the initial run has more than this number of failures (default 10) --version show version and exit Formats: dots print a character for each test dots-v2 experimental dots format, one package per line pkgname print a line for each package pkgname-and-test-fails print a line for each package and failed test output testname print a line for each test and package standard-quiet standard go test format standard-verbose standard go test -v format Commands: tool tools for working with test2json output gotestsum-0.5.0/testdata/post-run-hook-expected000066400000000000000000000002211367230725500216330ustar00rootroot00000000000000GOTESTSUM_FORMAT=short GOTESTSUM_JSONFILE=events.json GOTESTSUM_JUNITFILE=junit.xml TESTS_ERRORS=0 TESTS_FAILED=5 TESTS_SKIPPED=4 TESTS_TOTAL=46 gotestsum-0.5.0/testdata/postrunhook/000077500000000000000000000000001367230725500177645ustar00rootroot00000000000000gotestsum-0.5.0/testdata/postrunhook/main.go000066400000000000000000000007531367230725500212440ustar00rootroot00000000000000package main import ( "errors" "fmt" "os" "sort" "strings" ) func main() { if err := run(); err != nil { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1) } } func run() error { environ := os.Environ() sort.Strings(environ) for _, v := range environ { for _, prefix := range []string{"TESTS_", "GOTESTSUM_"} { if strings.HasPrefix(v, prefix) { fmt.Println(v) } } } err := os.Getenv("TEST_STUB_ERROR") if err != "" { return errors.New(err) } return nil } gotestsum-0.5.0/testjson/000077500000000000000000000000001367230725500154315ustar00rootroot00000000000000gotestsum-0.5.0/testjson/doc.go000066400000000000000000000010501367230725500165210ustar00rootroot00000000000000/*Package testjson scans test2json output and builds up a summary of the events. Events are passed to a formatter for output. Example This example reads the test2json output from os.Stdin. It builds an Execution from the output, then it prints the number of tests run. exec, err := testjson.ScanTestOutput(testjson.ScanConfig{Stdout: os.Stdin}) if err != nil { return fmt.Errorf("failed to scan testjson: %v", err) } fmt.Println("Ran %d tests", exec.Total()) */ package testjson // import "gotest.tools/gotestsum/testjson" gotestsum-0.5.0/testjson/dotformat.go000066400000000000000000000067241367230725500177700ustar00rootroot00000000000000package testjson import ( "fmt" "io" "os" "sort" "strings" "time" "golang.org/x/crypto/ssh/terminal" "gotest.tools/gotestsum/internal/dotwriter" "gotest.tools/gotestsum/log" ) func dotsFormatV1(event TestEvent, exec *Execution) (string, error) { pkg := exec.Package(event.Package) switch { case event.PackageEvent(): return "", nil case event.Action == ActionRun && pkg.Total == 1: return "[" + RelativePackagePath(event.Package) + "]", nil } return fmtDot(event), nil } func fmtDot(event TestEvent) string { withColor := colorEvent(event) switch event.Action { case ActionPass: return withColor("·") case ActionFail: return withColor("✖") case ActionSkip: return withColor("↷") } return "" } type dotFormatter struct { pkgs map[string]*dotLine order []string writer *dotwriter.Writer termWidth int } type dotLine struct { runes int builder *strings.Builder lastUpdate time.Time } func (l *dotLine) update(dot string) { if dot == "" { return } l.builder.WriteString(dot) l.runes++ } // checkWidth marks the line as full when the width of the line hits the // terminal width. func (l *dotLine) checkWidth(prefix, terminal int) { if prefix+l.runes >= terminal { l.builder.WriteString("\n" + strings.Repeat(" ", prefix)) l.runes = 0 } } func newDotFormatter(out io.Writer) EventFormatter { w, _, err := terminal.GetSize(int(os.Stdout.Fd())) if err != nil || w == 0 { log.Warnf("Failed to detect terminal width for dots format, error: %v", err) return &formatAdapter{format: dotsFormatV1, out: out} } return &dotFormatter{ pkgs: make(map[string]*dotLine), writer: dotwriter.New(out), termWidth: w, } } func (d *dotFormatter) Format(event TestEvent, exec *Execution) error { if d.pkgs[event.Package] == nil { d.pkgs[event.Package] = &dotLine{builder: new(strings.Builder)} d.order = append(d.order, event.Package) } line := d.pkgs[event.Package] line.lastUpdate = event.Time if !event.PackageEvent() { line.update(fmtDot(event)) } switch event.Action { case ActionOutput, ActionBench: return nil } // Add an empty header to work around incorrect line counting fmt.Fprint(d.writer, "\n\n") sort.Slice(d.order, d.orderByLastUpdated) for _, pkg := range d.order { line := d.pkgs[pkg] pkgname := RelativePackagePath(pkg) + " " prefix := fmtDotElapsed(exec.Package(pkg)) line.checkWidth(len(prefix+pkgname), d.termWidth) fmt.Fprintf(d.writer, prefix+pkgname+line.builder.String()+"\n") } PrintSummary(d.writer, exec, SummarizeNone) return d.writer.Flush() } // orderByLastUpdated so that the most recently updated packages move to the // bottom of the list, leaving completed package in the same order at the top. func (d *dotFormatter) orderByLastUpdated(i, j int) bool { return d.pkgs[d.order[i]].lastUpdate.Before(d.pkgs[d.order[j]].lastUpdate) } func fmtDotElapsed(p *Package) string { f := func(v string) string { return fmt.Sprintf(" %5s ", v) } elapsed := p.Elapsed() switch { case p.cached: return f("🖴 ") case elapsed <= 0: return f("") case elapsed >= time.Hour: return f("⏳ ") case elapsed < time.Second: return f(elapsed.String()) } const maxWidth = 7 var steps = []time.Duration{ time.Millisecond, 10 * time.Millisecond, 100 * time.Millisecond, time.Second, 10 * time.Second, time.Minute, 10 * time.Minute, } for _, trunc := range steps { r := f(elapsed.Truncate(trunc).String()) if len(r) <= maxWidth { return r } } return f("") } gotestsum-0.5.0/testjson/dotformat_test.go000066400000000000000000000060431367230725500210210ustar00rootroot00000000000000package testjson import ( "bytes" "math/rand" "runtime" "testing" "testing/quick" "time" "unicode/utf8" "gotest.tools/gotestsum/internal/dotwriter" "gotest.tools/gotestsum/internal/text" "gotest.tools/v3/assert" "gotest.tools/v3/assert/cmp" "gotest.tools/v3/golden" "gotest.tools/v3/skip" ) func TestScanTestOutput_WithDotsFormatter(t *testing.T) { defer patchPkgPathPrefix("github.com/gotestyourself/gotestyourself")() out := new(bytes.Buffer) dotfmt := &dotFormatter{ pkgs: make(map[string]*dotLine), writer: dotwriter.New(out), termWidth: 80, } shim := newFakeHandler(dotfmt, "go-test-json") exec, err := ScanTestOutput(shim.Config(t)) assert.NilError(t, err) actual := text.ProcessLines(t, out, text.OpRemoveSummaryLineElapsedTime) golden.Assert(t, actual, outFile("dots-format")) golden.Assert(t, shim.err.String(), "dots-format.err") assert.DeepEqual(t, exec, expectedExecution, cmpExecutionShallow) } func outFile(name string) string { if runtime.GOOS == "windows" { return name + "-windows.out" } return name + ".out" } func TestFmtDotElapsed(t *testing.T) { var testcases = []struct { cached bool elapsed time.Duration expected string }{ { elapsed: 999 * time.Microsecond, expected: " 999µs ", }, { elapsed: 7 * time.Millisecond, expected: " 7ms ", }, { cached: true, elapsed: time.Millisecond, expected: " 🖴 ", }, { elapsed: 3 * time.Hour, expected: " ⏳ ", }, { elapsed: 14 * time.Millisecond, expected: " 14ms ", }, { elapsed: 333 * time.Millisecond, expected: " 333ms ", }, { elapsed: 1337 * time.Millisecond, expected: " 1.33s ", }, { elapsed: 14821 * time.Millisecond, expected: " 14.8s ", }, { elapsed: time.Minute + 59*time.Second, expected: " 1m59s ", }, { elapsed: 59*time.Minute + 59*time.Second, expected: " 59m0s ", }, { elapsed: 148213 * time.Millisecond, expected: " 2m28s ", }, { elapsed: 1482137 * time.Millisecond, expected: " 24m0s ", }, } for _, tc := range testcases { t.Run(tc.expected, func(t *testing.T) { pkg := &Package{ cached: tc.cached, Passed: []TestCase{{Elapsed: tc.elapsed}}, } actual := fmtDotElapsed(pkg) assert.Check(t, cmp.Equal(utf8.RuneCountInString(actual), 7)) assert.Equal(t, actual, tc.expected) }) } } func TestFmtDotElapsed_RuneCountProperty(t *testing.T) { f := func(d time.Duration) bool { pkg := &Package{ Passed: []TestCase{{Elapsed: d}}, } actual := fmtDotElapsed(pkg) width := utf8.RuneCountInString(actual) if width == 7 { return true } t.Logf("actual %v (width %d)", actual, width) return false } seed := time.Now().Unix() t.Log("seed", seed) assert.Assert(t, quick.Check(f, &quick.Config{ MaxCountScale: 2000, Rand: rand.New(rand.NewSource(seed)), })) } func TestNewDotFormatter(t *testing.T) { buf := new(bytes.Buffer) ef := newDotFormatter(buf) d, ok := ef.(*dotFormatter) skip.If(t, !ok, "no terminal width") assert.Assert(t, d.termWidth != 0) } gotestsum-0.5.0/testjson/execution.go000066400000000000000000000372441367230725500177750ustar00rootroot00000000000000package testjson import ( "bufio" "bytes" "encoding/json" "fmt" "io" "sort" "strings" "time" "github.com/jonboulle/clockwork" "github.com/pkg/errors" "golang.org/x/sync/errgroup" "gotest.tools/gotestsum/log" ) // Action of TestEvent type Action string // nolint: unused const ( ActionRun Action = "run" ActionPause Action = "pause" ActionCont Action = "cont" ActionPass Action = "pass" ActionBench Action = "bench" ActionFail Action = "fail" ActionOutput Action = "output" ActionSkip Action = "skip" ) // TestEvent is a structure output by go tool test2json and go test -json. type TestEvent struct { // Time encoded as an RFC3339-format string Time time.Time Action Action Package string Test string // Elapsed time in seconds Elapsed float64 // Output of test or benchmark Output string // raw is the raw JSON bytes of the event raw []byte } // PackageEvent returns true if the event is a package start or end event func (e TestEvent) PackageEvent() bool { return e.Test == "" } // ElapsedFormatted returns Elapsed formatted in the go test format, ex (0.00s). func (e TestEvent) ElapsedFormatted() string { return fmt.Sprintf("(%.2fs)", e.Elapsed) } // Bytes returns the serialized JSON bytes that were parsed to create the event. func (e TestEvent) Bytes() []byte { return e.raw } // Package is the set of TestEvents for a single go package type Package struct { Total int running map[string]TestCase Failed []TestCase Skipped []TestCase Passed []TestCase // mapping of root TestCase ID to all sub test IDs. Used to mitigate // github.com/golang/go/issues/29755. // In the future when that bug is fixed this mapping can likely be removed. subTests map[int][]int // output printed by test cases, indexed by TestCase.ID. Package output is // saved with key 0. output map[int][]string // coverage stores the code coverage output for the package without the // trailing newline (ex: coverage: 91.1% of statements). coverage string // action identifies if the package passed or failed. A package may fail // with no test failures if an init() or TestMain exits non-zero. // skip indicates there were no tests. action Action // cached is true if the package was marked as (cached) cached bool } // Result returns if the package passed, failed, or was skipped because there // were no tests. func (p *Package) Result() Action { return p.action } // Elapsed returns the sum of the elapsed time for all tests in the package. func (p *Package) Elapsed() time.Duration { elapsed := time.Duration(0) for _, testcase := range p.TestCases() { elapsed += testcase.Elapsed } return elapsed } // TestCases returns all the test cases. func (p *Package) TestCases() []TestCase { tc := append([]TestCase{}, p.Passed...) tc = append(tc, p.Failed...) tc = append(tc, p.Skipped...) return tc } // LastFailedByName returns the most recent test with name in the list of Failed // tests. If no TestCase is found with that name, an empty TestCase is returned. // // LastFailedByName may be used by formatters to find the TestCase.ID for the current // failing TestEvent. It is very likely the last TestCase in Failed, but this method // provides a little more safety if that ever changes. func (p *Package) LastFailedByName(name string) TestCase { for i := len(p.Failed) - 1; i >= 0; i-- { if p.Failed[i].Test == name { return p.Failed[i] } } return TestCase{} } // Output returns the full test output for a test. // // Unlike OutputLines() it does not return lines from subtests in some cases. func (p *Package) Output(id int) string { return strings.Join(p.output[id], "") } // OutputLines returns the full test output for a test as a slice of strings. // // As a workaround for test output being attributed to the wrong subtest, if: // - the TestCase is a root TestCase (not a subtest), and // - the TestCase has no subtest failures; // then all output for every subtest under the root test is returned. // See https://github.com/golang/go/issues/29755. func (p *Package) OutputLines(tc TestCase) []string { _, sub := splitTestName(tc.Test) lines := p.output[tc.ID] // If this is a subtest, or a root test case with subtest failures the // subtest failure output should contain the relevant lines, so we don't need // extra lines. if sub != "" || tc.hasSubTestFailed { return lines } result := make([]string, 0, len(lines)+1) result = append(result, lines...) for _, sub := range p.subTests[tc.ID] { result = append(result, p.output[sub]...) } return result } func (p *Package) addOutput(id int, output string) { // TODO: limit size of buffered test output p.output[id] = append(p.output[id], output) } // splitTestName into root test name and any subtest names. func splitTestName(name string) (root, sub string) { parts := strings.SplitN(name, "/", 2) if len(parts) < 2 { return name, "" } return parts[0], parts[1] } func (p *Package) removeOutput(id int) { delete(p.output, id) skipped := tcIDSet(p.Skipped) for _, sub := range p.subTests[id] { if _, isSkipped := skipped[sub]; !isSkipped { delete(p.output, sub) } } } func tcIDSet(skipped []TestCase) map[int]struct{} { result := make(map[int]struct{}) for _, tc := range skipped { result[tc.ID] = struct{}{} } return result } // TestMainFailed returns true if the package failed, but there were no tests. // This may occur if the package init() or TestMain exited non-zero. func (p *Package) TestMainFailed() bool { return p.action == ActionFail && len(p.Failed) == 0 } const neverFinished time.Duration = -1 // end adds any tests that were missing an ActionFail TestEvent to the list of // Failed, and returns a slice of artificial TestEvent for the missing ones. // // This is done to work around 'go test' not sending the ActionFail TestEvents // in some cases, when a test panics. func (p *Package) end() []TestEvent { result := make([]TestEvent, 0, len(p.running)) for _, tc := range p.running { tc.Elapsed = neverFinished p.Failed = append(p.Failed, tc) result = append(result, TestEvent{ Action: ActionFail, Package: tc.Package, Test: tc.Test, Elapsed: float64(neverFinished), }) } return result } // TestCase stores the name and elapsed time for a test case. type TestCase struct { // ID is unique ID for each test case. A test run may include multiple instances // of the same Package and Name if -count is used, or if the input comes from // multiple runs. The ID can be used to uniquely reference an instance of a // test case. ID int Package string Test string Elapsed time.Duration // hasSubTestFailed is true when a subtest of this TestCase has failed. It is // used to find root TestCases which have no failing subtests. hasSubTestFailed bool } func newPackage() *Package { return &Package{ output: make(map[int][]string), running: make(map[string]TestCase), subTests: make(map[int][]int), } } // Execution of one or more test packages type Execution struct { started time.Time packages map[string]*Package errors []string done bool } func (e *Execution) add(event TestEvent) { pkg, ok := e.packages[event.Package] if !ok { pkg = newPackage() e.packages[event.Package] = pkg } if event.PackageEvent() { e.addPackageEvent(pkg, event) return } pkg.addTestEvent(event) } func (e *Execution) addPackageEvent(pkg *Package, event TestEvent) { switch event.Action { case ActionPass, ActionFail: pkg.action = event.Action case ActionOutput: if isCoverageOutput(event.Output) { pkg.coverage = strings.TrimRight(event.Output, "\n") } if isCachedOutput(event.Output) { pkg.cached = true } pkg.addOutput(0, event.Output) } } // nolint: gocyclo func (p *Package) addTestEvent(event TestEvent) { tc := p.running[event.Test] root, subTest := splitTestName(event.Test) switch event.Action { case ActionRun: // Incremental total before using it as the ID, because ID 0 is used for // the package output p.Total++ tc := TestCase{ Package: event.Package, Test: event.Test, ID: p.Total, } p.running[event.Test] = tc if subTest != "" { rootID := p.running[root].ID p.subTests[rootID] = append(p.subTests[rootID], tc.ID) } return case ActionOutput, ActionBench: p.addOutput(tc.ID, event.Output) return case ActionPause, ActionCont: return } delete(p.running, event.Test) tc.Elapsed = elapsedDuration(event.Elapsed) switch event.Action { case ActionFail: p.Failed = append(p.Failed, tc) // If this is a subtest, mark the root test as having a failed subtest if subTest != "" { rootTestCase := p.running[root] rootTestCase.hasSubTestFailed = true p.running[root] = rootTestCase } case ActionSkip: p.Skipped = append(p.Skipped, tc) case ActionPass: p.Passed = append(p.Passed, tc) // Do not immediately remove output for subtests, to work around a bug // in 'go test' where output is attributed to the wrong sub test. // github.com/golang/go/issues/29755. if subTest != "" { return } // Remove test output once a test passes, it wont be used. p.removeOutput(tc.ID) // Remove subtest mapping, it is only used when a test fails. delete(p.subTests, tc.ID) } } func elapsedDuration(elapsed float64) time.Duration { return time.Duration(elapsed*1000) * time.Millisecond } func isCoverageOutput(output string) bool { return all( strings.HasPrefix(output, "coverage:"), strings.HasSuffix(output, "% of statements\n")) } func isCachedOutput(output string) bool { return strings.Contains(output, "\t(cached)") } // OutputLines returns the full test output for a test as an slice of lines. // This function is a convenient wrapper around Package.OutputLines() to // support the hiding of output in the summary. // // See Package.OutLines() for more details. func (e *Execution) OutputLines(tc TestCase) []string { return e.packages[tc.Package].OutputLines(tc) } // Package returns the Package by name. func (e *Execution) Package(name string) *Package { return e.packages[name] } // Packages returns a sorted list of all package names. func (e *Execution) Packages() []string { return sortedKeys(e.packages) } var clock = clockwork.NewRealClock() // Elapsed returns the time elapsed since the execution started. func (e *Execution) Elapsed() time.Duration { return clock.Now().Sub(e.started) } // Failed returns a list of all the failed test cases. func (e *Execution) Failed() []TestCase { if e == nil { return nil } var failed []TestCase //nolint:prealloc for _, name := range sortedKeys(e.packages) { pkg := e.packages[name] // Add package-level failure output if there were no failed tests. if pkg.TestMainFailed() { failed = append(failed, TestCase{Package: name}) } failed = append(failed, pkg.Failed...) } return failed } func sortedKeys(pkgs map[string]*Package) []string { keys := make([]string, 0, len(pkgs)) for key := range pkgs { keys = append(keys, key) } sort.Strings(keys) return keys } // Skipped returns a list of all the skipped test cases. func (e *Execution) Skipped() []TestCase { skipped := make([]TestCase, 0, len(e.packages)) for _, pkg := range sortedKeys(e.packages) { skipped = append(skipped, e.packages[pkg].Skipped...) } return skipped } // Total returns a count of all test cases. func (e *Execution) Total() int { total := 0 for _, pkg := range e.packages { total += pkg.Total } return total } func (e *Execution) addError(err string) { // Build errors start with a header if strings.HasPrefix(err, "# ") { return } e.errors = append(e.errors, err) } // Errors returns a list of all the errors. func (e *Execution) Errors() []string { return e.errors } func (e *Execution) end() []TestEvent { e.done = true var result []TestEvent // nolint: prealloc for _, pkg := range e.packages { result = append(result, pkg.end()...) } return result } // newExecution returns a new Execution and records the current time as the // time the test execution started. func newExecution() *Execution { return &Execution{ started: clock.Now(), packages: make(map[string]*Package), } } // ScanConfig used by ScanTestOutput. type ScanConfig struct { // Stdout is a reader that yields the test2json output stream. Stdout io.Reader // Stderr is a reader that yields stderr from the 'go test' process. Often // it contains build errors, or panics. Stderr may be nil. Stderr io.Reader // Handler is a set of callbacks for receiving TestEvents and stderr text. Handler EventHandler // Execution to populate while scanning. If nil a new one will be created // and returned from ScanTestOutput. Execution *Execution } // EventHandler is called by ScanTestOutput for each event and write to stderr. type EventHandler interface { // Event is called for every TestEvent, with the current value of Execution. // It may return an error to stop scanning. Event(event TestEvent, execution *Execution) error // Err is called for every line from the Stderr reader and may return an // error to stop scanning. Err(text string) error } // ScanTestOutput reads lines from config.Stdout and config.Stderr, populates an // Execution, calls the Handler for each event, and returns the Execution. // // If config.Handler is nil, a default no-op handler will be used. func ScanTestOutput(config ScanConfig) (*Execution, error) { if config.Stdout == nil { return nil, fmt.Errorf("stdout reader must be non-nil") } if config.Handler == nil { config.Handler = noopHandler{} } if config.Stderr == nil { config.Stderr = new(bytes.Reader) } execution := config.Execution if execution == nil { execution = newExecution() } var group errgroup.Group group.Go(func() error { return readStdout(config, execution) }) group.Go(func() error { return readStderr(config, execution) }) if err := group.Wait(); err != nil { return execution, err } for _, event := range execution.end() { if err := config.Handler.Event(event, execution); err != nil { return execution, err } } return execution, nil } func readStdout(config ScanConfig, execution *Execution) error { scanner := bufio.NewScanner(config.Stdout) for scanner.Scan() { raw := scanner.Bytes() event, err := parseEvent(raw) switch { case err == errBadEvent: // nolint: errcheck config.Handler.Err(errBadEvent.Error() + ": " + scanner.Text()) continue case err != nil: return errors.Wrapf(err, "failed to parse test output: %s", string(raw)) } execution.add(event) if err := config.Handler.Event(event, execution); err != nil { return err } } return errors.Wrap(scanner.Err(), "failed to scan test output") } func readStderr(config ScanConfig, execution *Execution) error { scanner := bufio.NewScanner(config.Stderr) for scanner.Scan() { line := scanner.Text() if err := config.Handler.Err(line); err != nil { return fmt.Errorf("failed to handle stderr: %v", err) } if isGoModuleOutput(line) { continue } execution.addError(line) } if err := scanner.Err(); err != nil { return fmt.Errorf("failed to scan stderr: %v", err) } return nil } func isGoModuleOutput(scannerText string) bool { prefixes := []string{ "go: copying", "go: creating", "go: downloading", "go: extracting", "go: finding", } for _, prefix := range prefixes { if strings.HasPrefix(scannerText, prefix) { return true } } return false } func parseEvent(raw []byte) (TestEvent, error) { // TODO: this seems to be a bug in the `go test -json` output if bytes.HasPrefix(raw, []byte("FAIL")) { log.Warnf("invalid TestEvent: %v", string(raw)) return TestEvent{}, errBadEvent } event := TestEvent{} err := json.Unmarshal(raw, &event) event.raw = raw return event, err } var errBadEvent = errors.New("bad output from test2json") type noopHandler struct{} func (s noopHandler) Event(TestEvent, *Execution) error { return nil } func (s noopHandler) Err(string) error { return nil } gotestsum-0.5.0/testjson/execution_test.go000066400000000000000000000025421367230725500210250ustar00rootroot00000000000000package testjson import ( "bytes" "testing" "time" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "gotest.tools/v3/assert" "gotest.tools/v3/golden" ) func TestPackage_Elapsed(t *testing.T) { pkg := &Package{ Failed: []TestCase{ {Elapsed: 300 * time.Millisecond}, }, Passed: []TestCase{ {Elapsed: 200 * time.Millisecond}, {Elapsed: 2500 * time.Millisecond}, }, Skipped: []TestCase{ {Elapsed: 100 * time.Millisecond}, }, } assert.Equal(t, pkg.Elapsed(), 3100*time.Millisecond) } func TestExecution_Add_PackageCoverage(t *testing.T) { exec := newExecution() exec.add(TestEvent{ Package: "mytestpkg", Action: ActionOutput, Output: "coverage: 33.1% of statements\n", }) pkg := exec.Package("mytestpkg") expected := &Package{ coverage: "coverage: 33.1% of statements", output: map[int][]string{ 0: {"coverage: 33.1% of statements\n"}, }, running: map[string]TestCase{}, } assert.DeepEqual(t, pkg, expected, cmpPackage) } var cmpPackage = cmp.Options{ cmp.AllowUnexported(Package{}), cmpopts.EquateEmpty(), } func TestScanTestOutput_MinimalConfig(t *testing.T) { in := bytes.NewReader(golden.Get(t, "go-test-json.out")) exec, err := ScanTestOutput(ScanConfig{Stdout: in}) assert.NilError(t, err) // a weak check to show that all the stdout was scanned assert.Equal(t, exec.Total(), 46) } gotestsum-0.5.0/testjson/format.go000066400000000000000000000130171367230725500172520ustar00rootroot00000000000000package testjson import ( "fmt" "io" "strings" "github.com/fatih/color" ) func debugFormat(event TestEvent, _ *Execution) (string, error) { return fmt.Sprintf("%s %s %s (%.3f) [%d] %s\n", event.Package, event.Test, event.Action, event.Elapsed, event.Time.Unix(), event.Output), nil } // go test -v func standardVerboseFormat(event TestEvent, _ *Execution) (string, error) { if event.Action == ActionOutput { return event.Output, nil } return "", nil } // go test func standardQuietFormat(event TestEvent, _ *Execution) (string, error) { if !event.PackageEvent() { return "", nil } if event.Output != "PASS\n" && !isCoverageOutput(event.Output) { return event.Output, nil } return "", nil } func shortVerboseFormat(event TestEvent, exec *Execution) (string, error) { result := colorEvent(event)(strings.ToUpper(string(event.Action))) formatTest := func() string { pkgPath := RelativePackagePath(event.Package) // If the package path isn't the current directory, we add // a period to separate the test name and the package path. // If it is the current directory, we don't show it at all. // This prevents output like ..MyTest when the test // is in the current directory. if pkgPath == "." { pkgPath = "" } else { pkgPath += "." } return fmt.Sprintf("%s %s%s %s\n", result, pkgPath, event.Test, event.ElapsedFormatted()) } switch { case isPkgFailureOutput(event): return event.Output, nil case event.PackageEvent(): switch event.Action { case ActionSkip: result = colorEvent(event)("EMPTY") fallthrough case ActionPass, ActionFail: var cached string if exec.Package(event.Package).cached { cached = cachedMessage } return fmt.Sprintf("%s %s%s\n", result, RelativePackagePath(event.Package), cached), nil } case event.Action == ActionFail: pkg := exec.Package(event.Package) tc := pkg.LastFailedByName(event.Test) return pkg.Output(tc.ID) + formatTest(), nil case event.Action == ActionPass: return formatTest(), nil } return "", nil } // isPkgFailureOutput returns true if the event is package output, and the output // doesn't match any of the expected framing messages. Events which match this // pattern should be package-level failures (ex: exit(1) or panic in an init() or // TestMain). func isPkgFailureOutput(event TestEvent) bool { out := event.Output return all( event.PackageEvent(), event.Action == ActionOutput, out != "PASS\n", out != "FAIL\n", !strings.HasPrefix(out, "FAIL\t"+event.Package), !strings.HasPrefix(out, "ok \t"+event.Package), !strings.HasPrefix(out, "? \t"+event.Package), ) } func all(cond ...bool) bool { for _, c := range cond { if !c { return false } } return true } const cachedMessage = " (cached)" func shortFormat(event TestEvent, exec *Execution) (string, error) { if !event.PackageEvent() { return "", nil } return shortFormatPackageEvent(event, exec) } func shortFormatPackageEvent(event TestEvent, exec *Execution) (string, error) { pkg := exec.Package(event.Package) fmtElapsed := func() string { if pkg.cached { return cachedMessage } d := elapsedDuration(event.Elapsed) if d == 0 { return "" } return fmt.Sprintf(" (%s)", d) } fmtCoverage := func() string { if pkg.coverage == "" { return "" } return " (" + pkg.coverage + ")" } fmtEvent := func(action string) (string, error) { return fmt.Sprintf("%s %s%s%s\n", action, RelativePackagePath(event.Package), fmtElapsed(), fmtCoverage(), ), nil } withColor := colorEvent(event) switch event.Action { case ActionSkip: return fmtEvent(withColor("∅")) case ActionPass: return fmtEvent(withColor("✓")) case ActionFail: return fmtEvent(withColor("✖")) } return "", nil } func shortWithFailuresFormat(event TestEvent, exec *Execution) (string, error) { if !event.PackageEvent() { if event.Action == ActionFail { pkg := exec.Package(event.Package) tc := pkg.LastFailedByName(event.Test) return pkg.Output(tc.ID), nil } return "", nil } return shortFormatPackageEvent(event, exec) } func colorEvent(event TestEvent) func(format string, a ...interface{}) string { switch event.Action { case ActionPass: return color.GreenString case ActionFail: return color.RedString case ActionSkip: return color.YellowString } return color.WhiteString } // EventFormatter is a function which handles an event and returns a string to // output for the event. type EventFormatter interface { Format(event TestEvent, output *Execution) error } // NewEventFormatter returns a formatter for printing events. func NewEventFormatter(out io.Writer, format string) EventFormatter { switch format { case "debug": return &formatAdapter{out, debugFormat} case "standard-verbose": return &formatAdapter{out, standardVerboseFormat} case "standard-quiet": return &formatAdapter{out, standardQuietFormat} case "dots", "dots-v1": return &formatAdapter{out, dotsFormatV1} case "dots-v2": return newDotFormatter(out) case "testname", "short-verbose": return &formatAdapter{out, shortVerboseFormat} case "pkgname", "short": return &formatAdapter{out, shortFormat} case "pkgname-and-test-fails", "short-with-failures": return &formatAdapter{out, shortWithFailuresFormat} default: return nil } } type formatAdapter struct { out io.Writer format func(TestEvent, *Execution) (string, error) } func (f *formatAdapter) Format(event TestEvent, exec *Execution) error { o, err := f.format(event, exec) if err != nil { return err } _, err = f.out.Write([]byte(o)) return err } gotestsum-0.5.0/testjson/format_test.go000066400000000000000000000165021367230725500203130ustar00rootroot00000000000000package testjson import ( "bytes" "testing" "time" gocmp "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "gotest.tools/v3/assert" "gotest.tools/v3/assert/opt" "gotest.tools/v3/golden" ) //go:generate ./generate.sh type fakeHandler struct { inputName string formatter EventFormatter out *bytes.Buffer err *bytes.Buffer } func (s *fakeHandler) Config(t *testing.T) ScanConfig { return ScanConfig{ Stdout: bytes.NewReader(golden.Get(t, s.inputName+".out")), Stderr: bytes.NewReader(golden.Get(t, s.inputName+".err")), Handler: s, } } func newFakeHandlerWithAdapter( format func(event TestEvent, output *Execution) (string, error), inputName string, ) *fakeHandler { out := new(bytes.Buffer) return &fakeHandler{ inputName: inputName, formatter: &formatAdapter{out: out, format: format}, out: out, err: new(bytes.Buffer), } } func newFakeHandler(formatter EventFormatter, inputName string) *fakeHandler { return &fakeHandler{ inputName: inputName, formatter: formatter, out: new(bytes.Buffer), err: new(bytes.Buffer), } } func (s *fakeHandler) Event(event TestEvent, execution *Execution) error { return s.formatter.Format(event, execution) } func (s *fakeHandler) Err(text string) error { s.err.WriteString(text + "\n") return nil } func patchPkgPathPrefix(val string) func() { var oldVal string oldVal, pkgPathPrefix = pkgPathPrefix, val return func() { pkgPathPrefix = oldVal } } func TestScanTestOutputWithShortVerboseFormat(t *testing.T) { defer patchPkgPathPrefix("github.com/gotestyourself/gotestyourself")() shim := newFakeHandlerWithAdapter(shortVerboseFormat, "go-test-json") exec, err := ScanTestOutput(shim.Config(t)) assert.NilError(t, err) golden.Assert(t, shim.out.String(), "short-verbose-format.out") golden.Assert(t, shim.err.String(), "short-verbose-format.err") assert.DeepEqual(t, exec, expectedExecution, cmpExecutionShallow) } var expectedExecution = &Execution{ done: true, started: time.Now(), errors: []string{"internal/broken/broken.go:5:21: undefined: somepackage"}, packages: map[string]*Package{ "github.com/gotestyourself/gotestyourself/testjson/internal/good": { Total: 18, Skipped: []TestCase{ {Test: "TestSkipped"}, {Test: "TestSkippedWitLog"}, }, action: ActionPass, cached: true, running: map[string]TestCase{}, }, "github.com/gotestyourself/gotestyourself/testjson/internal/stub": { Total: 28, Failed: []TestCase{ {Test: "TestFailed"}, {Test: "TestFailedWithStderr"}, {Test: "TestNestedWithFailure/c"}, {Test: "TestNestedWithFailure"}, }, Skipped: []TestCase{ {Test: "TestSkipped"}, {Test: "TestSkippedWitLog"}, }, action: ActionFail, running: map[string]TestCase{}, }, "github.com/gotestyourself/gotestyourself/testjson/internal/badmain": { action: ActionFail, running: map[string]TestCase{}, }, }, } var cmpExecutionShallow = gocmp.Options{ gocmp.AllowUnexported(Execution{}, Package{}), gocmp.FilterPath(stringPath("started"), opt.TimeWithThreshold(10*time.Second)), cmpopts.EquateEmpty(), cmpPackageShallow, } var cmpPackageShallow = gocmp.Options{ gocmp.FilterPath(opt.PathField(Package{}, "output"), gocmp.Ignore()), gocmp.FilterPath(opt.PathField(Package{}, "Passed"), gocmp.Ignore()), gocmp.FilterPath(opt.PathField(Package{}, "subTests"), gocmp.Ignore()), gocmp.Comparer(func(x, y TestCase) bool { return x.Test == y.Test }), } func stringPath(spec string) func(gocmp.Path) bool { return func(path gocmp.Path) bool { return path.String() == spec } } func TestScanTestOutputWithDotsFormatV1(t *testing.T) { defer patchPkgPathPrefix("github.com/gotestyourself/gotestyourself")() shim := newFakeHandlerWithAdapter(dotsFormatV1, "go-test-json") exec, err := ScanTestOutput(shim.Config(t)) assert.NilError(t, err) golden.Assert(t, shim.out.String(), "dots-v1-format.out") golden.Assert(t, shim.err.String(), "dots-v1-format.err") assert.DeepEqual(t, exec, expectedExecution, cmpExecutionShallow) } func TestScanTestOutputWithShortFormat(t *testing.T) { defer patchPkgPathPrefix("github.com/gotestyourself/gotestyourself")() shim := newFakeHandlerWithAdapter(shortFormat, "go-test-json") exec, err := ScanTestOutput(shim.Config(t)) assert.NilError(t, err) golden.Assert(t, shim.out.String(), "short-format.out") golden.Assert(t, shim.err.String(), "short-format.err") assert.DeepEqual(t, exec, expectedExecution, cmpExecutionShallow) } func TestScanTestOutputWithShortFormat_WithCoverage(t *testing.T) { defer patchPkgPathPrefix("gotest.tools")() shim := newFakeHandlerWithAdapter(shortFormat, "go-test-json-with-cover") exec, err := ScanTestOutput(shim.Config(t)) assert.NilError(t, err) golden.Assert(t, shim.out.String(), "short-format-coverage.out") golden.Assert(t, shim.err.String(), "short-format-coverage.err") assert.DeepEqual(t, exec, expectedCoverageExecution, cmpExecutionShallow) } func TestScanTestOutputWithStandardVerboseFormat(t *testing.T) { defer patchPkgPathPrefix("github.com/gotestyourself/gotestyourself")() shim := newFakeHandlerWithAdapter(standardVerboseFormat, "go-test-json") exec, err := ScanTestOutput(shim.Config(t)) assert.NilError(t, err) golden.Assert(t, shim.out.String(), "go-test-verbose.out") golden.Assert(t, shim.err.String(), "go-test-verbose.err") assert.DeepEqual(t, exec, expectedExecution, cmpExecutionShallow) } func TestScanTestOutputWithStandardQuietFormat(t *testing.T) { defer patchPkgPathPrefix("github.com/gotestyourself/gotestyourself")() shim := newFakeHandlerWithAdapter(standardQuietFormat, "go-test-json") exec, err := ScanTestOutput(shim.Config(t)) assert.NilError(t, err) golden.Assert(t, shim.out.String(), "standard-quiet-format.out") golden.Assert(t, shim.err.String(), "standard-quiet-format.err") assert.DeepEqual(t, exec, expectedExecution, cmpExecutionShallow) } func TestScanTestOutputWithStandardQuietFormat_WithCoverage(t *testing.T) { defer patchPkgPathPrefix("gotest.tools")() shim := newFakeHandlerWithAdapter(standardQuietFormat, "go-test-json-with-cover") exec, err := ScanTestOutput(shim.Config(t)) assert.NilError(t, err) golden.Assert(t, shim.out.String(), "standard-quiet-format-coverage.out") golden.Assert(t, shim.err.String(), "standard-quiet-format-coverage.err") assert.DeepEqual(t, exec, expectedCoverageExecution, cmpExecutionShallow) } var expectedCoverageExecution = &Execution{ done: true, started: time.Now(), errors: []string{"internal/broken/broken.go:5:21: undefined: somepackage"}, packages: map[string]*Package{ "gotest.tools/gotestsum/testjson/internal/good": { Total: 18, Skipped: []TestCase{ {Test: "TestSkipped"}, {Test: "TestSkippedWitLog"}, }, action: ActionPass, coverage: "coverage: 0.0% of statements", running: map[string]TestCase{}, }, "gotest.tools/gotestsum/testjson/internal/stub": { Total: 28, Failed: []TestCase{ {Test: "TestFailed"}, {Test: "TestFailedWithStderr"}, {Test: "TestNestedWithFailure/c"}, {Test: "TestNestedWithFailure"}, }, Skipped: []TestCase{ {Test: "TestSkipped"}, {Test: "TestSkippedWitLog"}, }, action: ActionFail, coverage: "coverage: 0.0% of statements", running: map[string]TestCase{}, }, "gotest.tools/gotestsum/testjson/internal/badmain": { action: ActionFail, running: map[string]TestCase{}, }, }, } gotestsum-0.5.0/testjson/generate.sh000077500000000000000000000016331367230725500175650ustar00rootroot00000000000000#!/usr/bin/env bash set -eu go test -p 1 -tags stubpkg ./internal/... \ > testdata/go-test-quiet.out \ 2> testdata/go-test-quiet.err \ | true go test -p 1 -v -tags stubpkg ./internal/... \ > testdata/go-test-verbose.out \ 2> testdata/go-test-verbose.err \ | true go test -p 1 -json -tags stubpkg ./internal/... \ > testdata/go-test-json.out \ 2> testdata/go-test-json.err \ | true go test -p 1 -json -timeout 10ms -tags 'stubpkg timeout' ./internal/... \ > testdata/go-test-json-with-timeout.out \ 2> testdata/go-test-json-with-timeout.err \ | true go test -p 1 -json -tags 'stubpkg panic' ./internal/... \ > testdata/go-test-json-with-panic.out \ 2> testdata/go-test-json-with-panic.err \ | true go test -p 1 -json -tags stubpkg -cover ./internal/... \ > testdata/go-test-json-with-cover.out \ 2> testdata/go-test-json-with-cover.err \ | truegotestsum-0.5.0/testjson/internal/000077500000000000000000000000001367230725500172455ustar00rootroot00000000000000gotestsum-0.5.0/testjson/internal/badmain/000077500000000000000000000000001367230725500206405ustar00rootroot00000000000000gotestsum-0.5.0/testjson/internal/badmain/main_test.go000066400000000000000000000003221367230725500231470ustar00rootroot00000000000000// +build stubpkg /*Package badmain fails in TestMain */ package badmain import ( "fmt" "os" "testing" ) func TestMain(m *testing.M) { fmt.Fprintln(os.Stderr, "sometimes main can exit 2") os.Exit(2) } gotestsum-0.5.0/testjson/internal/broken/000077500000000000000000000000001367230725500205255ustar00rootroot00000000000000gotestsum-0.5.0/testjson/internal/broken/broken.go000066400000000000000000000001231367230725500223300ustar00rootroot00000000000000// +build stubpkg package broken var missingImport = somepackage.Foo() // nolint gotestsum-0.5.0/testjson/internal/empty/000077500000000000000000000000001367230725500204035ustar00rootroot00000000000000gotestsum-0.5.0/testjson/internal/empty/empty.go000066400000000000000000000000411367230725500220630ustar00rootroot00000000000000// +build stubpkg package empty gotestsum-0.5.0/testjson/internal/frenzy/000077500000000000000000000000001367230725500205625ustar00rootroot00000000000000gotestsum-0.5.0/testjson/internal/frenzy/frenzy_test.go000066400000000000000000000004641367230725500234710ustar00rootroot00000000000000// +build stubpkg,panic package frenzy import ( "fmt" "testing" ) func TestPassed(t *testing.T) {} func TestPassedWithLog(t *testing.T) { t.Log("this is a log") } func TestPassedWithStdout(t *testing.T) { fmt.Println("this is a Print") } func TestPanics(t *testing.T) { panic("this is a panic") } gotestsum-0.5.0/testjson/internal/good/000077500000000000000000000000001367230725500201755ustar00rootroot00000000000000gotestsum-0.5.0/testjson/internal/good/good_test.go000066400000000000000000000016151367230725500225160ustar00rootroot00000000000000// +build stubpkg package good import ( "fmt" "os" "testing" "time" ) func TestPassed(t *testing.T) {} func TestPassedWithLog(t *testing.T) { t.Log("this is a log") } func TestPassedWithStdout(t *testing.T) { fmt.Println("this is a Print") } func TestSkipped(t *testing.T) { t.Skip() } func TestSkippedWitLog(t *testing.T) { t.Skip("the skip message") } func TestWithStderr(t *testing.T) { fmt.Fprintln(os.Stderr, "this is stderr") } func TestParallelTheFirst(t *testing.T) { t.Parallel() time.Sleep(10 * time.Millisecond) } func TestParallelTheSecond(t *testing.T) { t.Parallel() time.Sleep(6 * time.Millisecond) } func TestParallelTheThird(t *testing.T) { t.Parallel() time.Sleep(2 * time.Millisecond) } func TestNestedSuccess(t *testing.T) { for _, name := range []string{"a", "b", "c", "d"} { t.Run(name, func(t *testing.T) { t.Run("sub", func(t *testing.T) {}) }) } } gotestsum-0.5.0/testjson/internal/stub/000077500000000000000000000000001367230725500202225ustar00rootroot00000000000000gotestsum-0.5.0/testjson/internal/stub/stub_test.go000066400000000000000000000026061367230725500225710ustar00rootroot00000000000000// +build stubpkg /*Package stub is used to generate testdata for the testjson package. */ package stub import ( "fmt" "os" "strings" "testing" "time" ) func TestPassed(t *testing.T) {} func TestPassedWithLog(t *testing.T) { t.Log("this is a log") } func TestPassedWithStdout(t *testing.T) { fmt.Println("this is a Print") } func TestSkipped(t *testing.T) { t.Skip() } func TestSkippedWitLog(t *testing.T) { t.Skip("the skip message") } func TestFailed(t *testing.T) { t.Fatal("this failed") } func TestWithStderr(t *testing.T) { fmt.Fprintln(os.Stderr, "this is stderr") } func TestFailedWithStderr(t *testing.T) { fmt.Fprintln(os.Stderr, "this is stderr") t.Fatal("also failed") } func TestParallelTheFirst(t *testing.T) { t.Parallel() time.Sleep(10 * time.Millisecond) } func TestParallelTheSecond(t *testing.T) { t.Parallel() time.Sleep(6 * time.Millisecond) } func TestParallelTheThird(t *testing.T) { t.Parallel() time.Sleep(2 * time.Millisecond) } func TestNestedWithFailure(t *testing.T) { for _, name := range []string{"a", "b", "c", "d"} { t.Run(name, func(t *testing.T) { if strings.HasSuffix(t.Name(), "c") { t.Fatal("failed") } t.Run("sub", func(t *testing.T) {}) }) } } func TestNestedSuccess(t *testing.T) { for _, name := range []string{"a", "b", "c", "d"} { t.Run(name, func(t *testing.T) { t.Run("sub", func(t *testing.T) {}) }) } } gotestsum-0.5.0/testjson/internal/stub/timeout_test.go000066400000000000000000000002041367230725500232720ustar00rootroot00000000000000// +build stubpkg,timeout package stub import ( "testing" "time" ) func TestTimeout(t *testing.T) { time.Sleep(time.Minute) } gotestsum-0.5.0/testjson/pkgpathprefix.go000066400000000000000000000057641367230725500206500ustar00rootroot00000000000000package testjson import ( "bytes" "go/build" "io/ioutil" "os" "path/filepath" "runtime" "strconv" "strings" ) // RelativePackagePath attempts to remove a common prefix from a package path. // The common prefix is determined either by looking at the GOPATH or reading // the package value from go.mod file. // If the pkgpath does not match the common prefix it will be returned // unmodified. // If the pkgpath matches the common prefix exactly then '.' will be returned. func RelativePackagePath(pkgpath string) string { if pkgpath == pkgPathPrefix { return "." } return strings.TrimPrefix(pkgpath, pkgPathPrefix+"/") } func getPkgPathPrefix() string { cwd, _ := os.Getwd() if isGoModuleEnabled() { prefix := getPkgPathPrefixFromGoModule(cwd) if prefix != "" { return prefix } } return getPkgPathPrefixGoPath(cwd) } func isGoModuleEnabled() bool { version := runtime.Version() if strings.HasPrefix(version, "go1.10") { return false } // Go modules may not be enabled if env var is unset, or set to auto, however // we can always fall back to using GOPATH as the prefix if a go.mod is not // found. return os.Getenv("GO111MODULE") != "off" } // TODO: might not work on windows func getPkgPathPrefixGoPath(cwd string) string { gopaths := strings.Split(build.Default.GOPATH, string(filepath.ListSeparator)) for _, gopath := range gopaths { gosrcpath := gopath + "/src/" if strings.HasPrefix(cwd, gosrcpath) { return strings.TrimPrefix(cwd, gosrcpath) } } return "" } func getPkgPathPrefixFromGoModule(cwd string) string { filename := goModuleFilePath(cwd) if filename == "" { return "" } raw, err := ioutil.ReadFile(filename) if err != nil { // TODO: log.Warn return "" } return pkgPathFromGoModuleFile(raw) } var ( slashSlash = []byte("//") moduleStr = []byte("module") ) // Copy of ModulePath from golang.org/src/cmd/go/internal/modfile/read.go func pkgPathFromGoModuleFile(mod []byte) string { for len(mod) > 0 { line := mod mod = nil if i := bytes.IndexByte(line, '\n'); i >= 0 { line, mod = line[:i], line[i+1:] } if i := bytes.Index(line, slashSlash); i >= 0 { line = line[:i] } line = bytes.TrimSpace(line) if !bytes.HasPrefix(line, moduleStr) { continue } line = line[len(moduleStr):] n := len(line) line = bytes.TrimSpace(line) if len(line) == n || len(line) == 0 { continue } if line[0] == '"' || line[0] == '`' { p, err := strconv.Unquote(string(line)) if err != nil { return "" // malformed quoted string or multi-line module path } return p } return string(line) } return "" // missing module path } // A rough re-implementation of FindModuleRoot from // golang.org/src/cmd/go/internal/modload/init.go func goModuleFilePath(cwd string) string { dir := filepath.Clean(cwd) for { path := filepath.Join(dir, "go.mod") if _, err := os.Stat(path); err == nil { return path } parent := filepath.Dir(dir) if parent == dir { return "" } dir = parent } } var pkgPathPrefix = getPkgPathPrefix() gotestsum-0.5.0/testjson/pkgpathprefix_test.go000066400000000000000000000013471367230725500217000ustar00rootroot00000000000000package testjson import ( "testing" "gotest.tools/v3/assert" "gotest.tools/v3/skip" ) func TestRelativePackagePath(t *testing.T) { prefix := "gotest.tools/gotestsum/testjson" defer patchPkgPathPrefix(prefix)() relPath := RelativePackagePath(prefix + "/extra/relpath") assert.Equal(t, relPath, "extra/relpath") relPath = RelativePackagePath(prefix) assert.Equal(t, relPath, ".") } func TestGetPkgPathPrefix(t *testing.T) { t.Run("with go path", func(t *testing.T) { skip.If(t, isGoModuleEnabled()) assert.Equal(t, getPkgPathPrefix(), "gotest.tools/gotestsum/testjson") }) t.Run("with go modules", func(t *testing.T) { skip.If(t, !isGoModuleEnabled()) assert.Equal(t, getPkgPathPrefix(), "gotest.tools/gotestsum") }) } gotestsum-0.5.0/testjson/summary.go000066400000000000000000000125501367230725500174600ustar00rootroot00000000000000package testjson import ( "fmt" "io" "strings" "time" "unicode" "unicode/utf8" "github.com/fatih/color" ) // Summary enumerates the sections which can be printed by PrintSummary type Summary int // nolint: golint const ( SummarizeNone Summary = 0 SummarizeSkipped Summary = (1 << iota) / 2 SummarizeFailed SummarizeErrors SummarizeOutput SummarizeAll = SummarizeSkipped | SummarizeFailed | SummarizeErrors | SummarizeOutput ) var summaryValues = map[Summary]string{ SummarizeSkipped: "skipped", SummarizeFailed: "failed", SummarizeErrors: "errors", SummarizeOutput: "output", } var summaryFromValue = map[string]Summary{ "none": SummarizeNone, "skipped": SummarizeSkipped, "failed": SummarizeFailed, "errors": SummarizeErrors, "output": SummarizeOutput, "all": SummarizeAll, } func (s Summary) String() string { if s == SummarizeNone { return "none" } var result []string for v := Summary(1); v <= s; v <<= 1 { if s.Includes(v) { result = append(result, summaryValues[v]) } } return strings.Join(result, ",") } // Includes returns true if Summary includes all the values set by other. func (s Summary) Includes(other Summary) bool { return s&other == other } // NewSummary returns a new Summary from a string value. If the string does not // match any known values returns false for the second value. func NewSummary(value string) (Summary, bool) { s, ok := summaryFromValue[value] return s, ok } // PrintSummary of a test Execution. Prints a section for each summary type // followed by a DONE line to out. func PrintSummary(out io.Writer, execution *Execution, opts Summary) { execSummary := newExecSummary(execution, opts) if opts.Includes(SummarizeSkipped) { writeTestCaseSummary(out, execSummary, formatSkipped()) } if opts.Includes(SummarizeFailed) { writeTestCaseSummary(out, execSummary, formatFailed()) } errors := execution.Errors() if opts.Includes(SummarizeErrors) { writeErrorSummary(out, errors) } fmt.Fprintf(out, "\n%s %d tests%s%s%s in %s\n", formatExecStatus(execution.done), execution.Total(), formatTestCount(len(execution.Skipped()), "skipped", ""), formatTestCount(len(execution.Failed()), "failure", "s"), formatTestCount(countErrors(errors), "error", "s"), FormatDurationAsSeconds(execution.Elapsed(), 3)) } func formatTestCount(count int, category string, pluralize string) string { switch count { case 0: return "" case 1: default: category += pluralize } return fmt.Sprintf(", %d %s", count, category) } // TODO: maybe color this? func formatExecStatus(done bool) string { if done { return "DONE" } return "" } // FormatDurationAsSeconds formats a time.Duration as a float with an s suffix. func FormatDurationAsSeconds(d time.Duration, precision int) string { if d == neverFinished { return "unknown" } return fmt.Sprintf("%.[2]*[1]fs", d.Seconds(), precision) } func writeErrorSummary(out io.Writer, errors []string) { if len(errors) > 0 { fmt.Fprintln(out, color.MagentaString("\n=== Errors")) } for _, err := range errors { fmt.Fprintln(out, err) } } // countErrors in stderr lines. Build errors may include multiple lines where // subsequent lines are indented. // FIXME: Panics will include multiple lines, and are still overcounted. func countErrors(errors []string) int { var count int for _, line := range errors { r, _ := utf8.DecodeRuneInString(line) if !unicode.IsSpace(r) { count++ } } return count } type executionSummary interface { Failed() []TestCase Skipped() []TestCase OutputLines(TestCase) []string } type noOutputSummary struct { Execution } func (s *noOutputSummary) OutputLines(_ TestCase) []string { return nil } func newExecSummary(execution *Execution, opts Summary) executionSummary { if opts.Includes(SummarizeOutput) { return execution } return &noOutputSummary{Execution: *execution} } func writeTestCaseSummary(out io.Writer, execution executionSummary, conf testCaseFormatConfig) { testCases := conf.getter(execution) if len(testCases) == 0 { return } fmt.Fprintln(out, "\n=== "+conf.header) for _, tc := range testCases { fmt.Fprintf(out, "=== %s: %s %s (%s)\n", conf.prefix, RelativePackagePath(tc.Package), tc.Test, FormatDurationAsSeconds(tc.Elapsed, 2)) for _, line := range execution.OutputLines(tc) { if isRunLine(line) || conf.filter(tc.Test, line) { continue } fmt.Fprint(out, line) } fmt.Fprintln(out) } } type testCaseFormatConfig struct { header string prefix string filter func(testName string, line string) bool getter func(executionSummary) []TestCase } func formatFailed() testCaseFormatConfig { withColor := color.RedString return testCaseFormatConfig{ header: withColor("Failed"), prefix: withColor("FAIL"), filter: func(testName string, line string) bool { return strings.HasPrefix(line, "--- FAIL: "+testName+" ") }, getter: func(execution executionSummary) []TestCase { return execution.Failed() }, } } func formatSkipped() testCaseFormatConfig { withColor := color.YellowString return testCaseFormatConfig{ header: withColor("Skipped"), prefix: withColor("SKIP"), filter: func(testName string, line string) bool { return strings.HasPrefix(line, "--- SKIP: "+testName+" ") }, getter: func(execution executionSummary) []TestCase { return execution.Skipped() }, } } func isRunLine(line string) bool { return strings.HasPrefix(line, "=== RUN Test") } gotestsum-0.5.0/testjson/summary_test.go000066400000000000000000000155201367230725500205170ustar00rootroot00000000000000package testjson import ( "bytes" "io" "strings" "testing" "time" "github.com/jonboulle/clockwork" "gotest.tools/v3/assert" "gotest.tools/v3/golden" ) func TestSummary_String(t *testing.T) { var testcases = []struct { name string summary Summary expected string }{ { name: "none", summary: SummarizeNone, expected: "none", }, { name: "all", summary: SummarizeAll, expected: "skipped,failed,errors,output", }, { name: "one value", summary: SummarizeErrors, expected: "errors", }, { name: "a few values", summary: SummarizeOutput | SummarizeSkipped | SummarizeErrors, expected: "skipped,errors,output", }, } for _, tc := range testcases { t.Run(tc.name, func(t *testing.T) { assert.Equal(t, tc.summary.String(), tc.expected) }) } } func TestPrintSummary_NoFailures(t *testing.T) { fake, reset := patchClock() defer reset() out := new(bytes.Buffer) exec := &Execution{ started: fake.Now(), done: true, packages: map[string]*Package{ "foo": {Total: 12}, "other": {Total: 1}, }, } fake.Advance(34123111 * time.Microsecond) PrintSummary(out, exec, SummarizeAll) expected := "\nDONE 13 tests in 34.123s\n" assert.Equal(t, out.String(), expected) } func TestPrintSummary_WithFailures(t *testing.T) { defer patchPkgPathPrefix("example.com")() fake, reset := patchClock() defer reset() exec := &Execution{ started: fake.Now(), done: true, packages: map[string]*Package{ "example.com/project/fs": { Total: 12, Failed: []TestCase{ { Package: "example.com/project/fs", Test: "TestFileDo", Elapsed: 1411 * time.Millisecond, ID: 1, }, { Package: "example.com/project/fs", Test: "TestFileDoError", Elapsed: 12 * time.Millisecond, ID: 2, }, }, output: map[int][]string{ 1: multiLine(`=== RUN TestFileDo Some stdout/stderr here --- FAIL: TestFileDo (1.41s) do_test.go:33 assertion failed `), 2: multiLine(`=== RUN TestFileDoError --- FAIL: TestFileDoError (0.01s) do_test.go:50 assertion failed: expected nil error, got WHAT! `), 0: multiLine("FAIL\n"), }, action: ActionFail, }, "example.com/project/pkg/more": { Total: 1, Failed: []TestCase{ { Package: "example.com/project/pkg/more", Test: "TestAlbatross", Elapsed: 40 * time.Millisecond, ID: 1, }, }, Skipped: []TestCase{ { Package: "example.com/project/pkg/more", Test: "TestOnlySometimes", Elapsed: 0, ID: 2, }, }, output: map[int][]string{ 1: multiLine(`=== RUN TestAlbatross --- FAIL: TestAlbatross (0.04s) `), 2: multiLine(`=== RUN TestOnlySometimes --- SKIP: TestOnlySometimes (0.00s) good_test.go:27: the skip message `), }, }, "example.com/project/badmain": { action: ActionFail, output: map[int][]string{ 0: multiLine("sometimes main can exit 2\n"), }, }, }, errors: []string{ "pkg/file.go:99:12: missing ',' before newline", }, } fake.Advance(34123111 * time.Microsecond) t.Run("summarize all", func(t *testing.T) { out := new(bytes.Buffer) PrintSummary(out, exec, SummarizeAll) expected := ` === Skipped === SKIP: project/pkg/more TestOnlySometimes (0.00s) good_test.go:27: the skip message === Failed === FAIL: project/badmain (0.00s) sometimes main can exit 2 === FAIL: project/fs TestFileDo (1.41s) Some stdout/stderr here do_test.go:33 assertion failed === FAIL: project/fs TestFileDoError (0.01s) do_test.go:50 assertion failed: expected nil error, got WHAT! === FAIL: project/pkg/more TestAlbatross (0.04s) === Errors pkg/file.go:99:12: missing ',' before newline DONE 13 tests, 1 skipped, 4 failures, 1 error in 34.123s ` assert.Equal(t, out.String(), expected) }) t.Run("summarize no output", func(t *testing.T) { out := new(bytes.Buffer) PrintSummary(out, exec, SummarizeAll-SummarizeOutput) expected := ` === Skipped === SKIP: project/pkg/more TestOnlySometimes (0.00s) === Failed === FAIL: project/badmain (0.00s) === FAIL: project/fs TestFileDo (1.41s) === FAIL: project/fs TestFileDoError (0.01s) === FAIL: project/pkg/more TestAlbatross (0.04s) === Errors pkg/file.go:99:12: missing ',' before newline DONE 13 tests, 1 skipped, 4 failures, 1 error in 34.123s ` assert.Equal(t, out.String(), expected) }) t.Run("summarize only errors", func(t *testing.T) { out := new(bytes.Buffer) PrintSummary(out, exec, SummarizeErrors) expected := ` === Errors pkg/file.go:99:12: missing ',' before newline DONE 13 tests, 1 skipped, 4 failures, 1 error in 34.123s ` assert.Equal(t, out.String(), expected) }) } func patchClock() (clockwork.FakeClock, func()) { fake := clockwork.NewFakeClock() clock = fake return fake, func() { clock = clockwork.NewRealClock() } } func multiLine(s string) []string { return strings.SplitAfter(s, "\n") } func TestPrintSummary_MissingTestFailEvent(t *testing.T) { _, reset := patchClock() defer reset() exec, err := ScanTestOutput(ScanConfig{ Stdout: bytes.NewReader(golden.Get(t, "go-test-json-missing-test-fail.out")), }) assert.NilError(t, err) buf := new(bytes.Buffer) PrintSummary(buf, exec, SummarizeAll) golden.Assert(t, buf.String(), "summary-missing-test-fail-event") } func TestPrintSummary_WithMisattributedOutput(t *testing.T) { _, reset := patchClock() defer reset() exec, err := ScanTestOutput(ScanConfig{ Stdout: bytes.NewReader(golden.Get(t, "go-test-json-misattributed.out")), }) assert.NilError(t, err) buf := new(bytes.Buffer) PrintSummary(buf, exec, SummarizeAll) golden.Assert(t, buf.String(), "summary-misattributed-output") } func TestPrintSummary_WithSubtestFailures(t *testing.T) { _, reset := patchClock() defer reset() exec, err := ScanTestOutput(ScanConfig{ Stdout: bytes.NewReader(golden.Get(t, "go-test-json.out")), }) assert.NilError(t, err) buf := new(bytes.Buffer) PrintSummary(buf, exec, SummarizeAll) golden.Assert(t, buf.String(), "summary-root-test-has-subtest-failures") } func TestPrintSummary_WithMissingSkipMessage(t *testing.T) { _, reset := patchClock() defer reset() exec, err := ScanTestOutput(ScanConfig{ Stdout: bytes.NewReader(golden.Get(t, "go-test-json-missing-skip-msg.out")), }) assert.NilError(t, err) buf := new(bytes.Buffer) PrintSummary(buf, exec, SummarizeAll) golden.Assert(t, buf.String(), "bug-missing-skip-message-summary.out") } func TestPrintSummary_WithRepeatedTestCases(t *testing.T) { _, reset := patchClock() defer reset() in := golden.Get(t, "go-test-json.out") exec, err := ScanTestOutput(ScanConfig{ Stdout: io.MultiReader( bytes.NewReader(in), bytes.NewReader(in), bytes.NewReader(in)), }) assert.NilError(t, err) buf := new(bytes.Buffer) PrintSummary(buf, exec, SummarizeAll) golden.Assert(t, buf.String(), "bug-repeated-test-case-output.out") } gotestsum-0.5.0/testjson/testdata/000077500000000000000000000000001367230725500172425ustar00rootroot00000000000000gotestsum-0.5.0/testjson/testdata/bug-missing-skip-message-summary.out000066400000000000000000000007171367230725500263050ustar00rootroot00000000000000 === Skipped === SKIP: testjson TestNewDotFormatter (0.00s) WARN Failed to detect terminal width for dots format, error: inappropriate ioctl for device TestNewDotFormatter: dotformat_test.go:161: !ok: no terminal width === SKIP: testjson TestGetPkgPathPrefix/with_go_path (0.00s) TestGetPkgPathPrefix/with_go_path: pkgpathprefix_test.go:22: isGoModuleEnabled() --- SKIP: TestGetPkgPathPrefix/with_go_path (0.00s) DONE 42 tests, 2 skipped in 0.000s gotestsum-0.5.0/testjson/testdata/bug-repeated-test-case-output.out000066400000000000000000000071121367230725500255640ustar00rootroot00000000000000 === Skipped === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/good TestSkipped (0.00s) good_test.go:23: === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/good TestSkippedWitLog (0.00s) good_test.go:27: the skip message === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/good TestSkipped (0.00s) good_test.go:23: === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/good TestSkippedWitLog (0.00s) good_test.go:27: the skip message === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/good TestSkipped (0.00s) good_test.go:23: === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/good TestSkippedWitLog (0.00s) good_test.go:27: the skip message === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestSkipped (0.00s) stub_test.go:26: === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestSkippedWitLog (0.00s) stub_test.go:30: the skip message === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestSkipped (0.00s) stub_test.go:26: === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestSkippedWitLog (0.00s) stub_test.go:30: the skip message === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestSkipped (0.00s) stub_test.go:26: === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestSkippedWitLog (0.00s) stub_test.go:30: the skip message === Failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/badmain (0.00s) sometimes main can exit 2 FAIL github.com/gotestyourself/gotestyourself/testjson/internal/badmain 0.010s sometimes main can exit 2 FAIL github.com/gotestyourself/gotestyourself/testjson/internal/badmain 0.010s sometimes main can exit 2 FAIL github.com/gotestyourself/gotestyourself/testjson/internal/badmain 0.010s === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestFailed (0.00s) stub_test.go:34: this failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestFailedWithStderr (0.00s) this is stderr stub_test.go:43: also failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestNestedWithFailure/c (0.00s) --- FAIL: TestNestedWithFailure/c (0.00s) stub_test.go:65: failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestNestedWithFailure (0.00s) === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestFailed (0.00s) stub_test.go:34: this failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestFailedWithStderr (0.00s) this is stderr stub_test.go:43: also failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestNestedWithFailure/c (0.00s) --- FAIL: TestNestedWithFailure/c (0.00s) stub_test.go:65: failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestNestedWithFailure (0.00s) === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestFailed (0.00s) stub_test.go:34: this failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestFailedWithStderr (0.00s) this is stderr stub_test.go:43: also failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestNestedWithFailure/c (0.00s) --- FAIL: TestNestedWithFailure/c (0.00s) stub_test.go:65: failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestNestedWithFailure (0.00s) DONE 138 tests, 12 skipped, 13 failures in 0.000s gotestsum-0.5.0/testjson/testdata/dots-format-windows.out000066400000000000000000000604621367230725500237320ustar00rootroot00000000000000 testjson/internal/badmain 0 tests, 1 failure, 1 error      testjson/internal/badmain testjson/internal/good 1 tests, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good · 1 tests, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good · 2 tests, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ·· 2 tests, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ·· 3 tests, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ··· 3 tests, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ··· 4 tests, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷ 4 tests, 1 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷ 5 tests, 1 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷ 5 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷ 6 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 6 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 7 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 7 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 8 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 8 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 9 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 9 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 10 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 11 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 12 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 13 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 14 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 15 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 16 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 17 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷·· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷··· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷···· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷····· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷······ 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷······· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷········ 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷········· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷·········· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷·········· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷·········· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷·········· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain testjson/internal/good ···↷↷··········· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain 10ms testjson/internal/good ···↷↷············ 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain 20ms testjson/internal/good ···↷↷············· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· 18 tests, 2 skipped, 1 failure, 1 error       testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub 19 tests, 2 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub · 19 tests, 2 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub · 20 tests, 2 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ·· 20 tests, 2 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ·· 21 tests, 2 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ··· 21 tests, 2 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ··· 22 tests, 2 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷ 22 tests, 3 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷ 23 tests, 3 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷ 23 tests, 4 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷ 24 tests, 4 skipped, 1 failure, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖ 24 tests, 4 skipped, 2 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖ 25 tests, 4 skipped, 2 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖· 25 tests, 4 skipped, 2 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖· 26 tests, 4 skipped, 2 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 26 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 27 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 27 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 28 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 28 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 29 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 29 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 30 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 31 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 32 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 33 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 34 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 35 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 36 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 37 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖· 37 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖·· 37 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖··· 37 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖···· 37 tests, 4 skipped, 3 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖ 37 tests, 4 skipped, 4 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖· 37 tests, 4 skipped, 4 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖·· 37 tests, 4 skipped, 4 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 37 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 38 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 39 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 40 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 41 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 42 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 43 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 44 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 45 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖·· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖··· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖···· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖····· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖······ 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖······· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········ 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖·········· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· 10ms testjson/internal/stub ···↷↷✖·✖····✖··✖··········· 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· 20ms testjson/internal/stub ···↷↷✖·✖····✖··✖············ 46 tests, 4 skipped, 5 failures, 1 error        testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· 20ms testjson/internal/stub ···↷↷✖·✖····✖··✖············ 46 tests, 4 skipped, 5 failures, 1 error gotestsum-0.5.0/testjson/testdata/dots-format.err000066400000000000000000000001731367230725500222140ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/dots-format.out000066400000000000000000000573431367230725500222460ustar00rootroot00000000000000 testjson/internal/badmain 0 tests, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good 1 tests, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good · 1 tests, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good · 2 tests, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ·· 2 tests, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ·· 3 tests, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ··· 3 tests, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ··· 4 tests, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷ 4 tests, 1 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷ 5 tests, 1 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷ 5 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷ 6 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 6 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 7 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 7 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 8 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 8 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 9 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 9 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 10 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 11 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 12 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 13 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 14 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 15 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 16 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 17 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷·· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷··· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷···· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷····· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷······ 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷······· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷········ 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷········· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷·········· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷·········· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷·········· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷·········· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain testjson/internal/good ···↷↷··········· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 10ms testjson/internal/good ···↷↷············ 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 20ms testjson/internal/good ···↷↷············· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· 18 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub 19 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub · 19 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub · 20 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ·· 20 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ·· 21 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ··· 21 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ··· 22 tests, 2 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷ 22 tests, 3 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷ 23 tests, 3 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷ 23 tests, 4 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷ 24 tests, 4 skipped, 1 failure, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖ 24 tests, 4 skipped, 2 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖ 25 tests, 4 skipped, 2 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖· 25 tests, 4 skipped, 2 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖· 26 tests, 4 skipped, 2 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 26 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 27 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 27 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 28 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 28 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 29 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 29 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 30 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 31 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 32 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 33 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 34 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 35 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 36 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖ 37 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖· 37 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖·· 37 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖··· 37 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖···· 37 tests, 4 skipped, 3 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖ 37 tests, 4 skipped, 4 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖· 37 tests, 4 skipped, 4 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖·· 37 tests, 4 skipped, 4 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 37 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 38 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 39 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 40 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 41 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 42 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 43 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 44 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 45 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖ 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖·· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖··· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖···· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖····· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖······ 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖······· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········ 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖········· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· testjson/internal/stub ···↷↷✖·✖····✖··✖·········· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· 10ms testjson/internal/stub ···↷↷✖·✖····✖··✖··········· 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· 20ms testjson/internal/stub ···↷↷✖·✖····✖··✖············ 46 tests, 4 skipped, 5 failures, 1 error  testjson/internal/badmain 🖴 testjson/internal/good ···↷↷············· 20ms testjson/internal/stub ···↷↷✖·✖····✖··✖············ 46 tests, 4 skipped, 5 failures, 1 error gotestsum-0.5.0/testjson/testdata/dots-v1-format.err000066400000000000000000000001731367230725500225400ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/dots-v1-format.out000066400000000000000000000002241367230725500225540ustar00rootroot00000000000000[testjson/internal/good]···↷↷·············[testjson/internal/stub]···↷↷✖·✖····✖··✖············gotestsum-0.5.0/testjson/testdata/go-test-json-misattributed.out000066400000000000000000000063641367230725500252130ustar00rootroot00000000000000{"Action":"run","Test":"TestOutputWithSubtest"} {"Action":"output","Test":"TestOutputWithSubtest","Output":"=== RUN TestOutputWithSubtest\n"} {"Action":"run","Test":"TestOutputWithSubtest/sub_test"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test","Output":"=== RUN TestOutputWithSubtest/sub_test\n"} {"Action":"run","Test":"TestOutputWithSubtest/sub_test/sub2"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test/sub2","Output":"=== RUN TestOutputWithSubtest/sub_test/sub2\n"} {"Action":"run","Test":"TestOutputWithSubtest/sub_test2"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test2","Output":"=== RUN TestOutputWithSubtest/sub_test2\n"} {"Action":"run","Test":"TestOutputWithSubtest/sub_test2/sub2"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test2/sub2","Output":"=== RUN TestOutputWithSubtest/sub_test2/sub2\n"} {"Action":"output","Test":"TestOutputWithSubtest","Output":"--- FAIL: TestOutputWithSubtest (0.00s)\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test","Output":" --- PASS: TestOutputWithSubtest/sub_test (0.00s)\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test","Output":" foo_test.go:9: output from sub test\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test","Output":" foo_test.go:11: more output from sub test\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test","Output":" foo_test.go:16: more output from sub test\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test/sub2","Output":" --- PASS: TestOutputWithSubtest/sub_test/sub2 (0.00s)\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test/sub2","Output":" foo_test.go:14: output from sub2 test\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test/sub2","Output":" foo_test.go:22: output from root test\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test/sub2","Output":" foo_test.go:27: output from root test\n"} {"Action":"pass","Test":"TestOutputWithSubtest/sub_test/sub2"} {"Action":"pass","Test":"TestOutputWithSubtest/sub_test"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test2","Output":" --- PASS: TestOutputWithSubtest/sub_test2 (0.00s)\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test2","Output":" foo_test.go:21: output from sub test2\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test2","Output":" foo_test.go:23: more output from sub test2\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test2","Output":" foo_test.go:28: more output from sub test2\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test2/sub2","Output":" --- PASS: TestOutputWithSubtest/sub_test2/sub2 (0.00s)\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test2/sub2","Output":" foo_test.go:26: output from sub2 test\n"} {"Action":"output","Test":"TestOutputWithSubtest/sub_test2/sub2","Output":" foo_test.go:32: output after sub test\n"} {"Action":"pass","Test":"TestOutputWithSubtest/sub_test2/sub2"} {"Action":"pass","Test":"TestOutputWithSubtest/sub_test2"} {"Action":"fail","Test":"TestOutputWithSubtest"} {"Action":"output","Output":"FAIL\n"} {"Action":"output","Output":"FAIL\tgotest.tools/gotestsum/foo\t0.001s\n"} {"Action":"output","Output":"FAIL\n"} {"Action":"fail"} gotestsum-0.5.0/testjson/testdata/go-test-json-missing-skip-msg.out000066400000000000000000000762421367230725500255360ustar00rootroot00000000000000{"Time":"2020-05-17T21:06:45.371590661-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutput_WithDotsFormatter"} {"Time":"2020-05-17T21:06:45.371755428-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutput_WithDotsFormatter","Output":"=== RUN TestScanTestOutput_WithDotsFormatter\n"} {"Time":"2020-05-17T21:06:45.426093306-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutput_WithDotsFormatter","Output":"--- PASS: TestScanTestOutput_WithDotsFormatter (0.05s)\n"} {"Time":"2020-05-17T21:06:45.426124191-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutput_WithDotsFormatter","Elapsed":0.05} {"Time":"2020-05-17T21:06:45.426131287-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed"} {"Time":"2020-05-17T21:06:45.426134719-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed","Output":"=== RUN TestFmtDotElapsed\n"} {"Time":"2020-05-17T21:06:45.42613898-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_999µs_"} {"Time":"2020-05-17T21:06:45.426144034-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_999µs_","Output":"=== RUN TestFmtDotElapsed/_999µs_\n"} {"Time":"2020-05-17T21:06:45.426155975-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/___7ms_"} {"Time":"2020-05-17T21:06:45.426160373-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/___7ms_","Output":"=== RUN TestFmtDotElapsed/___7ms_\n"} {"Time":"2020-05-17T21:06:45.426166742-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/____🖴__"} {"Time":"2020-05-17T21:06:45.426170156-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/____🖴__","Output":"=== RUN TestFmtDotElapsed/____🖴__\n"} {"Time":"2020-05-17T21:06:45.426189174-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/____⏳__"} {"Time":"2020-05-17T21:06:45.426212792-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/____⏳__","Output":"=== RUN TestFmtDotElapsed/____⏳__\n"} {"Time":"2020-05-17T21:06:45.426227048-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/__14ms_"} {"Time":"2020-05-17T21:06:45.426234018-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/__14ms_","Output":"=== RUN TestFmtDotElapsed/__14ms_\n"} {"Time":"2020-05-17T21:06:45.426243766-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_333ms_"} {"Time":"2020-05-17T21:06:45.42624722-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_333ms_","Output":"=== RUN TestFmtDotElapsed/_333ms_\n"} {"Time":"2020-05-17T21:06:45.426260359-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_1.33s_"} {"Time":"2020-05-17T21:06:45.426267551-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_1.33s_","Output":"=== RUN TestFmtDotElapsed/_1.33s_\n"} {"Time":"2020-05-17T21:06:45.426298022-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_14.8s_"} {"Time":"2020-05-17T21:06:45.426312244-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_14.8s_","Output":"=== RUN TestFmtDotElapsed/_14.8s_\n"} {"Time":"2020-05-17T21:06:45.426321045-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_1m59s_"} {"Time":"2020-05-17T21:06:45.426326396-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_1m59s_","Output":"=== RUN TestFmtDotElapsed/_1m59s_\n"} {"Time":"2020-05-17T21:06:45.426350409-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_59m0s_"} {"Time":"2020-05-17T21:06:45.426362648-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_59m0s_","Output":"=== RUN TestFmtDotElapsed/_59m0s_\n"} {"Time":"2020-05-17T21:06:45.426377077-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_2m28s_"} {"Time":"2020-05-17T21:06:45.42638404-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_2m28s_","Output":"=== RUN TestFmtDotElapsed/_2m28s_\n"} {"Time":"2020-05-17T21:06:45.426411764-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_24m0s_"} {"Time":"2020-05-17T21:06:45.426420961-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_24m0s_","Output":"=== RUN TestFmtDotElapsed/_24m0s_\n"} {"Time":"2020-05-17T21:06:45.426438769-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed","Output":"--- PASS: TestFmtDotElapsed (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426449379-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_999µs_","Output":" --- PASS: TestFmtDotElapsed/_999µs_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426454125-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_999µs_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426458284-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/___7ms_","Output":" --- PASS: TestFmtDotElapsed/___7ms_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426461846-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/___7ms_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426464826-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/____🖴__","Output":" --- PASS: TestFmtDotElapsed/____🖴__ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.42647425-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/____🖴__","Elapsed":0} {"Time":"2020-05-17T21:06:45.426480557-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/____⏳__","Output":" --- PASS: TestFmtDotElapsed/____⏳__ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426488798-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/____⏳__","Elapsed":0} {"Time":"2020-05-17T21:06:45.426495202-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/__14ms_","Output":" --- PASS: TestFmtDotElapsed/__14ms_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426500985-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/__14ms_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426506198-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_333ms_","Output":" --- PASS: TestFmtDotElapsed/_333ms_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.42651225-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_333ms_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426518337-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_1.33s_","Output":" --- PASS: TestFmtDotElapsed/_1.33s_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426525447-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_1.33s_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426529931-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_14.8s_","Output":" --- PASS: TestFmtDotElapsed/_14.8s_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426535502-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_14.8s_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426538826-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_1m59s_","Output":" --- PASS: TestFmtDotElapsed/_1m59s_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426548603-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_1m59s_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426552043-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_59m0s_","Output":" --- PASS: TestFmtDotElapsed/_59m0s_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426555165-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_59m0s_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426558054-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_2m28s_","Output":" --- PASS: TestFmtDotElapsed/_2m28s_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426562065-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_2m28s_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426565127-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_24m0s_","Output":" --- PASS: TestFmtDotElapsed/_24m0s_ (0.00s)\n"} {"Time":"2020-05-17T21:06:45.426571505-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed/_24m0s_","Elapsed":0} {"Time":"2020-05-17T21:06:45.426574497-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed","Elapsed":0} {"Time":"2020-05-17T21:06:45.426577198-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed_RuneCountProperty"} {"Time":"2020-05-17T21:06:45.426579938-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed_RuneCountProperty","Output":"=== RUN TestFmtDotElapsed_RuneCountProperty\n"} {"Time":"2020-05-17T21:06:45.42658341-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed_RuneCountProperty","Output":" TestFmtDotElapsed_RuneCountProperty: dotformat_test.go:149: seed 1589764005\n"} {"Time":"2020-05-17T21:06:45.561329225-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed_RuneCountProperty","Output":"--- PASS: TestFmtDotElapsed_RuneCountProperty (0.13s)\n"} {"Time":"2020-05-17T21:06:45.561369929-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestFmtDotElapsed_RuneCountProperty","Elapsed":0.13} {"Time":"2020-05-17T21:06:45.561379872-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestNewDotFormatter"} {"Time":"2020-05-17T21:06:45.561384356-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestNewDotFormatter","Output":"=== RUN TestNewDotFormatter\n"} {"Time":"2020-05-17T21:06:45.561388744-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestNewDotFormatter","Output":"WARN Failed to detect terminal width for dots format, error: inappropriate ioctl for device\n"} {"Time":"2020-05-17T21:06:45.561702233-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestNewDotFormatter","Output":" TestNewDotFormatter: dotformat_test.go:161: !ok: no terminal width\n"} {"Time":"2020-05-17T21:06:45.561719682-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestNewDotFormatter","Output":"--- SKIP: TestNewDotFormatter (0.00s)\n"} {"Time":"2020-05-17T21:06:45.561724743-04:00","Action":"skip","Package":"gotest.tools/gotestsum/testjson","Test":"TestNewDotFormatter","Elapsed":0} {"Time":"2020-05-17T21:06:45.561728367-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestPackage_Elapsed"} {"Time":"2020-05-17T21:06:45.56173296-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPackage_Elapsed","Output":"=== RUN TestPackage_Elapsed\n"} {"Time":"2020-05-17T21:06:45.561737792-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPackage_Elapsed","Output":"--- PASS: TestPackage_Elapsed (0.00s)\n"} {"Time":"2020-05-17T21:06:45.56175039-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestPackage_Elapsed","Elapsed":0} {"Time":"2020-05-17T21:06:45.561754009-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestExecution_Add_PackageCoverage"} {"Time":"2020-05-17T21:06:45.561757327-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestExecution_Add_PackageCoverage","Output":"=== RUN TestExecution_Add_PackageCoverage\n"} {"Time":"2020-05-17T21:06:45.561813733-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestExecution_Add_PackageCoverage","Output":"--- PASS: TestExecution_Add_PackageCoverage (0.00s)\n"} {"Time":"2020-05-17T21:06:45.561823792-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestExecution_Add_PackageCoverage","Elapsed":0} {"Time":"2020-05-17T21:06:45.561827819-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortVerboseFormat"} {"Time":"2020-05-17T21:06:45.561830844-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortVerboseFormat","Output":"=== RUN TestScanTestOutputWithShortVerboseFormat\n"} {"Time":"2020-05-17T21:06:45.601170618-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortVerboseFormat","Output":"--- PASS: TestScanTestOutputWithShortVerboseFormat (0.04s)\n"} {"Time":"2020-05-17T21:06:45.601216224-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortVerboseFormat","Elapsed":0.04} {"Time":"2020-05-17T21:06:45.601229736-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithDotsFormatV1"} {"Time":"2020-05-17T21:06:45.601237404-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithDotsFormatV1","Output":"=== RUN TestScanTestOutputWithDotsFormatV1\n"} {"Time":"2020-05-17T21:06:45.603375104-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithDotsFormatV1","Output":"--- PASS: TestScanTestOutputWithDotsFormatV1 (0.00s)\n"} {"Time":"2020-05-17T21:06:45.603410002-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithDotsFormatV1","Elapsed":0} {"Time":"2020-05-17T21:06:45.603419866-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortFormat"} {"Time":"2020-05-17T21:06:45.60342642-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortFormat","Output":"=== RUN TestScanTestOutputWithShortFormat\n"} {"Time":"2020-05-17T21:06:45.604830164-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortFormat","Output":"--- PASS: TestScanTestOutputWithShortFormat (0.00s)\n"} {"Time":"2020-05-17T21:06:45.604846658-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortFormat","Elapsed":0} {"Time":"2020-05-17T21:06:45.604855068-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortFormat_WithCoverage"} {"Time":"2020-05-17T21:06:45.60486112-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortFormat_WithCoverage","Output":"=== RUN TestScanTestOutputWithShortFormat_WithCoverage\n"} {"Time":"2020-05-17T21:06:45.607016671-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortFormat_WithCoverage","Output":"--- PASS: TestScanTestOutputWithShortFormat_WithCoverage (0.00s)\n"} {"Time":"2020-05-17T21:06:45.607042817-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithShortFormat_WithCoverage","Elapsed":0} {"Time":"2020-05-17T21:06:45.607054403-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardVerboseFormat"} {"Time":"2020-05-17T21:06:45.607069956-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardVerboseFormat","Output":"=== RUN TestScanTestOutputWithStandardVerboseFormat\n"} {"Time":"2020-05-17T21:06:45.608906022-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardVerboseFormat","Output":"--- PASS: TestScanTestOutputWithStandardVerboseFormat (0.00s)\n"} {"Time":"2020-05-17T21:06:45.608930307-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardVerboseFormat","Elapsed":0} {"Time":"2020-05-17T21:06:45.608941847-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardQuietFormat"} {"Time":"2020-05-17T21:06:45.608948827-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardQuietFormat","Output":"=== RUN TestScanTestOutputWithStandardQuietFormat\n"} {"Time":"2020-05-17T21:06:45.610294664-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardQuietFormat","Output":"--- PASS: TestScanTestOutputWithStandardQuietFormat (0.00s)\n"} {"Time":"2020-05-17T21:06:45.610311949-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardQuietFormat","Elapsed":0} {"Time":"2020-05-17T21:06:45.610317541-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardQuietFormat_WithCoverage"} {"Time":"2020-05-17T21:06:45.610320721-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardQuietFormat_WithCoverage","Output":"=== RUN TestScanTestOutputWithStandardQuietFormat_WithCoverage\n"} {"Time":"2020-05-17T21:06:45.693697524-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardQuietFormat_WithCoverage","Output":"--- PASS: TestScanTestOutputWithStandardQuietFormat_WithCoverage (0.08s)\n"} {"Time":"2020-05-17T21:06:45.693787837-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestScanTestOutputWithStandardQuietFormat_WithCoverage","Elapsed":0.08} {"Time":"2020-05-17T21:06:45.693824555-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestRelativePackagePath"} {"Time":"2020-05-17T21:06:45.693841809-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestRelativePackagePath","Output":"=== RUN TestRelativePackagePath\n"} {"Time":"2020-05-17T21:06:45.693859328-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestRelativePackagePath","Output":"--- PASS: TestRelativePackagePath (0.00s)\n"} {"Time":"2020-05-17T21:06:45.693872368-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestRelativePackagePath","Elapsed":0} {"Time":"2020-05-17T21:06:45.693888465-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix"} {"Time":"2020-05-17T21:06:45.693907566-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix","Output":"=== RUN TestGetPkgPathPrefix\n"} {"Time":"2020-05-17T21:06:45.693929153-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix/with_go_path"} {"Time":"2020-05-17T21:06:45.693940574-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix/with_go_path","Output":"=== RUN TestGetPkgPathPrefix/with_go_path\n"} {"Time":"2020-05-17T21:06:45.694298339-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix/with_go_path","Output":" TestGetPkgPathPrefix/with_go_path: pkgpathprefix_test.go:22: isGoModuleEnabled()\n"} {"Time":"2020-05-17T21:06:45.6943652-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix/with_go_modules"} {"Time":"2020-05-17T21:06:45.694413291-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix/with_go_modules","Output":"=== RUN TestGetPkgPathPrefix/with_go_modules\n"} {"Time":"2020-05-17T21:06:45.694569635-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix","Output":"--- PASS: TestGetPkgPathPrefix (0.00s)\n"} {"Time":"2020-05-17T21:06:45.694612647-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix/with_go_path","Output":" --- SKIP: TestGetPkgPathPrefix/with_go_path (0.00s)\n"} {"Time":"2020-05-17T21:06:45.694639191-04:00","Action":"skip","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix/with_go_path","Elapsed":0} {"Time":"2020-05-17T21:06:45.694664109-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix/with_go_modules","Output":" --- PASS: TestGetPkgPathPrefix/with_go_modules (0.00s)\n"} {"Time":"2020-05-17T21:06:45.694689546-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix/with_go_modules","Elapsed":0} {"Time":"2020-05-17T21:06:45.69470311-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestGetPkgPathPrefix","Elapsed":0} {"Time":"2020-05-17T21:06:45.694715971-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String"} {"Time":"2020-05-17T21:06:45.694730714-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String","Output":"=== RUN TestSummary_String\n"} {"Time":"2020-05-17T21:06:45.694752392-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/none"} {"Time":"2020-05-17T21:06:45.694769485-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/none","Output":"=== RUN TestSummary_String/none\n"} {"Time":"2020-05-17T21:06:45.694785705-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/all"} {"Time":"2020-05-17T21:06:45.694796767-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/all","Output":"=== RUN TestSummary_String/all\n"} {"Time":"2020-05-17T21:06:45.694807987-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/one_value"} {"Time":"2020-05-17T21:06:45.694822381-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/one_value","Output":"=== RUN TestSummary_String/one_value\n"} {"Time":"2020-05-17T21:06:45.694895269-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/a_few_values"} {"Time":"2020-05-17T21:06:45.694934921-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/a_few_values","Output":"=== RUN TestSummary_String/a_few_values\n"} {"Time":"2020-05-17T21:06:45.695006022-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String","Output":"--- PASS: TestSummary_String (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695052861-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/none","Output":" --- PASS: TestSummary_String/none (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695081352-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/none","Elapsed":0} {"Time":"2020-05-17T21:06:45.695105034-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/all","Output":" --- PASS: TestSummary_String/all (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695128571-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/all","Elapsed":0} {"Time":"2020-05-17T21:06:45.695150363-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/one_value","Output":" --- PASS: TestSummary_String/one_value (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695189799-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/one_value","Elapsed":0} {"Time":"2020-05-17T21:06:45.695209356-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/a_few_values","Output":" --- PASS: TestSummary_String/a_few_values (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695237549-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String/a_few_values","Elapsed":0} {"Time":"2020-05-17T21:06:45.695257433-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestSummary_String","Elapsed":0} {"Time":"2020-05-17T21:06:45.695269567-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_NoFailures"} {"Time":"2020-05-17T21:06:45.6952803-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_NoFailures","Output":"=== RUN TestPrintSummary_NoFailures\n"} {"Time":"2020-05-17T21:06:45.69529853-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_NoFailures","Output":"--- PASS: TestPrintSummary_NoFailures (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695319891-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_NoFailures","Elapsed":0} {"Time":"2020-05-17T21:06:45.695340098-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures"} {"Time":"2020-05-17T21:06:45.695360601-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures","Output":"=== RUN TestPrintSummary_WithFailures\n"} {"Time":"2020-05-17T21:06:45.695387925-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_all"} {"Time":"2020-05-17T21:06:45.695408199-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_all","Output":"=== RUN TestPrintSummary_WithFailures/summarize_all\n"} {"Time":"2020-05-17T21:06:45.695548542-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_no_output"} {"Time":"2020-05-17T21:06:45.695577885-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_no_output","Output":"=== RUN TestPrintSummary_WithFailures/summarize_no_output\n"} {"Time":"2020-05-17T21:06:45.695740373-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_only_errors"} {"Time":"2020-05-17T21:06:45.695766268-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_only_errors","Output":"=== RUN TestPrintSummary_WithFailures/summarize_only_errors\n"} {"Time":"2020-05-17T21:06:45.695875272-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures","Output":"--- PASS: TestPrintSummary_WithFailures (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695894246-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_all","Output":" --- PASS: TestPrintSummary_WithFailures/summarize_all (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695908276-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_all","Elapsed":0} {"Time":"2020-05-17T21:06:45.695921682-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_no_output","Output":" --- PASS: TestPrintSummary_WithFailures/summarize_no_output (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695933945-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_no_output","Elapsed":0} {"Time":"2020-05-17T21:06:45.695944263-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_only_errors","Output":" --- PASS: TestPrintSummary_WithFailures/summarize_only_errors (0.00s)\n"} {"Time":"2020-05-17T21:06:45.695973669-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures/summarize_only_errors","Elapsed":0} {"Time":"2020-05-17T21:06:45.695987799-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithFailures","Elapsed":0} {"Time":"2020-05-17T21:06:45.695996109-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_MissingTestFailEvent"} {"Time":"2020-05-17T21:06:45.69600455-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_MissingTestFailEvent","Output":"=== RUN TestPrintSummary_MissingTestFailEvent\n"} {"Time":"2020-05-17T21:06:45.696433387-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_MissingTestFailEvent","Output":"--- PASS: TestPrintSummary_MissingTestFailEvent (0.00s)\n"} {"Time":"2020-05-17T21:06:45.696453447-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_MissingTestFailEvent","Elapsed":0} {"Time":"2020-05-17T21:06:45.696460708-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithMisattributedOutput"} {"Time":"2020-05-17T21:06:45.696473682-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithMisattributedOutput","Output":"=== RUN TestPrintSummary_WithMisattributedOutput\n"} {"Time":"2020-05-17T21:06:45.696868368-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithMisattributedOutput","Output":"--- PASS: TestPrintSummary_WithMisattributedOutput (0.00s)\n"} {"Time":"2020-05-17T21:06:45.69688868-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithMisattributedOutput","Elapsed":0} {"Time":"2020-05-17T21:06:45.69689641-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithSubtestFailures"} {"Time":"2020-05-17T21:06:45.696901733-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithSubtestFailures","Output":"=== RUN TestPrintSummary_WithSubtestFailures\n"} {"Time":"2020-05-17T21:06:45.698494542-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithSubtestFailures","Output":"--- PASS: TestPrintSummary_WithSubtestFailures (0.00s)\n"} {"Time":"2020-05-17T21:06:45.698518242-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Test":"TestPrintSummary_WithSubtestFailures","Elapsed":0} {"Time":"2020-05-17T21:06:45.698531164-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Output":"PASS\n"} {"Time":"2020-05-17T21:06:45.69935265-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson","Output":"ok \tgotest.tools/gotestsum/testjson\t0.329s\n"} {"Time":"2020-05-17T21:06:45.699390055-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson","Elapsed":0.329} gotestsum-0.5.0/testjson/testdata/go-test-json-missing-test-fail.err000066400000000000000000000000001367230725500256300ustar00rootroot00000000000000gotestsum-0.5.0/testjson/testdata/go-test-json-missing-test-fail.out000066400000000000000000000101041367230725500256550ustar00rootroot00000000000000{"Time":"2020-04-10T14:52:44.192693974-04:00","Action":"run","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare"} {"Time":"2020-04-10T14:52:44.192822137-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"=== RUN TestWaitOn_WithCompare\n"} {"Time":"2020-04-10T14:52:44.1950981-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"panic: runtime error: index out of range [1] with length 1\n"} {"Time":"2020-04-10T14:52:44.195110282-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"\n"} {"Time":"2020-04-10T14:52:44.195116665-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"goroutine 7 [running]:\n"} {"Time":"2020-04-10T14:52:44.195120587-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"gotest.tools/v3/internal/assert.ArgsFromComparisonCall(0xc0000552a0, 0x1, 0x1, 0x1, 0x0, 0x0)\n"} {"Time":"2020-04-10T14:52:44.195301254-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"\t/home/daniel/pers/code/gotest.tools/internal/assert/result.go:102 +0x9f\n"} {"Time":"2020-04-10T14:52:44.195332206-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"gotest.tools/v3/internal/assert.runComparison(0x6bcb80, 0xc00000e180, 0x67dee8, 0xc00007a9f0, 0x0, 0x0, 0x0, 0x7f7f4fb6d108)\n"} {"Time":"2020-04-10T14:52:44.19533807-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"\t/home/daniel/pers/code/gotest.tools/internal/assert/result.go:34 +0x2b1\n"} {"Time":"2020-04-10T14:52:44.195342341-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"gotest.tools/v3/internal/assert.Eval(0x6bcb80, 0xc00000e180, 0x67dee8, 0x627660, 0xc00007a9f0, 0x0, 0x0, 0x0, 0x642c60)\n"} {"Time":"2020-04-10T14:52:44.195346449-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"\t/home/daniel/pers/code/gotest.tools/internal/assert/assert.go:56 +0x2e4\n"} {"Time":"2020-04-10T14:52:44.195350377-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"gotest.tools/v3/poll.Compare(0xc00007a9f0, 0x6b74a0, 0x618a60)\n"} {"Time":"2020-04-10T14:52:44.195356946-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"\t/home/daniel/pers/code/gotest.tools/poll/poll.go:151 +0x81\n"} {"Time":"2020-04-10T14:52:44.195360761-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"gotest.tools/v3/poll.TestWaitOn_WithCompare.func1(0x6be4c0, 0xc00016c240, 0xc00016c240, 0x6be4c0)\n"} {"Time":"2020-04-10T14:52:44.195367482-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"\t/home/daniel/pers/code/gotest.tools/poll/poll_test.go:81 +0x58\n"} {"Time":"2020-04-10T14:52:44.195371319-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"gotest.tools/v3/poll.WaitOn.func1(0xc00001e3c0, 0x67df50, 0x6c1960, 0xc00016c240)\n"} {"Time":"2020-04-10T14:52:44.195375766-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"\t/home/daniel/pers/code/gotest.tools/poll/poll.go:125 +0x62\n"} {"Time":"2020-04-10T14:52:44.195379421-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"created by gotest.tools/v3/poll.WaitOn\n"} {"Time":"2020-04-10T14:52:44.195384493-04:00","Action":"output","Package":"gotest.tools/v3/poll","Test":"TestWaitOn_WithCompare","Output":"\t/home/daniel/pers/code/gotest.tools/poll/poll.go:124 +0x16f\n"} {"Time":"2020-04-10T14:52:44.195785223-04:00","Action":"output","Package":"gotest.tools/v3/poll","Output":"FAIL\tgotest.tools/v3/poll\t0.005s\n"} {"Time":"2020-04-10T14:52:44.195796081-04:00","Action":"fail","Package":"gotest.tools/v3/poll","Elapsed":0.005} gotestsum-0.5.0/testjson/testdata/go-test-json-with-cover.err000066400000000000000000000001511367230725500243670ustar00rootroot00000000000000# gotest.tools/gotestsum/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/go-test-json-with-cover.out000066400000000000000000001210351367230725500244130ustar00rootroot00000000000000{"Time":"2019-06-26T19:28:47.238149257-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/badmain","Output":"sometimes main can exit 2\n"} {"Time":"2019-06-26T19:28:47.238279925-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/badmain","Output":"FAIL\tgotest.tools/gotestsum/testjson/internal/badmain\t0.001s\n"} {"Time":"2019-06-26T19:28:47.238295101-04:00","Action":"fail","Package":"gotest.tools/gotestsum/testjson/internal/badmain","Elapsed":0.001} {"Time":"2019-06-26T19:28:47.458747463-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassed"} {"Time":"2019-06-26T19:28:47.458782622-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassed","Output":"=== RUN TestPassed\n"} {"Time":"2019-06-26T19:28:47.458799449-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassed","Output":"--- PASS: TestPassed (0.00s)\n"} {"Time":"2019-06-26T19:28:47.458806961-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassed","Elapsed":0} {"Time":"2019-06-26T19:28:47.458813231-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithLog"} {"Time":"2019-06-26T19:28:47.458817456-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithLog","Output":"=== RUN TestPassedWithLog\n"} {"Time":"2019-06-26T19:28:47.458823547-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithLog","Output":"--- PASS: TestPassedWithLog (0.00s)\n"} {"Time":"2019-06-26T19:28:47.458829353-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithLog","Output":" good_test.go:15: this is a log\n"} {"Time":"2019-06-26T19:28:47.458833761-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithLog","Elapsed":0} {"Time":"2019-06-26T19:28:47.458837672-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithStdout"} {"Time":"2019-06-26T19:28:47.458841435-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithStdout","Output":"=== RUN TestPassedWithStdout\n"} {"Time":"2019-06-26T19:28:47.458845644-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithStdout","Output":"this is a Print\n"} {"Time":"2019-06-26T19:28:47.458850344-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithStdout","Output":"--- PASS: TestPassedWithStdout (0.00s)\n"} {"Time":"2019-06-26T19:28:47.458855053-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestPassedWithStdout","Elapsed":0} {"Time":"2019-06-26T19:28:47.458858851-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkipped"} {"Time":"2019-06-26T19:28:47.458862526-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"} {"Time":"2019-06-26T19:28:47.458870529-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.00s)\n"} {"Time":"2019-06-26T19:28:47.458876671-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkipped","Output":" good_test.go:23: \n"} {"Time":"2019-06-26T19:28:47.45888138-04:00","Action":"skip","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkipped","Elapsed":0} {"Time":"2019-06-26T19:28:47.458885294-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkippedWitLog"} {"Time":"2019-06-26T19:28:47.458889-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkippedWitLog","Output":"=== RUN TestSkippedWitLog\n"} {"Time":"2019-06-26T19:28:47.458900865-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkippedWitLog","Output":"--- SKIP: TestSkippedWitLog (0.00s)\n"} {"Time":"2019-06-26T19:28:47.458906593-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkippedWitLog","Output":" good_test.go:27: the skip message\n"} {"Time":"2019-06-26T19:28:47.458914409-04:00","Action":"skip","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestSkippedWitLog","Elapsed":0} {"Time":"2019-06-26T19:28:47.45892158-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestWithStderr"} {"Time":"2019-06-26T19:28:47.458927969-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestWithStderr","Output":"=== RUN TestWithStderr\n"} {"Time":"2019-06-26T19:28:47.458932512-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestWithStderr","Output":"this is stderr\n"} {"Time":"2019-06-26T19:28:47.458937403-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestWithStderr","Output":"--- PASS: TestWithStderr (0.00s)\n"} {"Time":"2019-06-26T19:28:47.458941827-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestWithStderr","Elapsed":0} {"Time":"2019-06-26T19:28:47.45894569-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2019-06-26T19:28:47.458949397-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== RUN TestParallelTheFirst\n"} {"Time":"2019-06-26T19:28:47.458955255-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== PAUSE TestParallelTheFirst\n"} {"Time":"2019-06-26T19:28:47.458959476-04:00","Action":"pause","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2019-06-26T19:28:47.458963459-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2019-06-26T19:28:47.458967038-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== RUN TestParallelTheSecond\n"} {"Time":"2019-06-26T19:28:47.458971275-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== PAUSE TestParallelTheSecond\n"} {"Time":"2019-06-26T19:28:47.458976317-04:00","Action":"pause","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2019-06-26T19:28:47.458983631-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2019-06-26T19:28:47.458990606-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== RUN TestParallelTheThird\n"} {"Time":"2019-06-26T19:28:47.459003982-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== PAUSE TestParallelTheThird\n"} {"Time":"2019-06-26T19:28:47.459011662-04:00","Action":"pause","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2019-06-26T19:28:47.459019071-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess"} {"Time":"2019-06-26T19:28:47.459025415-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess","Output":"=== RUN TestNestedSuccess\n"} {"Time":"2019-06-26T19:28:47.459032888-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/a"} {"Time":"2019-06-26T19:28:47.45903963-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/a","Output":"=== RUN TestNestedSuccess/a\n"} {"Time":"2019-06-26T19:28:47.459053477-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/a/sub"} {"Time":"2019-06-26T19:28:47.459061016-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Output":"=== RUN TestNestedSuccess/a/sub\n"} {"Time":"2019-06-26T19:28:47.459068324-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/b"} {"Time":"2019-06-26T19:28:47.459074849-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/b","Output":"=== RUN TestNestedSuccess/b\n"} {"Time":"2019-06-26T19:28:47.459082791-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/b/sub"} {"Time":"2019-06-26T19:28:47.459089945-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Output":"=== RUN TestNestedSuccess/b/sub\n"} {"Time":"2019-06-26T19:28:47.459097795-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/c"} {"Time":"2019-06-26T19:28:47.459105018-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/c","Output":"=== RUN TestNestedSuccess/c\n"} {"Time":"2019-06-26T19:28:47.459110103-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/c/sub"} {"Time":"2019-06-26T19:28:47.459113836-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Output":"=== RUN TestNestedSuccess/c/sub\n"} {"Time":"2019-06-26T19:28:47.459123681-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/d"} {"Time":"2019-06-26T19:28:47.459129671-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/d","Output":"=== RUN TestNestedSuccess/d\n"} {"Time":"2019-06-26T19:28:47.459134441-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/d/sub"} {"Time":"2019-06-26T19:28:47.459138104-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Output":"=== RUN TestNestedSuccess/d/sub\n"} {"Time":"2019-06-26T19:28:47.459144627-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess","Output":"--- PASS: TestNestedSuccess (0.00s)\n"} {"Time":"2019-06-26T19:28:47.459151692-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/a","Output":" --- PASS: TestNestedSuccess/a (0.00s)\n"} {"Time":"2019-06-26T19:28:47.459161703-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Output":" --- PASS: TestNestedSuccess/a/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.459169885-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.45917454-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/a","Elapsed":0} {"Time":"2019-06-26T19:28:47.459180719-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/b","Output":" --- PASS: TestNestedSuccess/b (0.00s)\n"} {"Time":"2019-06-26T19:28:47.459185674-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Output":" --- PASS: TestNestedSuccess/b/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.459190244-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.459197899-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/b","Elapsed":0} {"Time":"2019-06-26T19:28:47.459203616-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/c","Output":" --- PASS: TestNestedSuccess/c (0.00s)\n"} {"Time":"2019-06-26T19:28:47.459208678-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Output":" --- PASS: TestNestedSuccess/c/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.459213207-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.459217065-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/c","Elapsed":0} {"Time":"2019-06-26T19:28:47.459223713-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/d","Output":" --- PASS: TestNestedSuccess/d (0.00s)\n"} {"Time":"2019-06-26T19:28:47.459232135-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Output":" --- PASS: TestNestedSuccess/d/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.459240595-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.459247791-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess/d","Elapsed":0} {"Time":"2019-06-26T19:28:47.459252463-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestNestedSuccess","Elapsed":0} {"Time":"2019-06-26T19:28:47.459258769-04:00","Action":"cont","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2019-06-26T19:28:47.459262909-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== CONT TestParallelTheFirst\n"} {"Time":"2019-06-26T19:28:47.459267293-04:00","Action":"cont","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2019-06-26T19:28:47.459271273-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== CONT TestParallelTheThird\n"} {"Time":"2019-06-26T19:28:47.459275497-04:00","Action":"cont","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2019-06-26T19:28:47.459279162-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== CONT TestParallelTheSecond\n"} {"Time":"2019-06-26T19:28:47.46114001-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheThird","Output":"--- PASS: TestParallelTheThird (0.00s)\n"} {"Time":"2019-06-26T19:28:47.46514413-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheThird","Elapsed":0} {"Time":"2019-06-26T19:28:47.465163676-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheSecond","Output":"--- PASS: TestParallelTheSecond (0.01s)\n"} {"Time":"2019-06-26T19:28:47.469149033-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheSecond","Elapsed":0.01} {"Time":"2019-06-26T19:28:47.469167786-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheFirst","Output":"--- PASS: TestParallelTheFirst (0.01s)\n"} {"Time":"2019-06-26T19:28:47.469179349-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Test":"TestParallelTheFirst","Elapsed":0.01} {"Time":"2019-06-26T19:28:47.46918812-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Output":"PASS\n"} {"Time":"2019-06-26T19:28:47.469212191-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Output":"coverage: 0.0% of statements\n"} {"Time":"2019-06-26T19:28:47.469354607-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/good","Output":"ok \tgotest.tools/gotestsum/testjson/internal/good\t0.011s\tcoverage: 0.0% of statements\n"} {"Time":"2019-06-26T19:28:47.469649009-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/good","Elapsed":0.012} {"Time":"2019-06-26T19:28:47.613455232-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassed"} {"Time":"2019-06-26T19:28:47.613489941-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassed","Output":"=== RUN TestPassed\n"} {"Time":"2019-06-26T19:28:47.613501844-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassed","Output":"--- PASS: TestPassed (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613511031-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassed","Elapsed":0} {"Time":"2019-06-26T19:28:47.613518853-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithLog"} {"Time":"2019-06-26T19:28:47.61352445-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithLog","Output":"=== RUN TestPassedWithLog\n"} {"Time":"2019-06-26T19:28:47.613530776-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithLog","Output":"--- PASS: TestPassedWithLog (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613538567-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithLog","Output":" stub_test.go:18: this is a log\n"} {"Time":"2019-06-26T19:28:47.61354478-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithLog","Elapsed":0} {"Time":"2019-06-26T19:28:47.613548354-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithStdout"} {"Time":"2019-06-26T19:28:47.613551518-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"=== RUN TestPassedWithStdout\n"} {"Time":"2019-06-26T19:28:47.613559269-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"this is a Print\n"} {"Time":"2019-06-26T19:28:47.613566884-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"--- PASS: TestPassedWithStdout (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613573134-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestPassedWithStdout","Elapsed":0} {"Time":"2019-06-26T19:28:47.613578456-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkipped"} {"Time":"2019-06-26T19:28:47.613584276-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"} {"Time":"2019-06-26T19:28:47.613591296-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613598946-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkipped","Output":" stub_test.go:26: \n"} {"Time":"2019-06-26T19:28:47.613605417-04:00","Action":"skip","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkipped","Elapsed":0} {"Time":"2019-06-26T19:28:47.613611099-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkippedWitLog"} {"Time":"2019-06-26T19:28:47.613616389-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"=== RUN TestSkippedWitLog\n"} {"Time":"2019-06-26T19:28:47.613630786-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"--- SKIP: TestSkippedWitLog (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613638067-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkippedWitLog","Output":" stub_test.go:30: the skip message\n"} {"Time":"2019-06-26T19:28:47.613644539-04:00","Action":"skip","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestSkippedWitLog","Elapsed":0} {"Time":"2019-06-26T19:28:47.613650915-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailed"} {"Time":"2019-06-26T19:28:47.613656057-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailed","Output":"=== RUN TestFailed\n"} {"Time":"2019-06-26T19:28:47.613660804-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailed","Output":"--- FAIL: TestFailed (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613666458-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailed","Output":" stub_test.go:34: this failed\n"} {"Time":"2019-06-26T19:28:47.61367398-04:00","Action":"fail","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailed","Elapsed":0} {"Time":"2019-06-26T19:28:47.613677924-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestWithStderr"} {"Time":"2019-06-26T19:28:47.613680917-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestWithStderr","Output":"=== RUN TestWithStderr\n"} {"Time":"2019-06-26T19:28:47.613684329-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestWithStderr","Output":"this is stderr\n"} {"Time":"2019-06-26T19:28:47.613689561-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestWithStderr","Output":"--- PASS: TestWithStderr (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613698172-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestWithStderr","Elapsed":0} {"Time":"2019-06-26T19:28:47.613701738-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailedWithStderr"} {"Time":"2019-06-26T19:28:47.613704935-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"=== RUN TestFailedWithStderr\n"} {"Time":"2019-06-26T19:28:47.613708452-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"this is stderr\n"} {"Time":"2019-06-26T19:28:47.613712122-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"--- FAIL: TestFailedWithStderr (0.00s)\n"} {"Time":"2019-06-26T19:28:47.61371559-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailedWithStderr","Output":" stub_test.go:43: also failed\n"} {"Time":"2019-06-26T19:28:47.613719048-04:00","Action":"fail","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestFailedWithStderr","Elapsed":0} {"Time":"2019-06-26T19:28:47.613722888-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2019-06-26T19:28:47.613728376-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== RUN TestParallelTheFirst\n"} {"Time":"2019-06-26T19:28:47.613733754-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== PAUSE TestParallelTheFirst\n"} {"Time":"2019-06-26T19:28:47.613737105-04:00","Action":"pause","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2019-06-26T19:28:47.613743446-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2019-06-26T19:28:47.613746934-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== RUN TestParallelTheSecond\n"} {"Time":"2019-06-26T19:28:47.613750637-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== PAUSE TestParallelTheSecond\n"} {"Time":"2019-06-26T19:28:47.613776438-04:00","Action":"pause","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2019-06-26T19:28:47.613781739-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2019-06-26T19:28:47.613785885-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== RUN TestParallelTheThird\n"} {"Time":"2019-06-26T19:28:47.613790704-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== PAUSE TestParallelTheThird\n"} {"Time":"2019-06-26T19:28:47.613794776-04:00","Action":"pause","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2019-06-26T19:28:47.61379922-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure"} {"Time":"2019-06-26T19:28:47.613803368-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure","Output":"=== RUN TestNestedWithFailure\n"} {"Time":"2019-06-26T19:28:47.613807955-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/a"} {"Time":"2019-06-26T19:28:47.613812031-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/a","Output":"=== RUN TestNestedWithFailure/a\n"} {"Time":"2019-06-26T19:28:47.61381662-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub"} {"Time":"2019-06-26T19:28:47.613820714-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Output":"=== RUN TestNestedWithFailure/a/sub\n"} {"Time":"2019-06-26T19:28:47.61382569-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/b"} {"Time":"2019-06-26T19:28:47.61382997-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/b","Output":"=== RUN TestNestedWithFailure/b\n"} {"Time":"2019-06-26T19:28:47.613834604-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub"} {"Time":"2019-06-26T19:28:47.613838711-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Output":"=== RUN TestNestedWithFailure/b/sub\n"} {"Time":"2019-06-26T19:28:47.61384326-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/c"} {"Time":"2019-06-26T19:28:47.613847279-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":"=== RUN TestNestedWithFailure/c\n"} {"Time":"2019-06-26T19:28:47.613851721-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/d"} {"Time":"2019-06-26T19:28:47.613856183-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/d","Output":"=== RUN TestNestedWithFailure/d\n"} {"Time":"2019-06-26T19:28:47.613860835-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub"} {"Time":"2019-06-26T19:28:47.613868445-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Output":"=== RUN TestNestedWithFailure/d/sub\n"} {"Time":"2019-06-26T19:28:47.613874256-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure","Output":"--- FAIL: TestNestedWithFailure (0.00s)\n"} {"Time":"2019-06-26T19:28:47.61387999-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/a","Output":" --- PASS: TestNestedWithFailure/a (0.00s)\n"} {"Time":"2019-06-26T19:28:47.61388535-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Output":" --- PASS: TestNestedWithFailure/a/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613892244-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.61389948-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/a","Elapsed":0} {"Time":"2019-06-26T19:28:47.613904207-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/b","Output":" --- PASS: TestNestedWithFailure/b (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613909201-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Output":" --- PASS: TestNestedWithFailure/b/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613914432-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.613918715-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/b","Elapsed":0} {"Time":"2019-06-26T19:28:47.613923018-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":" --- FAIL: TestNestedWithFailure/c (0.00s)\n"} {"Time":"2019-06-26T19:28:47.61392748-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":" stub_test.go:65: failed\n"} {"Time":"2019-06-26T19:28:47.613932152-04:00","Action":"fail","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/c","Elapsed":0} {"Time":"2019-06-26T19:28:47.613936537-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/d","Output":" --- PASS: TestNestedWithFailure/d (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613941691-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Output":" --- PASS: TestNestedWithFailure/d/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.613946328-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.613950391-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure/d","Elapsed":0} {"Time":"2019-06-26T19:28:47.61395449-04:00","Action":"fail","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedWithFailure","Elapsed":0} {"Time":"2019-06-26T19:28:47.61395872-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess"} {"Time":"2019-06-26T19:28:47.613962881-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess","Output":"=== RUN TestNestedSuccess\n"} {"Time":"2019-06-26T19:28:47.613967468-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/a"} {"Time":"2019-06-26T19:28:47.613971517-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/a","Output":"=== RUN TestNestedSuccess/a\n"} {"Time":"2019-06-26T19:28:47.613978979-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/a/sub"} {"Time":"2019-06-26T19:28:47.613984807-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Output":"=== RUN TestNestedSuccess/a/sub\n"} {"Time":"2019-06-26T19:28:47.613989747-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/b"} {"Time":"2019-06-26T19:28:47.613994192-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/b","Output":"=== RUN TestNestedSuccess/b\n"} {"Time":"2019-06-26T19:28:47.613998627-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/b/sub"} {"Time":"2019-06-26T19:28:47.614002677-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Output":"=== RUN TestNestedSuccess/b/sub\n"} {"Time":"2019-06-26T19:28:47.614007557-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/c"} {"Time":"2019-06-26T19:28:47.614011782-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/c","Output":"=== RUN TestNestedSuccess/c\n"} {"Time":"2019-06-26T19:28:47.614016469-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/c/sub"} {"Time":"2019-06-26T19:28:47.614020531-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Output":"=== RUN TestNestedSuccess/c/sub\n"} {"Time":"2019-06-26T19:28:47.614025042-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/d"} {"Time":"2019-06-26T19:28:47.614029111-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/d","Output":"=== RUN TestNestedSuccess/d\n"} {"Time":"2019-06-26T19:28:47.614033552-04:00","Action":"run","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/d/sub"} {"Time":"2019-06-26T19:28:47.614038027-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Output":"=== RUN TestNestedSuccess/d/sub\n"} {"Time":"2019-06-26T19:28:47.614047195-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess","Output":"--- PASS: TestNestedSuccess (0.00s)\n"} {"Time":"2019-06-26T19:28:47.614052718-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/a","Output":" --- PASS: TestNestedSuccess/a (0.00s)\n"} {"Time":"2019-06-26T19:28:47.614059105-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Output":" --- PASS: TestNestedSuccess/a/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.614064422-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.614068694-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/a","Elapsed":0} {"Time":"2019-06-26T19:28:47.614072803-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/b","Output":" --- PASS: TestNestedSuccess/b (0.00s)\n"} {"Time":"2019-06-26T19:28:47.614077732-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Output":" --- PASS: TestNestedSuccess/b/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.614082472-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.614090817-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/b","Elapsed":0} {"Time":"2019-06-26T19:28:47.614095867-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/c","Output":" --- PASS: TestNestedSuccess/c (0.00s)\n"} {"Time":"2019-06-26T19:28:47.61410088-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Output":" --- PASS: TestNestedSuccess/c/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.614105594-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.614109835-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/c","Elapsed":0} {"Time":"2019-06-26T19:28:47.614114046-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/d","Output":" --- PASS: TestNestedSuccess/d (0.00s)\n"} {"Time":"2019-06-26T19:28:47.614118785-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Output":" --- PASS: TestNestedSuccess/d/sub (0.00s)\n"} {"Time":"2019-06-26T19:28:47.614123463-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Elapsed":0} {"Time":"2019-06-26T19:28:47.614127465-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess/d","Elapsed":0} {"Time":"2019-06-26T19:28:47.614131655-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestNestedSuccess","Elapsed":0} {"Time":"2019-06-26T19:28:47.614135791-04:00","Action":"cont","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2019-06-26T19:28:47.614139853-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== CONT TestParallelTheFirst\n"} {"Time":"2019-06-26T19:28:47.614144429-04:00","Action":"cont","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2019-06-26T19:28:47.614148541-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== CONT TestParallelTheThird\n"} {"Time":"2019-06-26T19:28:47.614154363-04:00","Action":"cont","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2019-06-26T19:28:47.614158811-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== CONT TestParallelTheSecond\n"} {"Time":"2019-06-26T19:28:47.61583309-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheThird","Output":"--- PASS: TestParallelTheThird (0.00s)\n"} {"Time":"2019-06-26T19:28:47.619887526-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheThird","Elapsed":0} {"Time":"2019-06-26T19:28:47.619903436-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"--- PASS: TestParallelTheSecond (0.01s)\n"} {"Time":"2019-06-26T19:28:47.62383803-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheSecond","Elapsed":0.01} {"Time":"2019-06-26T19:28:47.62385879-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"--- PASS: TestParallelTheFirst (0.01s)\n"} {"Time":"2019-06-26T19:28:47.623867697-04:00","Action":"pass","Package":"gotest.tools/gotestsum/testjson/internal/stub","Test":"TestParallelTheFirst","Elapsed":0.01} {"Time":"2019-06-26T19:28:47.623872233-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Output":"FAIL\n"} {"Time":"2019-06-26T19:28:47.623881112-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Output":"coverage: 0.0% of statements\n"} {"Time":"2019-06-26T19:28:47.623967813-04:00","Action":"output","Package":"gotest.tools/gotestsum/testjson/internal/stub","Output":"FAIL\tgotest.tools/gotestsum/testjson/internal/stub\t0.011s\n"} {"Time":"2019-06-26T19:28:47.623982468-04:00","Action":"fail","Package":"gotest.tools/gotestsum/testjson/internal/stub","Elapsed":0.011} gotestsum-0.5.0/testjson/testdata/go-test-json-with-panic.err000066400000000000000000000001731367230725500243470ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/go-test-json-with-panic.out000066400000000000000000001431621367230725500243740ustar00rootroot00000000000000{"Time":"2018-03-22T22:33:35.739099374Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/badmain","Output":"sometimes main can exit 2\n"} {"Time":"2018-03-22T22:33:35.739208859Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/badmain","Output":"FAIL\tgithub.com/gotestyourself/gotestyourself/testjson/internal/badmain\t0.001s\n"} {"Time":"2018-03-22T22:33:35.739217575Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/badmain","Elapsed":0.001} {"Time":"2018-03-22T22:33:35.866413454Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassed"} {"Time":"2018-03-22T22:33:35.866444891Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassed","Output":"=== RUN TestPassed\n"} {"Time":"2018-03-22T22:33:35.866459774Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassed","Output":"--- PASS: TestPassed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.866466088Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassed","Elapsed":0} {"Time":"2018-03-22T22:33:35.866472637Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithLog"} {"Time":"2018-03-22T22:33:35.86647728Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithLog","Output":"=== RUN TestPassedWithLog\n"} {"Time":"2018-03-22T22:33:35.86648321Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithLog","Output":"--- PASS: TestPassedWithLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.866488506Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithLog","Output":"\tfrenzy_test.go:13: this is a log\n"} {"Time":"2018-03-22T22:33:35.866493861Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.866498419Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithStdout"} {"Time":"2018-03-22T22:33:35.866502911Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithStdout","Output":"=== RUN TestPassedWithStdout\n"} {"Time":"2018-03-22T22:33:35.866508069Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithStdout","Output":"this is a Print\n"} {"Time":"2018-03-22T22:33:35.866513588Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithStdout","Output":"--- PASS: TestPassedWithStdout (0.00s)\n"} {"Time":"2018-03-22T22:33:35.866518866Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPassedWithStdout","Elapsed":0} {"Time":"2018-03-22T22:33:35.866523346Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics"} {"Time":"2018-03-22T22:33:35.866527677Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"=== RUN TestPanics\n"} {"Time":"2018-03-22T22:33:35.866533097Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"--- FAIL: TestPanics (0.00s)\n"} {"Time":"2018-03-22T22:33:35.868615666Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"panic: this is a panic [recovered]\n"} {"Time":"2018-03-22T22:33:35.868625038Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"\tpanic: this is a panic\n"} {"Time":"2018-03-22T22:33:35.868637336Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"\n"} {"Time":"2018-03-22T22:33:35.868642347Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"goroutine 8 [running]:\n"} {"Time":"2018-03-22T22:33:35.868648027Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"testing.tRunner.func1(0xc4200aa3c0)\n"} {"Time":"2018-03-22T22:33:35.868652513Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"\t/usr/local/go/src/testing/testing.go:742 +0x29d\n"} {"Time":"2018-03-22T22:33:35.868656842Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"panic(0x4fedc0, 0x546780)\n"} {"Time":"2018-03-22T22:33:35.868661294Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"\t/usr/local/go/src/runtime/panic.go:505 +0x229\n"} {"Time":"2018-03-22T22:33:35.868667419Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy.TestPanics(0xc4200aa3c0)\n"} {"Time":"2018-03-22T22:33:35.868674474Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"\t/go/src/github.com/gotestyourself/gotestyourself/testjson/internal/frenzy/frenzy_test.go:21 +0x39\n"} {"Time":"2018-03-22T22:33:35.86868092Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"testing.tRunner(0xc4200aa3c0, 0x537670)\n"} {"Time":"2018-03-22T22:33:35.868687479Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"\t/usr/local/go/src/testing/testing.go:777 +0xd0\n"} {"Time":"2018-03-22T22:33:35.868694239Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"created by testing.(*T).Run\n"} {"Time":"2018-03-22T22:33:35.868700872Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"\t/usr/local/go/src/testing/testing.go:824 +0x2e0\n"} {"Time":"2018-03-22T22:33:35.868808871Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Output":"FAIL\tgithub.com/gotestyourself/gotestyourself/testjson/internal/frenzy\t0.003s\n"} {"Time":"2018-03-22T22:33:35.868825494Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/frenzy","Test":"TestPanics","Elapsed":0.003} {"Time":"2018-03-22T22:33:35.87795164Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed"} {"Time":"2018-03-22T22:33:35.877987077Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed","Output":"=== RUN TestPassed\n"} {"Time":"2018-03-22T22:33:35.87800109Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed","Output":"--- PASS: TestPassed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878010307Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed","Elapsed":0} {"Time":"2018-03-22T22:33:35.878019358Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog"} {"Time":"2018-03-22T22:33:35.878027147Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Output":"=== RUN TestPassedWithLog\n"} {"Time":"2018-03-22T22:33:35.878044922Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Output":"--- PASS: TestPassedWithLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.87805318Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Output":"\tgood_test.go:15: this is a log\n"} {"Time":"2018-03-22T22:33:35.878061287Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.878068217Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout"} {"Time":"2018-03-22T22:33:35.878075114Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Output":"=== RUN TestPassedWithStdout\n"} {"Time":"2018-03-22T22:33:35.878082839Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Output":"this is a Print\n"} {"Time":"2018-03-22T22:33:35.878091286Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Output":"--- PASS: TestPassedWithStdout (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878097236Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Elapsed":0} {"Time":"2018-03-22T22:33:35.878101462Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped"} {"Time":"2018-03-22T22:33:35.878105488Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"} {"Time":"2018-03-22T22:33:35.878110481Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878114937Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Output":"\tgood_test.go:23: \n"} {"Time":"2018-03-22T22:33:35.878119478Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Elapsed":0} {"Time":"2018-03-22T22:33:35.878123939Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog"} {"Time":"2018-03-22T22:33:35.878130558Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Output":"=== RUN TestSkippedWitLog\n"} {"Time":"2018-03-22T22:33:35.878136994Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Output":"--- SKIP: TestSkippedWitLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878141734Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Output":"\tgood_test.go:27: the skip message\n"} {"Time":"2018-03-22T22:33:35.878146442Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.878150543Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr"} {"Time":"2018-03-22T22:33:35.878154549Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Output":"=== RUN TestWithStderr\n"} {"Time":"2018-03-22T22:33:35.878158988Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Output":"this is stderr\n"} {"Time":"2018-03-22T22:33:35.87816375Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Output":"--- PASS: TestWithStderr (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878172029Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Elapsed":0} {"Time":"2018-03-22T22:33:35.878179826Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.878186738Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== RUN TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.87819184Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== PAUSE TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.878196037Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.878200304Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.878204305Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== RUN TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.878209Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== PAUSE TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.878213215Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.87821755Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.878221618Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== RUN TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.878226199Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== PAUSE TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.878231771Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.878235999Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess"} {"Time":"2018-03-22T22:33:35.878239962Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess","Output":"=== RUN TestNestedSuccess\n"} {"Time":"2018-03-22T22:33:35.878246139Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a"} {"Time":"2018-03-22T22:33:35.87825014Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a","Output":"=== RUN TestNestedSuccess/a\n"} {"Time":"2018-03-22T22:33:35.878254644Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub"} {"Time":"2018-03-22T22:33:35.878258643Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Output":"=== RUN TestNestedSuccess/a/sub\n"} {"Time":"2018-03-22T22:33:35.878263241Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b"} {"Time":"2018-03-22T22:33:35.878267145Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b","Output":"=== RUN TestNestedSuccess/b\n"} {"Time":"2018-03-22T22:33:35.878271535Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub"} {"Time":"2018-03-22T22:33:35.87827899Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Output":"=== RUN TestNestedSuccess/b/sub\n"} {"Time":"2018-03-22T22:33:35.878284186Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c"} {"Time":"2018-03-22T22:33:35.87828811Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c","Output":"=== RUN TestNestedSuccess/c\n"} {"Time":"2018-03-22T22:33:35.878292599Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub"} {"Time":"2018-03-22T22:33:35.878296515Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Output":"=== RUN TestNestedSuccess/c/sub\n"} {"Time":"2018-03-22T22:33:35.87830099Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d"} {"Time":"2018-03-22T22:33:35.8783051Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d","Output":"=== RUN TestNestedSuccess/d\n"} {"Time":"2018-03-22T22:33:35.878309651Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub"} {"Time":"2018-03-22T22:33:35.878313591Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Output":"=== RUN TestNestedSuccess/d/sub\n"} {"Time":"2018-03-22T22:33:35.878318579Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess","Output":"--- PASS: TestNestedSuccess (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878323903Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a","Output":" --- PASS: TestNestedSuccess/a (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878329182Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Output":" --- PASS: TestNestedSuccess/a/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878335313Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.878339517Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a","Elapsed":0} {"Time":"2018-03-22T22:33:35.878343554Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b","Output":" --- PASS: TestNestedSuccess/b (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878348367Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Output":" --- PASS: TestNestedSuccess/b/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878353111Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.878357179Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b","Elapsed":0} {"Time":"2018-03-22T22:33:35.878362672Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c","Output":" --- PASS: TestNestedSuccess/c (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878367533Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Output":" --- PASS: TestNestedSuccess/c/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.87837224Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.878378659Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c","Elapsed":0} {"Time":"2018-03-22T22:33:35.878383125Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d","Output":" --- PASS: TestNestedSuccess/d (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878388049Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Output":" --- PASS: TestNestedSuccess/d/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878392702Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.878396788Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d","Elapsed":0} {"Time":"2018-03-22T22:33:35.878400657Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess","Elapsed":0} {"Time":"2018-03-22T22:33:35.878404626Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.878408512Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== CONT TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.878413034Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.87841693Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== CONT TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.878421399Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.87842529Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== CONT TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.878430114Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"--- PASS: TestParallelTheThird (0.00s)\n"} {"Time":"2018-03-22T22:33:35.878435104Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Elapsed":0} {"Time":"2018-03-22T22:33:35.878439295Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"--- PASS: TestParallelTheSecond (0.01s)\n"} {"Time":"2018-03-22T22:33:35.878445228Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.878450123Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"--- PASS: TestParallelTheFirst (0.01s)\n"} {"Time":"2018-03-22T22:33:35.878454324Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.878458511Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Output":"PASS\n"} {"Time":"2018-03-22T22:33:35.878463036Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Output":"ok \tgithub.com/gotestyourself/gotestyourself/testjson/internal/good\t(cached)\n"} {"Time":"2018-03-22T22:33:35.878468853Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Elapsed":0.001} {"Time":"2018-03-22T22:33:35.977738935Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed"} {"Time":"2018-03-22T22:33:35.977761708Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed","Output":"=== RUN TestPassed\n"} {"Time":"2018-03-22T22:33:35.977773148Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed","Output":"--- PASS: TestPassed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.977780105Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed","Elapsed":0} {"Time":"2018-03-22T22:33:35.977785632Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog"} {"Time":"2018-03-22T22:33:35.977788941Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Output":"=== RUN TestPassedWithLog\n"} {"Time":"2018-03-22T22:33:35.977793105Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Output":"--- PASS: TestPassedWithLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.977796778Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Output":"\tstub_test.go:18: this is a log\n"} {"Time":"2018-03-22T22:33:35.977802122Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.977805367Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout"} {"Time":"2018-03-22T22:33:35.977808816Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"=== RUN TestPassedWithStdout\n"} {"Time":"2018-03-22T22:33:35.977812356Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"this is a Print\n"} {"Time":"2018-03-22T22:33:35.977816294Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"--- PASS: TestPassedWithStdout (0.00s)\n"} {"Time":"2018-03-22T22:33:35.977820025Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Elapsed":0} {"Time":"2018-03-22T22:33:35.977823232Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped"} {"Time":"2018-03-22T22:33:35.977828106Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"} {"Time":"2018-03-22T22:33:35.977834808Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.00s)\n"} {"Time":"2018-03-22T22:33:35.977838853Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Output":"\tstub_test.go:26: \n"} {"Time":"2018-03-22T22:33:35.977844701Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Elapsed":0} {"Time":"2018-03-22T22:33:35.977848211Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog"} {"Time":"2018-03-22T22:33:35.977853133Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"=== RUN TestSkippedWitLog\n"} {"Time":"2018-03-22T22:33:35.97785782Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"--- SKIP: TestSkippedWitLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.977868768Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"\tstub_test.go:30: the skip message\n"} {"Time":"2018-03-22T22:33:35.977874835Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.977878104Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed"} {"Time":"2018-03-22T22:33:35.977881054Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Output":"=== RUN TestFailed\n"} {"Time":"2018-03-22T22:33:35.977886553Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Output":"--- FAIL: TestFailed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.977891199Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Output":"\tstub_test.go:34: this failed\n"} {"Time":"2018-03-22T22:33:35.977896727Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Elapsed":0} {"Time":"2018-03-22T22:33:35.977902175Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr"} {"Time":"2018-03-22T22:33:35.977907291Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Output":"=== RUN TestWithStderr\n"} {"Time":"2018-03-22T22:33:35.977913079Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Output":"this is stderr\n"} {"Time":"2018-03-22T22:33:35.977918775Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Output":"--- PASS: TestWithStderr (0.00s)\n"} {"Time":"2018-03-22T22:33:35.977924542Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Elapsed":0} {"Time":"2018-03-22T22:33:35.977928829Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr"} {"Time":"2018-03-22T22:33:35.977933065Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"=== RUN TestFailedWithStderr\n"} {"Time":"2018-03-22T22:33:35.977938519Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"this is stderr\n"} {"Time":"2018-03-22T22:33:35.977945899Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"--- FAIL: TestFailedWithStderr (0.00s)\n"} {"Time":"2018-03-22T22:33:35.977952003Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"\tstub_test.go:43: also failed\n"} {"Time":"2018-03-22T22:33:35.977957702Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Elapsed":0} {"Time":"2018-03-22T22:33:35.977962976Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.977967297Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== RUN TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.977971084Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== PAUSE TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.977974512Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.977982165Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.977985769Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== RUN TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.977989317Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== PAUSE TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.97799235Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.977996887Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.977999874Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== RUN TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.978003311Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== PAUSE TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.978006325Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.978009475Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure"} {"Time":"2018-03-22T22:33:35.97801245Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure","Output":"=== RUN TestNestedWithFailure\n"} {"Time":"2018-03-22T22:33:35.978015921Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a"} {"Time":"2018-03-22T22:33:35.978018916Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a","Output":"=== RUN TestNestedWithFailure/a\n"} {"Time":"2018-03-22T22:33:35.978022356Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub"} {"Time":"2018-03-22T22:33:35.978025353Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Output":"=== RUN TestNestedWithFailure/a/sub\n"} {"Time":"2018-03-22T22:33:35.978028763Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b"} {"Time":"2018-03-22T22:33:35.978032431Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b","Output":"=== RUN TestNestedWithFailure/b\n"} {"Time":"2018-03-22T22:33:35.97803881Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub"} {"Time":"2018-03-22T22:33:35.978044133Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Output":"=== RUN TestNestedWithFailure/b/sub\n"} {"Time":"2018-03-22T22:33:35.978054397Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c"} {"Time":"2018-03-22T22:33:35.978060355Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":"=== RUN TestNestedWithFailure/c\n"} {"Time":"2018-03-22T22:33:35.978066536Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d"} {"Time":"2018-03-22T22:33:35.978074315Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d","Output":"=== RUN TestNestedWithFailure/d\n"} {"Time":"2018-03-22T22:33:35.978080705Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub"} {"Time":"2018-03-22T22:33:35.978086308Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Output":"=== RUN TestNestedWithFailure/d/sub\n"} {"Time":"2018-03-22T22:33:35.9780934Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure","Output":"--- FAIL: TestNestedWithFailure (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978097854Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a","Output":" --- PASS: TestNestedWithFailure/a (0.00s)\n"} {"Time":"2018-03-22T22:33:35.97810176Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Output":" --- PASS: TestNestedWithFailure/a/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978105354Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.978108643Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a","Elapsed":0} {"Time":"2018-03-22T22:33:35.978111774Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b","Output":" --- PASS: TestNestedWithFailure/b (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978115358Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Output":" --- PASS: TestNestedWithFailure/b/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978120569Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.978123673Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b","Elapsed":0} {"Time":"2018-03-22T22:33:35.978126675Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":" --- FAIL: TestNestedWithFailure/c (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978129966Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":" \tstub_test.go:65: failed\n"} {"Time":"2018-03-22T22:33:35.97813473Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Elapsed":0} {"Time":"2018-03-22T22:33:35.978137944Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d","Output":" --- PASS: TestNestedWithFailure/d (0.00s)\n"} {"Time":"2018-03-22T22:33:35.97814162Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Output":" --- PASS: TestNestedWithFailure/d/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978145173Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.978148284Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d","Elapsed":0} {"Time":"2018-03-22T22:33:35.978151234Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure","Elapsed":0} {"Time":"2018-03-22T22:33:35.978156331Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess"} {"Time":"2018-03-22T22:33:35.978160758Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess","Output":"=== RUN TestNestedSuccess\n"} {"Time":"2018-03-22T22:33:35.978164246Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a"} {"Time":"2018-03-22T22:33:35.978167262Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a","Output":"=== RUN TestNestedSuccess/a\n"} {"Time":"2018-03-22T22:33:35.978170661Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub"} {"Time":"2018-03-22T22:33:35.978173662Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Output":"=== RUN TestNestedSuccess/a/sub\n"} {"Time":"2018-03-22T22:33:35.978177051Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b"} {"Time":"2018-03-22T22:33:35.978180039Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b","Output":"=== RUN TestNestedSuccess/b\n"} {"Time":"2018-03-22T22:33:35.978183391Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub"} {"Time":"2018-03-22T22:33:35.978186395Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Output":"=== RUN TestNestedSuccess/b/sub\n"} {"Time":"2018-03-22T22:33:35.978189764Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c"} {"Time":"2018-03-22T22:33:35.978192845Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c","Output":"=== RUN TestNestedSuccess/c\n"} {"Time":"2018-03-22T22:33:35.978196162Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub"} {"Time":"2018-03-22T22:33:35.978199123Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Output":"=== RUN TestNestedSuccess/c/sub\n"} {"Time":"2018-03-22T22:33:35.978202469Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d"} {"Time":"2018-03-22T22:33:35.978205408Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d","Output":"=== RUN TestNestedSuccess/d\n"} {"Time":"2018-03-22T22:33:35.978208723Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub"} {"Time":"2018-03-22T22:33:35.978211721Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Output":"=== RUN TestNestedSuccess/d/sub\n"} {"Time":"2018-03-22T22:33:35.978215423Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess","Output":"--- PASS: TestNestedSuccess (0.00s)\n"} {"Time":"2018-03-22T22:33:35.97821913Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a","Output":" --- PASS: TestNestedSuccess/a (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978222781Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Output":" --- PASS: TestNestedSuccess/a/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978226312Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.978232611Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a","Elapsed":0} {"Time":"2018-03-22T22:33:35.978235924Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b","Output":" --- PASS: TestNestedSuccess/b (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978239603Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Output":" --- PASS: TestNestedSuccess/b/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978243117Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.978246193Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b","Elapsed":0} {"Time":"2018-03-22T22:33:35.978249199Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c","Output":" --- PASS: TestNestedSuccess/c (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978253942Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Output":" --- PASS: TestNestedSuccess/c/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.97825749Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.978260577Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c","Elapsed":0} {"Time":"2018-03-22T22:33:35.978263575Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d","Output":" --- PASS: TestNestedSuccess/d (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978267117Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Output":" --- PASS: TestNestedSuccess/d/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.978270626Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.978273698Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d","Elapsed":0} {"Time":"2018-03-22T22:33:35.978276602Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess","Elapsed":0} {"Time":"2018-03-22T22:33:35.978279595Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.978282516Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== CONT TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.978288092Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.97829116Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== CONT TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.978294586Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.978297553Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== CONT TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.980187956Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"--- PASS: TestParallelTheThird (0.00s)\n"} {"Time":"2018-03-22T22:33:35.984209575Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Elapsed":0} {"Time":"2018-03-22T22:33:35.984225235Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"--- PASS: TestParallelTheSecond (0.01s)\n"} {"Time":"2018-03-22T22:33:35.988168077Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.988187916Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"--- PASS: TestParallelTheFirst (0.01s)\n"} {"Time":"2018-03-22T22:33:35.988197932Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.988207941Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Output":"FAIL\n"} {"Time":"2018-03-22T22:33:35.988383401Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Output":"FAIL\tgithub.com/gotestyourself/gotestyourself/testjson/internal/stub\t0.011s\n"} {"Time":"2018-03-22T22:33:35.988402372Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Elapsed":0.011} gotestsum-0.5.0/testjson/testdata/go-test-json-with-timeout.err000066400000000000000000000001731367230725500247430ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/go-test-json-with-timeout.out000066400000000000000000001535311367230725500247710ustar00rootroot00000000000000{"Time":"2018-03-22T22:33:35.440089733Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/badmain","Output":"sometimes main can exit 2\n"} {"Time":"2018-03-22T22:33:35.440231717Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/badmain","Output":"FAIL\tgithub.com/gotestyourself/gotestyourself/testjson/internal/badmain\t0.001s\n"} {"Time":"2018-03-22T22:33:35.440243675Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/badmain","Elapsed":0.001} {"Time":"2018-03-22T22:33:35.455160402Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed"} {"Time":"2018-03-22T22:33:35.455198057Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed","Output":"=== RUN TestPassed\n"} {"Time":"2018-03-22T22:33:35.455214086Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed","Output":"--- PASS: TestPassed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455224083Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed","Elapsed":0} {"Time":"2018-03-22T22:33:35.455242811Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog"} {"Time":"2018-03-22T22:33:35.455252284Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Output":"=== RUN TestPassedWithLog\n"} {"Time":"2018-03-22T22:33:35.45526172Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Output":"--- PASS: TestPassedWithLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455269315Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Output":"\tgood_test.go:15: this is a log\n"} {"Time":"2018-03-22T22:33:35.455278935Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.455287227Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout"} {"Time":"2018-03-22T22:33:35.455294515Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Output":"=== RUN TestPassedWithStdout\n"} {"Time":"2018-03-22T22:33:35.455302612Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Output":"this is a Print\n"} {"Time":"2018-03-22T22:33:35.455317842Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Output":"--- PASS: TestPassedWithStdout (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455326807Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Elapsed":0} {"Time":"2018-03-22T22:33:35.455336778Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped"} {"Time":"2018-03-22T22:33:35.455344239Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"} {"Time":"2018-03-22T22:33:35.455353562Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455362046Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Output":"\tgood_test.go:23: \n"} {"Time":"2018-03-22T22:33:35.455370348Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Elapsed":0} {"Time":"2018-03-22T22:33:35.455378112Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog"} {"Time":"2018-03-22T22:33:35.455394926Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Output":"=== RUN TestSkippedWitLog\n"} {"Time":"2018-03-22T22:33:35.455404386Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Output":"--- SKIP: TestSkippedWitLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455413368Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Output":"\tgood_test.go:27: the skip message\n"} {"Time":"2018-03-22T22:33:35.455422531Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.455431008Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr"} {"Time":"2018-03-22T22:33:35.455438666Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Output":"=== RUN TestWithStderr\n"} {"Time":"2018-03-22T22:33:35.455447331Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Output":"this is stderr\n"} {"Time":"2018-03-22T22:33:35.45545678Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Output":"--- PASS: TestWithStderr (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455466638Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Elapsed":0} {"Time":"2018-03-22T22:33:35.455475333Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.455483176Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== RUN TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.455492645Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== PAUSE TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.455502958Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.455511717Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.455519938Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== RUN TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.455531566Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== PAUSE TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.455539399Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.455547397Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.455555305Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== RUN TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.455564332Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== PAUSE TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.455571815Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.455584462Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess"} {"Time":"2018-03-22T22:33:35.455589647Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess","Output":"=== RUN TestNestedSuccess\n"} {"Time":"2018-03-22T22:33:35.455596612Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a"} {"Time":"2018-03-22T22:33:35.455601042Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a","Output":"=== RUN TestNestedSuccess/a\n"} {"Time":"2018-03-22T22:33:35.4556061Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub"} {"Time":"2018-03-22T22:33:35.455610579Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Output":"=== RUN TestNestedSuccess/a/sub\n"} {"Time":"2018-03-22T22:33:35.455615582Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b"} {"Time":"2018-03-22T22:33:35.455619878Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b","Output":"=== RUN TestNestedSuccess/b\n"} {"Time":"2018-03-22T22:33:35.455625711Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub"} {"Time":"2018-03-22T22:33:35.455633765Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Output":"=== RUN TestNestedSuccess/b/sub\n"} {"Time":"2018-03-22T22:33:35.455639045Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c"} {"Time":"2018-03-22T22:33:35.455643304Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c","Output":"=== RUN TestNestedSuccess/c\n"} {"Time":"2018-03-22T22:33:35.455648198Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub"} {"Time":"2018-03-22T22:33:35.455655458Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Output":"=== RUN TestNestedSuccess/c/sub\n"} {"Time":"2018-03-22T22:33:35.455662538Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d"} {"Time":"2018-03-22T22:33:35.455667303Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d","Output":"=== RUN TestNestedSuccess/d\n"} {"Time":"2018-03-22T22:33:35.455672087Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub"} {"Time":"2018-03-22T22:33:35.455676406Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Output":"=== RUN TestNestedSuccess/d/sub\n"} {"Time":"2018-03-22T22:33:35.455682062Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess","Output":"--- PASS: TestNestedSuccess (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455688209Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a","Output":" --- PASS: TestNestedSuccess/a (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455694127Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Output":" --- PASS: TestNestedSuccess/a/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455699366Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.455706912Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a","Elapsed":0} {"Time":"2018-03-22T22:33:35.455711662Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b","Output":" --- PASS: TestNestedSuccess/b (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455717141Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Output":" --- PASS: TestNestedSuccess/b/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455722359Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.455726696Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b","Elapsed":0} {"Time":"2018-03-22T22:33:35.455731154Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c","Output":" --- PASS: TestNestedSuccess/c (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455736397Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Output":" --- PASS: TestNestedSuccess/c/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455743172Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.455747589Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c","Elapsed":0} {"Time":"2018-03-22T22:33:35.455751967Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d","Output":" --- PASS: TestNestedSuccess/d (0.00s)\n"} {"Time":"2018-03-22T22:33:35.45575716Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Output":" --- PASS: TestNestedSuccess/d/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455762715Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.455767158Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d","Elapsed":0} {"Time":"2018-03-22T22:33:35.455771389Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess","Elapsed":0} {"Time":"2018-03-22T22:33:35.455775619Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.455779873Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== CONT TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.45578484Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.455789416Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== CONT TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.455795547Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.455799905Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== CONT TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.455805126Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"--- PASS: TestParallelTheThird (0.00s)\n"} {"Time":"2018-03-22T22:33:35.455812683Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Elapsed":0} {"Time":"2018-03-22T22:33:35.455817594Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"--- PASS: TestParallelTheSecond (0.01s)\n"} {"Time":"2018-03-22T22:33:35.455822672Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.455828223Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"--- PASS: TestParallelTheFirst (0.01s)\n"} {"Time":"2018-03-22T22:33:35.455832814Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.455837438Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Output":"PASS\n"} {"Time":"2018-03-22T22:33:35.455842371Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Output":"ok \tgithub.com/gotestyourself/gotestyourself/testjson/internal/good\t(cached)\n"} {"Time":"2018-03-22T22:33:35.455848655Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Elapsed":0.001} {"Time":"2018-03-22T22:33:35.572788203Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed"} {"Time":"2018-03-22T22:33:35.57281635Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed","Output":"=== RUN TestPassed\n"} {"Time":"2018-03-22T22:33:35.572834616Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed","Output":"--- PASS: TestPassed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.572841149Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed","Elapsed":0} {"Time":"2018-03-22T22:33:35.572847268Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog"} {"Time":"2018-03-22T22:33:35.572851534Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Output":"=== RUN TestPassedWithLog\n"} {"Time":"2018-03-22T22:33:35.572856831Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Output":"--- PASS: TestPassedWithLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.572861369Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Output":"\tstub_test.go:18: this is a log\n"} {"Time":"2018-03-22T22:33:35.572866079Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.572870236Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout"} {"Time":"2018-03-22T22:33:35.572874416Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"=== RUN TestPassedWithStdout\n"} {"Time":"2018-03-22T22:33:35.572879004Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"this is a Print\n"} {"Time":"2018-03-22T22:33:35.57288397Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"--- PASS: TestPassedWithStdout (0.00s)\n"} {"Time":"2018-03-22T22:33:35.572895333Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Elapsed":0} {"Time":"2018-03-22T22:33:35.572900116Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped"} {"Time":"2018-03-22T22:33:35.572904159Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"} {"Time":"2018-03-22T22:33:35.572909122Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.00s)\n"} {"Time":"2018-03-22T22:33:35.572913498Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Output":"\tstub_test.go:26: \n"} {"Time":"2018-03-22T22:33:35.572919692Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Elapsed":0} {"Time":"2018-03-22T22:33:35.572923753Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog"} {"Time":"2018-03-22T22:33:35.572927702Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"=== RUN TestSkippedWitLog\n"} {"Time":"2018-03-22T22:33:35.572932589Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"--- SKIP: TestSkippedWitLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.572937086Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"\tstub_test.go:30: the skip message\n"} {"Time":"2018-03-22T22:33:35.572941611Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.572945685Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed"} {"Time":"2018-03-22T22:33:35.57294967Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Output":"=== RUN TestFailed\n"} {"Time":"2018-03-22T22:33:35.572954509Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Output":"--- FAIL: TestFailed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.572958869Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Output":"\tstub_test.go:34: this failed\n"} {"Time":"2018-03-22T22:33:35.572963512Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Elapsed":0} {"Time":"2018-03-22T22:33:35.572967506Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr"} {"Time":"2018-03-22T22:33:35.572971424Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Output":"=== RUN TestWithStderr\n"} {"Time":"2018-03-22T22:33:35.572975824Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Output":"this is stderr\n"} {"Time":"2018-03-22T22:33:35.572980607Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Output":"--- PASS: TestWithStderr (0.00s)\n"} {"Time":"2018-03-22T22:33:35.572985125Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Elapsed":0} {"Time":"2018-03-22T22:33:35.572989167Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr"} {"Time":"2018-03-22T22:33:35.572993113Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"=== RUN TestFailedWithStderr\n"} {"Time":"2018-03-22T22:33:35.572999827Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"this is stderr\n"} {"Time":"2018-03-22T22:33:35.573006753Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"--- FAIL: TestFailedWithStderr (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573011184Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"\tstub_test.go:43: also failed\n"} {"Time":"2018-03-22T22:33:35.573015674Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Elapsed":0} {"Time":"2018-03-22T22:33:35.573019718Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.573023621Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== RUN TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.573028421Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== PAUSE TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.573032442Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.573036757Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.573040733Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== RUN TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.573046878Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== PAUSE TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.573050962Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.573055148Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.57305907Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== RUN TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.573063693Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== PAUSE TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.573067726Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.573071962Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure"} {"Time":"2018-03-22T22:33:35.573075903Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure","Output":"=== RUN TestNestedWithFailure\n"} {"Time":"2018-03-22T22:33:35.573083964Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a"} {"Time":"2018-03-22T22:33:35.573089503Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a","Output":"=== RUN TestNestedWithFailure/a\n"} {"Time":"2018-03-22T22:33:35.573094161Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub"} {"Time":"2018-03-22T22:33:35.573100383Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Output":"=== RUN TestNestedWithFailure/a/sub\n"} {"Time":"2018-03-22T22:33:35.573105276Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b"} {"Time":"2018-03-22T22:33:35.573109234Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b","Output":"=== RUN TestNestedWithFailure/b\n"} {"Time":"2018-03-22T22:33:35.573113696Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub"} {"Time":"2018-03-22T22:33:35.573117734Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Output":"=== RUN TestNestedWithFailure/b/sub\n"} {"Time":"2018-03-22T22:33:35.573122232Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c"} {"Time":"2018-03-22T22:33:35.573126136Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":"=== RUN TestNestedWithFailure/c\n"} {"Time":"2018-03-22T22:33:35.573130575Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d"} {"Time":"2018-03-22T22:33:35.57313451Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d","Output":"=== RUN TestNestedWithFailure/d\n"} {"Time":"2018-03-22T22:33:35.573139079Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub"} {"Time":"2018-03-22T22:33:35.573142987Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Output":"=== RUN TestNestedWithFailure/d/sub\n"} {"Time":"2018-03-22T22:33:35.573148409Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure","Output":"--- FAIL: TestNestedWithFailure (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573153694Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a","Output":" --- PASS: TestNestedWithFailure/a (0.00s)\n"} {"Time":"2018-03-22T22:33:35.57315884Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Output":" --- PASS: TestNestedWithFailure/a/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573163606Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.573167691Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a","Elapsed":0} {"Time":"2018-03-22T22:33:35.573171875Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b","Output":" --- PASS: TestNestedWithFailure/b (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573177904Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Output":" --- PASS: TestNestedWithFailure/b/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573182793Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.573188258Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b","Elapsed":0} {"Time":"2018-03-22T22:33:35.57319241Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":" --- FAIL: TestNestedWithFailure/c (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573198842Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":" \tstub_test.go:65: failed\n"} {"Time":"2018-03-22T22:33:35.573203969Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Elapsed":0} {"Time":"2018-03-22T22:33:35.573208084Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d","Output":" --- PASS: TestNestedWithFailure/d (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573212875Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Output":" --- PASS: TestNestedWithFailure/d/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573217378Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.573221928Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d","Elapsed":0} {"Time":"2018-03-22T22:33:35.573225978Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure","Elapsed":0} {"Time":"2018-03-22T22:33:35.573229939Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess"} {"Time":"2018-03-22T22:33:35.573233848Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess","Output":"=== RUN TestNestedSuccess\n"} {"Time":"2018-03-22T22:33:35.573238387Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a"} {"Time":"2018-03-22T22:33:35.573242348Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a","Output":"=== RUN TestNestedSuccess/a\n"} {"Time":"2018-03-22T22:33:35.573246916Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub"} {"Time":"2018-03-22T22:33:35.573250882Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Output":"=== RUN TestNestedSuccess/a/sub\n"} {"Time":"2018-03-22T22:33:35.573255339Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b"} {"Time":"2018-03-22T22:33:35.573260916Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b","Output":"=== RUN TestNestedSuccess/b\n"} {"Time":"2018-03-22T22:33:35.573265382Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub"} {"Time":"2018-03-22T22:33:35.573270764Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Output":"=== RUN TestNestedSuccess/b/sub\n"} {"Time":"2018-03-22T22:33:35.573275249Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c"} {"Time":"2018-03-22T22:33:35.573279117Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c","Output":"=== RUN TestNestedSuccess/c\n"} {"Time":"2018-03-22T22:33:35.5732835Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub"} {"Time":"2018-03-22T22:33:35.573287557Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Output":"=== RUN TestNestedSuccess/c/sub\n"} {"Time":"2018-03-22T22:33:35.573294073Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d"} {"Time":"2018-03-22T22:33:35.573298184Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d","Output":"=== RUN TestNestedSuccess/d\n"} {"Time":"2018-03-22T22:33:35.573302616Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub"} {"Time":"2018-03-22T22:33:35.573306529Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Output":"=== RUN TestNestedSuccess/d/sub\n"} {"Time":"2018-03-22T22:33:35.573312991Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess","Output":"--- PASS: TestNestedSuccess (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573317957Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a","Output":" --- PASS: TestNestedSuccess/a (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573322697Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Output":" --- PASS: TestNestedSuccess/a/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573327335Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.573331368Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a","Elapsed":0} {"Time":"2018-03-22T22:33:35.57333545Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b","Output":" --- PASS: TestNestedSuccess/b (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573340313Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Output":" --- PASS: TestNestedSuccess/b/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573344949Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.573350089Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b","Elapsed":0} {"Time":"2018-03-22T22:33:35.573355433Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c","Output":" --- PASS: TestNestedSuccess/c (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573360328Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Output":" --- PASS: TestNestedSuccess/c/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573364934Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.57336891Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c","Elapsed":0} {"Time":"2018-03-22T22:33:35.573372958Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d","Output":" --- PASS: TestNestedSuccess/d (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573377618Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Output":" --- PASS: TestNestedSuccess/d/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.573382243Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.573388323Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d","Elapsed":0} {"Time":"2018-03-22T22:33:35.573392486Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess","Elapsed":0} {"Time":"2018-03-22T22:33:35.573396392Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout"} {"Time":"2018-03-22T22:33:35.573400243Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"=== RUN TestTimeout\n"} {"Time":"2018-03-22T22:33:35.585072873Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"panic: test timed out after 10ms\n"} {"Time":"2018-03-22T22:33:35.585087307Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\n"} {"Time":"2018-03-22T22:33:35.585093062Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"goroutine 49 [running]:\n"} {"Time":"2018-03-22T22:33:35.58509774Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.(*M).startAlarm.func1()\n"} {"Time":"2018-03-22T22:33:35.58510236Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:1240 +0xfc\n"} {"Time":"2018-03-22T22:33:35.585107624Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"created by time.goFunc\n"} {"Time":"2018-03-22T22:33:35.585112005Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/time/sleep.go:172 +0x44\n"} {"Time":"2018-03-22T22:33:35.585116462Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\n"} {"Time":"2018-03-22T22:33:35.585120789Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"goroutine 1 [chan receive]:\n"} {"Time":"2018-03-22T22:33:35.585127186Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.(*T).Run(0xc4200abb30, 0x530c14, 0xb, 0x5388a8, 0x466d01)\n"} {"Time":"2018-03-22T22:33:35.585131684Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:825 +0x301\n"} {"Time":"2018-03-22T22:33:35.58513606Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.runTests.func1(0xc4200aa000)\n"} {"Time":"2018-03-22T22:33:35.585140375Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:1063 +0x64\n"} {"Time":"2018-03-22T22:33:35.585144736Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.tRunner(0xc4200aa000, 0xc420051df8)\n"} {"Time":"2018-03-22T22:33:35.585149012Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:777 +0xd0\n"} {"Time":"2018-03-22T22:33:35.585155126Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.runTests(0xc42000a060, 0x5db580, 0xe, 0xe, 0x40ef79)\n"} {"Time":"2018-03-22T22:33:35.585159593Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:1061 +0x2c4\n"} {"Time":"2018-03-22T22:33:35.585169431Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.(*M).Run(0xc4200a6000, 0x0)\n"} {"Time":"2018-03-22T22:33:35.585174248Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:978 +0x171\n"} {"Time":"2018-03-22T22:33:35.585180403Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"main.main()\n"} {"Time":"2018-03-22T22:33:35.585186306Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t_testmain.go:68 +0x151\n"} {"Time":"2018-03-22T22:33:35.585194027Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\n"} {"Time":"2018-03-22T22:33:35.58520165Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"goroutine 14 [chan receive]:\n"} {"Time":"2018-03-22T22:33:35.58520628Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.(*T).Parallel(0xc4200aa870)\n"} {"Time":"2018-03-22T22:33:35.585210568Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:697 +0x205\n"} {"Time":"2018-03-22T22:33:35.585215012Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"github.com/gotestyourself/gotestyourself/testjson/internal/stub.TestParallelTheFirst(0xc4200aa870)\n"} {"Time":"2018-03-22T22:33:35.58521955Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/go/src/github.com/gotestyourself/gotestyourself/testjson/internal/stub/stub_test.go:47 +0x2b\n"} {"Time":"2018-03-22T22:33:35.585224016Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.tRunner(0xc4200aa870, 0x538868)\n"} {"Time":"2018-03-22T22:33:35.585228292Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:777 +0xd0\n"} {"Time":"2018-03-22T22:33:35.585232615Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"created by testing.(*T).Run\n"} {"Time":"2018-03-22T22:33:35.585253683Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:824 +0x2e0\n"} {"Time":"2018-03-22T22:33:35.585258654Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\n"} {"Time":"2018-03-22T22:33:35.585262914Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"goroutine 15 [chan receive]:\n"} {"Time":"2018-03-22T22:33:35.585269094Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.(*T).Parallel(0xc4200aa960)\n"} {"Time":"2018-03-22T22:33:35.585273446Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:697 +0x205\n"} {"Time":"2018-03-22T22:33:35.585277772Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"github.com/gotestyourself/gotestyourself/testjson/internal/stub.TestParallelTheSecond(0xc4200aa960)\n"} {"Time":"2018-03-22T22:33:35.585285319Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/go/src/github.com/gotestyourself/gotestyourself/testjson/internal/stub/stub_test.go:52 +0x2b\n"} {"Time":"2018-03-22T22:33:35.585289973Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.tRunner(0xc4200aa960, 0x538870)\n"} {"Time":"2018-03-22T22:33:35.585294287Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:777 +0xd0\n"} {"Time":"2018-03-22T22:33:35.585298589Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"created by testing.(*T).Run\n"} {"Time":"2018-03-22T22:33:35.585302869Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:824 +0x2e0\n"} {"Time":"2018-03-22T22:33:35.585307118Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\n"} {"Time":"2018-03-22T22:33:35.585311295Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"goroutine 16 [chan receive]:\n"} {"Time":"2018-03-22T22:33:35.585316088Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.(*T).Parallel(0xc4200aaa50)\n"} {"Time":"2018-03-22T22:33:35.585321783Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:697 +0x205\n"} {"Time":"2018-03-22T22:33:35.585326192Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"github.com/gotestyourself/gotestyourself/testjson/internal/stub.TestParallelTheThird(0xc4200aaa50)\n"} {"Time":"2018-03-22T22:33:35.585330607Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/go/src/github.com/gotestyourself/gotestyourself/testjson/internal/stub/stub_test.go:57 +0x2b\n"} {"Time":"2018-03-22T22:33:35.585336439Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.tRunner(0xc4200aaa50, 0x538878)\n"} {"Time":"2018-03-22T22:33:35.585340804Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:777 +0xd0\n"} {"Time":"2018-03-22T22:33:35.585345056Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"created by testing.(*T).Run\n"} {"Time":"2018-03-22T22:33:35.585363549Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:824 +0x2e0\n"} {"Time":"2018-03-22T22:33:35.585367984Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\n"} {"Time":"2018-03-22T22:33:35.585372153Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"goroutine 34 [sleep]:\n"} {"Time":"2018-03-22T22:33:35.585376429Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"time.Sleep(0xdf8475800)\n"} {"Time":"2018-03-22T22:33:35.585380808Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/runtime/time.go:102 +0x166\n"} {"Time":"2018-03-22T22:33:35.585388862Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"github.com/gotestyourself/gotestyourself/testjson/internal/stub.TestTimeout(0xc4200abb30)\n"} {"Time":"2018-03-22T22:33:35.585393851Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/go/src/github.com/gotestyourself/gotestyourself/testjson/internal/stub/timeout_test.go:11 +0x30\n"} {"Time":"2018-03-22T22:33:35.585398348Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"testing.tRunner(0xc4200abb30, 0x5388a8)\n"} {"Time":"2018-03-22T22:33:35.585402766Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:777 +0xd0\n"} {"Time":"2018-03-22T22:33:35.585407145Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"created by testing.(*T).Run\n"} {"Time":"2018-03-22T22:33:35.585411483Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"\t/usr/local/go/src/testing/testing.go:824 +0x2e0\n"} {"Time":"2018-03-22T22:33:35.585439794Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Output":"FAIL\tgithub.com/gotestyourself/gotestyourself/testjson/internal/stub\t0.013s\n"} {"Time":"2018-03-22T22:33:35.585447468Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestTimeout","Elapsed":0.013} gotestsum-0.5.0/testjson/testdata/go-test-json.err000066400000000000000000000001731367230725500223060ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/go-test-json.out000066400000000000000000001262201367230725500223270ustar00rootroot00000000000000{"Time":"2018-03-22T22:33:35.147671743Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/badmain","Output":"sometimes main can exit 2\n"} {"Time":"2018-03-22T22:33:35.157399336Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/badmain","Output":"FAIL\tgithub.com/gotestyourself/gotestyourself/testjson/internal/badmain\t0.010s\n"} {"Time":"2018-03-22T22:33:35.157410331Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/badmain","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.167978423Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed"} {"Time":"2018-03-22T22:33:35.167999152Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed","Output":"=== RUN TestPassed\n"} {"Time":"2018-03-22T22:33:35.168007043Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed","Output":"--- PASS: TestPassed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.16801113Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassed","Elapsed":0} {"Time":"2018-03-22T22:33:35.168016095Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog"} {"Time":"2018-03-22T22:33:35.16801913Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Output":"=== RUN TestPassedWithLog\n"} {"Time":"2018-03-22T22:33:35.168023331Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Output":"--- PASS: TestPassedWithLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.16802697Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Output":"\tgood_test.go:15: this is a log\n"} {"Time":"2018-03-22T22:33:35.168030493Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.168033455Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout"} {"Time":"2018-03-22T22:33:35.168038131Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Output":"=== RUN TestPassedWithStdout\n"} {"Time":"2018-03-22T22:33:35.168041338Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Output":"this is a Print\n"} {"Time":"2018-03-22T22:33:35.168044931Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Output":"--- PASS: TestPassedWithStdout (0.00s)\n"} {"Time":"2018-03-22T22:33:35.16804835Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestPassedWithStdout","Elapsed":0} {"Time":"2018-03-22T22:33:35.168051352Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped"} {"Time":"2018-03-22T22:33:35.168054963Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"} {"Time":"2018-03-22T22:33:35.168058556Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168061787Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Output":"\tgood_test.go:23: \n"} {"Time":"2018-03-22T22:33:35.168065243Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkipped","Elapsed":0} {"Time":"2018-03-22T22:33:35.168068535Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog"} {"Time":"2018-03-22T22:33:35.16807635Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Output":"=== RUN TestSkippedWitLog\n"} {"Time":"2018-03-22T22:33:35.168080555Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Output":"--- SKIP: TestSkippedWitLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.16808377Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Output":"\tgood_test.go:27: the skip message\n"} {"Time":"2018-03-22T22:33:35.168087783Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestSkippedWitLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.168090717Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr"} {"Time":"2018-03-22T22:33:35.168093506Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Output":"=== RUN TestWithStderr\n"} {"Time":"2018-03-22T22:33:35.168096587Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Output":"this is stderr\n"} {"Time":"2018-03-22T22:33:35.168100074Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Output":"--- PASS: TestWithStderr (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168103406Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestWithStderr","Elapsed":0} {"Time":"2018-03-22T22:33:35.168106287Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.168109034Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== RUN TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.168112396Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== PAUSE TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.168115302Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.168119592Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.168122468Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== RUN TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.168125847Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== PAUSE TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.16813009Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.16813329Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.168136248Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== RUN TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.16813956Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== PAUSE TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.168142653Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.168147969Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess"} {"Time":"2018-03-22T22:33:35.168150995Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess","Output":"=== RUN TestNestedSuccess\n"} {"Time":"2018-03-22T22:33:35.168155447Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a"} {"Time":"2018-03-22T22:33:35.168158403Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a","Output":"=== RUN TestNestedSuccess/a\n"} {"Time":"2018-03-22T22:33:35.168161668Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub"} {"Time":"2018-03-22T22:33:35.168164766Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Output":"=== RUN TestNestedSuccess/a/sub\n"} {"Time":"2018-03-22T22:33:35.168168123Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b"} {"Time":"2018-03-22T22:33:35.168170964Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b","Output":"=== RUN TestNestedSuccess/b\n"} {"Time":"2018-03-22T22:33:35.168174253Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub"} {"Time":"2018-03-22T22:33:35.168177104Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Output":"=== RUN TestNestedSuccess/b/sub\n"} {"Time":"2018-03-22T22:33:35.168180421Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c"} {"Time":"2018-03-22T22:33:35.168183268Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c","Output":"=== RUN TestNestedSuccess/c\n"} {"Time":"2018-03-22T22:33:35.168186419Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub"} {"Time":"2018-03-22T22:33:35.168189199Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Output":"=== RUN TestNestedSuccess/c/sub\n"} {"Time":"2018-03-22T22:33:35.168192362Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d"} {"Time":"2018-03-22T22:33:35.168196217Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d","Output":"=== RUN TestNestedSuccess/d\n"} {"Time":"2018-03-22T22:33:35.168199392Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub"} {"Time":"2018-03-22T22:33:35.168202549Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Output":"=== RUN TestNestedSuccess/d/sub\n"} {"Time":"2018-03-22T22:33:35.16820637Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess","Output":"--- PASS: TestNestedSuccess (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168210256Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a","Output":" --- PASS: TestNestedSuccess/a (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168213987Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Output":" --- PASS: TestNestedSuccess/a/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168217438Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.168222153Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/a","Elapsed":0} {"Time":"2018-03-22T22:33:35.168225261Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b","Output":" --- PASS: TestNestedSuccess/b (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168228804Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Output":" --- PASS: TestNestedSuccess/b/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168232207Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.16823512Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/b","Elapsed":0} {"Time":"2018-03-22T22:33:35.168238059Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c","Output":" --- PASS: TestNestedSuccess/c (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168241829Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Output":" --- PASS: TestNestedSuccess/c/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168245229Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.168248049Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/c","Elapsed":0} {"Time":"2018-03-22T22:33:35.16825093Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d","Output":" --- PASS: TestNestedSuccess/d (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168254732Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Output":" --- PASS: TestNestedSuccess/d/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168259123Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.168262026Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess/d","Elapsed":0} {"Time":"2018-03-22T22:33:35.16826478Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestNestedSuccess","Elapsed":0} {"Time":"2018-03-22T22:33:35.168267552Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.168270338Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"=== CONT TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.168274591Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.168277422Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"=== CONT TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.168280609Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.168283453Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"=== CONT TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.16828685Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Output":"--- PASS: TestParallelTheThird (0.00s)\n"} {"Time":"2018-03-22T22:33:35.168291927Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheThird","Elapsed":0} {"Time":"2018-03-22T22:33:35.168295301Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Output":"--- PASS: TestParallelTheSecond (0.01s)\n"} {"Time":"2018-03-22T22:33:35.168298716Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheSecond","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.168302304Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Output":"--- PASS: TestParallelTheFirst (0.01s)\n"} {"Time":"2018-03-22T22:33:35.168305326Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Test":"TestParallelTheFirst","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.168308334Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Output":"PASS\n"} {"Time":"2018-03-22T22:33:35.168311492Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Output":"ok \tgithub.com/gotestyourself/gotestyourself/testjson/internal/good\t(cached)\n"} {"Time":"2018-03-22T22:33:35.168316085Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/good","Elapsed":0} {"Time":"2018-03-22T22:33:35.27769148Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed"} {"Time":"2018-03-22T22:33:35.277713073Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed","Output":"=== RUN TestPassed\n"} {"Time":"2018-03-22T22:33:35.277722036Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed","Output":"--- PASS: TestPassed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277726087Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassed","Elapsed":0} {"Time":"2018-03-22T22:33:35.277731052Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog"} {"Time":"2018-03-22T22:33:35.277736017Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Output":"=== RUN TestPassedWithLog\n"} {"Time":"2018-03-22T22:33:35.277740134Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Output":"--- PASS: TestPassedWithLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277743774Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Output":"\tstub_test.go:18: this is a log\n"} {"Time":"2018-03-22T22:33:35.277747736Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.277750942Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout"} {"Time":"2018-03-22T22:33:35.277754002Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"=== RUN TestPassedWithStdout\n"} {"Time":"2018-03-22T22:33:35.277757361Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"this is a Print\n"} {"Time":"2018-03-22T22:33:35.277761297Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Output":"--- PASS: TestPassedWithStdout (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277774779Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestPassedWithStdout","Elapsed":0} {"Time":"2018-03-22T22:33:35.277779002Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped"} {"Time":"2018-03-22T22:33:35.27778211Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Output":"=== RUN TestSkipped\n"} {"Time":"2018-03-22T22:33:35.277788392Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Output":"--- SKIP: TestSkipped (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277792015Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Output":"\tstub_test.go:26: \n"} {"Time":"2018-03-22T22:33:35.277795484Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkipped","Elapsed":0} {"Time":"2018-03-22T22:33:35.2777986Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog"} {"Time":"2018-03-22T22:33:35.277801919Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"=== RUN TestSkippedWitLog\n"} {"Time":"2018-03-22T22:33:35.277805618Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"--- SKIP: TestSkippedWitLog (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277809083Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Output":"\tstub_test.go:30: the skip message\n"} {"Time":"2018-03-22T22:33:35.277812564Z","Action":"skip","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestSkippedWitLog","Elapsed":0} {"Time":"2018-03-22T22:33:35.277815574Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed"} {"Time":"2018-03-22T22:33:35.277818567Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Output":"=== RUN TestFailed\n"} {"Time":"2018-03-22T22:33:35.277822205Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Output":"--- FAIL: TestFailed (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277825477Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Output":"\tstub_test.go:34: this failed\n"} {"Time":"2018-03-22T22:33:35.277828827Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailed","Elapsed":0} {"Time":"2018-03-22T22:33:35.277831837Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr"} {"Time":"2018-03-22T22:33:35.277834764Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Output":"=== RUN TestWithStderr\n"} {"Time":"2018-03-22T22:33:35.27784029Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Output":"this is stderr\n"} {"Time":"2018-03-22T22:33:35.277846645Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Output":"--- PASS: TestWithStderr (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277850255Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestWithStderr","Elapsed":0} {"Time":"2018-03-22T22:33:35.277853355Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr"} {"Time":"2018-03-22T22:33:35.277856266Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"=== RUN TestFailedWithStderr\n"} {"Time":"2018-03-22T22:33:35.277861957Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"this is stderr\n"} {"Time":"2018-03-22T22:33:35.277865909Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"--- FAIL: TestFailedWithStderr (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277869242Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Output":"\tstub_test.go:43: also failed\n"} {"Time":"2018-03-22T22:33:35.277872669Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestFailedWithStderr","Elapsed":0} {"Time":"2018-03-22T22:33:35.27787572Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.277878691Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== RUN TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.277882257Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== PAUSE TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.277885297Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.277888532Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.27789153Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== RUN TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.277896171Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== PAUSE TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.277899578Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.277902801Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.277905738Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== RUN TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.27790952Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== PAUSE TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.277914751Z","Action":"pause","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.277919051Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure"} {"Time":"2018-03-22T22:33:35.277922056Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure","Output":"=== RUN TestNestedWithFailure\n"} {"Time":"2018-03-22T22:33:35.277928623Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a"} {"Time":"2018-03-22T22:33:35.27793184Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a","Output":"=== RUN TestNestedWithFailure/a\n"} {"Time":"2018-03-22T22:33:35.277935348Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub"} {"Time":"2018-03-22T22:33:35.277940328Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Output":"=== RUN TestNestedWithFailure/a/sub\n"} {"Time":"2018-03-22T22:33:35.277944Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b"} {"Time":"2018-03-22T22:33:35.277947323Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b","Output":"=== RUN TestNestedWithFailure/b\n"} {"Time":"2018-03-22T22:33:35.277950698Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub"} {"Time":"2018-03-22T22:33:35.277953634Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Output":"=== RUN TestNestedWithFailure/b/sub\n"} {"Time":"2018-03-22T22:33:35.277958256Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c"} {"Time":"2018-03-22T22:33:35.277961258Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":"=== RUN TestNestedWithFailure/c\n"} {"Time":"2018-03-22T22:33:35.277964663Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d"} {"Time":"2018-03-22T22:33:35.27796762Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d","Output":"=== RUN TestNestedWithFailure/d\n"} {"Time":"2018-03-22T22:33:35.277970966Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub"} {"Time":"2018-03-22T22:33:35.277973904Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Output":"=== RUN TestNestedWithFailure/d/sub\n"} {"Time":"2018-03-22T22:33:35.277977981Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure","Output":"--- FAIL: TestNestedWithFailure (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277982031Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a","Output":" --- PASS: TestNestedWithFailure/a (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277987499Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Output":" --- PASS: TestNestedWithFailure/a/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.277993031Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.277996352Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/a","Elapsed":0} {"Time":"2018-03-22T22:33:35.277999433Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b","Output":" --- PASS: TestNestedWithFailure/b (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278003023Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Output":" --- PASS: TestNestedWithFailure/b/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278006629Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.278009591Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/b","Elapsed":0} {"Time":"2018-03-22T22:33:35.278012611Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":" --- FAIL: TestNestedWithFailure/c (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278021122Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Output":" \tstub_test.go:65: failed\n"} {"Time":"2018-03-22T22:33:35.278025071Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/c","Elapsed":0} {"Time":"2018-03-22T22:33:35.278029338Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d","Output":" --- PASS: TestNestedWithFailure/d (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278033116Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Output":" --- PASS: TestNestedWithFailure/d/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.27803655Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.278039619Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure/d","Elapsed":0} {"Time":"2018-03-22T22:33:35.278043645Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedWithFailure","Elapsed":0} {"Time":"2018-03-22T22:33:35.278046593Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess"} {"Time":"2018-03-22T22:33:35.27804949Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess","Output":"=== RUN TestNestedSuccess\n"} {"Time":"2018-03-22T22:33:35.278052871Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a"} {"Time":"2018-03-22T22:33:35.278055822Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a","Output":"=== RUN TestNestedSuccess/a\n"} {"Time":"2018-03-22T22:33:35.278059163Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub"} {"Time":"2018-03-22T22:33:35.278062104Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Output":"=== RUN TestNestedSuccess/a/sub\n"} {"Time":"2018-03-22T22:33:35.278065419Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b"} {"Time":"2018-03-22T22:33:35.278069432Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b","Output":"=== RUN TestNestedSuccess/b\n"} {"Time":"2018-03-22T22:33:35.278072807Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub"} {"Time":"2018-03-22T22:33:35.278075775Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Output":"=== RUN TestNestedSuccess/b/sub\n"} {"Time":"2018-03-22T22:33:35.278079066Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c"} {"Time":"2018-03-22T22:33:35.278082296Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c","Output":"=== RUN TestNestedSuccess/c\n"} {"Time":"2018-03-22T22:33:35.278085727Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub"} {"Time":"2018-03-22T22:33:35.278088658Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Output":"=== RUN TestNestedSuccess/c/sub\n"} {"Time":"2018-03-22T22:33:35.278093435Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d"} {"Time":"2018-03-22T22:33:35.278096524Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d","Output":"=== RUN TestNestedSuccess/d\n"} {"Time":"2018-03-22T22:33:35.278099817Z","Action":"run","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub"} {"Time":"2018-03-22T22:33:35.278102761Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Output":"=== RUN TestNestedSuccess/d/sub\n"} {"Time":"2018-03-22T22:33:35.278106321Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess","Output":"--- PASS: TestNestedSuccess (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278109895Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a","Output":" --- PASS: TestNestedSuccess/a (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278113462Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Output":" --- PASS: TestNestedSuccess/a/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278116975Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.278119993Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/a","Elapsed":0} {"Time":"2018-03-22T22:33:35.278123093Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b","Output":" --- PASS: TestNestedSuccess/b (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278126668Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Output":" --- PASS: TestNestedSuccess/b/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278130111Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.278133081Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/b","Elapsed":0} {"Time":"2018-03-22T22:33:35.278136107Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c","Output":" --- PASS: TestNestedSuccess/c (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278139636Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Output":" --- PASS: TestNestedSuccess/c/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278143067Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.278146068Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/c","Elapsed":0} {"Time":"2018-03-22T22:33:35.278149067Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d","Output":" --- PASS: TestNestedSuccess/d (0.00s)\n"} {"Time":"2018-03-22T22:33:35.27815262Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Output":" --- PASS: TestNestedSuccess/d/sub (0.00s)\n"} {"Time":"2018-03-22T22:33:35.278157231Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d/sub","Elapsed":0} {"Time":"2018-03-22T22:33:35.278161659Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess/d","Elapsed":0} {"Time":"2018-03-22T22:33:35.278164702Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestNestedSuccess","Elapsed":0} {"Time":"2018-03-22T22:33:35.278168676Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst"} {"Time":"2018-03-22T22:33:35.278171618Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"=== CONT TestParallelTheFirst\n"} {"Time":"2018-03-22T22:33:35.278176868Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird"} {"Time":"2018-03-22T22:33:35.278180956Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"=== CONT TestParallelTheThird\n"} {"Time":"2018-03-22T22:33:35.278184323Z","Action":"cont","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond"} {"Time":"2018-03-22T22:33:35.278187288Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"=== CONT TestParallelTheSecond\n"} {"Time":"2018-03-22T22:33:35.280066527Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Output":"--- PASS: TestParallelTheThird (0.00s)\n"} {"Time":"2018-03-22T22:33:35.284050163Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheThird","Elapsed":0} {"Time":"2018-03-22T22:33:35.284061418Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Output":"--- PASS: TestParallelTheSecond (0.01s)\n"} {"Time":"2018-03-22T22:33:35.287976883Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheSecond","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.28799118Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Output":"--- PASS: TestParallelTheFirst (0.01s)\n"} {"Time":"2018-03-22T22:33:35.287999208Z","Action":"pass","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Test":"TestParallelTheFirst","Elapsed":0.01} {"Time":"2018-03-22T22:33:35.288005158Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Output":"FAIL\n"} {"Time":"2018-03-22T22:33:35.288154141Z","Action":"output","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Output":"FAIL\tgithub.com/gotestyourself/gotestyourself/testjson/internal/stub\t0.011s\n"} {"Time":"2018-03-22T22:33:35.288167612Z","Action":"fail","Package":"github.com/gotestyourself/gotestyourself/testjson/internal/stub","Elapsed":0.011} gotestsum-0.5.0/testjson/testdata/go-test-quiet-format.err000066400000000000000000000001731367230725500237520ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/go-test-quiet-format.out000066400000000000000000000002531367230725500237700ustar00rootroot00000000000000this is a Print --- FAIL: TestFailed (0.00s) stub_test.go:33: this failed this is stderr FAIL FAIL github.com/gotestyourself/gotestyourself/testjson/internal/stub 0.011s gotestsum-0.5.0/testjson/testdata/go-test-quiet.err000066400000000000000000000001731367230725500224640ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/go-test-quiet.out000066400000000000000000000010511367230725500224770ustar00rootroot00000000000000sometimes main can exit 2 FAIL github.com/gotestyourself/gotestyourself/testjson/internal/badmain 0.000s ok github.com/gotestyourself/gotestyourself/testjson/internal/good (cached) this is a Print --- FAIL: TestFailed (0.00s) stub_test.go:34: this failed this is stderr this is stderr --- FAIL: TestFailedWithStderr (0.00s) stub_test.go:43: also failed --- FAIL: TestNestedWithFailure (0.00s) --- FAIL: TestNestedWithFailure/c (0.00s) stub_test.go:65: failed FAIL FAIL github.com/gotestyourself/gotestyourself/testjson/internal/stub 0.011s gotestsum-0.5.0/testjson/testdata/go-test-verbose.err000066400000000000000000000001731367230725500230020ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/go-test-verbose.out000066400000000000000000000102771367230725500230270ustar00rootroot00000000000000sometimes main can exit 2 FAIL github.com/gotestyourself/gotestyourself/testjson/internal/badmain 0.010s === RUN TestPassed --- PASS: TestPassed (0.00s) === RUN TestPassedWithLog --- PASS: TestPassedWithLog (0.00s) good_test.go:15: this is a log === RUN TestPassedWithStdout this is a Print --- PASS: TestPassedWithStdout (0.00s) === RUN TestSkipped --- SKIP: TestSkipped (0.00s) good_test.go:23: === RUN TestSkippedWitLog --- SKIP: TestSkippedWitLog (0.00s) good_test.go:27: the skip message === RUN TestWithStderr this is stderr --- PASS: TestWithStderr (0.00s) === RUN TestParallelTheFirst === PAUSE TestParallelTheFirst === RUN TestParallelTheSecond === PAUSE TestParallelTheSecond === RUN TestParallelTheThird === PAUSE TestParallelTheThird === RUN TestNestedSuccess === RUN TestNestedSuccess/a === RUN TestNestedSuccess/a/sub === RUN TestNestedSuccess/b === RUN TestNestedSuccess/b/sub === RUN TestNestedSuccess/c === RUN TestNestedSuccess/c/sub === RUN TestNestedSuccess/d === RUN TestNestedSuccess/d/sub --- PASS: TestNestedSuccess (0.00s) --- PASS: TestNestedSuccess/a (0.00s) --- PASS: TestNestedSuccess/a/sub (0.00s) --- PASS: TestNestedSuccess/b (0.00s) --- PASS: TestNestedSuccess/b/sub (0.00s) --- PASS: TestNestedSuccess/c (0.00s) --- PASS: TestNestedSuccess/c/sub (0.00s) --- PASS: TestNestedSuccess/d (0.00s) --- PASS: TestNestedSuccess/d/sub (0.00s) === CONT TestParallelTheFirst === CONT TestParallelTheThird === CONT TestParallelTheSecond --- PASS: TestParallelTheThird (0.00s) --- PASS: TestParallelTheSecond (0.01s) --- PASS: TestParallelTheFirst (0.01s) PASS ok github.com/gotestyourself/gotestyourself/testjson/internal/good (cached) === RUN TestPassed --- PASS: TestPassed (0.00s) === RUN TestPassedWithLog --- PASS: TestPassedWithLog (0.00s) stub_test.go:18: this is a log === RUN TestPassedWithStdout this is a Print --- PASS: TestPassedWithStdout (0.00s) === RUN TestSkipped --- SKIP: TestSkipped (0.00s) stub_test.go:26: === RUN TestSkippedWitLog --- SKIP: TestSkippedWitLog (0.00s) stub_test.go:30: the skip message === RUN TestFailed --- FAIL: TestFailed (0.00s) stub_test.go:34: this failed === RUN TestWithStderr this is stderr --- PASS: TestWithStderr (0.00s) === RUN TestFailedWithStderr this is stderr --- FAIL: TestFailedWithStderr (0.00s) stub_test.go:43: also failed === RUN TestParallelTheFirst === PAUSE TestParallelTheFirst === RUN TestParallelTheSecond === PAUSE TestParallelTheSecond === RUN TestParallelTheThird === PAUSE TestParallelTheThird === RUN TestNestedWithFailure === RUN TestNestedWithFailure/a === RUN TestNestedWithFailure/a/sub === RUN TestNestedWithFailure/b === RUN TestNestedWithFailure/b/sub === RUN TestNestedWithFailure/c === RUN TestNestedWithFailure/d === RUN TestNestedWithFailure/d/sub --- FAIL: TestNestedWithFailure (0.00s) --- PASS: TestNestedWithFailure/a (0.00s) --- PASS: TestNestedWithFailure/a/sub (0.00s) --- PASS: TestNestedWithFailure/b (0.00s) --- PASS: TestNestedWithFailure/b/sub (0.00s) --- FAIL: TestNestedWithFailure/c (0.00s) stub_test.go:65: failed --- PASS: TestNestedWithFailure/d (0.00s) --- PASS: TestNestedWithFailure/d/sub (0.00s) === RUN TestNestedSuccess === RUN TestNestedSuccess/a === RUN TestNestedSuccess/a/sub === RUN TestNestedSuccess/b === RUN TestNestedSuccess/b/sub === RUN TestNestedSuccess/c === RUN TestNestedSuccess/c/sub === RUN TestNestedSuccess/d === RUN TestNestedSuccess/d/sub --- PASS: TestNestedSuccess (0.00s) --- PASS: TestNestedSuccess/a (0.00s) --- PASS: TestNestedSuccess/a/sub (0.00s) --- PASS: TestNestedSuccess/b (0.00s) --- PASS: TestNestedSuccess/b/sub (0.00s) --- PASS: TestNestedSuccess/c (0.00s) --- PASS: TestNestedSuccess/c/sub (0.00s) --- PASS: TestNestedSuccess/d (0.00s) --- PASS: TestNestedSuccess/d/sub (0.00s) === CONT TestParallelTheFirst === CONT TestParallelTheThird === CONT TestParallelTheSecond --- PASS: TestParallelTheThird (0.00s) --- PASS: TestParallelTheSecond (0.01s) --- PASS: TestParallelTheFirst (0.01s) FAIL FAIL github.com/gotestyourself/gotestyourself/testjson/internal/stub 0.011s gotestsum-0.5.0/testjson/testdata/short-format-coverage.err000066400000000000000000000001511367230725500241670ustar00rootroot00000000000000# gotest.tools/gotestsum/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/short-format-coverage.out000066400000000000000000000003071367230725500242110ustar00rootroot00000000000000✖ gotestsum/testjson/internal/badmain (1ms) ✓ gotestsum/testjson/internal/good (12ms) (coverage: 0.0% of statements) ✖ gotestsum/testjson/internal/stub (11ms) (coverage: 0.0% of statements) gotestsum-0.5.0/testjson/testdata/short-format.err000066400000000000000000000001731367230725500224020ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/short-format.out000066400000000000000000000001561367230725500224220ustar00rootroot00000000000000✖ testjson/internal/badmain (10ms) ✓ testjson/internal/good (cached) ✖ testjson/internal/stub (11ms) gotestsum-0.5.0/testjson/testdata/short-verbose-format.err000066400000000000000000000001731367230725500240450ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/short-verbose-format.out000066400000000000000000000055121367230725500240660ustar00rootroot00000000000000sometimes main can exit 2 FAIL testjson/internal/badmain PASS testjson/internal/good.TestPassed (0.00s) PASS testjson/internal/good.TestPassedWithLog (0.00s) PASS testjson/internal/good.TestPassedWithStdout (0.00s) PASS testjson/internal/good.TestWithStderr (0.00s) PASS testjson/internal/good.TestNestedSuccess/a/sub (0.00s) PASS testjson/internal/good.TestNestedSuccess/a (0.00s) PASS testjson/internal/good.TestNestedSuccess/b/sub (0.00s) PASS testjson/internal/good.TestNestedSuccess/b (0.00s) PASS testjson/internal/good.TestNestedSuccess/c/sub (0.00s) PASS testjson/internal/good.TestNestedSuccess/c (0.00s) PASS testjson/internal/good.TestNestedSuccess/d/sub (0.00s) PASS testjson/internal/good.TestNestedSuccess/d (0.00s) PASS testjson/internal/good.TestNestedSuccess (0.00s) PASS testjson/internal/good.TestParallelTheThird (0.00s) PASS testjson/internal/good.TestParallelTheSecond (0.01s) PASS testjson/internal/good.TestParallelTheFirst (0.01s) PASS testjson/internal/good (cached) PASS testjson/internal/stub.TestPassed (0.00s) PASS testjson/internal/stub.TestPassedWithLog (0.00s) PASS testjson/internal/stub.TestPassedWithStdout (0.00s) === RUN TestFailed --- FAIL: TestFailed (0.00s) stub_test.go:34: this failed FAIL testjson/internal/stub.TestFailed (0.00s) PASS testjson/internal/stub.TestWithStderr (0.00s) === RUN TestFailedWithStderr this is stderr --- FAIL: TestFailedWithStderr (0.00s) stub_test.go:43: also failed FAIL testjson/internal/stub.TestFailedWithStderr (0.00s) PASS testjson/internal/stub.TestNestedWithFailure/a/sub (0.00s) PASS testjson/internal/stub.TestNestedWithFailure/a (0.00s) PASS testjson/internal/stub.TestNestedWithFailure/b/sub (0.00s) PASS testjson/internal/stub.TestNestedWithFailure/b (0.00s) === RUN TestNestedWithFailure/c --- FAIL: TestNestedWithFailure/c (0.00s) stub_test.go:65: failed FAIL testjson/internal/stub.TestNestedWithFailure/c (0.00s) PASS testjson/internal/stub.TestNestedWithFailure/d/sub (0.00s) PASS testjson/internal/stub.TestNestedWithFailure/d (0.00s) === RUN TestNestedWithFailure --- FAIL: TestNestedWithFailure (0.00s) FAIL testjson/internal/stub.TestNestedWithFailure (0.00s) PASS testjson/internal/stub.TestNestedSuccess/a/sub (0.00s) PASS testjson/internal/stub.TestNestedSuccess/a (0.00s) PASS testjson/internal/stub.TestNestedSuccess/b/sub (0.00s) PASS testjson/internal/stub.TestNestedSuccess/b (0.00s) PASS testjson/internal/stub.TestNestedSuccess/c/sub (0.00s) PASS testjson/internal/stub.TestNestedSuccess/c (0.00s) PASS testjson/internal/stub.TestNestedSuccess/d/sub (0.00s) PASS testjson/internal/stub.TestNestedSuccess/d (0.00s) PASS testjson/internal/stub.TestNestedSuccess (0.00s) PASS testjson/internal/stub.TestParallelTheThird (0.00s) PASS testjson/internal/stub.TestParallelTheSecond (0.01s) PASS testjson/internal/stub.TestParallelTheFirst (0.01s) FAIL testjson/internal/stub gotestsum-0.5.0/testjson/testdata/standard-quiet-format-coverage.err000066400000000000000000000001511367230725500257550ustar00rootroot00000000000000# gotest.tools/gotestsum/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/standard-quiet-format-coverage.out000066400000000000000000000003551367230725500260020ustar00rootroot00000000000000sometimes main can exit 2 FAIL gotest.tools/gotestsum/testjson/internal/badmain 0.001s ok gotest.tools/gotestsum/testjson/internal/good 0.011s coverage: 0.0% of statements FAIL FAIL gotest.tools/gotestsum/testjson/internal/stub 0.011s gotestsum-0.5.0/testjson/testdata/standard-quiet-format.err000066400000000000000000000001731367230725500241700ustar00rootroot00000000000000# github.com/gotestyourself/gotestyourself/testjson/internal/broken internal/broken/broken.go:5:21: undefined: somepackage gotestsum-0.5.0/testjson/testdata/standard-quiet-format.out000066400000000000000000000004101367230725500242010ustar00rootroot00000000000000sometimes main can exit 2 FAIL github.com/gotestyourself/gotestyourself/testjson/internal/badmain 0.010s ok github.com/gotestyourself/gotestyourself/testjson/internal/good (cached) FAIL FAIL github.com/gotestyourself/gotestyourself/testjson/internal/stub 0.011s gotestsum-0.5.0/testjson/testdata/summary-misattributed-output000066400000000000000000000015071367230725500251010ustar00rootroot00000000000000 === Failed === FAIL: TestOutputWithSubtest (0.00s) --- PASS: TestOutputWithSubtest/sub_test (0.00s) foo_test.go:9: output from sub test foo_test.go:11: more output from sub test foo_test.go:16: more output from sub test --- PASS: TestOutputWithSubtest/sub_test/sub2 (0.00s) foo_test.go:14: output from sub2 test foo_test.go:22: output from root test foo_test.go:27: output from root test --- PASS: TestOutputWithSubtest/sub_test2 (0.00s) foo_test.go:21: output from sub test2 foo_test.go:23: more output from sub test2 foo_test.go:28: more output from sub test2 --- PASS: TestOutputWithSubtest/sub_test2/sub2 (0.00s) foo_test.go:26: output from sub2 test foo_test.go:32: output after sub test DONE 5 tests, 1 failure in 0.000s gotestsum-0.5.0/testjson/testdata/summary-missing-test-fail-event000066400000000000000000000024001367230725500253320ustar00rootroot00000000000000 === Failed === FAIL: gotest.tools/v3/poll TestWaitOn_WithCompare (unknown) panic: runtime error: index out of range [1] with length 1 goroutine 7 [running]: gotest.tools/v3/internal/assert.ArgsFromComparisonCall(0xc0000552a0, 0x1, 0x1, 0x1, 0x0, 0x0) /home/daniel/pers/code/gotest.tools/internal/assert/result.go:102 +0x9f gotest.tools/v3/internal/assert.runComparison(0x6bcb80, 0xc00000e180, 0x67dee8, 0xc00007a9f0, 0x0, 0x0, 0x0, 0x7f7f4fb6d108) /home/daniel/pers/code/gotest.tools/internal/assert/result.go:34 +0x2b1 gotest.tools/v3/internal/assert.Eval(0x6bcb80, 0xc00000e180, 0x67dee8, 0x627660, 0xc00007a9f0, 0x0, 0x0, 0x0, 0x642c60) /home/daniel/pers/code/gotest.tools/internal/assert/assert.go:56 +0x2e4 gotest.tools/v3/poll.Compare(0xc00007a9f0, 0x6b74a0, 0x618a60) /home/daniel/pers/code/gotest.tools/poll/poll.go:151 +0x81 gotest.tools/v3/poll.TestWaitOn_WithCompare.func1(0x6be4c0, 0xc00016c240, 0xc00016c240, 0x6be4c0) /home/daniel/pers/code/gotest.tools/poll/poll_test.go:81 +0x58 gotest.tools/v3/poll.WaitOn.func1(0xc00001e3c0, 0x67df50, 0x6c1960, 0xc00016c240) /home/daniel/pers/code/gotest.tools/poll/poll.go:125 +0x62 created by gotest.tools/v3/poll.WaitOn /home/daniel/pers/code/gotest.tools/poll/poll.go:124 +0x16f DONE 1 tests, 1 failure in 0.000s gotestsum-0.5.0/testjson/testdata/summary-root-test-has-subtest-failures000066400000000000000000000024551367230725500266760ustar00rootroot00000000000000 === Skipped === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/good TestSkipped (0.00s) good_test.go:23: === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/good TestSkippedWitLog (0.00s) good_test.go:27: the skip message === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestSkipped (0.00s) stub_test.go:26: === SKIP: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestSkippedWitLog (0.00s) stub_test.go:30: the skip message === Failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/badmain (0.00s) sometimes main can exit 2 FAIL github.com/gotestyourself/gotestyourself/testjson/internal/badmain 0.010s === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestFailed (0.00s) stub_test.go:34: this failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestFailedWithStderr (0.00s) this is stderr stub_test.go:43: also failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestNestedWithFailure/c (0.00s) --- FAIL: TestNestedWithFailure/c (0.00s) stub_test.go:65: failed === FAIL: github.com/gotestyourself/gotestyourself/testjson/internal/stub TestNestedWithFailure (0.00s) DONE 46 tests, 4 skipped, 5 failures in 0.000s