Created a issue based on our discussion:
https://github.com/golang/go/issues/65653

On Saturday, February 10, 2024 at 10:49:58 PM UTC+1 Martin wrote:

> 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/6cf11254-ef82-4642-92ba-587dca5bbc63n%40googlegroups.com.

Reply via email to