Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test files cannot contain a tests variable #1084

Open
thehowl opened this issue Aug 30, 2023 · 0 comments
Open

test files cannot contain a tests variable #1084

thehowl opened this issue Aug 30, 2023 · 0 comments
Labels
🐞 bug Something isn't working 📦 🤖 gnovm Issues or PRs gnovm related

Comments

@thehowl
Copy link
Member

thehowl commented Aug 30, 2023

I don't know if the issue is as specific like the title, but here is a minimal example:

package xx

import (
        "testing"
)

type pair [2]uint64

var tests = []pair{
        {
                uint64(1),
                uint64(11),
        },
}

func TestHello(t *testing.T) {
        for _, p := range tests {
                t.Log(p)
        }
}
$ gno test -verbose .
panic: runtime error: invalid memory address or nil pointer dereference [recovered]
        panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x38 pc=0x9f066e]

goroutine 1 [running]:
github.com/gnolang/gno/gnovm/pkg/gnolang.predefineNow.func1()
        /home/howl/oc/gno/gnovm/pkg/gnolang/preprocess.go:2851 +0x19c
panic({0xc29400, 0x142d9d0})
        /usr/lib/go/src/runtime/panic.go:884 +0x213
github.com/gnolang/gno/gnovm/pkg/gnolang.(*StaticBlock).Define2(0xc0002b3ba0, 0x0, {0xc003043b1b, 0x5}, {0x0?, 0x0}, {{0x0, 0x0}, {0x0, 0x0}, ...})
        /home/howl/oc/gno/gnovm/pkg/gnolang/nodes.go:1773 +0x64e
github.com/gnolang/gno/gnovm/pkg/gnolang.(*StaticBlock).Predefine(...)
        /home/howl/oc/gno/gnovm/pkg/gnolang/nodes.go:1736
github.com/gnolang/gno/gnovm/pkg/gnolang.tryPredefine({0xf651b0, 0xc000188240}, {0xf62cd8, 0xc009d9a2c0}, {0xf5dda0, 0xc009585030?})
        /home/howl/oc/gno/gnovm/pkg/gnolang/preprocess.go:3006 +0x17ef
github.com/gnolang/gno/gnovm/pkg/gnolang.predefineNow2({0xf651b0, 0xc000188240}, {0xf62cd8?, 0xc009d9a2c0}, {0xf5dda0, 0xc009585030?}, 0x44ebb2?)
        /home/howl/oc/gno/gnovm/pkg/gnolang/preprocess.go:2870 +0x125
github.com/gnolang/gno/gnovm/pkg/gnolang.predefineNow({0xf651b0, 0xc000188240}, {0xf62cd8, 0xc009d9a2c0}, {0xf5dda0, 0xc009585030})
        /home/howl/oc/gno/gnovm/pkg/gnolang/preprocess.go:2859 +0x149
github.com/gnolang/gno/gnovm/pkg/gnolang.PredefineFileSet({0xf651b0, 0xc000188240}, 0xc0002b3b80, 0xc00050ca98)
        /home/howl/oc/gno/gnovm/pkg/gnolang/preprocess.go:90 +0x2d3
github.com/gnolang/gno/gnovm/pkg/gnolang.(*Machine).runFiles(0xc0000c4fc0, {0xc0037c02a8, 0x1, 0x1})
        /home/howl/oc/gno/gnovm/pkg/gnolang/machine.go:509 +0x291
github.com/gnolang/gno/gnovm/pkg/gnolang.(*Machine).RunFiles(...)
        /home/howl/oc/gno/gnovm/pkg/gnolang/machine.go:475

This was discovered while trying to run gno test . on a converted version of https://github.com/notnil/chess . (as a fun fact, yaegi doesn't correctly handle that package's tests either: traefik/yaegi#1585 -- looks like we found ourselves a challenge-package!)

I did some debugging by adding this print statement in gnovm/pkg/gnolang/nodes.go:

func (sb *StaticBlock) Define2(isConst bool, n Name, st Type, tv TypedValue) {
	fmt.Printf(
		"StaticBlock.Define2(%v, %s, %v, %v)\n",
		isConst, n, st, tv)
// ...

The relevant output is in the last lines

StaticBlock.Define2(false, err, <nil>, (undefined))
StaticBlock.Define2(false, err, interface{}, (undefined))
StaticBlock.Define2(false, testing, package{}, (package(testing testing) package{}))
StaticBlock.Define2(false, pair, type{}, (typeval{gno/test.pair (0xc00992c9c0)} type{}))
StaticBlock.Define2(false, TestHello, func()(), (TestHello func()()))
StaticBlock.Define2(false, tests, <nil>, (undefined)) // <=============
StaticBlock.Define2(false, tests, []gno/test.pair, (nil []gno/test.pair))
StaticBlock.Define2(false, t, *testing.T, (nil *testing.T))
StaticBlock.Define2(false, _, int, (0 int))
StaticBlock.Define2(false, p, gno/test.pair, (nil gno/test.pair))
StaticBlock.Define2(false, testing, package{}, (package(testing testing) package{}))
StaticBlock.Define2(false, runtest, func()(), (runtest func()()))
StaticBlock.Define2(false, tests, <nil>, (undefined)) // <=============

I'm not 100% sure on the functioning of Define2, but a rough guess seems to be that it is seen as a re-definition and thus panics.

I suspect this issue is not limited to the tests variable, but this needs more investigation.

(The specific issue disappears changing the name of var tests to something else, like xxtests.)

(Part of a series of issues encountered while developing gnochess)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐞 bug Something isn't working 📦 🤖 gnovm Issues or PRs gnovm related
Projects
Status: Triage
Development

No branches or pull requests

4 participants