Hey Aldemar and Thomas,

thanks for your hints.

>  While trying to upgrade a go package to 1.22.0 today, I ran into this 
same issue in my coverage step. From testing different combinations of 
options for `go test`, it seems that the 'no such file or directory' errors 
and resulting non-zero exit code occur when go test processes a 
folder/package that isn't included in the -coverpkg list- e.g. in your 
case, any package that isn't part of ./internal. When I set -coverpkg equal 
to the entire list of packages in the project, the error goes away.

You are right, if I adopt your command, the errors go away.

There seem several issues with the new code coverage design, see
https://github.com/golang/go/issues/65570
https://github.com/golang/go/issues/65636

In both issues its addressed, that with
$ GOEXPERIMENT=nocoverageredesign go test -v ./... 
-coverprofile=coverage.out -coverpkg=./internal/... -covermode count

The old behaviour is used and the error is gone as well.

I assume the root cause is related to the both issues linked above, but 
will create a new issue anyway.
I will include your findings as well.

On Thursday, February 8, 2024 at 11:14:58 PM UTC+1 Thomas McNulty wrote:

> While trying to upgrade a go package to 1.22.0 today, I ran into this same 
> issue in my coverage step. From testing different combinations of options 
> for `go test`, it seems that the 'no such file or directory' errors and 
> resulting non-zero exit code occur when go test processes a folder/package 
> that isn't included in the -coverpkg list- e.g. in your case, any package 
> that isn't part of ./internal. When I set -coverpkg equal to the entire 
> list of packages in the project, the error goes away.
>
> Running with some packages (in this case, mocks) excluded:
>
> % go version
> go version go1.22.0 darwin/arm64
> % CVPKG=$(go list ./... | grep -v mocks | tr '\n' ',')
> % go test -coverpkg=${CVPKG} -coverprofile=coverage.out -covermode=count 
>  ./...
>   ... (tests passing)
> github.com/<org>/<repo>/internal/mocks/a/b: open 
> /var/folders/c4/kbr99g196216gsv36c94cp840000gn/T/go-build466145861/b849/covmeta.3a394ea9611306b457bfb2f5b2169adffc13123f3b07d667fd86b58eac717920:
>  
> no such file or directory
> github.com/<org>/<repo>/internal/mocks/c: open 
> /var/folders/c4/kbr99g196216gsv36c94cp840000gn/T/go-build466145861/b851/covmeta.5fc2c6ff11ae04da5c2cdbbb4c9e9e64d515086b2a7a7f5660d5dc409cdf5724:
>  
> no such file or directory
> github.com/<org>/<repo>/internal/mocks/e/f: open 
> /var/folders/c4/kbr99g196216gsv36c94cp840000gn/T/go-build466145861/b853/covmeta.2405ba52a1121a0f4a20da157347d9217eff95f8d18b9ae656cf0414aefe8221:
>  
> no such file or directory
>   ... (more tests passing)
> % echo $?                                                                 
>      
> 1
>
>
> Vs. running with no packages excluded:
>
> % go version
> go version go1.22.0 darwin/arm64
> % CVPKG=$(go list ./... | tr '\n' ',')
> % go test -coverpkg=${CVPKG} -coverprofile=coverage.out -covermode=count 
> ./...
> .... (all tests passing)
> % echo $?
> 0
> On Thursday, February 8, 2024 at 2:41:18 PM UTC-5 Martin Schallnahs wrote:
>
>> Hey Brian,
>>
>> dont get me wrong!
>>
>> My usual setup is Continuous Integration Pipeline running in Linux VMs 
>> which, in case of my golang projects, start fresh golang docker container 
>> images from DockerHub.
>> In case of this problem I used golang:1.22.0-alpine3.19 and golang:1.22.0 
>> (debian basd).
>> For both I have the problem I describe.
>> I just wanted to show, that its not a Docker problem and used my local 
>> Windows machine do prove that.
>>
>> I grabbed my Macbook Pro (Intel), installed freshly Golang 1.22.0 and run 
>> the mentioned go test command on the reproducer, and for me here the 
>> problem also gets triggered.
>> As you explained I use the corrected reproducer, with the Test not 
>> failing, and have "go 1.22.0" in the go.mod.
>>
>>
>> $ go version
>> go version go1.22.0 darwin/amd64
>>
>> $ go test -v ./... -coverprofile=coverage.out -coverpkg=./internal/... 
>> -covermode count
>> example.com/m: open 
>> /var/folders/dm/k73ydgtx15l7dzwc3qk_wmhc0000gn/T/go-build3097649140/b002/covmeta.f6e4431d5ec1fd71f02b3ce4e56eb691a86525173d917007425576a7d9db7c72:
>>  
>> no such file or directory
>>
>> === RUN TestHelloer
>> --- PASS: TestHelloer (0.00s)
>> PASS
>> coverage: 100.0% of statements in ./internal/...
>> ok example.com/m/internal 0.261s coverage: 100.0% of statements in 
>> ./internal/…
>>
>>
>> Bit confusing, that it works for you though.
>> On Thursday, February 8, 2024 at 6:11:15 PM UTC+1 Brian Candler wrote:
>>
>>> $ go test -v ./... -coverprofile=coverage.out -coverpkg=./internal/... 
>>> -covermode count || echo "flaky:$?"
>>> example.com/m: open 
>>> /tmp/go-build2233205084/b002/covmeta.f6e4431d5ec1fd71f02b3ce4e56eb691a86525173d917007425576a7d9db7c72:
>>>  
>>> no such file or directory
>>>
>>> C:\dev\git\golang-test-cover>go test -v ./... -coverprofile=coverage.out 
>>> -coverpkg=./internal/... -covermode count
>>> example.com/m: open 
>>> C:\Users\A1524415\AppData\Local\Temp\go-build2423189316\b002\covmeta.f6e4431d5ec1fd71f02b3ce4e56eb691a86525173d917007425576a7d9db7c72:
>>>  
>>> The system cannot find the file specified.
>>>
>>> Those look like the underlying errors causing the exit code 1. But it 
>>> works fine for me under both Linux and macOS, as long as I have "go 1.22.0" 
>>> in go.mod. Maybe someone who knows more about Windows can help?
>>>
>>> On Thursday 8 February 2024 at 17:03:18 UTC Martin Schallnahs wrote:
>>>
>>>> Hi Brian,
>>>>
>>>> thanks for checking out, yes that I wanted also to write you.
>>>> We need it currently in our CI as some dependency scanner tool does not 
>>>> work with the "go X.Y.Z." syntax, but I tried, and for my problem it did 
>>>> not was the cause.
>>>>
>>>>
>>>> > If a test fails, I would expect it to terminate with an error (exit 
>>>> code 1 in this case).
>>>>
>>>> See my second mail, the test case should not fail, it was kinda a typo 
>>>> (tried to shorten the reproducer to much in my first mail).
>>>>
>>>> > If I run your reproducer locally (not in Docker) with the modified 
>>>> TestHelloer, it works fine(*) and gives me an exit code of 0
>>>>
>>>> Yes, when I run it with golang 1.21.7 it works fine as well, as my 
>>>> problem statement is about golang 1.22.0.
>>>>
>>>> > Therefore, if your problem only occurs when using Docker, then you 
>>>> should provide a docker-based reproducer (including the Dockerfile)
>>>>
>>>> Happens locally as well. And in my original setup it was using a fresh 
>>>> docker container from golang (in an CI/GitLab pipeline) and did this:
>>>>
>>>> $ go test -v ./... -coverprofile=coverage.out -coverpkg=./internal/... 
>>>> -covermode count || echo "flaky:$?"
>>>> example.com/m: open 
>>>> /tmp/go-build2233205084/b002/covmeta.f6e4431d5ec1fd71f02b3ce4e56eb691a86525173d917007425576a7d9db7c72:
>>>>  
>>>> no such file or directory
>>>>
>>>> === RUN   TestHelloer
>>>> --- PASS: TestHelloer (0.00s)
>>>> PASS
>>>> coverage: 100.0% of statements in ./internal/...
>>>> ok   example.com/m/internal 0.004s coverage: 100.0% of statements in 
>>>> ./internal/...
>>>> flaky:1
>>>> $ go tool cover -html=coverage.out -o coverage.html
>>>> $ go tool cover -func=coverage.out
>>>> example.com/m/internal/helloer.go:3: Helloer 100.0%
>>>> total: (statements) 100.0%
>>>>
>>>>
>>>> But I just tried it locally (Windows) and there it happens as well:
>>>>
>>>> C:\dev\git\golang-test-cover>go test -v ./... 
>>>> -coverprofile=coverage.out -coverpkg=./internal/... -covermode count
>>>> example.com/m: open 
>>>> C:\Users\A1524415\AppData\Local\Temp\go-build2423189316\b002\covmeta.f6e4431d5ec1fd71f02b3ce4e56eb691a86525173d917007425576a7d9db7c72:
>>>>  
>>>> The system cannot find the file specified.
>>>>
>>>> === RUN   TestHelloer
>>>> --- PASS: TestHelloer (0.00s)
>>>> PASS
>>>> coverage: 100.0% of statements in ./internal/...
>>>> ok      example.com/m/internal  15.260s coverage: 100.0% of statements 
>>>> in ./internal/...
>>>>
>>>>
>>>> So for now I checked it on:
>>>> - windows
>>>> - debian (via docker container)
>>>> - alpine (via docker container)
>>>>
>>>> All with 1.22.0.
>>>>
>>>> >  since you say that the coverage file is created, and presumably you 
>>>> would have noticed the "toolchain not available" error message. In any 
>>>> case, you're using a base image with go 1.22.0.
>>>>
>>>> Exactly.
>>>> As seen in the output above, further commands (go tool cover) using the 
>>>> coverage.out work fine.
>>>>
>>>> On Thursday 8 February 2024 at 10:46:44 UTC+1 Brian Candler wrote:
>>>>
>>>>> I found the solution to the "toolchain not available" problem: put "go 
>>>>> 1.22.0" instead of "go 1.22" in go.mod. Clues picked up from #62278 
>>>>> <https://github.com/golang/go/issues/62278>.
>>>>>
>>>>> It's confusing for people who've been using go for a while though, 
>>>>> when go.mod used to contain "go X.Y" and it was invalid to put "go 
>>>>> X.Y.Z". 
>>>>> Now that appears to have swapped around 
>>>>> <https://github.com/golang/go/issues/62278#issuecomment-1698829945>.
>>>>>
>>>>> On Thursday 8 February 2024 at 08:30:25 UTC Brian Candler wrote:
>>>>>
>>>>>> Is it a bug or exepected behaviour?
>>>>>>
>>>>>>
>>>>>> If a test fails, I would expect it to terminate with an error (exit 
>>>>>> code 1 in this case).
>>>>>>
>>>>>> If I run your reproducer locally (not in Docker) with the modified 
>>>>>> TestHelloer, it works fine(*) and gives me an exit code of 0:
>>>>>>
>>>>>> % go test -v ./... -coverprofile=coverage.out 
>>>>>> -coverpkg=./internal/... -covermode count
>>>>>> ?   example.com/m [no test files]
>>>>>> === RUN   TestHelloer
>>>>>> --- PASS: TestHelloer (0.00s)
>>>>>> PASS
>>>>>>
>>>>>> coverage: 100.0% of statements in ./internal/...
>>>>>> ok   example.com/m/internal 0.135s coverage: 100.0% of statements in 
>>>>>> ./internal/...
>>>>>> % echo $?
>>>>>> 0
>>>>>>
>>>>>> Therefore, if your problem only occurs when using Docker, then you 
>>>>>> should provide a docker-based reproducer (including the Dockerfile)
>>>>>>
>>>>>> (*) However, I had to change the go.mod file to say version 1.21.  If 
>>>>>> it says 1.22, I get an error.
>>>>>>
>>>>>> Under Linux (go1.21.7):
>>>>>>
>>>>>> $ go test -v ./... -coverprofile=coverage.out 
>>>>>> -coverpkg=./internal/... -covermode count
>>>>>> go: downloading go1.22 (linux/amd64)
>>>>>> go: download go1.22 for linux/amd64: toolchain not available
>>>>>>
>>>>>> Under macOS (go1.21.6):
>>>>>>
>>>>>> % go test -v ./... -coverprofile=coverage.out 
>>>>>> -coverpkg=./internal/... -covermode count
>>>>>> go: downloading go1.22 (darwin/arm64)
>>>>>> go: download go1.22 for darwin/arm64: toolchain not available
>>>>>>
>>>>>> I don't *think* this is the same problem as you're seeing, since you 
>>>>>> say that the coverage file is created, and presumably you would have 
>>>>>> noticed the "toolchain not available" error message. In any case, you're 
>>>>>> using a base image with go 1.22.0.
>>>>>>
>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/7e946b3d-3529-489f-bc33-4ba7650723d8n%40googlegroups.com.

Reply via email to