diff --git a/.circleci/config.yml b/.circleci/config.yml index f361fd5fb..883739216 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,6 +13,11 @@ executors: - image: circleci/golang:1.12 environment: GO111MODULE: "on" + go1_13: + docker: + - image: circleci/golang:1.13 + environment: + GO111MODULE: "on" commands: gomod: @@ -29,7 +34,7 @@ commands: jobs: lint: working_directory: /go/src/github.com/CityOfZion/neo-go - executor: go1_12 + executor: go1_13 steps: - checkout - gomod @@ -41,7 +46,7 @@ jobs: vet: working_directory: /go/src/github.com/CityOfZion/neo-go - executor: go1_12 + executor: go1_13 steps: - checkout - gomod @@ -60,6 +65,14 @@ jobs: test_1_12: working_directory: /go/src/github.com/CityOfZion/neo-go executor: go1_12 + steps: + - checkout + - gomod + - run: go test -v -race ./... + + test_1_13: + working_directory: /go/src/github.com/CityOfZion/neo-go + executor: go1_13 steps: - checkout - gomod @@ -118,6 +131,10 @@ workflows: filters: tags: only: v/[0-9]+\.[0-9]+\.[0-9]+/ + - test_1_13: + filters: + tags: + only: v/[0-9]+\.[0-9]+\.[0-9]+/ - build_cli: filters: tags: diff --git a/.gitignore b/.gitignore index 1331957f4..78297164b 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,7 @@ blockchains/ # patch *.orig *.rej + +# Coverage +coverage.txt +coverage.html diff --git a/Makefile b/Makefile index 13d47163e..f37bf24e4 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,11 @@ REPO ?= "$(shell go list -m)" VERSION ?= "$(shell git describe --tags 2>/dev/null | sed 's/^v//')" BUILD_FLAGS = "-X $(REPO)/config.Version=$(VERSION)" +# All of the targets are phony here because we don't really use make dependency +# tracking for files +.PHONY: build deps image check-version clean-cluster push-tag push-to-registry \ + run run-cluster test vet lint fmt cover + build: deps @echo "=> Building binary" @set -x \ @@ -60,3 +65,13 @@ test: vet: @go vet ./... + +lint: + @go list ./... | xargs -L1 golint -set_exit_status + +fmt: + @gofmt -l -w -s $$(find . -type f -name '*.go'| grep -v "/vendor/") + +cover: + @go test -v -race ./... -coverprofile=coverage.txt -covermode=atomic + @go tool cover -html=coverage.txt -o coverage.html diff --git a/config/config.go b/config/config.go index 6873de7d5..17f7a33ea 100644 --- a/config/config.go +++ b/config/config.go @@ -16,11 +16,11 @@ const ( userAgentFormat = "/NEO-GO:%s/" // ModeMainNet contains magic code used in the NEO main official network. - ModeMainNet NetMode = 0x00746e41 // 7630401 + ModeMainNet NetMode = 0x00746e41 // 7630401 // ModeTestNet contains magic code used in the NEO testing network. - ModeTestNet NetMode = 0x74746e41 // 1953787457 + ModeTestNet NetMode = 0x74746e41 // 1953787457 // ModePrivNet contains magic code usually used for NEO private networks. - ModePrivNet NetMode = 56753 // docker privnet + ModePrivNet NetMode = 56753 // docker privnet // ModeUnitTestNet is a stub magic code used for testing purposes. ModeUnitTestNet NetMode = 0 ) diff --git a/pkg/core/block_test.go b/pkg/core/block_test.go index 4ba5e561e..3191e959d 100644 --- a/pkg/core/block_test.go +++ b/pkg/core/block_test.go @@ -176,7 +176,7 @@ func TestBinBlockDecodeEncode(t *testing.T) { func TestBlockSizeCalculation(t *testing.T) { // block taken from mainnet: 0006d3ff96e269f599eb1b5c5a527c218439e498dcc65b63794591bbcdc0516b // The Size in golang is given by counting the number of bytes of an object. (len(Bytes)) - // its implementation is different from the corresponding C# and python implentation. But the result should + // its implementation is different from the corresponding C# and python implementations. But the result should // should be the same.In this test we provide more details then necessary because in case of failure we can easily debug the // root cause of the size calculation missmatch. @@ -250,7 +250,6 @@ func TestBlockSizeCalculation(t *testing.T) { assert.Equal(t, "552102486fd15702c4490a26703112a5cc1d0923fd697a33406bd5a1c00e0013b09a7021024c7b7fb6c310fccf1ba33b082519d82964ea93868d676662d4a59ad548df0e7d2102aaec38470f6aad0042c6e877cfd8087d2676b0f516fddd362801b9bd3936399e2103b209fd4f53a7170ea4444e0cb0a6bb6a53c2bd016926989cf85f9b0fba17a70c2103b8d9d5771d8f513aa0869b9cc8d50986403b78c6da36890638c3d46a5adce04a2102ca0e27697b9c248f6f16e085fd0061e26f44da85b58ee835c110caa5ec3ba5542102df48f60e8f3e01c48ff40b9b7f1310d7a8b2a193188befe1c2e3df740e89509357ae", hex.EncodeToString(b.Script.VerificationScript)) assert.Equal(t, "0006d3ff96e269f599eb1b5c5a527c218439e498dcc65b63794591bbcdc0516b", b.Hash().ReverseString()) - buf := new(bytes.Buffer) err = b.EncodeBinary(buf) diff --git a/pkg/core/transaction/attribute.go b/pkg/core/transaction/attribute.go index 3619fe931..1b3ca0c3b 100644 --- a/pkg/core/transaction/attribute.go +++ b/pkg/core/transaction/attribute.go @@ -67,7 +67,7 @@ func (attr *Attribute) EncodeBinary(w io.Writer) error { var urllen = uint8(len(attr.Data)) bw.WriteLE(urllen) fallthrough - case Script, ContractHash, Vote, Hash1, Hash2, Hash3, Hash4, Hash5, Hash6, + case Script, ContractHash, Vote, Hash1, Hash2, Hash3, Hash4, Hash5, Hash6, Hash7, Hash8, Hash9, Hash10, Hash11, Hash12, Hash13, Hash14, Hash15: bw.WriteLE(attr.Data) default: diff --git a/pkg/core/transaction/invocation.go b/pkg/core/transaction/invocation.go index d23a8f59d..0b255426c 100644 --- a/pkg/core/transaction/invocation.go +++ b/pkg/core/transaction/invocation.go @@ -13,7 +13,7 @@ type InvocationTX struct { Script []byte // Gas cost of the smart contract. - Gas util.Fixed8 + Gas util.Fixed8 Version uint8 } @@ -36,7 +36,7 @@ func NewInvocationTX(script []byte) *Transaction { func (tx *InvocationTX) DecodeBinary(r io.Reader) error { br := util.BinReader{R: r} tx.Script = br.ReadBytes() - if (tx.Version >= 1) { + if tx.Version >= 1 { br.ReadLE(&tx.Gas) } else { tx.Gas = util.Fixed8FromInt64(0) @@ -48,7 +48,7 @@ func (tx *InvocationTX) DecodeBinary(r io.Reader) error { func (tx *InvocationTX) EncodeBinary(w io.Writer) error { bw := util.BinWriter{W: w} bw.WriteBytes(tx.Script) - if (tx.Version >= 1) { + if tx.Version >= 1 { bw.WriteLE(tx.Gas) } return bw.Err @@ -57,7 +57,7 @@ func (tx *InvocationTX) EncodeBinary(w io.Writer) error { // Size returns serialized binary size for this transaction. func (tx *InvocationTX) Size() int { sz := util.GetVarSize(tx.Script) - if (tx.Version >= 1) { + if tx.Version >= 1 { sz += tx.Gas.Size() } return sz diff --git a/pkg/crypto/keys/nep2.go b/pkg/crypto/keys/nep2.go index c67888792..29f1c5661 100644 --- a/pkg/crypto/keys/nep2.go +++ b/pkg/crypto/keys/nep2.go @@ -40,7 +40,6 @@ func NEP2ScryptParams() ScryptParams { } } - // NEP2Encrypt encrypts a the PrivateKey using a given passphrase // under the NEP-2 standard. func NEP2Encrypt(priv *PrivateKey, passphrase string) (s string, err error) { diff --git a/pkg/crypto/keys/private_key_test.go b/pkg/crypto/keys/private_key_test.go index ea021b6ea..fd71d6812 100644 --- a/pkg/crypto/keys/private_key_test.go +++ b/pkg/crypto/keys/private_key_test.go @@ -5,11 +5,10 @@ import ( "strings" "testing" - "github.com/stretchr/testify/assert" "github.com/CityOfZion/neo-go/pkg/internal/keytestcases" + "github.com/stretchr/testify/assert" ) - func TestPrivateKey(t *testing.T) { for _, testCase := range keytestcases.Arr { privKey, err := NewPrivateKeyFromHex(testCase.PrivateKey) diff --git a/pkg/crypto/keys/publickey.go b/pkg/crypto/keys/publickey.go index 7335a6a2e..a03734688 100644 --- a/pkg/crypto/keys/publickey.go +++ b/pkg/crypto/keys/publickey.go @@ -11,8 +11,8 @@ import ( "io" "math/big" - "github.com/CityOfZion/neo-go/pkg/crypto/hash" "github.com/CityOfZion/neo-go/pkg/crypto" + "github.com/CityOfZion/neo-go/pkg/crypto/hash" "github.com/pkg/errors" ) @@ -150,7 +150,7 @@ func (p *PublicKey) DecodeBinary(r io.Reader) error { return err } x = new(big.Int).SetBytes(xbytes) - ylsb := uint(prefix&0x1) + ylsb := uint(prefix & 0x1) y, err = decodeCompressedY(x, ylsb) if err != nil { return err diff --git a/pkg/crypto/keys/wif.go b/pkg/crypto/keys/wif.go index df856412f..d0b6b7519 100644 --- a/pkg/crypto/keys/wif.go +++ b/pkg/crypto/keys/wif.go @@ -99,7 +99,7 @@ func (wif WIF) GetVerificationScript() []byte { ) var ( vScript []byte - pubkey *PublicKey + pubkey *PublicKey ) pubkey = wif.PrivateKey.PublicKey() vScript = append([]byte{pushbytes33}, pubkey.Bytes()...) diff --git a/pkg/network/server.go b/pkg/network/server.go index d6e260956..21b305616 100644 --- a/pkg/network/server.go +++ b/pkg/network/server.go @@ -352,5 +352,5 @@ func (s *Server) RelayDirectly(p Peer, inv *payload.Inventory) { } func init() { - rand.Seed(time.Now().UTC().UnixNano()) + rand.Seed(time.Now().UTC().UnixNano()) } diff --git a/pkg/rpc/txTypes.go b/pkg/rpc/txTypes.go index 96ad082d5..29065d41a 100644 --- a/pkg/rpc/txTypes.go +++ b/pkg/rpc/txTypes.go @@ -7,8 +7,8 @@ package rpc import ( "github.com/CityOfZion/neo-go/pkg/core/transaction" - "github.com/CityOfZion/neo-go/pkg/util" "github.com/CityOfZion/neo-go/pkg/crypto/keys" + "github.com/CityOfZion/neo-go/pkg/util" ) type ( diff --git a/pkg/rpc/wrappers/account_state.go b/pkg/rpc/wrappers/account_state.go index dda35ac70..6fa50d85c 100644 --- a/pkg/rpc/wrappers/account_state.go +++ b/pkg/rpc/wrappers/account_state.go @@ -12,11 +12,11 @@ import ( // AccountState wrapper used for the representation of // core.AccountState on the RPC Server. type AccountState struct { - Version uint8 `json:"version"` - ScriptHash util.Uint160 `json:"script_hash"` - IsFrozen bool `json:"frozen"` + Version uint8 `json:"version"` + ScriptHash util.Uint160 `json:"script_hash"` + IsFrozen bool `json:"frozen"` Votes []*keys.PublicKey `json:"votes"` - Balances []Balance `json:"balances"` + Balances []Balance `json:"balances"` } // Balances type for sorting balances in rpc response diff --git a/pkg/util/size_test.go b/pkg/util/size_test.go index 15eb77523..9d1217424 100644 --- a/pkg/util/size_test.go +++ b/pkg/util/size_test.go @@ -170,9 +170,9 @@ func TestVarSize(t *testing.T) { "test_string_3", 41, }, - {[]*smthSerializable{&smthSerializable{}, &smthSerializable{}}, + {[]*smthSerializable{{}, {}}, "test_Serializable", - 2 * 42 + 1, + 2*42 + 1, }, } diff --git a/pkg/vm/compiler/codegen.go b/pkg/vm/compiler/codegen.go index d0ae6290b..f90138616 100644 --- a/pkg/vm/compiler/codegen.go +++ b/pkg/vm/compiler/codegen.go @@ -361,7 +361,7 @@ func (c *codegen) Visit(node ast.Node) ast.Visitor { case token.LOR: ast.Walk(c, n.X) - emitJmp(c.prog, vm.JMPIF, int16(len(c.l) - 3)) + emitJmp(c.prog, vm.JMPIF, int16(len(c.l)-3)) ast.Walk(c, n.Y) return nil diff --git a/pkg/vm/tests/vm_test.go b/pkg/vm/tests/vm_test.go index 4ce507dc1..5ace8c269 100644 --- a/pkg/vm/tests/vm_test.go +++ b/pkg/vm/tests/vm_test.go @@ -18,7 +18,7 @@ type testCase struct { func run_testcases(t *testing.T, tcases []testCase) { for _, tcase := range tcases { - t.Run(tcase.name, func(t *testing.T) {eval(t, tcase.src, tcase.result)}) + t.Run(tcase.name, func(t *testing.T) { eval(t, tcase.src, tcase.result) }) } } diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index 1fa1fe3c7..d964d2178 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -7,8 +7,8 @@ import ( "log" "math/big" "os" - "text/tabwriter" "reflect" + "text/tabwriter" "github.com/CityOfZion/neo-go/pkg/crypto/hash" "github.com/CityOfZion/neo-go/pkg/util" @@ -311,7 +311,7 @@ func (v *VM) execute(ctx *Context, op Instruction) { l := int(v.estack.Pop().BigInt().Int64()) o := int(v.estack.Pop().BigInt().Int64()) s := v.estack.Pop().Bytes() - v.estack.PushVal(s[o:o+l]) + v.estack.PushVal(s[o : o+l]) case LEFT: l := int(v.estack.Pop().BigInt().Int64()) s := v.estack.Pop().Bytes() @@ -419,7 +419,7 @@ func (v *VM) execute(ctx *Context, op Instruction) { case EQUAL: b := v.estack.Pop() a := v.estack.Pop() - v.estack.PushVal(reflect.DeepEqual(a,b)) + v.estack.PushVal(reflect.DeepEqual(a, b)) // Bit operations. case INVERT: diff --git a/pkg/vm/vm_test.go b/pkg/vm/vm_test.go index a27f53b6a..78a9b1429 100644 --- a/pkg/vm/vm_test.go +++ b/pkg/vm/vm_test.go @@ -789,9 +789,9 @@ func TestUNPACKGood(t *testing.T) { assert.Equal(t, 5, vm.estack.Len()) assert.Equal(t, int64(len(elements)), vm.estack.Peek(0).BigInt().Int64()) for k, v := range elements { - assert.Equal(t, int64(v), vm.estack.Peek(k + 1).BigInt().Int64()) + assert.Equal(t, int64(v), vm.estack.Peek(k+1).BigInt().Int64()) } - assert.Equal(t, int64(1), vm.estack.Peek(len(elements) + 1).BigInt().Int64()) + assert.Equal(t, int64(1), vm.estack.Peek(len(elements)+1).BigInt().Int64()) } func TestREVERSEBadNotArray(t *testing.T) { @@ -833,7 +833,7 @@ func TestREVERSEGood(t *testing.T) { a := vm.estack.Peek(0).Array() assert.Equal(t, len(elements), len(a)) for k, v := range elements { - e := a[len(a) - 1 - k].Value().(*big.Int) + e := a[len(a)-1-k].Value().(*big.Int) assert.Equal(t, int64(v), e.Int64()) } assert.Equal(t, int64(1), vm.estack.Peek(1).BigInt().Int64()) diff --git a/pkg/wallet/account.go b/pkg/wallet/account.go index 6f4677d37..36362e431 100644 --- a/pkg/wallet/account.go +++ b/pkg/wallet/account.go @@ -1,8 +1,8 @@ package wallet import ( - "github.com/CityOfZion/neo-go/pkg/util" "github.com/CityOfZion/neo-go/pkg/crypto/keys" + "github.com/CityOfZion/neo-go/pkg/util" ) // Account represents a NEO account. It holds the private and public key