From 9e3ac59aa8a09db9967329d5c8c45560403c8c80 Mon Sep 17 00:00:00 2001 From: Ekaterina Lebedeva Date: Mon, 7 Aug 2023 11:10:58 +0300 Subject: [PATCH] [#2] Fix test Use `require` to check for errors and instead of just printing result to Stdout, t.Log to print errors. Added functions to calculate start offset, check if contract method has result and to get random int to put. Signed-off-by: Ekaterina Lebedeva --- tests/contract_test.go | 52 +++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/tests/contract_test.go b/tests/contract_test.go index bb91372..caa41d8 100644 --- a/tests/contract_test.go +++ b/tests/contract_test.go @@ -1,11 +1,14 @@ package contract import ( + "errors" + "math/rand" "path" "testing" "git.frostfs.info/TrueCloudLab/contract-coverage-primer/covertest" "github.com/davecgh/go-spew/spew" + "github.com/nspcc-dev/neo-go/pkg/compiler" "github.com/nspcc-dev/neo-go/pkg/neotest" "github.com/nspcc-dev/neo-go/pkg/neotest/chain" "github.com/nspcc-dev/neo-go/pkg/smartcontract/callflag" @@ -52,23 +55,31 @@ func TestRun(t *testing.T) { ctrDI := covertest.CompileFile(t, e.CommitteeHash, ctrPath, path.Join(ctrPath, "config.yml")) e.DeployContract(t, ctrDI.Contract, nil) + startOffsetPutNumber, err := getStartOffset(ctrDI.DebugInfo, "PutNumber") + require.NoError(t, err) + + hasResult, err := hasResult(ctrDI.DebugInfo, "PutNumber") + require.NoError(t, err) + + someNum := getNumToPut() + // setting up a VM for covertest.Run() - covertestRunVM := setUpVMForPut(t, e, ctrDI.Contract, false, 101, 2, invalidKey) - res, err := covertest.Run(covertestRunVM) - spew.Println("Printing collected instructions:") + covertestRunVM := setUpVMForPut(t, e, ctrDI.Contract, hasResult, startOffsetPutNumber, someNum, invalidKey) + res, covErr := covertest.Run(covertestRunVM) + t.Log("Printing collected instructions:") spew.Dump(res) - spew.Println("covertest.Run() returned an error: ", err) + t.Log("covertest.Run() returned an error: ", covErr) // setting up a VM for vm.Run() - origRunVM := setUpVMForPut(t, e, ctrDI.Contract, false, 101, 2, invalidKey) + origRunVM := setUpVMForPut(t, e, ctrDI.Contract, hasResult, startOffsetPutNumber, someNum, invalidKey) runerr := origRunVM.Run() - spew.Println("vm.Run() returned an error: ", err) + t.Log("vm.Run() returned an error: ", covErr) //check if errors are the same - spew.Println("Are errors the same? ", runerr.Error() == runerr.Error()) + require.Equal(t, runerr.Error(), covErr.Error()) //check if the number of elements on the stack is the same - spew.Println("Is the number of elements on the stack the same? ", origRunVM.Estack().Len() == covertestRunVM.Estack().Len()) + require.Equal(t, origRunVM.Estack().Len(), covertestRunVM.Estack().Len()) } func setUpVMForPut(t *testing.T, e *neotest.Executor, contract *neotest.Contract, hasResult bool, methodOff int, num int, key []byte) (v *vm.VM) { @@ -79,3 +90,28 @@ func setUpVMForPut(t *testing.T, e *neotest.Executor, contract *neotest.Contract ic.VM.Context().Estack().PushVal(key) return ic.VM } + +func getStartOffset(di *compiler.DebugInfo, methodID string) (int, error) { + for _, method := range di.Methods { + if method.ID == methodID { + return int(method.Range.Start), nil + } + } + return 0, errors.New("Method not found") +} + +func hasResult(di *compiler.DebugInfo, methodID string) (bool, error) { + for _, method := range di.Methods { + if method.ID == methodID { + if method.ReturnType == "Void" { + return false, nil + } + return true, nil + } + } + return false, errors.New("Method not found") +} + +func getNumToPut() int { + return rand.Intn(100) +}