From 6b61943d4006ea7709bac9403697969ae3050645 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 2 Nov 2021 16:33:44 -0400 Subject: [PATCH 01/43] move build_spec_tests --- dot/build_spec_test.go | 135 ----------------------------------------- 1 file changed, 135 deletions(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index 53dc276742..adb708a978 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -14,138 +14,3 @@ // You should have received a copy of the GNU Lesser General Public License // along with the gossamer library. If not, see . package dot - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "os" - "testing" - - "github.com/ChainSafe/gossamer/lib/genesis" - "github.com/stretchr/testify/require" -) - -func TestBuildFromGenesis(t *testing.T) { - file, err := genesis.CreateTestGenesisJSONFile(false) - defer os.Remove(file) - require.NoError(t, err) - bs, err := BuildFromGenesis(file, 0) - - expectedChainType := "TESTCHAINTYPE" - expectedProperties := map[string]interface{}{ - "ss58Format": 0.0, - "tokenDecimals": 0.0, - "tokenSymbol": "TEST", - } - - bs.genesis.ChainType = expectedChainType - bs.genesis.Properties = expectedProperties - - require.NoError(t, err) - - // confirm human-readable fields - hr, err := bs.ToJSON() - require.NoError(t, err) - jGen := genesis.Genesis{} - err = json.Unmarshal(hr, &jGen) - require.NoError(t, err) - genesis.TestGenesis.Genesis = genesis.TestFieldsHR - require.Equal(t, genesis.TestGenesis.Genesis.Runtime, jGen.Genesis.Runtime) - require.Equal(t, expectedChainType, jGen.ChainType) - require.Equal(t, expectedProperties, jGen.Properties) - - // confirm raw fields - raw, err := bs.ToJSONRaw() - require.NoError(t, err) - jGenRaw := genesis.Genesis{} - err = json.Unmarshal(raw, &jGenRaw) - require.NoError(t, err) - genesis.TestGenesis.Genesis = genesis.TestFieldsRaw - require.Equal(t, genesis.TestGenesis.Genesis.Raw, jGenRaw.Genesis.Raw) - require.Equal(t, expectedChainType, jGenRaw.ChainType) - require.Equal(t, expectedProperties, jGenRaw.Properties) -} - -func TestBuildFromGenesis_WhenGenesisDoesNotExists(t *testing.T) { - bs, err := BuildFromGenesis("/not/exists/genesis.json", 0) - require.Nil(t, bs) - require.Error(t, err, os.ErrNotExist) -} - -func TestWriteGenesisSpecFileWhenFileAlreadyExists(t *testing.T) { - f, err := ioutil.TempFile("", "existing file data") - require.NoError(t, err) - defer os.Remove(f.Name()) - - someBytes := []byte("Testing some bytes") - err = WriteGenesisSpecFile(someBytes, f.Name()) - - require.Error(t, err, - fmt.Sprintf("file %s already exists, rename to avoid overwritten", f.Name())) -} - -func TestWriteGenesisSpecFile(t *testing.T) { - cfg := NewTestConfig(t) - cfg.Init.Genesis = "../chain/gssmr/genesis.json" - - expected, err := genesis.NewGenesisFromJSONRaw(cfg.Init.Genesis) - require.NoError(t, err) - - err = InitNode(cfg) - require.NoError(t, err) - - bs, err := BuildFromGenesis(cfg.Init.Genesis, 0) - require.NoError(t, err) - - data, err := bs.ToJSONRaw() - require.NoError(t, err) - - tmpFiles := []string{ - "/tmp/unique-raw-genesis.json", - "./unique-raw-genesis.json", - } - - for _, tmpFile := range tmpFiles { - err = WriteGenesisSpecFile(data, tmpFile) - require.NoError(t, err) - require.FileExists(t, tmpFile) - - defer os.Remove(tmpFile) - - file, err := os.Open(tmpFile) - require.NoError(t, err) - defer file.Close() - - genesisBytes, err := ioutil.ReadAll(file) - require.NoError(t, err) - - gen := new(genesis.Genesis) - err = json.Unmarshal(genesisBytes, gen) - require.NoError(t, err) - - require.Equal(t, expected.ChainType, gen.ChainType) - require.Equal(t, expected.Properties, gen.Properties) - } -} - -func TestBuildFromDB(t *testing.T) { - // setup expected - cfg := NewTestConfig(t) - cfg.Init.Genesis = "../chain/gssmr/genesis.json" - expected, err := genesis.NewGenesisFromJSONRaw(cfg.Init.Genesis) - require.NoError(t, err) - // initialise node (initialise state database and load genesis data) - err = InitNode(cfg) - require.NoError(t, err) - - bs, err := BuildFromDB(cfg.Global.BasePath) - require.NoError(t, err) - res, err := bs.ToJSON() - require.NoError(t, err) - jGen := genesis.Genesis{} - err = json.Unmarshal(res, &jGen) - require.NoError(t, err) - - require.Equal(t, expected.Genesis.Raw["top"]["0x3a636f6465"], jGen.Genesis.Runtime["system"]["code"]) -} From d12b7c2fd5f00a4d68701485c6c6728de9d71731 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 2 Nov 2021 16:35:13 -0400 Subject: [PATCH 02/43] added file --- dot/build_spec_integration_test.go | 155 +++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 dot/build_spec_integration_test.go diff --git a/dot/build_spec_integration_test.go b/dot/build_spec_integration_test.go new file mode 100644 index 0000000000..24e66e22b6 --- /dev/null +++ b/dot/build_spec_integration_test.go @@ -0,0 +1,155 @@ +//go:build integration +// +build integration + +// Copyright 2020 ChainSafe Systems (ON) Corp. +// This file is part of gossamer. +// +// The gossamer library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The gossamer library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the gossamer library. If not, see . + +package dot + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "testing" + + "github.com/ChainSafe/gossamer/lib/genesis" + "github.com/stretchr/testify/require" +) + +func TestBuildFromGenesis(t *testing.T) { + file, err := genesis.CreateTestGenesisJSONFile(false) + defer os.Remove(file) + require.NoError(t, err) + bs, err := BuildFromGenesis(file, 0) + + expectedChainType := "TESTCHAINTYPE" + expectedProperties := map[string]interface{}{ + "ss58Format": 0.0, + "tokenDecimals": 0.0, + "tokenSymbol": "TEST", + } + + bs.genesis.ChainType = expectedChainType + bs.genesis.Properties = expectedProperties + + require.NoError(t, err) + + // confirm human-readable fields + hr, err := bs.ToJSON() + require.NoError(t, err) + jGen := genesis.Genesis{} + err = json.Unmarshal(hr, &jGen) + require.NoError(t, err) + genesis.TestGenesis.Genesis = genesis.TestFieldsHR + require.Equal(t, genesis.TestGenesis.Genesis.Runtime, jGen.Genesis.Runtime) + require.Equal(t, expectedChainType, jGen.ChainType) + require.Equal(t, expectedProperties, jGen.Properties) + + // confirm raw fields + raw, err := bs.ToJSONRaw() + require.NoError(t, err) + jGenRaw := genesis.Genesis{} + err = json.Unmarshal(raw, &jGenRaw) + require.NoError(t, err) + genesis.TestGenesis.Genesis = genesis.TestFieldsRaw + require.Equal(t, genesis.TestGenesis.Genesis.Raw, jGenRaw.Genesis.Raw) + require.Equal(t, expectedChainType, jGenRaw.ChainType) + require.Equal(t, expectedProperties, jGenRaw.Properties) +} + +func TestBuildFromGenesis_WhenGenesisDoesNotExists(t *testing.T) { + bs, err := BuildFromGenesis("/not/exists/genesis.json", 0) + require.Nil(t, bs) + require.Error(t, err, os.ErrNotExist) +} + +func TestWriteGenesisSpecFileWhenFileAlreadyExists(t *testing.T) { + f, err := ioutil.TempFile("", "existing file data") + require.NoError(t, err) + defer os.Remove(f.Name()) + + someBytes := []byte("Testing some bytes") + err = WriteGenesisSpecFile(someBytes, f.Name()) + + require.Error(t, err, + fmt.Sprintf("file %s already exists, rename to avoid overwritten", f.Name())) +} + +func TestWriteGenesisSpecFile(t *testing.T) { + cfg := NewTestConfig(t) + cfg.Init.Genesis = "../chain/gssmr/genesis.json" + + expected, err := genesis.NewGenesisFromJSONRaw(cfg.Init.Genesis) + require.NoError(t, err) + + err = InitNode(cfg) + require.NoError(t, err) + + bs, err := BuildFromGenesis(cfg.Init.Genesis, 0) + require.NoError(t, err) + + data, err := bs.ToJSONRaw() + require.NoError(t, err) + + tmpFiles := []string{ + "/tmp/unique-raw-genesis.json", + "./unique-raw-genesis.json", + } + + for _, tmpFile := range tmpFiles { + err = WriteGenesisSpecFile(data, tmpFile) + require.NoError(t, err) + require.FileExists(t, tmpFile) + + defer os.Remove(tmpFile) + + file, err := os.Open(tmpFile) + require.NoError(t, err) + defer file.Close() + + genesisBytes, err := ioutil.ReadAll(file) + require.NoError(t, err) + + gen := new(genesis.Genesis) + err = json.Unmarshal(genesisBytes, gen) + require.NoError(t, err) + + require.Equal(t, expected.ChainType, gen.ChainType) + require.Equal(t, expected.Properties, gen.Properties) + } +} + +func TestBuildFromDB(t *testing.T) { + // setup expected + cfg := NewTestConfig(t) + cfg.Init.Genesis = "../chain/gssmr/genesis.json" + expected, err := genesis.NewGenesisFromJSONRaw(cfg.Init.Genesis) + require.NoError(t, err) + // initialise node (initialise state database and load genesis data) + err = InitNode(cfg) + require.NoError(t, err) + + bs, err := BuildFromDB(cfg.Global.BasePath) + require.NoError(t, err) + res, err := bs.ToJSON() + require.NoError(t, err) + jGen := genesis.Genesis{} + err = json.Unmarshal(res, &jGen) + require.NoError(t, err) + + require.Equal(t, expected.Genesis.Raw["top"]["0x3a636f6465"], jGen.Genesis.Runtime["system"]["code"]) +} From 2346cd910ee66d8562cf7951987bd0d7d9c2ebb5 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 2 Nov 2021 16:37:41 -0400 Subject: [PATCH 03/43] move config_tests --- dot/config_integration_test.go | 47 ++++++++++++++++++++++++++++++++++ dot/config_test.go | 27 ------------------- 2 files changed, 47 insertions(+), 27 deletions(-) create mode 100644 dot/config_integration_test.go diff --git a/dot/config_integration_test.go b/dot/config_integration_test.go new file mode 100644 index 0000000000..c71eb7f8d1 --- /dev/null +++ b/dot/config_integration_test.go @@ -0,0 +1,47 @@ +//go:build integration +// +build integration + +// Copyright 2020 ChainSafe Systems (ON) Corp. +// This file is part of gossamer. +// +// The gossamer library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The gossamer library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the gossamer library. If not, see . + +package dot + +import ( + "testing" + + "github.com/ChainSafe/gossamer/lib/utils" + + "github.com/stretchr/testify/require" +) + +// TestExportConfig tests exporting a toml configuration file +func TestExportConfig(t *testing.T) { + cfg, cfgFile := NewTestConfigWithFile(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.Nil(t, err) + + file := ExportConfig(cfg, cfgFile.Name()) + require.NotNil(t, file) +} diff --git a/dot/config_test.go b/dot/config_test.go index d029c331f6..165991c8ba 100644 --- a/dot/config_test.go +++ b/dot/config_test.go @@ -15,30 +15,3 @@ // along with the gossamer library. If not, see . package dot - -import ( - "testing" - - "github.com/ChainSafe/gossamer/lib/utils" - - "github.com/stretchr/testify/require" -) - -// TestExportConfig tests exporting a toml configuration file -func TestExportConfig(t *testing.T) { - cfg, cfgFile := NewTestConfigWithFile(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.Nil(t, err) - - file := ExportConfig(cfg, cfgFile.Name()) - require.NotNil(t, file) -} From 9ac48f40a7ea23845bf5d18a811213f671349ad5 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 2 Nov 2021 16:39:41 -0400 Subject: [PATCH 04/43] move import_tests --- dot/import_integration_test.go | 120 +++++++++++++++++++++++++++++++++ dot/import_test.go | 100 --------------------------- 2 files changed, 120 insertions(+), 100 deletions(-) create mode 100644 dot/import_integration_test.go diff --git a/dot/import_integration_test.go b/dot/import_integration_test.go new file mode 100644 index 0000000000..9257bd1f7c --- /dev/null +++ b/dot/import_integration_test.go @@ -0,0 +1,120 @@ +//go:build integration +// +build integration + +// Copyright 2020 ChainSafe Systems (ON) Corp. +// This file is part of gossamer. +// +// The gossamer library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The gossamer library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the gossamer library. If not, see . + +package dot + +import ( + "encoding/json" + "io/ioutil" + "math/big" + "testing" + + "github.com/ChainSafe/gossamer/dot/types" + "github.com/ChainSafe/gossamer/lib/common" + "github.com/ChainSafe/gossamer/lib/utils" + "github.com/ChainSafe/gossamer/pkg/scale" + + "github.com/stretchr/testify/require" +) + +func setupStateFile(t *testing.T) string { + filename := "../lib/runtime/test_data/kusama/block1482002.out" + + data, err := ioutil.ReadFile(filename) + require.NoError(t, err) + + rpcPairs := make(map[string]interface{}) + err = json.Unmarshal(data, &rpcPairs) + require.NoError(t, err) + pairs := rpcPairs["result"].([]interface{}) + + bz, err := json.Marshal(pairs) + require.NoError(t, err) + + fp := "./test_data/state.json" + err = ioutil.WriteFile(fp, bz, 0777) + require.NoError(t, err) + + return fp +} + +func setupHeaderFile(t *testing.T) string { + headerStr := "{\"digest\":{\"logs\":[\"0x0642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c\",\"0x054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86\"]},\"extrinsicsRoot\":\"0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0\",\"number\":\"0x169d12\",\"parentHash\":\"0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975\",\"stateRoot\":\"0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb\"}" + fp := "./test_data/header.json" + err := ioutil.WriteFile(fp, []byte(headerStr), 0777) + require.NoError(t, err) + return fp +} + +func TestNewTrieFromPairs(t *testing.T) { + fp := setupStateFile(t) + tr, err := newTrieFromPairs(fp) + require.NoError(t, err) + + expectedRoot := common.MustHexToHash("0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb") + require.Equal(t, expectedRoot, tr.MustHash()) +} + +func TestNewHeaderFromFile(t *testing.T) { + fp := setupHeaderFile(t) + header, err := newHeaderFromFile(fp) + require.NoError(t, err) + + digestBytes := common.MustHexToBytes("0x080642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86") + digest := types.NewDigest() + err = scale.Unmarshal(digestBytes, &digest) + require.NoError(t, err) + require.Equal(t, 2, len(digest.Types)) + + expected := &types.Header{ + ParentHash: common.MustHexToHash("0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975"), + Number: big.NewInt(1482002), + StateRoot: common.MustHexToHash("0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb"), + ExtrinsicsRoot: common.MustHexToHash("0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0"), + Digest: digest, + } + + require.Equal(t, expected, header) +} + +func TestImportState(t *testing.T) { + basepath, err := ioutil.TempDir("", "gossamer-test-*") + require.NoError(t, err) + + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + cfg.Global.BasePath = basepath + err = InitNode(cfg) + require.NoError(t, err) + + stateFP := setupStateFile(t) + headerFP := setupHeaderFile(t) + + firstSlot := uint64(262493679) + err = ImportState(basepath, stateFP, headerFP, firstSlot) + require.NoError(t, err) +} diff --git a/dot/import_test.go b/dot/import_test.go index 30527edf21..165991c8ba 100644 --- a/dot/import_test.go +++ b/dot/import_test.go @@ -15,103 +15,3 @@ // along with the gossamer library. If not, see . package dot - -import ( - "encoding/json" - "io/ioutil" - "math/big" - "testing" - - "github.com/ChainSafe/gossamer/dot/types" - "github.com/ChainSafe/gossamer/lib/common" - "github.com/ChainSafe/gossamer/lib/utils" - "github.com/ChainSafe/gossamer/pkg/scale" - - "github.com/stretchr/testify/require" -) - -func setupStateFile(t *testing.T) string { - filename := "../lib/runtime/test_data/kusama/block1482002.out" - - data, err := ioutil.ReadFile(filename) - require.NoError(t, err) - - rpcPairs := make(map[string]interface{}) - err = json.Unmarshal(data, &rpcPairs) - require.NoError(t, err) - pairs := rpcPairs["result"].([]interface{}) - - bz, err := json.Marshal(pairs) - require.NoError(t, err) - - fp := "./test_data/state.json" - err = ioutil.WriteFile(fp, bz, 0777) - require.NoError(t, err) - - return fp -} - -func setupHeaderFile(t *testing.T) string { - headerStr := "{\"digest\":{\"logs\":[\"0x0642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c\",\"0x054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86\"]},\"extrinsicsRoot\":\"0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0\",\"number\":\"0x169d12\",\"parentHash\":\"0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975\",\"stateRoot\":\"0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb\"}" - fp := "./test_data/header.json" - err := ioutil.WriteFile(fp, []byte(headerStr), 0777) - require.NoError(t, err) - return fp -} - -func TestNewTrieFromPairs(t *testing.T) { - fp := setupStateFile(t) - tr, err := newTrieFromPairs(fp) - require.NoError(t, err) - - expectedRoot := common.MustHexToHash("0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb") - require.Equal(t, expectedRoot, tr.MustHash()) -} - -func TestNewHeaderFromFile(t *testing.T) { - fp := setupHeaderFile(t) - header, err := newHeaderFromFile(fp) - require.NoError(t, err) - - digestBytes := common.MustHexToBytes("0x080642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86") - digest := types.NewDigest() - err = scale.Unmarshal(digestBytes, &digest) - require.NoError(t, err) - require.Equal(t, 2, len(digest.Types)) - - expected := &types.Header{ - ParentHash: common.MustHexToHash("0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975"), - Number: big.NewInt(1482002), - StateRoot: common.MustHexToHash("0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb"), - ExtrinsicsRoot: common.MustHexToHash("0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0"), - Digest: digest, - } - - require.Equal(t, expected, header) -} - -func TestImportState(t *testing.T) { - basepath, err := ioutil.TempDir("", "gossamer-test-*") - require.NoError(t, err) - - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - cfg.Global.BasePath = basepath - err = InitNode(cfg) - require.NoError(t, err) - - stateFP := setupStateFile(t) - headerFP := setupHeaderFile(t) - - firstSlot := uint64(262493679) - err = ImportState(basepath, stateFP, headerFP, firstSlot) - require.NoError(t, err) -} From f10a4db19ef545b883ee9f4c3ce4d19439b073a9 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 2 Nov 2021 16:42:05 -0400 Subject: [PATCH 05/43] move node_tests --- dot/node_integration_test.go | 414 +++++++++++++++++++++++++++++++++++ dot/node_test.go | 394 --------------------------------- 2 files changed, 414 insertions(+), 394 deletions(-) create mode 100644 dot/node_integration_test.go diff --git a/dot/node_integration_test.go b/dot/node_integration_test.go new file mode 100644 index 0000000000..fa98363602 --- /dev/null +++ b/dot/node_integration_test.go @@ -0,0 +1,414 @@ +//go:build integration +// +build integration + +// Copyright 2020 ChainSafe Systems (ON) Corp. +// This file is part of gossamer. +// +// The gossamer library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The gossamer library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the gossamer library. If not, see . + +package dot + +import ( + "math/big" + "reflect" + "sync" + "testing" + + "github.com/ChainSafe/gossamer/dot/core" + "github.com/ChainSafe/gossamer/dot/state" + "github.com/ChainSafe/gossamer/dot/types" + "github.com/ChainSafe/gossamer/lib/babe" + "github.com/ChainSafe/gossamer/lib/common" + "github.com/ChainSafe/gossamer/lib/crypto/sr25519" + "github.com/ChainSafe/gossamer/lib/genesis" + "github.com/ChainSafe/gossamer/lib/grandpa" + "github.com/ChainSafe/gossamer/lib/keystore" + "github.com/ChainSafe/gossamer/lib/services" + "github.com/ChainSafe/gossamer/lib/trie" + "github.com/ChainSafe/gossamer/lib/utils" + + log "github.com/ChainSafe/log15" + "github.com/stretchr/testify/require" +) + +func TestInitNode(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) +} + +func TestInitNode_GenesisSpec(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) +} + +// TestNodeInitialized +func TestNodeInitialized(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + expected := NodeInitialized(cfg.Global.BasePath) + require.Equal(t, expected, false) + + err := InitNode(cfg) + require.NoError(t, err) + + expected = NodeInitialized(cfg.Global.BasePath) + require.Equal(t, expected, true) +} + +// TestNewNode +func TestNewNode(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + err = keystore.LoadKeystore("alice", ks.Gran) + require.NoError(t, err) + err = keystore.LoadKeystore("alice", ks.Babe) + require.NoError(t, err) + + cfg.Core.Roles = types.FullNodeRole + + node, err := NewNode(cfg, ks, nil) + require.NoError(t, err) + + bp := node.Services.Get(&babe.Service{}) + require.NotNil(t, bp) + fg := node.Services.Get(&grandpa.Service{}) + require.NotNil(t, fg) +} + +func TestNewNode_Authority(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + err = keystore.LoadKeystore("alice", ks.Gran) + require.NoError(t, err) + require.Equal(t, 1, ks.Gran.Size()) + err = keystore.LoadKeystore("alice", ks.Babe) + require.NoError(t, err) + require.Equal(t, 1, ks.Babe.Size()) + + cfg.Core.Roles = types.AuthorityRole + + node, err := NewNode(cfg, ks, nil) + require.NoError(t, err) + + bp := node.Services.Get(&babe.Service{}) + require.NotNil(t, bp) + fg := node.Services.Get(&grandpa.Service{}) + require.NotNil(t, fg) +} + +// TestStartNode +func TestStartNode(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + cfg.Core.GrandpaAuthority = false + + err := InitNode(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + err = keystore.LoadKeystore("alice", ks.Gran) + require.NoError(t, err) + err = keystore.LoadKeystore("alice", ks.Babe) + require.NoError(t, err) + + cfg.Core.Roles = types.FullNodeRole + + node, err := NewNode(cfg, ks, nil) + require.NoError(t, err) + + go func() { + <-node.started + node.Stop() + }() + + err = node.Start() + require.NoError(t, err) +} + +// TestInitNode_LoadGenesisData +func TestInitNode_LoadGenesisData(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genPath := NewTestGenesisAndRuntime(t) + require.NotNil(t, genPath) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genPath + cfg.Core.GrandpaAuthority = false + + err := InitNode(cfg) + require.NoError(t, err) + + config := state.Config{ + Path: cfg.Global.BasePath, + LogLevel: log.LvlInfo, + } + stateSrvc := state.NewService(config) + + gen, err := genesis.NewGenesisFromJSONRaw(genPath) + require.NoError(t, err) + + genTrie, err := genesis.NewTrieFromGenesis(gen) + require.NoError(t, err) + + genesisHeader, err := types.NewHeader(common.NewHash([]byte{0}), genTrie.MustHash(), trie.EmptyHash, big.NewInt(0), types.NewDigest()) + require.NoError(t, err) + + err = stateSrvc.Initialise(gen, genesisHeader, genTrie) + require.NoError(t, err) + + err = stateSrvc.Start() + require.NoError(t, err) + + defer func() { + err = stateSrvc.Stop() + require.NoError(t, err) + }() + + gendata, err := stateSrvc.Base.LoadGenesisData() + require.NoError(t, err) + + testGenesis := NewTestGenesis(t) + + expected := &genesis.Data{ + Name: testGenesis.Name, + ID: testGenesis.ID, + Bootnodes: common.StringArrayToBytes(testGenesis.Bootnodes), + ProtocolID: testGenesis.ProtocolID, + } + require.Equal(t, expected, gendata) + + genesisHeader, err = stateSrvc.Block.BestBlockHeader() + require.NoError(t, err) + + stateRoot := genesisHeader.StateRoot + expectedHeader, err := types.NewHeader(common.NewHash([]byte{0}), stateRoot, trie.EmptyHash, big.NewInt(0), types.NewDigest()) + require.NoError(t, err) + require.Equal(t, expectedHeader.Hash(), genesisHeader.Hash()) +} + +// TestInitNode_LoadStorageRoot +func TestInitNode_LoadStorageRoot(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genPath := NewTestGenesisAndRuntime(t) + require.NotNil(t, genPath) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Core.BabeAuthority = false + cfg.Core.GrandpaAuthority = false + cfg.Init.Genesis = genPath + + gen, err := genesis.NewGenesisFromJSONRaw(genPath) + require.NoError(t, err) + + err = InitNode(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + ed25519Keyring, _ := keystore.NewEd25519Keyring() + ks.Gran.Insert(ed25519Keyring.Alice()) + sr25519Keyring, _ := keystore.NewSr25519Keyring() + ks.Babe.Insert(sr25519Keyring.Alice()) + node, err := NewNode(cfg, ks, nil) + require.NoError(t, err) + + if reflect.TypeOf(node) != reflect.TypeOf(&Node{}) { + t.Fatalf("failed to return correct type: got %v expected %v", reflect.TypeOf(node), reflect.TypeOf(&Node{})) + } + + expected := &trie.Trie{} + err = expected.LoadFromMap(gen.GenesisFields().Raw["top"]) + require.NoError(t, err) + + expectedRoot, err := expected.Hash() + require.NoError(t, err) + + mgr := node.Services.Get(&core.Service{}) + + var coreSrvc *core.Service + var ok bool + + if coreSrvc, ok = mgr.(*core.Service); !ok { + t.Fatal("could not find core service") + } + require.NotNil(t, coreSrvc) + + stateRoot, err := coreSrvc.StorageRoot() + require.NoError(t, err) + require.Equal(t, expectedRoot, stateRoot) +} + +// balanceKey returns the storage trie key for the balance of the account with the given public key +func balanceKey(t *testing.T, key [32]byte) []byte { + accKey := append([]byte("balance:"), key[:]...) + hash, err := common.Blake2bHash(accKey) + require.NoError(t, err) + return hash[:] +} + +func TestInitNode_LoadBalances(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genPath := NewTestGenesisAndRuntime(t) + require.NotNil(t, genPath) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Core.BabeAuthority = false + cfg.Core.GrandpaAuthority = false + cfg.Init.Genesis = genPath + + err := InitNode(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + ed25519Keyring, _ := keystore.NewEd25519Keyring() + ks.Gran.Insert(ed25519Keyring.Alice()) + + node, err := NewNode(cfg, ks, nil) + require.NoError(t, err) + + if reflect.TypeOf(node) != reflect.TypeOf(&Node{}) { + t.Fatalf("failed to return correct type: got %v expected %v", reflect.TypeOf(node), reflect.TypeOf(&Node{})) + } + + mgr := node.Services.Get(&state.Service{}) + + var stateSrv *state.Service + var ok bool + + if stateSrv, ok = mgr.(*state.Service); !ok { + t.Fatal("could not find core service") + } + require.NotNil(t, stateSrv) + + kr, _ := keystore.NewSr25519Keyring() + alice := kr.Alice().Public().(*sr25519.PublicKey).AsBytes() + + bal, err := stateSrv.Storage.GetStorage(nil, balanceKey(t, alice)) + require.NoError(t, err) + + genbal := "0x0000000000000001" + expected, _ := common.HexToBytes(genbal) + require.Equal(t, expected, bal) +} + +func TestNode_StopFunc(t *testing.T) { + testvar := "before" + stopFunc := func() { + testvar = "after" + } + + node := &Node{ + Services: &services.ServiceRegistry{}, + StopFunc: stopFunc, + wg: sync.WaitGroup{}, + } + node.wg.Add(1) + + node.Stop() + require.Equal(t, testvar, "after") +} + +func TestNode_PersistGlobalName_WhenInitialize(t *testing.T) { + globalName := RandomNodeName() + + cfg := NewTestConfig(t) + cfg.Global.Name = globalName + require.NotNil(t, cfg) + + genPath := NewTestGenesisAndRuntime(t) + require.NotNil(t, genPath) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Core.BabeAuthority = false + cfg.Core.GrandpaAuthority = false + cfg.Init.Genesis = genPath + + err := InitNode(cfg) + require.NoError(t, err) + + storedName, err := LoadGlobalNodeName(cfg.Global.BasePath) + require.Nil(t, err) + require.Equal(t, globalName, storedName) +} diff --git a/dot/node_test.go b/dot/node_test.go index 7d4bbe8d77..165991c8ba 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -15,397 +15,3 @@ // along with the gossamer library. If not, see . package dot - -import ( - "math/big" - "reflect" - "sync" - "testing" - - "github.com/ChainSafe/gossamer/dot/core" - "github.com/ChainSafe/gossamer/dot/state" - "github.com/ChainSafe/gossamer/dot/types" - "github.com/ChainSafe/gossamer/lib/babe" - "github.com/ChainSafe/gossamer/lib/common" - "github.com/ChainSafe/gossamer/lib/crypto/sr25519" - "github.com/ChainSafe/gossamer/lib/genesis" - "github.com/ChainSafe/gossamer/lib/grandpa" - "github.com/ChainSafe/gossamer/lib/keystore" - "github.com/ChainSafe/gossamer/lib/services" - "github.com/ChainSafe/gossamer/lib/trie" - "github.com/ChainSafe/gossamer/lib/utils" - - log "github.com/ChainSafe/log15" - "github.com/stretchr/testify/require" -) - -func TestInitNode(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) -} - -func TestInitNode_GenesisSpec(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) -} - -// TestNodeInitialized -func TestNodeInitialized(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - expected := NodeInitialized(cfg.Global.BasePath) - require.Equal(t, expected, false) - - err := InitNode(cfg) - require.NoError(t, err) - - expected = NodeInitialized(cfg.Global.BasePath) - require.Equal(t, expected, true) -} - -// TestNewNode -func TestNewNode(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - err = keystore.LoadKeystore("alice", ks.Gran) - require.NoError(t, err) - err = keystore.LoadKeystore("alice", ks.Babe) - require.NoError(t, err) - - cfg.Core.Roles = types.FullNodeRole - - node, err := NewNode(cfg, ks, nil) - require.NoError(t, err) - - bp := node.Services.Get(&babe.Service{}) - require.NotNil(t, bp) - fg := node.Services.Get(&grandpa.Service{}) - require.NotNil(t, fg) -} - -func TestNewNode_Authority(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - err = keystore.LoadKeystore("alice", ks.Gran) - require.NoError(t, err) - require.Equal(t, 1, ks.Gran.Size()) - err = keystore.LoadKeystore("alice", ks.Babe) - require.NoError(t, err) - require.Equal(t, 1, ks.Babe.Size()) - - cfg.Core.Roles = types.AuthorityRole - - node, err := NewNode(cfg, ks, nil) - require.NoError(t, err) - - bp := node.Services.Get(&babe.Service{}) - require.NotNil(t, bp) - fg := node.Services.Get(&grandpa.Service{}) - require.NotNil(t, fg) -} - -// TestStartNode -func TestStartNode(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - cfg.Core.GrandpaAuthority = false - - err := InitNode(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - err = keystore.LoadKeystore("alice", ks.Gran) - require.NoError(t, err) - err = keystore.LoadKeystore("alice", ks.Babe) - require.NoError(t, err) - - cfg.Core.Roles = types.FullNodeRole - - node, err := NewNode(cfg, ks, nil) - require.NoError(t, err) - - go func() { - <-node.started - node.Stop() - }() - - err = node.Start() - require.NoError(t, err) -} - -// TestInitNode_LoadGenesisData -func TestInitNode_LoadGenesisData(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genPath := NewTestGenesisAndRuntime(t) - require.NotNil(t, genPath) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genPath - cfg.Core.GrandpaAuthority = false - - err := InitNode(cfg) - require.NoError(t, err) - - config := state.Config{ - Path: cfg.Global.BasePath, - LogLevel: log.LvlInfo, - } - stateSrvc := state.NewService(config) - - gen, err := genesis.NewGenesisFromJSONRaw(genPath) - require.NoError(t, err) - - genTrie, err := genesis.NewTrieFromGenesis(gen) - require.NoError(t, err) - - genesisHeader, err := types.NewHeader(common.NewHash([]byte{0}), genTrie.MustHash(), trie.EmptyHash, big.NewInt(0), types.NewDigest()) - require.NoError(t, err) - - err = stateSrvc.Initialise(gen, genesisHeader, genTrie) - require.NoError(t, err) - - err = stateSrvc.Start() - require.NoError(t, err) - - defer func() { - err = stateSrvc.Stop() - require.NoError(t, err) - }() - - gendata, err := stateSrvc.Base.LoadGenesisData() - require.NoError(t, err) - - testGenesis := NewTestGenesis(t) - - expected := &genesis.Data{ - Name: testGenesis.Name, - ID: testGenesis.ID, - Bootnodes: common.StringArrayToBytes(testGenesis.Bootnodes), - ProtocolID: testGenesis.ProtocolID, - } - require.Equal(t, expected, gendata) - - genesisHeader, err = stateSrvc.Block.BestBlockHeader() - require.NoError(t, err) - - stateRoot := genesisHeader.StateRoot - expectedHeader, err := types.NewHeader(common.NewHash([]byte{0}), stateRoot, trie.EmptyHash, big.NewInt(0), types.NewDigest()) - require.NoError(t, err) - require.Equal(t, expectedHeader.Hash(), genesisHeader.Hash()) -} - -// TestInitNode_LoadStorageRoot -func TestInitNode_LoadStorageRoot(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genPath := NewTestGenesisAndRuntime(t) - require.NotNil(t, genPath) - - defer utils.RemoveTestDir(t) - - cfg.Core.Roles = types.FullNodeRole - cfg.Core.BabeAuthority = false - cfg.Core.GrandpaAuthority = false - cfg.Init.Genesis = genPath - - gen, err := genesis.NewGenesisFromJSONRaw(genPath) - require.NoError(t, err) - - err = InitNode(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - ed25519Keyring, _ := keystore.NewEd25519Keyring() - ks.Gran.Insert(ed25519Keyring.Alice()) - sr25519Keyring, _ := keystore.NewSr25519Keyring() - ks.Babe.Insert(sr25519Keyring.Alice()) - node, err := NewNode(cfg, ks, nil) - require.NoError(t, err) - - if reflect.TypeOf(node) != reflect.TypeOf(&Node{}) { - t.Fatalf("failed to return correct type: got %v expected %v", reflect.TypeOf(node), reflect.TypeOf(&Node{})) - } - - expected := &trie.Trie{} - err = expected.LoadFromMap(gen.GenesisFields().Raw["top"]) - require.NoError(t, err) - - expectedRoot, err := expected.Hash() - require.NoError(t, err) - - mgr := node.Services.Get(&core.Service{}) - - var coreSrvc *core.Service - var ok bool - - if coreSrvc, ok = mgr.(*core.Service); !ok { - t.Fatal("could not find core service") - } - require.NotNil(t, coreSrvc) - - stateRoot, err := coreSrvc.StorageRoot() - require.NoError(t, err) - require.Equal(t, expectedRoot, stateRoot) -} - -// balanceKey returns the storage trie key for the balance of the account with the given public key -func balanceKey(t *testing.T, key [32]byte) []byte { - accKey := append([]byte("balance:"), key[:]...) - hash, err := common.Blake2bHash(accKey) - require.NoError(t, err) - return hash[:] -} - -func TestInitNode_LoadBalances(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genPath := NewTestGenesisAndRuntime(t) - require.NotNil(t, genPath) - - defer utils.RemoveTestDir(t) - - cfg.Core.Roles = types.FullNodeRole - cfg.Core.BabeAuthority = false - cfg.Core.GrandpaAuthority = false - cfg.Init.Genesis = genPath - - err := InitNode(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - ed25519Keyring, _ := keystore.NewEd25519Keyring() - ks.Gran.Insert(ed25519Keyring.Alice()) - - node, err := NewNode(cfg, ks, nil) - require.NoError(t, err) - - if reflect.TypeOf(node) != reflect.TypeOf(&Node{}) { - t.Fatalf("failed to return correct type: got %v expected %v", reflect.TypeOf(node), reflect.TypeOf(&Node{})) - } - - mgr := node.Services.Get(&state.Service{}) - - var stateSrv *state.Service - var ok bool - - if stateSrv, ok = mgr.(*state.Service); !ok { - t.Fatal("could not find core service") - } - require.NotNil(t, stateSrv) - - kr, _ := keystore.NewSr25519Keyring() - alice := kr.Alice().Public().(*sr25519.PublicKey).AsBytes() - - bal, err := stateSrv.Storage.GetStorage(nil, balanceKey(t, alice)) - require.NoError(t, err) - - genbal := "0x0000000000000001" - expected, _ := common.HexToBytes(genbal) - require.Equal(t, expected, bal) -} - -func TestNode_StopFunc(t *testing.T) { - testvar := "before" - stopFunc := func() { - testvar = "after" - } - - node := &Node{ - Services: &services.ServiceRegistry{}, - StopFunc: stopFunc, - wg: sync.WaitGroup{}, - } - node.wg.Add(1) - - node.Stop() - require.Equal(t, testvar, "after") -} - -func TestNode_PersistGlobalName_WhenInitialize(t *testing.T) { - globalName := RandomNodeName() - - cfg := NewTestConfig(t) - cfg.Global.Name = globalName - require.NotNil(t, cfg) - - genPath := NewTestGenesisAndRuntime(t) - require.NotNil(t, genPath) - - defer utils.RemoveTestDir(t) - - cfg.Core.Roles = types.FullNodeRole - cfg.Core.BabeAuthority = false - cfg.Core.GrandpaAuthority = false - cfg.Init.Genesis = genPath - - err := InitNode(cfg) - require.NoError(t, err) - - storedName, err := LoadGlobalNodeName(cfg.Global.BasePath) - require.Nil(t, err) - require.Equal(t, globalName, storedName) -} From 8cafe33f8ae2d2fd8c9ea5e93491f923d8ee2238 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 2 Nov 2021 16:44:02 -0400 Subject: [PATCH 06/43] move services_tests --- dot/service_integration_test.go | 370 ++++++++++++++++++++++++++++++++ dot/services_test.go | 350 ------------------------------ 2 files changed, 370 insertions(+), 350 deletions(-) create mode 100644 dot/service_integration_test.go diff --git a/dot/service_integration_test.go b/dot/service_integration_test.go new file mode 100644 index 0000000000..d4a6d146e7 --- /dev/null +++ b/dot/service_integration_test.go @@ -0,0 +1,370 @@ +//go:build integration +// +build integration + +// Copyright 2020 ChainSafe Systems (ON) Corp. +// This file is part of gossamer. +// +// The gossamer library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The gossamer library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the gossamer library. If not, see . + +package dot + +import ( + "flag" + "net/url" + "testing" + "time" + + "github.com/ChainSafe/gossamer/dot/network" + "github.com/ChainSafe/gossamer/dot/types" + "github.com/ChainSafe/gossamer/lib/grandpa" + "github.com/ChainSafe/gossamer/lib/keystore" + "github.com/ChainSafe/gossamer/lib/utils" + + "github.com/gorilla/websocket" + "github.com/stretchr/testify/require" +) + +// TestCreateStateService tests the createStateService method +func TestCreateStateService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.Nil(t, err) + + stateSrvc, err := createStateService(cfg) + require.Nil(t, err) + require.NotNil(t, stateSrvc) +} + +// TestCreateCoreService tests the createCoreService method +func TestCreateCoreService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Core.BabeAuthority = false + cfg.Core.GrandpaAuthority = false + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + require.NotNil(t, ks) + ed25519Keyring, _ := keystore.NewEd25519Keyring() + ks.Gran.Insert(ed25519Keyring.Alice()) + + networkSrvc := &network.Service{} + + dh, err := createDigestHandler(stateSrvc) + require.NoError(t, err) + + coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + require.NoError(t, err) + require.NotNil(t, coreSrvc) +} + +func TestCreateBlockVerifier(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + _, err = createBlockVerifier(stateSrvc) + require.NoError(t, err) +} + +func TestCreateSyncService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + require.NotNil(t, ks) + + ver, err := createBlockVerifier(stateSrvc) + require.NoError(t, err) + + dh, err := createDigestHandler(stateSrvc) + require.NoError(t, err) + + coreSrvc, err := createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) + require.NoError(t, err) + + _, err = newSyncService(cfg, stateSrvc, &grandpa.Service{}, ver, coreSrvc, &network.Service{}) + require.NoError(t, err) +} + +// TestCreateNetworkService tests the createNetworkService method +func TestCreateNetworkService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + networkSrvc, err := createNetworkService(cfg, stateSrvc) + require.NoError(t, err) + require.NotNil(t, networkSrvc) +} + +// TestCreateRPCService tests the createRPCService method +func TestCreateRPCService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Core.BabeAuthority = false + cfg.Core.GrandpaAuthority = false + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + networkSrvc := &network.Service{} + + ks := keystore.NewGlobalKeystore() + ed25519Keyring, _ := keystore.NewEd25519Keyring() + ks.Gran.Insert(ed25519Keyring.Alice()) + + ns, err := createRuntimeStorage(stateSrvc) + require.NoError(t, err) + err = loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) + require.NoError(t, err) + + dh, err := createDigestHandler(stateSrvc) + require.NoError(t, err) + + coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + require.NoError(t, err) + + sysSrvc, err := createSystemService(&cfg.System, stateSrvc) + require.NoError(t, err) + + rpcSrvc, err := createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, nil, sysSrvc, nil) + require.NoError(t, err) + require.NotNil(t, rpcSrvc) +} + +func TestCreateBABEService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + kr, err := keystore.NewSr25519Keyring() + require.NoError(t, err) + ks.Babe.Insert(kr.Alice()) + + ns, err := createRuntimeStorage(stateSrvc) + require.NoError(t, err) + err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) + require.NoError(t, err) + + dh, err := createDigestHandler(stateSrvc) + require.NoError(t, err) + + coreSrvc, err := createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) + require.NoError(t, err) + + bs, err := createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) + require.NoError(t, err) + require.NotNil(t, bs) +} + +func TestCreateGrandpaService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.AuthorityRole + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + kr, err := keystore.NewEd25519Keyring() + require.NoError(t, err) + ks.Gran.Insert(kr.Alice()) + + ns, err := createRuntimeStorage(stateSrvc) + require.NoError(t, err) + + err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) + require.NoError(t, err) + + dh, err := createDigestHandler(stateSrvc) + require.NoError(t, err) + + gs, err := createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, &network.Service{}) + require.NoError(t, err) + require.NotNil(t, gs) +} + +var addr = flag.String("addr", "localhost:8546", "http service address") +var testCalls = []struct { + call []byte + expected []byte +}{ + {[]byte(`{"jsonrpc":"2.0","method":"system_name","params":[],"id":1}`), []byte(`{"id":1,"jsonrpc":"2.0","result":"gossamer"}` + "\n")}, // working request + {[]byte(`{"jsonrpc":"2.0","method":"unknown","params":[],"id":2}`), []byte(`{"error":{"code":-32000,"data":null,"message":"rpc error method unknown not found"},"id":2,"jsonrpc":"2.0"}` + "\n")}, // unknown method + {[]byte{}, []byte(`{"jsonrpc":"2.0","error":{"code":-32600,"message":"Invalid request"},"id":0}` + "\n")}, // empty request + {[]byte(`{"jsonrpc":"2.0","method":"chain_subscribeNewHeads","params":[],"id":3}`), []byte(`{"jsonrpc":"2.0","result":1,"id":3}` + "\n")}, + {[]byte(`{"jsonrpc":"2.0","method":"state_subscribeStorage","params":[],"id":4}`), []byte(`{"jsonrpc":"2.0","result":2,"id":4}` + "\n")}, +} + +func TestNewWebSocketServer(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Core.BabeAuthority = false + cfg.Core.GrandpaAuthority = false + cfg.Init.Genesis = genFile.Name() + cfg.RPC.External = false + cfg.RPC.WS = true + cfg.RPC.WSExternal = false + cfg.System.SystemName = "gossamer" + + err := InitNode(cfg) + require.Nil(t, err) + + stateSrvc, err := createStateService(cfg) + require.Nil(t, err) + + networkSrvc := &network.Service{} + + ks := keystore.NewGlobalKeystore() + ed25519Keyring, _ := keystore.NewEd25519Keyring() + ks.Gran.Insert(ed25519Keyring.Alice()) + + ns, err := createRuntimeStorage(stateSrvc) + require.NoError(t, err) + err = loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) + require.NoError(t, err) + + dh, err := createDigestHandler(stateSrvc) + require.NoError(t, err) + + coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + require.Nil(t, err) + + sysSrvc, err := createSystemService(&cfg.System, stateSrvc) + require.NoError(t, err) + + rpcSrvc, err := createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, nil, sysSrvc, nil) + require.NoError(t, err) + err = rpcSrvc.Start() + require.Nil(t, err) + + time.Sleep(time.Second) // give server a second to start + + u := url.URL{Scheme: "ws", Host: *addr, Path: "/"} + + c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) + require.NoError(t, err) + defer c.Close() + + for _, item := range testCalls { + err = c.WriteMessage(websocket.TextMessage, item.call) + require.Nil(t, err) + + _, message, err := c.ReadMessage() + require.Nil(t, err) + require.Equal(t, item.expected, message) + } +} diff --git a/dot/services_test.go b/dot/services_test.go index 7bd1071114..165991c8ba 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -15,353 +15,3 @@ // along with the gossamer library. If not, see . package dot - -import ( - "flag" - "net/url" - "testing" - "time" - - "github.com/ChainSafe/gossamer/dot/network" - "github.com/ChainSafe/gossamer/dot/types" - "github.com/ChainSafe/gossamer/lib/grandpa" - "github.com/ChainSafe/gossamer/lib/keystore" - "github.com/ChainSafe/gossamer/lib/utils" - - "github.com/gorilla/websocket" - "github.com/stretchr/testify/require" -) - -// TestCreateStateService tests the createStateService method -func TestCreateStateService(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.Nil(t, err) - - stateSrvc, err := createStateService(cfg) - require.Nil(t, err) - require.NotNil(t, stateSrvc) -} - -// TestCreateCoreService tests the createCoreService method -func TestCreateCoreService(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Core.Roles = types.FullNodeRole - cfg.Core.BabeAuthority = false - cfg.Core.GrandpaAuthority = false - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) - - stateSrvc, err := createStateService(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - require.NotNil(t, ks) - ed25519Keyring, _ := keystore.NewEd25519Keyring() - ks.Gran.Insert(ed25519Keyring.Alice()) - - networkSrvc := &network.Service{} - - dh, err := createDigestHandler(stateSrvc) - require.NoError(t, err) - - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) - require.NoError(t, err) - require.NotNil(t, coreSrvc) -} - -func TestCreateBlockVerifier(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) - - stateSrvc, err := createStateService(cfg) - require.NoError(t, err) - - _, err = createBlockVerifier(stateSrvc) - require.NoError(t, err) -} - -func TestCreateSyncService(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) - - stateSrvc, err := createStateService(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - require.NotNil(t, ks) - - ver, err := createBlockVerifier(stateSrvc) - require.NoError(t, err) - - dh, err := createDigestHandler(stateSrvc) - require.NoError(t, err) - - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) - require.NoError(t, err) - - _, err = newSyncService(cfg, stateSrvc, &grandpa.Service{}, ver, coreSrvc, &network.Service{}) - require.NoError(t, err) -} - -// TestCreateNetworkService tests the createNetworkService method -func TestCreateNetworkService(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) - - stateSrvc, err := createStateService(cfg) - require.NoError(t, err) - - networkSrvc, err := createNetworkService(cfg, stateSrvc) - require.NoError(t, err) - require.NotNil(t, networkSrvc) -} - -// TestCreateRPCService tests the createRPCService method -func TestCreateRPCService(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Core.Roles = types.FullNodeRole - cfg.Core.BabeAuthority = false - cfg.Core.GrandpaAuthority = false - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) - - stateSrvc, err := createStateService(cfg) - require.NoError(t, err) - - networkSrvc := &network.Service{} - - ks := keystore.NewGlobalKeystore() - ed25519Keyring, _ := keystore.NewEd25519Keyring() - ks.Gran.Insert(ed25519Keyring.Alice()) - - ns, err := createRuntimeStorage(stateSrvc) - require.NoError(t, err) - err = loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) - require.NoError(t, err) - - dh, err := createDigestHandler(stateSrvc) - require.NoError(t, err) - - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) - require.NoError(t, err) - - sysSrvc, err := createSystemService(&cfg.System, stateSrvc) - require.NoError(t, err) - - rpcSrvc, err := createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, nil, sysSrvc, nil) - require.NoError(t, err) - require.NotNil(t, rpcSrvc) -} - -func TestCreateBABEService(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Core.Roles = types.FullNodeRole - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) - - stateSrvc, err := createStateService(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - kr, err := keystore.NewSr25519Keyring() - require.NoError(t, err) - ks.Babe.Insert(kr.Alice()) - - ns, err := createRuntimeStorage(stateSrvc) - require.NoError(t, err) - err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) - require.NoError(t, err) - - dh, err := createDigestHandler(stateSrvc) - require.NoError(t, err) - - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) - require.NoError(t, err) - - bs, err := createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) - require.NoError(t, err) - require.NotNil(t, bs) -} - -func TestCreateGrandpaService(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Core.Roles = types.AuthorityRole - cfg.Init.Genesis = genFile.Name() - - err := InitNode(cfg) - require.NoError(t, err) - - stateSrvc, err := createStateService(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - kr, err := keystore.NewEd25519Keyring() - require.NoError(t, err) - ks.Gran.Insert(kr.Alice()) - - ns, err := createRuntimeStorage(stateSrvc) - require.NoError(t, err) - - err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) - require.NoError(t, err) - - dh, err := createDigestHandler(stateSrvc) - require.NoError(t, err) - - gs, err := createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, &network.Service{}) - require.NoError(t, err) - require.NotNil(t, gs) -} - -var addr = flag.String("addr", "localhost:8546", "http service address") -var testCalls = []struct { - call []byte - expected []byte -}{ - {[]byte(`{"jsonrpc":"2.0","method":"system_name","params":[],"id":1}`), []byte(`{"id":1,"jsonrpc":"2.0","result":"gossamer"}` + "\n")}, // working request - {[]byte(`{"jsonrpc":"2.0","method":"unknown","params":[],"id":2}`), []byte(`{"error":{"code":-32000,"data":null,"message":"rpc error method unknown not found"},"id":2,"jsonrpc":"2.0"}` + "\n")}, // unknown method - {[]byte{}, []byte(`{"jsonrpc":"2.0","error":{"code":-32600,"message":"Invalid request"},"id":0}` + "\n")}, // empty request - {[]byte(`{"jsonrpc":"2.0","method":"chain_subscribeNewHeads","params":[],"id":3}`), []byte(`{"jsonrpc":"2.0","result":1,"id":3}` + "\n")}, - {[]byte(`{"jsonrpc":"2.0","method":"state_subscribeStorage","params":[],"id":4}`), []byte(`{"jsonrpc":"2.0","result":2,"id":4}` + "\n")}, -} - -func TestNewWebSocketServer(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Core.Roles = types.FullNodeRole - cfg.Core.BabeAuthority = false - cfg.Core.GrandpaAuthority = false - cfg.Init.Genesis = genFile.Name() - cfg.RPC.External = false - cfg.RPC.WS = true - cfg.RPC.WSExternal = false - cfg.System.SystemName = "gossamer" - - err := InitNode(cfg) - require.Nil(t, err) - - stateSrvc, err := createStateService(cfg) - require.Nil(t, err) - - networkSrvc := &network.Service{} - - ks := keystore.NewGlobalKeystore() - ed25519Keyring, _ := keystore.NewEd25519Keyring() - ks.Gran.Insert(ed25519Keyring.Alice()) - - ns, err := createRuntimeStorage(stateSrvc) - require.NoError(t, err) - err = loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) - require.NoError(t, err) - - dh, err := createDigestHandler(stateSrvc) - require.NoError(t, err) - - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) - require.Nil(t, err) - - sysSrvc, err := createSystemService(&cfg.System, stateSrvc) - require.NoError(t, err) - - rpcSrvc, err := createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, nil, sysSrvc, nil) - require.NoError(t, err) - err = rpcSrvc.Start() - require.Nil(t, err) - - time.Sleep(time.Second) // give server a second to start - - u := url.URL{Scheme: "ws", Host: *addr, Path: "/"} - - c, _, err := websocket.DefaultDialer.Dial(u.String(), nil) - require.NoError(t, err) - defer c.Close() - - for _, item := range testCalls { - err = c.WriteMessage(websocket.TextMessage, item.call) - require.Nil(t, err) - - _, message, err := c.ReadMessage() - require.Nil(t, err) - require.Equal(t, item.expected, message) - } -} From 9042ce946e690abbd32338307243427ecbe44e4a Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 2 Nov 2021 16:44:40 -0400 Subject: [PATCH 07/43] fix name --- dot/{service_integration_test.go => services_integration_test.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename dot/{service_integration_test.go => services_integration_test.go} (100%) diff --git a/dot/service_integration_test.go b/dot/services_integration_test.go similarity index 100% rename from dot/service_integration_test.go rename to dot/services_integration_test.go From 12543422738b3fc5c330a3149db10297ebd83465 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 2 Nov 2021 16:46:39 -0400 Subject: [PATCH 08/43] move utils_tests --- dot/utils_integration_test.go | 197 ++++++++++++++++++++++++++++++++++ dot/utils_test.go | 177 ------------------------------ 2 files changed, 197 insertions(+), 177 deletions(-) create mode 100644 dot/utils_integration_test.go diff --git a/dot/utils_integration_test.go b/dot/utils_integration_test.go new file mode 100644 index 0000000000..ec2086cb3d --- /dev/null +++ b/dot/utils_integration_test.go @@ -0,0 +1,197 @@ +//go:build integration +// +build integration + +// Copyright 2020 ChainSafe Systems (ON) Corp. +// This file is part of gossamer. +// +// The gossamer library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The gossamer library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the gossamer library. If not, see . + +package dot + +import ( + "log" + "os" + "runtime" + "testing" + "time" + + "github.com/ChainSafe/gossamer/lib/genesis" + "github.com/ChainSafe/gossamer/lib/trie" + "github.com/ChainSafe/gossamer/lib/utils" + "github.com/stretchr/testify/require" +) + +// TestNewConfig tests the NewTestConfig method +func TestNewConfig(t *testing.T) { + cfg := NewTestConfig(t) + defer utils.RemoveTestDir(t) + require.NotNil(t, cfg) +} + +// TestNewConfigAndFile tests the NewTestConfigWithFile method +func TestNewConfigAndFile(t *testing.T) { + testCfg, testCfgFile := NewTestConfigWithFile(t) + defer utils.RemoveTestDir(t) + require.NotNil(t, testCfg) + require.NotNil(t, testCfgFile) +} + +// TestInitNode +func TestNewTestGenesis(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() +} + +func TestNewTestGenesisFile(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genHRFile := NewTestGenesisFile(t, cfg) + require.NotNil(t, genHRFile) + defer os.Remove(genHRFile.Name()) + + genRawFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genRawFile) + defer os.Remove(genRawFile.Name()) + + genHR, err := genesis.NewGenesisFromJSON(genHRFile.Name(), 0) + require.NoError(t, err) + genRaw, err := genesis.NewGenesisFromJSONRaw(genRawFile.Name()) + require.NoError(t, err) + + // values from raw genesis file should equal values generated from human readable genesis file + require.Equal(t, genRaw.Genesis.Raw["top"], genHR.Genesis.Raw["top"]) +} + +func TestDeepCopyVsSnapshot(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genRawFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genRawFile) + + defer os.Remove(genRawFile.Name()) + + genRaw, err := genesis.NewGenesisFromJSONRaw(genRawFile.Name()) + require.NoError(t, err) + + tri := trie.NewEmptyTrie() + var ttlLenght int + for k, v := range genRaw.Genesis.Raw["top"] { + val := []byte(v) + ttlLenght += len(val) + tri.Put([]byte(k), val) + } + + testCases := []struct { + name string + fn func(tri *trie.Trie) (*trie.Trie, error) + }{ + {"DeepCopy", func(tri *trie.Trie) (*trie.Trie, error) { + return tri.DeepCopy() + }}, + {"Snapshot", func(tri *trie.Trie) (*trie.Trie, error) { + return tri.Snapshot(), nil + }}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + trieMap := make(map[int]*trie.Trie) + start := time.Now() + var m runtime.MemStats + for i := 0; i <= 200; i++ { + newTrie, err := tc.fn(tri) + require.NoError(t, err) + + runtime.ReadMemStats(&m) + trieMap[i] = newTrie + } + + log.Printf("\nAlloc = %v MB \nTotalAlloc = %v MB \nSys = %v MB \nNumGC = %v \n\n", m.Alloc/(1024*1024), m.TotalAlloc/(1024*1024), m.Sys/(1024*1024), m.NumGC) + elapsed := time.Since(start) + log.Printf("DeepCopy to trie took %s", elapsed) + runtime.GC() + }) + } +} + +func TestTrieSnapshot(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genRawFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genRawFile) + + defer os.Remove(genRawFile.Name()) + + genRaw, err := genesis.NewGenesisFromJSONRaw(genRawFile.Name()) + require.NoError(t, err) + + tri := trie.NewEmptyTrie() + key := []byte("key") + value := []byte("value") + + for k, v := range genRaw.Genesis.Raw["top"] { + val := []byte(v) + tri.Put([]byte(k), val) + } + + // DeepCopy the trie. + dcTrie, err := tri.DeepCopy() + require.NoError(t, err) + + // Take Snapshot of the trie. + newTrie := tri.Snapshot() + + // Get the Trie root hash for all the 3 tries. + tHash, err := tri.Hash() + require.NoError(t, err) + + dcTrieHash, err := dcTrie.Hash() + require.NoError(t, err) + + newTrieHash, err := newTrie.Hash() + require.NoError(t, err) + + // Root hash for the 3 tries should be equal. + require.Equal(t, tHash, dcTrieHash) + require.Equal(t, tHash, newTrieHash) + + // Modify the current trie. + value[0] = 'w' + newTrie.Put(key, value) + + // Get the updated root hash of all tries. + tHash, err = tri.Hash() + require.NoError(t, err) + + dcTrieHash, err = dcTrie.Hash() + require.NoError(t, err) + + newTrieHash, err = newTrie.Hash() + require.NoError(t, err) + + // Only the current trie should have a different root hash since it is updated. + require.NotEqual(t, newTrieHash, dcTrieHash) + require.NotEqual(t, newTrieHash, tHash) + require.Equal(t, dcTrieHash, tHash) +} diff --git a/dot/utils_test.go b/dot/utils_test.go index 63be0d3dd3..165991c8ba 100644 --- a/dot/utils_test.go +++ b/dot/utils_test.go @@ -15,180 +15,3 @@ // along with the gossamer library. If not, see . package dot - -import ( - "log" - "os" - "runtime" - "testing" - "time" - - "github.com/ChainSafe/gossamer/lib/genesis" - "github.com/ChainSafe/gossamer/lib/trie" - "github.com/ChainSafe/gossamer/lib/utils" - "github.com/stretchr/testify/require" -) - -// TestNewConfig tests the NewTestConfig method -func TestNewConfig(t *testing.T) { - cfg := NewTestConfig(t) - defer utils.RemoveTestDir(t) - require.NotNil(t, cfg) -} - -// TestNewConfigAndFile tests the NewTestConfigWithFile method -func TestNewConfigAndFile(t *testing.T) { - testCfg, testCfgFile := NewTestConfigWithFile(t) - defer utils.RemoveTestDir(t) - require.NotNil(t, testCfg) - require.NotNil(t, testCfgFile) -} - -// TestInitNode -func TestNewTestGenesis(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() -} - -func TestNewTestGenesisFile(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genHRFile := NewTestGenesisFile(t, cfg) - require.NotNil(t, genHRFile) - defer os.Remove(genHRFile.Name()) - - genRawFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genRawFile) - defer os.Remove(genRawFile.Name()) - - genHR, err := genesis.NewGenesisFromJSON(genHRFile.Name(), 0) - require.NoError(t, err) - genRaw, err := genesis.NewGenesisFromJSONRaw(genRawFile.Name()) - require.NoError(t, err) - - // values from raw genesis file should equal values generated from human readable genesis file - require.Equal(t, genRaw.Genesis.Raw["top"], genHR.Genesis.Raw["top"]) -} - -func TestDeepCopyVsSnapshot(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genRawFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genRawFile) - - defer os.Remove(genRawFile.Name()) - - genRaw, err := genesis.NewGenesisFromJSONRaw(genRawFile.Name()) - require.NoError(t, err) - - tri := trie.NewEmptyTrie() - var ttlLenght int - for k, v := range genRaw.Genesis.Raw["top"] { - val := []byte(v) - ttlLenght += len(val) - tri.Put([]byte(k), val) - } - - testCases := []struct { - name string - fn func(tri *trie.Trie) (*trie.Trie, error) - }{ - {"DeepCopy", func(tri *trie.Trie) (*trie.Trie, error) { - return tri.DeepCopy() - }}, - {"Snapshot", func(tri *trie.Trie) (*trie.Trie, error) { - return tri.Snapshot(), nil - }}, - } - - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - trieMap := make(map[int]*trie.Trie) - start := time.Now() - var m runtime.MemStats - for i := 0; i <= 200; i++ { - newTrie, err := tc.fn(tri) - require.NoError(t, err) - - runtime.ReadMemStats(&m) - trieMap[i] = newTrie - } - - log.Printf("\nAlloc = %v MB \nTotalAlloc = %v MB \nSys = %v MB \nNumGC = %v \n\n", m.Alloc/(1024*1024), m.TotalAlloc/(1024*1024), m.Sys/(1024*1024), m.NumGC) - elapsed := time.Since(start) - log.Printf("DeepCopy to trie took %s", elapsed) - runtime.GC() - }) - } -} - -func TestTrieSnapshot(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genRawFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genRawFile) - - defer os.Remove(genRawFile.Name()) - - genRaw, err := genesis.NewGenesisFromJSONRaw(genRawFile.Name()) - require.NoError(t, err) - - tri := trie.NewEmptyTrie() - key := []byte("key") - value := []byte("value") - - for k, v := range genRaw.Genesis.Raw["top"] { - val := []byte(v) - tri.Put([]byte(k), val) - } - - // DeepCopy the trie. - dcTrie, err := tri.DeepCopy() - require.NoError(t, err) - - // Take Snapshot of the trie. - newTrie := tri.Snapshot() - - // Get the Trie root hash for all the 3 tries. - tHash, err := tri.Hash() - require.NoError(t, err) - - dcTrieHash, err := dcTrie.Hash() - require.NoError(t, err) - - newTrieHash, err := newTrie.Hash() - require.NoError(t, err) - - // Root hash for the 3 tries should be equal. - require.Equal(t, tHash, dcTrieHash) - require.Equal(t, tHash, newTrieHash) - - // Modify the current trie. - value[0] = 'w' - newTrie.Put(key, value) - - // Get the updated root hash of all tries. - tHash, err = tri.Hash() - require.NoError(t, err) - - dcTrieHash, err = dcTrie.Hash() - require.NoError(t, err) - - newTrieHash, err = newTrie.Hash() - require.NoError(t, err) - - // Only the current trie should have a different root hash since it is updated. - require.NotEqual(t, newTrieHash, dcTrieHash) - require.NotEqual(t, newTrieHash, tHash) - require.Equal(t, dcTrieHash, tHash) -} From 974b3b295df00e468c0e8961df8af8fc81b5d05c Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Wed, 3 Nov 2021 16:13:39 -0400 Subject: [PATCH 09/43] add build_spec unit tests --- dot/build_spec_integration_test.go | 6 +- dot/build_spec_test.go | 193 +++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+), 3 deletions(-) diff --git a/dot/build_spec_integration_test.go b/dot/build_spec_integration_test.go index 24e66e22b6..9a9f7dece2 100644 --- a/dot/build_spec_integration_test.go +++ b/dot/build_spec_integration_test.go @@ -30,7 +30,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestBuildFromGenesis(t *testing.T) { +func TestBuildFromGenesis_Integration(t *testing.T) { file, err := genesis.CreateTestGenesisJSONFile(false) defer os.Remove(file) require.NoError(t, err) @@ -89,7 +89,7 @@ func TestWriteGenesisSpecFileWhenFileAlreadyExists(t *testing.T) { fmt.Sprintf("file %s already exists, rename to avoid overwritten", f.Name())) } -func TestWriteGenesisSpecFile(t *testing.T) { +func TestWriteGenesisSpecFile_Integration(t *testing.T) { cfg := NewTestConfig(t) cfg.Init.Genesis = "../chain/gssmr/genesis.json" @@ -133,7 +133,7 @@ func TestWriteGenesisSpecFile(t *testing.T) { } } -func TestBuildFromDB(t *testing.T) { +func TestBuildFromDB_Integration(t *testing.T) { // setup expected cfg := NewTestConfig(t) cfg.Init.Genesis = "../chain/gssmr/genesis.json" diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index adb708a978..aac41c50b1 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -14,3 +14,196 @@ // You should have received a copy of the GNU Lesser General Public License // along with the gossamer library. If not, see . package dot + +import ( + "github.com/ChainSafe/gossamer/lib/genesis" + "github.com/stretchr/testify/require" + "os" + "reflect" + "testing" +) + +func TestBuildSpec_ToJSON(t *testing.T) { + type fields struct { + genesis *genesis.Genesis + } + tests := []struct { + name string + fields fields + want []byte + wantErr bool + }{ + { + name: "normal conditions", + fields: fields{genesis: &genesis.Genesis{Name: "test"}}, + want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, + wantErr: false, + }, + // todo determine test case for error condition (How to create input to json.Marshal that will error) + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + b := &BuildSpec{ + genesis: tt.fields.genesis, + } + got, err := b.ToJSON() + if (err != nil) != tt.wantErr { + t.Errorf("ToJSON() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("ToJSON() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestBuildFromDB(t *testing.T) { + type args struct { + path string + } + tests := []struct { + name string + args args + want *BuildSpec + wantErr bool + }{ + {name: "invalid db path", args: args{path: "foo/bar"}, wantErr: true}, + // TODO: not sure how to test this since it's comparing pointers that I don't have reference to. + {name: "normal conditions", args: args{path: "test_data/TestBuildFromDB"}, want: &BuildSpec{genesis: &genesis.Genesis{}}}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := BuildFromDB(tt.args.path) + if (err != nil) != tt.wantErr { + t.Errorf("BuildFromDB() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("BuildFromDB() got = %v, want %v", got, tt.want) + } + if tt.wantErr { + // remove file created during error conditions + err := os.RemoveAll(tt.args.path) + require.NoError(t, err) + } + }) + } +} + +func TestBuildFromGenesis(t *testing.T) { + // setup test file + file, err := genesis.CreateTestGenesisJSONFile(false) + require.NoError(t, err) + defer os.Remove(file) + + type args struct { + path string + authCount int + } + tests := []struct { + name string + args args + want *BuildSpec + wantErr bool + }{ + { + name: "invalid file path", + args: args{ + path: "invalid/path", + authCount: 0, + }, + wantErr: true, + }, + // TODO: not sure how to test this since it's comparing pointers that I don't have reference to. + { + name: "normal conditions", + args: args{ + path: file, + authCount: 0, + }, + want: &BuildSpec{genesis: &genesis.Genesis{}}, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := BuildFromGenesis(tt.args.path, tt.args.authCount) + if (err != nil) != tt.wantErr { + t.Errorf("BuildFromGenesis() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("BuildFromGenesis() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestBuildSpec_ToJSONRaw(t *testing.T) { + type fields struct { + genesis *genesis.Genesis + } + tests := []struct { + name string + fields fields + want []byte + wantErr bool + }{ + { + name: "normal conditions", + fields: fields{genesis: &genesis.Genesis{Name: "test"}}, + want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, + }, + // todo determine test case for error condition (How to create input to json.Marshal that will error) + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + b := &BuildSpec{ + genesis: tt.fields.genesis, + } + got, err := b.ToJSONRaw() + if (err != nil) != tt.wantErr { + t.Errorf("ToJSONRaw() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("ToJSONRaw() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWriteGenesisSpecFile(t *testing.T) { + + file, err := os.Create("test.txt") + require.NoError(t, err) + defer os.Remove(file.Name()) + + type args struct { + data []byte + fp string + } + tests := []struct { + name string + args args + wantErr bool + }{ + {name: "normal conditions", args: args{ + data: []byte{1}, + fp: "test.file", + }}, + {name: "existing file", args: args{ + data: []byte{1}, + fp: file.Name(), + }, wantErr: true}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := WriteGenesisSpecFile(tt.args.data, tt.args.fp); (err != nil) != tt.wantErr { + t.Errorf("WriteGenesisSpecFile() error = %v, wantErr %v", err, tt.wantErr) + } + os.Remove(tt.args.fp) + }) + } +} From 73d870a044e520ce4f203c34a93eda672ec0b13b Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Fri, 5 Nov 2021 16:26:40 -0400 Subject: [PATCH 10/43] refactor tests --- dot/build_spec_test.go | 140 ++++++++++++++++++++--------------------- 1 file changed, 69 insertions(+), 71 deletions(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index aac41c50b1..f8913866bc 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -16,10 +16,10 @@ package dot import ( + "errors" "github.com/ChainSafe/gossamer/lib/genesis" - "github.com/stretchr/testify/require" + "github.com/stretchr/testify/assert" "os" - "reflect" "testing" ) @@ -28,18 +28,16 @@ func TestBuildSpec_ToJSON(t *testing.T) { genesis *genesis.Genesis } tests := []struct { - name string - fields fields - want []byte - wantErr bool + name string + fields fields + want []byte + err error }{ { - name: "normal conditions", - fields: fields{genesis: &genesis.Genesis{Name: "test"}}, - want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, - wantErr: false, + name: "normal conditions", + fields: fields{genesis: &genesis.Genesis{Name: "test"}}, + want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, }, - // todo determine test case for error condition (How to create input to json.Marshal that will error) } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -47,46 +45,49 @@ func TestBuildSpec_ToJSON(t *testing.T) { genesis: tt.fields.genesis, } got, err := b.ToJSON() - if (err != nil) != tt.wantErr { - t.Errorf("ToJSON() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToJSON() got = %v, want %v", got, tt.want) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } + assert.Equal(t, tt.want, got) }) } } func TestBuildFromDB(t *testing.T) { + // initialise node (initialise state database and load genesis data) + cfg := NewTestConfig(t) + cfg.Init.Genesis = "../chain/gssmr/genesis.json" + err := InitNode(cfg) + assert.NoError(t, err) + type args struct { path string } tests := []struct { - name string - args args - want *BuildSpec - wantErr bool + name string + args args + want *BuildSpec + err error }{ - {name: "invalid db path", args: args{path: "foo/bar"}, wantErr: true}, - // TODO: not sure how to test this since it's comparing pointers that I don't have reference to. - {name: "normal conditions", args: args{path: "test_data/TestBuildFromDB"}, want: &BuildSpec{genesis: &genesis.Genesis{}}}, + {name: "normal conditions", args: args{path: "test_data/TestBuildFromDB"}, want: &BuildSpec{genesis: &genesis.Genesis{Name: "Gossamer"}}}, + {name: "invalid db path", args: args{path: "foo/bar"}, err: errors.New("failed to create block state: cannot get block 0: Key not found")}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := BuildFromDB(tt.args.path) - if (err != nil) != tt.wantErr { - t.Errorf("BuildFromDB() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("BuildFromDB() got = %v, want %v", got, tt.want) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if tt.wantErr { - // remove file created during error conditions - err := os.RemoveAll(tt.args.path) - require.NoError(t, err) + if tt.want != nil { + assert.Equal(t, tt.want.genesis.Name, got.genesis.Name) } + // remove files created for tests + err = os.RemoveAll(tt.args.path) + assert.NoError(t, err) }) } } @@ -94,7 +95,7 @@ func TestBuildFromDB(t *testing.T) { func TestBuildFromGenesis(t *testing.T) { // setup test file file, err := genesis.CreateTestGenesisJSONFile(false) - require.NoError(t, err) + assert.NoError(t, err) defer os.Remove(file) type args struct { @@ -102,39 +103,36 @@ func TestBuildFromGenesis(t *testing.T) { authCount int } tests := []struct { - name string - args args - want *BuildSpec - wantErr bool + name string + args args + want *BuildSpec + err error }{ { name: "invalid file path", args: args{ - path: "invalid/path", - authCount: 0, + path: "/invalid/path", }, - wantErr: true, + err: errors.New("open /invalid/path: no such file or directory"), }, - // TODO: not sure how to test this since it's comparing pointers that I don't have reference to. { name: "normal conditions", args: args{ - path: file, - authCount: 0, + path: file, }, - want: &BuildSpec{genesis: &genesis.Genesis{}}, - wantErr: false, + want: &BuildSpec{genesis: &genesis.Genesis{Name: "test"}}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := BuildFromGenesis(tt.args.path, tt.args.authCount) - if (err != nil) != tt.wantErr { - t.Errorf("BuildFromGenesis() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("BuildFromGenesis() got = %v, want %v", got, tt.want) + if tt.want != nil { + assert.Equal(t, tt.want.genesis.Name, got.genesis.Name) } }) } @@ -145,17 +143,16 @@ func TestBuildSpec_ToJSONRaw(t *testing.T) { genesis *genesis.Genesis } tests := []struct { - name string - fields fields - want []byte - wantErr bool + name string + fields fields + want []byte + err error }{ { name: "normal conditions", fields: fields{genesis: &genesis.Genesis{Name: "test"}}, want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, }, - // todo determine test case for error condition (How to create input to json.Marshal that will error) } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -163,21 +160,19 @@ func TestBuildSpec_ToJSONRaw(t *testing.T) { genesis: tt.fields.genesis, } got, err := b.ToJSONRaw() - if (err != nil) != tt.wantErr { - t.Errorf("ToJSONRaw() error = %v, wantErr %v", err, tt.wantErr) - return - } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("ToJSONRaw() got = %v, want %v", got, tt.want) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } + assert.Equal(t, tt.want, got) }) } } func TestWriteGenesisSpecFile(t *testing.T) { - file, err := os.Create("test.txt") - require.NoError(t, err) + assert.NoError(t, err) defer os.Remove(file.Name()) type args struct { @@ -185,9 +180,9 @@ func TestWriteGenesisSpecFile(t *testing.T) { fp string } tests := []struct { - name string - args args - wantErr bool + name string + args args + err error }{ {name: "normal conditions", args: args{ data: []byte{1}, @@ -196,12 +191,15 @@ func TestWriteGenesisSpecFile(t *testing.T) { {name: "existing file", args: args{ data: []byte{1}, fp: file.Name(), - }, wantErr: true}, + }, err: errors.New("file test.txt already exists, rename to avoid overwriting")}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := WriteGenesisSpecFile(tt.args.data, tt.args.fp); (err != nil) != tt.wantErr { - t.Errorf("WriteGenesisSpecFile() error = %v, wantErr %v", err, tt.wantErr) + err := WriteGenesisSpecFile(tt.args.data, tt.args.fp) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } os.Remove(tt.args.fp) }) From 84321d73cd3c78d1344e594118e3464a35ff8d60 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Fri, 5 Nov 2021 16:47:55 -0400 Subject: [PATCH 11/43] lint --- dot/build_spec_integration_test.go | 6 ++++-- dot/build_spec_test.go | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dot/build_spec_integration_test.go b/dot/build_spec_integration_test.go index 9a9f7dece2..3eeb948c4d 100644 --- a/dot/build_spec_integration_test.go +++ b/dot/build_spec_integration_test.go @@ -30,6 +30,8 @@ import ( "github.com/stretchr/testify/require" ) +const genesisLocation = "../chain/gssmr/genesis.json" + func TestBuildFromGenesis_Integration(t *testing.T) { file, err := genesis.CreateTestGenesisJSONFile(false) defer os.Remove(file) @@ -91,7 +93,7 @@ func TestWriteGenesisSpecFileWhenFileAlreadyExists(t *testing.T) { func TestWriteGenesisSpecFile_Integration(t *testing.T) { cfg := NewTestConfig(t) - cfg.Init.Genesis = "../chain/gssmr/genesis.json" + cfg.Init.Genesis = genesisLocation expected, err := genesis.NewGenesisFromJSONRaw(cfg.Init.Genesis) require.NoError(t, err) @@ -136,7 +138,7 @@ func TestWriteGenesisSpecFile_Integration(t *testing.T) { func TestBuildFromDB_Integration(t *testing.T) { // setup expected cfg := NewTestConfig(t) - cfg.Init.Genesis = "../chain/gssmr/genesis.json" + cfg.Init.Genesis = genesisLocation expected, err := genesis.NewGenesisFromJSONRaw(cfg.Init.Genesis) require.NoError(t, err) // initialise node (initialise state database and load genesis data) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index f8913866bc..d405aabf92 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -17,10 +17,11 @@ package dot import ( "errors" - "github.com/ChainSafe/gossamer/lib/genesis" - "github.com/stretchr/testify/assert" "os" "testing" + + "github.com/ChainSafe/gossamer/lib/genesis" + "github.com/stretchr/testify/assert" ) func TestBuildSpec_ToJSON(t *testing.T) { From 28ce8082732e9cfd1bf7d0b917d7eb1d5ac4dbf0 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Sat, 6 Nov 2021 09:56:47 -0400 Subject: [PATCH 12/43] generate tests stubs --- dot/config_integration_test.go | 2 +- dot/config_test.go | 220 +++++++++++++++++++ dot/import_integration_test.go | 2 +- dot/import_test.go | 83 +++++++ dot/node_integration_test.go | 6 +- dot/node_test.go | 211 ++++++++++++++++++ dot/services_test.go | 388 +++++++++++++++++++++++++++++++++ dot/utils_integration_test.go | 4 +- dot/utils_test.go | 252 +++++++++++++++++++++ 9 files changed, 1161 insertions(+), 7 deletions(-) diff --git a/dot/config_integration_test.go b/dot/config_integration_test.go index c71eb7f8d1..8beceafe9d 100644 --- a/dot/config_integration_test.go +++ b/dot/config_integration_test.go @@ -28,7 +28,7 @@ import ( ) // TestExportConfig tests exporting a toml configuration file -func TestExportConfig(t *testing.T) { +func TestExportConfig_Integration(t *testing.T) { cfg, cfgFile := NewTestConfigWithFile(t) require.NotNil(t, cfg) diff --git a/dot/config_test.go b/dot/config_test.go index 165991c8ba..138a0d9df5 100644 --- a/dot/config_test.go +++ b/dot/config_test.go @@ -15,3 +15,223 @@ // along with the gossamer library. If not, see . package dot + +import ( + "reflect" + "testing" + + "github.com/ChainSafe/gossamer/dot/types" +) + +func TestConfig_String(t *testing.T) { + type fields struct { + Global GlobalConfig + Log LogConfig + Init InitConfig + Account AccountConfig + Core CoreConfig + Network NetworkConfig + RPC RPCConfig + System types.SystemInfo + State StateConfig + } + tests := []struct { + name string + fields fields + want string + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + c := &Config{ + Global: tt.fields.Global, + Log: tt.fields.Log, + Init: tt.fields.Init, + Account: tt.fields.Account, + Core: tt.fields.Core, + Network: tt.fields.Network, + RPC: tt.fields.RPC, + System: tt.fields.System, + State: tt.fields.State, + } + if got := c.String(); got != tt.want { + t.Errorf("String() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestDevConfig(t *testing.T) { + tests := []struct { + name string + want *Config + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := DevConfig(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("DevConfig() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestGssmrConfig(t *testing.T) { + tests := []struct { + name string + want *Config + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := GssmrConfig(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("GssmrConfig() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestKusamaConfig(t *testing.T) { + tests := []struct { + name string + want *Config + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := KusamaConfig(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("KusamaConfig() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestPolkadotConfig(t *testing.T) { + tests := []struct { + name string + want *Config + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := PolkadotConfig(); !reflect.DeepEqual(got, tt.want) { + t.Errorf("PolkadotConfig() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestRPCConfig_isRPCEnabled(t *testing.T) { + type fields struct { + Enabled bool + External bool + Unsafe bool + UnsafeExternal bool + Port uint32 + Host string + Modules []string + WSPort uint32 + WS bool + WSExternal bool + WSUnsafe bool + WSUnsafeExternal bool + } + tests := []struct { + name string + fields fields + want bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := &RPCConfig{ + Enabled: tt.fields.Enabled, + External: tt.fields.External, + Unsafe: tt.fields.Unsafe, + UnsafeExternal: tt.fields.UnsafeExternal, + Port: tt.fields.Port, + Host: tt.fields.Host, + Modules: tt.fields.Modules, + WSPort: tt.fields.WSPort, + WS: tt.fields.WS, + WSExternal: tt.fields.WSExternal, + WSUnsafe: tt.fields.WSUnsafe, + WSUnsafeExternal: tt.fields.WSUnsafeExternal, + } + if got := r.isRPCEnabled(); got != tt.want { + t.Errorf("isRPCEnabled() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestRPCConfig_isWSEnabled(t *testing.T) { + type fields struct { + Enabled bool + External bool + Unsafe bool + UnsafeExternal bool + Port uint32 + Host string + Modules []string + WSPort uint32 + WS bool + WSExternal bool + WSUnsafe bool + WSUnsafeExternal bool + } + tests := []struct { + name string + fields fields + want bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r := &RPCConfig{ + Enabled: tt.fields.Enabled, + External: tt.fields.External, + Unsafe: tt.fields.Unsafe, + UnsafeExternal: tt.fields.UnsafeExternal, + Port: tt.fields.Port, + Host: tt.fields.Host, + Modules: tt.fields.Modules, + WSPort: tt.fields.WSPort, + WS: tt.fields.WS, + WSExternal: tt.fields.WSExternal, + WSUnsafe: tt.fields.WSUnsafe, + WSUnsafeExternal: tt.fields.WSUnsafeExternal, + } + if got := r.isWSEnabled(); got != tt.want { + t.Errorf("isWSEnabled() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_networkServiceEnabled(t *testing.T) { + type args struct { + cfg *Config + } + tests := []struct { + name string + args args + want bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := networkServiceEnabled(tt.args.cfg); got != tt.want { + t.Errorf("networkServiceEnabled() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/dot/import_integration_test.go b/dot/import_integration_test.go index 9257bd1f7c..60e8c1a340 100644 --- a/dot/import_integration_test.go +++ b/dot/import_integration_test.go @@ -93,7 +93,7 @@ func TestNewHeaderFromFile(t *testing.T) { require.Equal(t, expected, header) } -func TestImportState(t *testing.T) { +func TestImportState_Integration(t *testing.T) { basepath, err := ioutil.TempDir("", "gossamer-test-*") require.NoError(t, err) diff --git a/dot/import_test.go b/dot/import_test.go index 165991c8ba..2b4a1536a4 100644 --- a/dot/import_test.go +++ b/dot/import_test.go @@ -15,3 +15,86 @@ // along with the gossamer library. If not, see . package dot + +import ( + "reflect" + "testing" + + "github.com/ChainSafe/gossamer/dot/types" + "github.com/ChainSafe/gossamer/lib/trie" +) + +func TestImportState(t *testing.T) { + type args struct { + basepath string + stateFP string + headerFP string + firstSlot uint64 + } + tests := []struct { + name string + args args + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := ImportState(tt.args.basepath, tt.args.stateFP, tt.args.headerFP, tt.args.firstSlot); (err != nil) != tt.wantErr { + t.Errorf("ImportState() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_newHeaderFromFile(t *testing.T) { + type args struct { + filename string + } + tests := []struct { + name string + args args + want *types.Header + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := newHeaderFromFile(tt.args.filename) + if (err != nil) != tt.wantErr { + t.Errorf("newHeaderFromFile() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("newHeaderFromFile() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_newTrieFromPairs(t *testing.T) { + type args struct { + filename string + } + tests := []struct { + name string + args args + want *trie.Trie + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := newTrieFromPairs(tt.args.filename) + if (err != nil) != tt.wantErr { + t.Errorf("newTrieFromPairs() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("newTrieFromPairs() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/dot/node_integration_test.go b/dot/node_integration_test.go index fa98363602..392c938349 100644 --- a/dot/node_integration_test.go +++ b/dot/node_integration_test.go @@ -42,7 +42,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestInitNode(t *testing.T) { +func TestInitNode_Integration(t *testing.T) { cfg := NewTestConfig(t) require.NotNil(t, cfg) @@ -73,7 +73,7 @@ func TestInitNode_GenesisSpec(t *testing.T) { } // TestNodeInitialized -func TestNodeInitialized(t *testing.T) { +func TestNodeInitialized_Integration(t *testing.T) { cfg := NewTestConfig(t) require.NotNil(t, cfg) @@ -95,7 +95,7 @@ func TestNodeInitialized(t *testing.T) { } // TestNewNode -func TestNewNode(t *testing.T) { +func TestNewNode_Integration(t *testing.T) { cfg := NewTestConfig(t) require.NotNil(t, cfg) diff --git a/dot/node_test.go b/dot/node_test.go index 165991c8ba..f540388c15 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -15,3 +15,214 @@ // along with the gossamer library. If not, see . package dot + +import ( + "fmt" + "reflect" + "sync" + "testing" + + "github.com/ChainSafe/gossamer/dot/network" + "github.com/ChainSafe/gossamer/dot/state" + "github.com/ChainSafe/gossamer/lib/keystore" + "github.com/ChainSafe/gossamer/lib/runtime" + "github.com/ChainSafe/gossamer/lib/services" +) + +func TestInitNode(t *testing.T) { + type args struct { + cfg *Config + } + tests := []struct { + name string + args args + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := InitNode(tt.args.cfg); (err != nil) != tt.wantErr { + t.Errorf("InitNode() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestLoadGlobalNodeName(t *testing.T) { + type args struct { + basepath string + } + tests := []struct { + name string + args args + wantNodename string + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotNodename, err := LoadGlobalNodeName(tt.args.basepath) + if (err != nil) != tt.wantErr { + t.Errorf("LoadGlobalNodeName() error = %v, wantErr %v", err, tt.wantErr) + return + } + if gotNodename != tt.wantNodename { + t.Errorf("LoadGlobalNodeName() gotNodename = %v, want %v", gotNodename, tt.wantNodename) + } + }) + } +} + +func TestNewNode(t *testing.T) { + type args struct { + cfg *Config + ks *keystore.GlobalKeystore + stopFunc func() + } + tests := []struct { + name string + args args + want *Node + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := NewNode(tt.args.cfg, tt.args.ks, tt.args.stopFunc) + if (err != nil) != tt.wantErr { + t.Errorf("NewNode() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewNode() got = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNodeInitialized(t *testing.T) { + type args struct { + basepath string + } + tests := []struct { + name string + args args + want bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := NodeInitialized(tt.args.basepath); got != tt.want { + t.Errorf("NodeInitialized() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNode_Start(t *testing.T) { + type fields struct { + Name string + Services *services.ServiceRegistry + StopFunc func() + wg sync.WaitGroup + started chan struct{} + } + tests := []struct { + name string + fields fields + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + n := &Node{ + Name: tt.fields.Name, + Services: tt.fields.Services, + StopFunc: tt.fields.StopFunc, + wg: tt.fields.wg, + started: tt.fields.started, + } + if err := n.Start(); (err != nil) != tt.wantErr { + t.Errorf("Start() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestNode_Stop(t *testing.T) { + type fields struct { + Name string + Services *services.ServiceRegistry + StopFunc func() + wg sync.WaitGroup + started chan struct{} + } + tests := []struct { + name string + fields fields + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + n := &Node{ + Name: tt.fields.Name, + Services: tt.fields.Services, + StopFunc: tt.fields.StopFunc, + wg: tt.fields.wg, + started: tt.fields.started, + } + fmt.Printf("node %v\n", n) + }) + } +} + +func Test_loadRuntime(t *testing.T) { + type args struct { + cfg *Config + ns *runtime.NodeStorage + stateSrvc *state.Service + ks *keystore.GlobalKeystore + net *network.Service + } + tests := []struct { + name string + args args + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := loadRuntime(tt.args.cfg, tt.args.ns, tt.args.stateSrvc, tt.args.ks, tt.args.net); (err != nil) != tt.wantErr { + t.Errorf("loadRuntime() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func Test_storeGlobalNodeName(t *testing.T) { + type args struct { + name string + basepath string + } + tests := []struct { + name string + args args + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if err := storeGlobalNodeName(tt.args.name, tt.args.basepath); (err != nil) != tt.wantErr { + t.Errorf("storeGlobalNodeName() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} diff --git a/dot/services_test.go b/dot/services_test.go index 165991c8ba..ad7df35219 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -15,3 +15,391 @@ // along with the gossamer library. If not, see . package dot + +import ( + "reflect" + "testing" + + "github.com/ChainSafe/chaindb" + "github.com/ChainSafe/gossamer/dot/core" + "github.com/ChainSafe/gossamer/dot/digest" + "github.com/ChainSafe/gossamer/dot/network" + "github.com/ChainSafe/gossamer/dot/rpc" + "github.com/ChainSafe/gossamer/dot/rpc/modules" + "github.com/ChainSafe/gossamer/dot/state" + "github.com/ChainSafe/gossamer/dot/sync" + "github.com/ChainSafe/gossamer/dot/system" + "github.com/ChainSafe/gossamer/dot/types" + "github.com/ChainSafe/gossamer/lib/babe" + "github.com/ChainSafe/gossamer/lib/grandpa" + "github.com/ChainSafe/gossamer/lib/keystore" + "github.com/ChainSafe/gossamer/lib/runtime" +) + +func Test_createBABEService(t *testing.T) { + type args struct { + cfg *Config + st *state.Service + ks keystore.Keystore + cs *core.Service + } + tests := []struct { + name string + args args + want *babe.Service + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createBABEService(tt.args.cfg, tt.args.st, tt.args.ks, tt.args.cs) + if (err != nil) != tt.wantErr { + t.Errorf("createBABEService() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createBABEService() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createBlockVerifier(t *testing.T) { + type args struct { + st *state.Service + } + tests := []struct { + name string + args args + want *babe.VerificationManager + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createBlockVerifier(tt.args.st) + if (err != nil) != tt.wantErr { + t.Errorf("createBlockVerifier() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createBlockVerifier() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createCoreService(t *testing.T) { + type args struct { + cfg *Config + ks *keystore.GlobalKeystore + st *state.Service + net *network.Service + dh *digest.Handler + } + tests := []struct { + name string + args args + want *core.Service + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createCoreService(tt.args.cfg, tt.args.ks, tt.args.st, tt.args.net, tt.args.dh) + if (err != nil) != tt.wantErr { + t.Errorf("createCoreService() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createCoreService() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createDigestHandler(t *testing.T) { + type args struct { + st *state.Service + } + tests := []struct { + name string + args args + want *digest.Handler + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createDigestHandler(tt.args.st) + if (err != nil) != tt.wantErr { + t.Errorf("createDigestHandler() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createDigestHandler() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createGRANDPAService(t *testing.T) { + type args struct { + cfg *Config + st *state.Service + dh *digest.Handler + ks keystore.Keystore + net *network.Service + } + tests := []struct { + name string + args args + want *grandpa.Service + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createGRANDPAService(tt.args.cfg, tt.args.st, tt.args.dh, tt.args.ks, tt.args.net) + if (err != nil) != tt.wantErr { + t.Errorf("createGRANDPAService() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createGRANDPAService() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createNetworkService(t *testing.T) { + type args struct { + cfg *Config + stateSrvc *state.Service + } + tests := []struct { + name string + args args + want *network.Service + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createNetworkService(tt.args.cfg, tt.args.stateSrvc) + if (err != nil) != tt.wantErr { + t.Errorf("createNetworkService() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createNetworkService() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createRPCService(t *testing.T) { + type args struct { + cfg *Config + ns *runtime.NodeStorage + stateSrvc *state.Service + coreSrvc *core.Service + networkSrvc *network.Service + bp modules.BlockProducerAPI + sysSrvc *system.Service + finSrvc *grandpa.Service + } + tests := []struct { + name string + args args + want *rpc.HTTPServer + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createRPCService(tt.args.cfg, tt.args.ns, tt.args.stateSrvc, tt.args.coreSrvc, tt.args.networkSrvc, tt.args.bp, tt.args.sysSrvc, tt.args.finSrvc) + if (err != nil) != tt.wantErr { + t.Errorf("createRPCService() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createRPCService() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createRuntime(t *testing.T) { + type args struct { + cfg *Config + ns runtime.NodeStorage + st *state.Service + ks *keystore.GlobalKeystore + net *network.Service + code []byte + } + tests := []struct { + name string + args args + want runtime.Instance + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createRuntime(tt.args.cfg, tt.args.ns, tt.args.st, tt.args.ks, tt.args.net, tt.args.code) + if (err != nil) != tt.wantErr { + t.Errorf("createRuntime() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createRuntime() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createRuntimeStorage(t *testing.T) { + type args struct { + st *state.Service + } + tests := []struct { + name string + args args + want *runtime.NodeStorage + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createRuntimeStorage(tt.args.st) + if (err != nil) != tt.wantErr { + t.Errorf("createRuntimeStorage() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createRuntimeStorage() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createStateService(t *testing.T) { + type args struct { + cfg *Config + } + tests := []struct { + name string + args args + want *state.Service + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createStateService(tt.args.cfg) + if (err != nil) != tt.wantErr { + t.Errorf("createStateService() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createStateService() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_createSystemService(t *testing.T) { + type args struct { + cfg *types.SystemInfo + stateSrvc *state.Service + } + tests := []struct { + name string + args args + want *system.Service + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := createSystemService(tt.args.cfg, tt.args.stateSrvc) + if (err != nil) != tt.wantErr { + t.Errorf("createSystemService() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("createSystemService() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_newInMemoryDB(t *testing.T) { + type args struct { + path string + } + tests := []struct { + name string + args args + want chaindb.Database + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := newInMemoryDB(tt.args.path) + if (err != nil) != tt.wantErr { + t.Errorf("newInMemoryDB() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("newInMemoryDB() got = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_newSyncService(t *testing.T) { + type args struct { + cfg *Config + st *state.Service + fg sync.FinalityGadget + verifier *babe.VerificationManager + cs *core.Service + net *network.Service + } + tests := []struct { + name string + args args + want *sync.Service + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := newSyncService(tt.args.cfg, tt.args.st, tt.args.fg, tt.args.verifier, tt.args.cs, tt.args.net) + if (err != nil) != tt.wantErr { + t.Errorf("newSyncService() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("newSyncService() got = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/dot/utils_integration_test.go b/dot/utils_integration_test.go index ec2086cb3d..081fc8be52 100644 --- a/dot/utils_integration_test.go +++ b/dot/utils_integration_test.go @@ -48,7 +48,7 @@ func TestNewConfigAndFile(t *testing.T) { } // TestInitNode -func TestNewTestGenesis(t *testing.T) { +func TestNewTestGenesis_Integration(t *testing.T) { cfg := NewTestConfig(t) require.NotNil(t, cfg) @@ -60,7 +60,7 @@ func TestNewTestGenesis(t *testing.T) { cfg.Init.Genesis = genFile.Name() } -func TestNewTestGenesisFile(t *testing.T) { +func TestNewTestGenesisFile_Integration(t *testing.T) { cfg := NewTestConfig(t) require.NotNil(t, cfg) diff --git a/dot/utils_test.go b/dot/utils_test.go index 165991c8ba..3bb76779c1 100644 --- a/dot/utils_test.go +++ b/dot/utils_test.go @@ -15,3 +15,255 @@ // along with the gossamer library. If not, see . package dot + +import ( + "os" + "reflect" + "testing" + + ctoml "github.com/ChainSafe/gossamer/dot/config/toml" + "github.com/ChainSafe/gossamer/lib/genesis" +) + +func TestCreateJSONRawFile(t *testing.T) { + type args struct { + bs *BuildSpec + fp string + } + tests := []struct { + name string + args args + want *os.File + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := CreateJSONRawFile(tt.args.bs, tt.args.fp); !reflect.DeepEqual(got, tt.want) { + t.Errorf("CreateJSONRawFile() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestExportConfig(t *testing.T) { + type args struct { + cfg *Config + fp string + } + tests := []struct { + name string + args args + want *os.File + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := ExportConfig(tt.args.cfg, tt.args.fp); !reflect.DeepEqual(got, tt.want) { + t.Errorf("ExportConfig() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestExportTomlConfig(t *testing.T) { + type args struct { + cfg *ctoml.Config + fp string + } + tests := []struct { + name string + args args + want *os.File + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := ExportTomlConfig(tt.args.cfg, tt.args.fp); !reflect.DeepEqual(got, tt.want) { + t.Errorf("ExportTomlConfig() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNewTestConfig(t *testing.T) { + type args struct { + t *testing.T + } + tests := []struct { + name string + args args + want *Config + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := NewTestConfig(tt.args.t); !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewTestConfig() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNewTestConfigWithFile(t *testing.T) { + type args struct { + t *testing.T + } + tests := []struct { + name string + args args + want *Config + want1 *os.File + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, got1 := NewTestConfigWithFile(tt.args.t) + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewTestConfigWithFile() got = %v, want %v", got, tt.want) + } + if !reflect.DeepEqual(got1, tt.want1) { + t.Errorf("NewTestConfigWithFile() got1 = %v, want %v", got1, tt.want1) + } + }) + } +} + +func TestNewTestGenesis(t *testing.T) { + type args struct { + t *testing.T + } + tests := []struct { + name string + args args + want *genesis.Genesis + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := NewTestGenesis(tt.args.t); !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewTestGenesis() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNewTestGenesisAndRuntime(t *testing.T) { + type args struct { + t *testing.T + } + tests := []struct { + name string + args args + want string + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := NewTestGenesisAndRuntime(tt.args.t); got != tt.want { + t.Errorf("NewTestGenesisAndRuntime() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNewTestGenesisFile(t *testing.T) { + type args struct { + t *testing.T + cfg *Config + } + tests := []struct { + name string + args args + want *os.File + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := NewTestGenesisFile(tt.args.t, tt.args.cfg); !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewTestGenesisFile() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNewTestGenesisRawFile(t *testing.T) { + type args struct { + t *testing.T + cfg *Config + } + tests := []struct { + name string + args args + want *os.File + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := NewTestGenesisRawFile(tt.args.t, tt.args.cfg); !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewTestGenesisRawFile() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestRandomNodeName(t *testing.T) { + tests := []struct { + name string + want string + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := RandomNodeName(); got != tt.want { + t.Errorf("RandomNodeName() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestWriteConfig(t *testing.T) { + type args struct { + data []byte + fp string + } + tests := []struct { + name string + args args + want *os.File + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := WriteConfig(tt.args.data, tt.args.fp); !reflect.DeepEqual(got, tt.want) { + t.Errorf("WriteConfig() = %v, want %v", got, tt.want) + } + }) + } +} + +func Test_setupLogger(t *testing.T) { + type args struct { + cfg *Config + } + tests := []struct { + name string + args args + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + }) + } +} From 6b3cd93b0db5765a692870cfe3d5e95de997aa07 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Mon, 8 Nov 2021 16:07:41 -0500 Subject: [PATCH 13/43] implement core config unit tests --- dot/config_test.go | 286 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 253 insertions(+), 33 deletions(-) diff --git a/dot/config_test.go b/dot/config_test.go index 138a0d9df5..e00974a538 100644 --- a/dot/config_test.go +++ b/dot/config_test.go @@ -17,10 +17,11 @@ package dot import ( - "reflect" "testing" "github.com/ChainSafe/gossamer/dot/types" + "github.com/ChainSafe/gossamer/lib/genesis" + "github.com/stretchr/testify/assert" ) func TestConfig_String(t *testing.T) { @@ -40,7 +41,133 @@ func TestConfig_String(t *testing.T) { fields fields want string }{ - // TODO: Add test cases. + { + name: "default values", + fields: fields{}, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", + }, + { + name: "global config", + fields: fields{ + Global: GlobalConfig{ + Name: "name", + ID: "id", + BasePath: "basepath", + LogLvl: 2, + PublishMetrics: true, + MetricsPort: 3, + NoTelemetry: true, + TelemetryURLs: []genesis.TelemetryEndpoint{{ + Endpoint: "endpoint", + Verbosity: 4, + }}, + RetainBlocks: 5, + Pruning: "a", + }, + }, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"name\",\n\t\t\"ID\": \"id\",\n\t\t\"BasePath\": \"basepath\",\n\t\t\"LogLvl\": 2,\n\t\t\"PublishMetrics\": true,\n\t\t\"MetricsPort\": 3,\n\t\t\"NoTelemetry\": true,\n\t\t\"TelemetryURLs\": [\n\t\t\t{\n\t\t\t\t\"Endpoint\": \"endpoint\",\n\t\t\t\t\"Verbosity\": 4\n\t\t\t}\n\t\t],\n\t\t\"RetainBlocks\": 5,\n\t\t\"Pruning\": \"a\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", + }, + { + name: "log config", + fields: fields{ + Log: LogConfig{ + CoreLvl: 1, + SyncLvl: 2, + NetworkLvl: 3, + RPCLvl: 4, + StateLvl: 5, + RuntimeLvl: 6, + BlockProducerLvl: 7, + FinalityGadgetLvl: 8, + }, + }, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 1,\n\t\t\"SyncLvl\": 2,\n\t\t\"NetworkLvl\": 3,\n\t\t\"RPCLvl\": 4,\n\t\t\"StateLvl\": 5,\n\t\t\"RuntimeLvl\": 6,\n\t\t\"BlockProducerLvl\": 7,\n\t\t\"FinalityGadgetLvl\": 8\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", + }, + { + name: "init config", + fields: fields{ + Init: InitConfig{Genesis: "genesis"}, + }, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"genesis\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", + }, + { + name: "account config", + fields: fields{ + Account: AccountConfig{ + Key: "aKey", + Unlock: "unlock", + }, + }, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"aKey\",\n\t\t\"Unlock\": \"unlock\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", + }, + { + name: "core config", + fields: fields{ + Core: CoreConfig{ + Roles: 1, + BabeAuthority: true, + BABELead: true, + GrandpaAuthority: true, + WasmInterpreter: "wasm", + GrandpaInterval: 2, + }, + }, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 1,\n\t\t\"BabeAuthority\": true,\n\t\t\"BABELead\": true,\n\t\t\"GrandpaAuthority\": true,\n\t\t\"WasmInterpreter\": \"wasm\",\n\t\t\"GrandpaInterval\": 2\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", + }, + { + name: "network config", + fields: fields{ + Network: NetworkConfig{ + Port: 1, + Bootnodes: []string{"node1", "node2"}, + ProtocolID: "pID", + NoBootstrap: true, + NoMDNS: true, + MinPeers: 2, + MaxPeers: 3, + PersistentPeers: []string{"peer1", "peer2"}, + DiscoveryInterval: 4, + }, + }, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 1,\n\t\t\"Bootnodes\": [\n\t\t\t\"node1\",\n\t\t\t\"node2\"\n\t\t],\n\t\t\"ProtocolID\": \"pID\",\n\t\t\"NoBootstrap\": true,\n\t\t\"NoMDNS\": true,\n\t\t\"MinPeers\": 2,\n\t\t\"MaxPeers\": 3,\n\t\t\"PersistentPeers\": [\n\t\t\t\"peer1\",\n\t\t\t\"peer2\"\n\t\t],\n\t\t\"DiscoveryInterval\": 4\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", + }, + { + name: "rpc config", + fields: fields{ + RPC: RPCConfig{ + Enabled: true, + External: true, + Unsafe: true, + UnsafeExternal: true, + Port: 1, + Host: "host", + Modules: []string{"mod1", "mod2"}, + WSPort: 2, + WS: true, + WSExternal: true, + WSUnsafe: true, + WSUnsafeExternal: true, + }, + }, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": true,\n\t\t\"External\": true,\n\t\t\"Unsafe\": true,\n\t\t\"UnsafeExternal\": true,\n\t\t\"Port\": 1,\n\t\t\"Host\": \"host\",\n\t\t\"Modules\": [\n\t\t\t\"mod1\",\n\t\t\t\"mod2\"\n\t\t],\n\t\t\"WSPort\": 2,\n\t\t\"WS\": true,\n\t\t\"WSExternal\": true,\n\t\t\"WSUnsafe\": true,\n\t\t\"WSUnsafeExternal\": true\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", + }, + { + name: "system info", + fields: fields{ + System: types.SystemInfo{ + SystemName: "name", + SystemVersion: "version", + }, + }, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"name\",\n\t\t\"SystemVersion\": \"version\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", + }, + { + name: "state config", + fields: fields{ + State: StateConfig{Rewind: 2}, + }, + want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 2\n\t}\n}", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -55,9 +182,8 @@ func TestConfig_String(t *testing.T) { System: tt.fields.System, State: tt.fields.State, } - if got := c.String(); got != tt.want { - t.Errorf("String() = %v, want %v", got, tt.want) - } + got := c.String() + assert.Equal(t, tt.want, got) }) } } @@ -67,13 +193,19 @@ func TestDevConfig(t *testing.T) { name string want *Config }{ - // TODO: Add test cases. + { + name: "dev default", + want: &Config{ + Global: GlobalConfig{ + ID: "dev", + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := DevConfig(); !reflect.DeepEqual(got, tt.want) { - t.Errorf("DevConfig() = %v, want %v", got, tt.want) - } + got := DevConfig() + assert.Equal(t, tt.want.Global.ID, got.Global.ID) }) } } @@ -83,13 +215,19 @@ func TestGssmrConfig(t *testing.T) { name string want *Config }{ - // TODO: Add test cases. + { + name: "gossamer default", + want: &Config{ + Global: GlobalConfig{ + ID: "gssmr", + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := GssmrConfig(); !reflect.DeepEqual(got, tt.want) { - t.Errorf("GssmrConfig() = %v, want %v", got, tt.want) - } + got := GssmrConfig() + assert.Equal(t, tt.want.Global.ID, got.Global.ID) }) } } @@ -99,13 +237,19 @@ func TestKusamaConfig(t *testing.T) { name string want *Config }{ - // TODO: Add test cases. + { + name: "kusama default", + want: &Config{ + Global: GlobalConfig{ + ID: "ksmcc3", + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := KusamaConfig(); !reflect.DeepEqual(got, tt.want) { - t.Errorf("KusamaConfig() = %v, want %v", got, tt.want) - } + got := KusamaConfig() + assert.Equal(t, tt.want.Global.ID, got.Global.ID) }) } } @@ -115,13 +259,19 @@ func TestPolkadotConfig(t *testing.T) { name string want *Config }{ - // TODO: Add test cases. + { + name: "polkadot default", + want: &Config{ + Global: GlobalConfig{ + ID: "polkadot", + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := PolkadotConfig(); !reflect.DeepEqual(got, tt.want) { - t.Errorf("PolkadotConfig() = %v, want %v", got, tt.want) - } + got := PolkadotConfig() + assert.Equal(t, tt.want.Global.ID, got.Global.ID) }) } } @@ -146,7 +296,30 @@ func TestRPCConfig_isRPCEnabled(t *testing.T) { fields fields want bool }{ - // TODO: Add test cases. + { + name: "default", + want: false, + }, + { + name: "enabled true", + fields: fields{Enabled: true}, + want: true, + }, + { + name: "external true", + fields: fields{External: true}, + want: true, + }, + { + name: "unsafe true", + fields: fields{Unsafe: true}, + want: true, + }, + { + name: "unsafe external true", + fields: fields{UnsafeExternal: true}, + want: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -164,9 +337,8 @@ func TestRPCConfig_isRPCEnabled(t *testing.T) { WSUnsafe: tt.fields.WSUnsafe, WSUnsafeExternal: tt.fields.WSUnsafeExternal, } - if got := r.isRPCEnabled(); got != tt.want { - t.Errorf("isRPCEnabled() = %v, want %v", got, tt.want) - } + got := r.isRPCEnabled() + assert.Equal(t, tt.want, got) }) } } @@ -191,7 +363,30 @@ func TestRPCConfig_isWSEnabled(t *testing.T) { fields fields want bool }{ - // TODO: Add test cases. + { + name: "default", + want: false, + }, + { + name: "ws true", + fields: fields{WS: true}, + want: true, + }, + { + name: "ws external true", + fields: fields{WSExternal: true}, + want: true, + }, + { + name: "ws unsafe true", + fields: fields{WSUnsafe: true}, + want: true, + }, + { + name: "ws unsafe external true", + fields: fields{WSUnsafeExternal: true}, + want: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -209,9 +404,8 @@ func TestRPCConfig_isWSEnabled(t *testing.T) { WSUnsafe: tt.fields.WSUnsafe, WSUnsafeExternal: tt.fields.WSUnsafeExternal, } - if got := r.isWSEnabled(); got != tt.want { - t.Errorf("isWSEnabled() = %v, want %v", got, tt.want) - } + got := r.isWSEnabled() + assert.Equal(t, tt.want, got) }) } } @@ -225,13 +419,39 @@ func Test_networkServiceEnabled(t *testing.T) { args args want bool }{ - // TODO: Add test cases. + { + name: "dev config", + args: args{cfg: DevConfig()}, + want: true, + }, + { + name: "empty config", + args: args{cfg: &Config{}}, + want: false, + }, + { + name: "core roles 0", + args: args{cfg: &Config{ + Core: CoreConfig{ + Roles: 0, + }, + }}, + want: false, + }, + { + name: "core roles 1", + args: args{cfg: &Config{ + Core: CoreConfig{ + Roles: 1, + }, + }}, + want: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := networkServiceEnabled(tt.args.cfg); got != tt.want { - t.Errorf("networkServiceEnabled() = %v, want %v", got, tt.want) - } + got := networkServiceEnabled(tt.args.cfg) + assert.Equal(t, tt.want, got) }) } } From 357dd1991956689902c7756511937a99b9338a97 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Mon, 8 Nov 2021 16:34:00 -0500 Subject: [PATCH 14/43] add t.Parallel to tests --- dot/config_test.go | 16 +++++++++ dot/import_test.go | 85 ++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 95 insertions(+), 6 deletions(-) diff --git a/dot/config_test.go b/dot/config_test.go index e00974a538..dfcb96e354 100644 --- a/dot/config_test.go +++ b/dot/config_test.go @@ -25,6 +25,8 @@ import ( ) func TestConfig_String(t *testing.T) { + t.Parallel() + type fields struct { Global GlobalConfig Log LogConfig @@ -189,6 +191,8 @@ func TestConfig_String(t *testing.T) { } func TestDevConfig(t *testing.T) { + t.Parallel() + tests := []struct { name string want *Config @@ -211,6 +215,8 @@ func TestDevConfig(t *testing.T) { } func TestGssmrConfig(t *testing.T) { + t.Parallel() + tests := []struct { name string want *Config @@ -233,6 +239,8 @@ func TestGssmrConfig(t *testing.T) { } func TestKusamaConfig(t *testing.T) { + t.Parallel() + tests := []struct { name string want *Config @@ -255,6 +263,8 @@ func TestKusamaConfig(t *testing.T) { } func TestPolkadotConfig(t *testing.T) { + t.Parallel() + tests := []struct { name string want *Config @@ -277,6 +287,8 @@ func TestPolkadotConfig(t *testing.T) { } func TestRPCConfig_isRPCEnabled(t *testing.T) { + t.Parallel() + type fields struct { Enabled bool External bool @@ -344,6 +356,8 @@ func TestRPCConfig_isRPCEnabled(t *testing.T) { } func TestRPCConfig_isWSEnabled(t *testing.T) { + t.Parallel() + type fields struct { Enabled bool External bool @@ -411,6 +425,8 @@ func TestRPCConfig_isWSEnabled(t *testing.T) { } func Test_networkServiceEnabled(t *testing.T) { + t.Parallel() + type args struct { cfg *Config } diff --git a/dot/import_test.go b/dot/import_test.go index 2b4a1536a4..7a4dc285c1 100644 --- a/dot/import_test.go +++ b/dot/import_test.go @@ -17,6 +17,12 @@ package dot import ( + "encoding/json" + "errors" + "github.com/ChainSafe/gossamer/lib/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "io/ioutil" "reflect" "testing" @@ -25,6 +31,29 @@ import ( ) func TestImportState(t *testing.T) { + t.Parallel() + + // setup node for test + basepath, err := ioutil.TempDir("", "gossamer-test-*") + require.NoError(t, err) + + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + cfg.Global.BasePath = basepath + err = InitNode(cfg) + require.NoError(t, err) + + stateFP := setupStateFile(t) + headerFP := setupHeaderFile(t) + type args struct { basepath string stateFP string @@ -32,16 +61,31 @@ func TestImportState(t *testing.T) { firstSlot uint64 } tests := []struct { - name string - args args - wantErr bool + name string + args args + err error }{ - // TODO: Add test cases. + { + name: "no arguments", + err: errors.New("read .: is a directory"), + }, + { + name: "working example", + args: args{ + basepath: basepath, + stateFP: stateFP, + headerFP: headerFP, + firstSlot: 262493679, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := ImportState(tt.args.basepath, tt.args.stateFP, tt.args.headerFP, tt.args.firstSlot); (err != nil) != tt.wantErr { - t.Errorf("ImportState() error = %v, wantErr %v", err, tt.wantErr) + err := ImportState(tt.args.basepath, tt.args.stateFP, tt.args.headerFP, tt.args.firstSlot) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } }) } @@ -98,3 +142,32 @@ func Test_newTrieFromPairs(t *testing.T) { }) } } + +func setupStateFile(t *testing.T) string { + filename := "../lib/runtime/test_data/kusama/block1482002.out" + + data, err := ioutil.ReadFile(filename) + require.NoError(t, err) + + rpcPairs := make(map[string]interface{}) + err = json.Unmarshal(data, &rpcPairs) + require.NoError(t, err) + pairs := rpcPairs["result"].([]interface{}) + + bz, err := json.Marshal(pairs) + require.NoError(t, err) + + fp := "./test_data/state.json" + err = ioutil.WriteFile(fp, bz, 0777) + require.NoError(t, err) + + return fp +} + +func setupHeaderFile(t *testing.T) string { + headerStr := "{\"digest\":{\"logs\":[\"0x0642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c\",\"0x054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86\"]},\"extrinsicsRoot\":\"0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0\",\"number\":\"0x169d12\",\"parentHash\":\"0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975\",\"stateRoot\":\"0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb\"}" + fp := "./test_data/header.json" + err := ioutil.WriteFile(fp, []byte(headerStr), 0777) + require.NoError(t, err) + return fp +} From b43f571bbe212f53482a9d43bbecb519547355ad Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 9 Nov 2021 13:26:47 -0500 Subject: [PATCH 15/43] implement tests for import.go --- dot/import_test.go | 83 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 25 deletions(-) diff --git a/dot/import_test.go b/dot/import_test.go index 7a4dc285c1..21dbec8301 100644 --- a/dot/import_test.go +++ b/dot/import_test.go @@ -19,15 +19,15 @@ package dot import ( "encoding/json" "errors" - "github.com/ChainSafe/gossamer/lib/utils" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "io/ioutil" - "reflect" + "math/big" "testing" "github.com/ChainSafe/gossamer/dot/types" - "github.com/ChainSafe/gossamer/lib/trie" + "github.com/ChainSafe/gossamer/lib/common" + "github.com/ChainSafe/gossamer/lib/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestImportState(t *testing.T) { @@ -92,52 +92,85 @@ func TestImportState(t *testing.T) { } func Test_newHeaderFromFile(t *testing.T) { + t.Parallel() + type args struct { filename string } tests := []struct { - name string - args args - want *types.Header - wantErr bool + name string + args args + want *types.Header + err error }{ - // TODO: Add test cases. + { + name: "working example", + args: args{filename: setupHeaderFile(t)}, + want: &types.Header{ + ParentHash: common.MustHexToHash("0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975"), + Number: big.NewInt(1482002), + StateRoot: common.MustHexToHash("0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb"), + ExtrinsicsRoot: common.MustHexToHash("0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0"), + }, + }, + { + name: "no arguments", + err: errors.New("read .: is a directory"), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := newHeaderFromFile(tt.args.filename) - if (err != nil) != tt.wantErr { - t.Errorf("newHeaderFromFile() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("newHeaderFromFile() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.Equal(t, tt.want.ParentHash, got.ParentHash) + assert.Equal(t, tt.want.Number, got.Number) + assert.Equal(t, tt.want.StateRoot, got.StateRoot) + assert.Equal(t, tt.want.ExtrinsicsRoot, got.ExtrinsicsRoot) } }) } } func Test_newTrieFromPairs(t *testing.T) { + t.Parallel() + type args struct { filename string } tests := []struct { - name string - args args - want *trie.Trie - wantErr bool + name string + args args + want common.Hash + err error }{ - // TODO: Add test cases. + { + name: "no arguments", + err: errors.New("read .: is a directory"), + want: common.Hash{}, + }, + { + name: "working example", + args: args{filename: setupStateFile(t)}, + want: common.MustHexToHash("0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb"), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := newTrieFromPairs(tt.args.filename) - if (err != nil) != tt.wantErr { - t.Errorf("newTrieFromPairs() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("newTrieFromPairs() got = %v, want %v", got, tt.want) + + if !tt.want.IsEmpty() { + assert.Equal(t, tt.want, got.MustHash()) } }) } From 49c3addb6ac5c76dbfd6e42b4666c435bc2fd64d Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 9 Nov 2021 16:45:29 -0500 Subject: [PATCH 16/43] add tests for node.go --- dot/node.go | 4 +- dot/node_test.go | 114 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 96 insertions(+), 22 deletions(-) diff --git a/dot/node.go b/dot/node.go index 8a67a3e2f3..3f5ab7f366 100644 --- a/dot/node.go +++ b/dot/node.go @@ -180,7 +180,7 @@ func NodeInitialized(basepath string) bool { } // LoadGlobalNodeName returns the stored global node name from database -func LoadGlobalNodeName(basepath string) (nodename string, err error) { +func LoadGlobalNodeName(basepath string) (string, error) { // initialise database using data directory db, err := utils.SetupDatabase(basepath, false) if err != nil { @@ -196,7 +196,7 @@ func LoadGlobalNodeName(basepath string) (nodename string, err error) { }() basestate := state.NewBaseState(db) - nodename, err = basestate.LoadNodeGlobalName() + nodename, err := basestate.LoadNodeGlobalName() if err != nil { logger.Warn( "failed to load global node name", diff --git a/dot/node_test.go b/dot/node_test.go index f540388c15..1461f35cdb 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -17,8 +17,13 @@ package dot import ( + "errors" "fmt" - "reflect" + "github.com/ChainSafe/gossamer/dot/types" + "github.com/ChainSafe/gossamer/lib/common" + "github.com/ChainSafe/gossamer/lib/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "sync" "testing" @@ -36,20 +41,42 @@ func TestInitNode(t *testing.T) { tests := []struct { name string args args - wantErr bool + err error }{ - // TODO: Add test cases. + { + name: "no arguments", + args: args{cfg: GssmrConfig()}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := InitNode(tt.args.cfg); (err != nil) != tt.wantErr { - t.Errorf("InitNode() error = %v, wantErr %v", err, tt.wantErr) + // todo (ed) deal with file path to test this + fmt.Printf("gen %v\n", tt.args.cfg.Init.Genesis) + err := InitNode(tt.args.cfg) + + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } }) } } func TestLoadGlobalNodeName(t *testing.T) { + t.Parallel() + + // initialise database using data directory + basePath := utils.NewTestBasePath(t, "tmpBase") + db, err := utils.SetupDatabase(basePath, false) + require.NoError(t, err) + + basestate := state.NewBaseState(db) + basestate.Put(common.NodeNameKey, []byte(`nodeName`)) + + err = db.Close() + require.NoError(t, err) + type args struct { basepath string } @@ -57,25 +84,55 @@ func TestLoadGlobalNodeName(t *testing.T) { name string args args wantNodename string - wantErr bool + err error }{ - // TODO: Add test cases. + { + name: "working example", + args: args{basepath: basePath}, + wantNodename: "nodeName", + }, + { + name: "no arguments", + err: errors.New("Key not found"), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { gotNodename, err := LoadGlobalNodeName(tt.args.basepath) - if (err != nil) != tt.wantErr { - t.Errorf("LoadGlobalNodeName() error = %v, wantErr %v", err, tt.wantErr) - return - } - if gotNodename != tt.wantNodename { - t.Errorf("LoadGlobalNodeName() gotNodename = %v, want %v", gotNodename, tt.wantNodename) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } + + assert.Equal(t, tt.wantNodename, gotNodename) }) } } func TestNewNode(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + err = keystore.LoadKeystore("alice", ks.Gran) + require.NoError(t, err) + err = keystore.LoadKeystore("alice", ks.Babe) + require.NoError(t, err) + + cfg.Core.Roles = types.FullNodeRole + + type args struct { cfg *Config ks *keystore.GlobalKeystore @@ -85,19 +142,36 @@ func TestNewNode(t *testing.T) { name string args args want *Node - wantErr bool + err error }{ - // TODO: Add test cases. + { + name: "missing keystore", + args: args{ + cfg: cfg, + }, + err: errors.New("failed to create core service: cannot have nil keystore"), + }, + // todo (ed) this second test fails with; failed to create state service: failed to start state service: Cannot acquire directory lock on "/home/emack/projects/ChainSafe/gossamer/dot/test_data/TestNewNode/db". Another process is using this Badger database.: resource temporarily unavailable + { + name: "working example", + args: args{ + cfg: cfg, + ks: ks, + }, + want: &Node{Name: "Gossamer"}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := NewNode(tt.args.cfg, tt.args.ks, tt.args.stopFunc) - if (err != nil) != tt.wantErr { - t.Errorf("NewNode() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("NewNode() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.Equal(t, tt.want.Name, got.Name) } }) } From cecc64187ef12ee32a7142ead928ceb7bedf7e0b Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Wed, 10 Nov 2021 17:35:33 -0500 Subject: [PATCH 17/43] implement service tests --- dot/services_test.go | 467 +++++++++++++++++++++++++++++++++++-------- lib/babe/verify.go | 24 ++- 2 files changed, 407 insertions(+), 84 deletions(-) diff --git a/dot/services_test.go b/dot/services_test.go index ad7df35219..e42b85b03e 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -17,6 +17,13 @@ package dot import ( + "errors" + "github.com/ChainSafe/gossamer/lib/runtime/wasmer" + "github.com/ChainSafe/gossamer/lib/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "io/ioutil" + "path/filepath" "reflect" "testing" @@ -37,6 +44,41 @@ import ( ) func Test_createBABEService(t *testing.T) { + t.Parallel() + + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + kr, err := keystore.NewSr25519Keyring() + require.NoError(t, err) + ks.Babe.Insert(kr.Alice()) + + ns, err := createRuntimeStorage(stateSrvc) + require.NoError(t, err) + err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) + require.NoError(t, err) + + dh, err := createDigestHandler(stateSrvc) + require.NoError(t, err) + + coreSrvc, err := createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) + require.NoError(t, err) + type args struct { cfg *Config st *state.Service @@ -44,54 +86,126 @@ func Test_createBABEService(t *testing.T) { cs *core.Service } tests := []struct { - name string - args args - want *babe.Service - wantErr bool + name string + args args + want *babe.Service + err error }{ - // TODO: Add test cases. + { + name: "invalid keystore type test", + args: args{ + cfg: cfg, + st: stateSrvc, + ks: ks.Gran, + cs: coreSrvc, + }, + err: errors.New("invalid keystore type"), + }, + { + name: "working example", + args: args{ + cfg: cfg, + st: stateSrvc, + ks: ks.Babe, + cs: coreSrvc, + }, + want: &babe.Service{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createBABEService(tt.args.cfg, tt.args.st, tt.args.ks, tt.args.cs) - if (err != nil) != tt.wantErr { - t.Errorf("createBABEService() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createBABEService() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } } func Test_createBlockVerifier(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + type args struct { st *state.Service } tests := []struct { - name string - args args - want *babe.VerificationManager - wantErr bool + name string + args args + want *babe.VerificationManager + err error }{ - // TODO: Add test cases. + { + name: "nil BlockState test", + args: args{st: &state.Service{}}, + err: errors.New("cannot have nil BlockState"), + }, + { + name: "working example", + args: args{st: stateSrvc}, + want: &babe.VerificationManager{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createBlockVerifier(tt.args.st) - if (err != nil) != tt.wantErr { - t.Errorf("createBlockVerifier() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createBlockVerifier() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } } func Test_createCoreService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Core.BabeAuthority = false + cfg.Core.GrandpaAuthority = false + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + require.NotNil(t, ks) + ed25519Keyring, _ := keystore.NewEd25519Keyring() + ks.Gran.Insert(ed25519Keyring.Alice()) + type args struct { cfg *Config ks *keystore.GlobalKeystore @@ -100,54 +214,124 @@ func Test_createCoreService(t *testing.T) { dh *digest.Handler } tests := []struct { - name string - args args - want *core.Service - wantErr bool + name string + args args + want *core.Service + err error }{ - // TODO: Add test cases. + { + name: "missing keystore test", + args: args{ + cfg: cfg, + st: stateSrvc, + }, + err: errors.New("cannot have nil keystore"), + }, + { + name: "working example", + args: args{ + cfg: cfg, + ks: ks, + st: stateSrvc, + }, + want: &core.Service{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createCoreService(tt.args.cfg, tt.args.ks, tt.args.st, tt.args.net, tt.args.dh) - if (err != nil) != tt.wantErr { - t.Errorf("createCoreService() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createCoreService() got = %v, want %v", got, tt.want) + if tt.want != nil { + assert.NotNil(t, got) } }) } } func Test_createDigestHandler(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + type args struct { st *state.Service } tests := []struct { - name string - args args - want *digest.Handler - wantErr bool + name string + args args + want *digest.Handler + err error }{ - // TODO: Add test cases. + { + name: "working example", + args: args{st: stateSrvc}, + want: &digest.Handler{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createDigestHandler(tt.args.st) - if (err != nil) != tt.wantErr { - t.Errorf("createDigestHandler() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createDigestHandler() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } } func Test_createGRANDPAService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.AuthorityRole + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + kr, err := keystore.NewEd25519Keyring() + require.NoError(t, err) + ks.Gran.Insert(kr.Alice()) + + ns, err := createRuntimeStorage(stateSrvc) + require.NoError(t, err) + + err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) + require.NoError(t, err) + + dh, err := createDigestHandler(stateSrvc) + require.NoError(t, err) + type args struct { cfg *Config st *state.Service @@ -156,55 +340,120 @@ func Test_createGRANDPAService(t *testing.T) { net *network.Service } tests := []struct { - name string - args args - want *grandpa.Service - wantErr bool + name string + args args + want *grandpa.Service + err error }{ - // TODO: Add test cases. + { + name: "invalid key type test", + args: args{ + cfg: cfg, + st: stateSrvc, + dh: dh, + ks: ks.Babe, + }, + err: errors.New("invalid keystore type"), + }, + { + name: "working example", + args: args{ + cfg: cfg, + st: stateSrvc, + dh: dh, + ks: ks.Gran, + }, + want: &grandpa.Service{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createGRANDPAService(tt.args.cfg, tt.args.st, tt.args.dh, tt.args.ks, tt.args.net) - if (err != nil) != tt.wantErr { - t.Errorf("createGRANDPAService() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createGRANDPAService() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } } func Test_createNetworkService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + type args struct { cfg *Config stateSrvc *state.Service } tests := []struct { - name string - args args - want *network.Service - wantErr bool + name string + args args + want *network.Service + err error }{ - // TODO: Add test cases. + { + name: "working example", + args: args{ + cfg: cfg, + stateSrvc: stateSrvc, + }, + want: &network.Service{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createNetworkService(tt.args.cfg, tt.args.stateSrvc) - if (err != nil) != tt.wantErr { - t.Errorf("createNetworkService() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createNetworkService() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } } func Test_createRPCService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Core.Roles = types.FullNodeRole + cfg.Core.BabeAuthority = false + cfg.Core.GrandpaAuthority = false + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + type args struct { cfg *Config ns *runtime.NodeStorage @@ -216,28 +465,59 @@ func Test_createRPCService(t *testing.T) { finSrvc *grandpa.Service } tests := []struct { - name string - args args - want *rpc.HTTPServer - wantErr bool + name string + args args + want *rpc.HTTPServer + err error }{ - // TODO: Add test cases. + { + name: "working example", + args: args{ + cfg: cfg, + stateSrvc: stateSrvc, + }, + want: &rpc.HTTPServer{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createRPCService(tt.args.cfg, tt.args.ns, tt.args.stateSrvc, tt.args.coreSrvc, tt.args.networkSrvc, tt.args.bp, tt.args.sysSrvc, tt.args.finSrvc) - if (err != nil) != tt.wantErr { - t.Errorf("createRPCService() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createRPCService() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } } func Test_createRuntime(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + + _ = wasmer.NewTestInstance(t, runtime.NODE_RUNTIME) + runtimeFilePath := runtime.GetAbsolutePath(runtime.NODE_RUNTIME_FP) + + runtimeData, err := ioutil.ReadFile(filepath.Clean(runtimeFilePath)) + require.Nil(t, err) + type args struct { cfg *Config ns runtime.NodeStorage @@ -247,22 +527,49 @@ func Test_createRuntime(t *testing.T) { code []byte } tests := []struct { - name string - args args - want runtime.Instance - wantErr bool + name string + args args + want bool + err error }{ - // TODO: Add test cases. + { + name: "empty code test", + args: args{ + cfg: cfg, + st: stateSrvc, + }, + err: errors.New("failed to create runtime executor: code is empty"), + }, + { + name: "bad code test", + args: args{ + cfg: cfg, + st: stateSrvc, + code: []byte(`fake code`), + }, + err: errors.New("failed to create runtime executor: Failed to instantiate the module:\n compile error: Validation error \"Bad magic number\""), + }, + { + name: "working example", + args: args{ + cfg: cfg, + st: stateSrvc, + code: runtimeData, + }, + want: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createRuntime(tt.args.cfg, tt.args.ns, tt.args.st, tt.args.ks, tt.args.net, tt.args.code) - if (err != nil) != tt.wantErr { - t.Errorf("createRuntime() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createRuntime() got = %v, want %v", got, tt.want) + + if tt.want { + assert.NotNil(t, got) } }) } diff --git a/lib/babe/verify.go b/lib/babe/verify.go index a7c4b759d8..133ac9ab9b 100644 --- a/lib/babe/verify.go +++ b/lib/babe/verify.go @@ -19,7 +19,9 @@ package babe import ( "errors" "fmt" + "github.com/ChainSafe/gossamer/dot/state" "math/big" + "reflect" "sync" "github.com/ChainSafe/gossamer/dot/types" @@ -58,12 +60,26 @@ type VerificationManager struct { // NewVerificationManager returns a new NewVerificationManager func NewVerificationManager(blockState BlockState, epochState EpochState) (*VerificationManager, error) { - if blockState == nil { - return nil, errNilBlockState + switch blockState.(type) { + case *state.BlockState: + if blockState == (*state.BlockState)(nil) { + return nil, errNilBlockState + } + default: + if reflect.ValueOf(blockState).IsNil() { + return nil, errNilBlockState + } } - if epochState == nil { - return nil, errNilEpochState + switch epochState.(type) { + case *state.EpochState: + if epochState == (*state.EpochState)(nil) { + return nil, errNilEpochState + } + default: + if reflect.ValueOf(epochState).IsNil() { + return nil, errNilEpochState + } } return &VerificationManager{ From 3cfdf934699242b606b740708a7c5be89abc24a7 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Thu, 11 Nov 2021 15:18:44 -0500 Subject: [PATCH 18/43] implement services tests --- dot/config_test.go | 168 --------------------------------- dot/services_test.go | 215 ++++++++++++++++++++++++++++++++----------- 2 files changed, 163 insertions(+), 220 deletions(-) diff --git a/dot/config_test.go b/dot/config_test.go index dfcb96e354..b29984b5f3 100644 --- a/dot/config_test.go +++ b/dot/config_test.go @@ -19,177 +19,9 @@ package dot import ( "testing" - "github.com/ChainSafe/gossamer/dot/types" - "github.com/ChainSafe/gossamer/lib/genesis" "github.com/stretchr/testify/assert" ) -func TestConfig_String(t *testing.T) { - t.Parallel() - - type fields struct { - Global GlobalConfig - Log LogConfig - Init InitConfig - Account AccountConfig - Core CoreConfig - Network NetworkConfig - RPC RPCConfig - System types.SystemInfo - State StateConfig - } - tests := []struct { - name string - fields fields - want string - }{ - { - name: "default values", - fields: fields{}, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", - }, - { - name: "global config", - fields: fields{ - Global: GlobalConfig{ - Name: "name", - ID: "id", - BasePath: "basepath", - LogLvl: 2, - PublishMetrics: true, - MetricsPort: 3, - NoTelemetry: true, - TelemetryURLs: []genesis.TelemetryEndpoint{{ - Endpoint: "endpoint", - Verbosity: 4, - }}, - RetainBlocks: 5, - Pruning: "a", - }, - }, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"name\",\n\t\t\"ID\": \"id\",\n\t\t\"BasePath\": \"basepath\",\n\t\t\"LogLvl\": 2,\n\t\t\"PublishMetrics\": true,\n\t\t\"MetricsPort\": 3,\n\t\t\"NoTelemetry\": true,\n\t\t\"TelemetryURLs\": [\n\t\t\t{\n\t\t\t\t\"Endpoint\": \"endpoint\",\n\t\t\t\t\"Verbosity\": 4\n\t\t\t}\n\t\t],\n\t\t\"RetainBlocks\": 5,\n\t\t\"Pruning\": \"a\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", - }, - { - name: "log config", - fields: fields{ - Log: LogConfig{ - CoreLvl: 1, - SyncLvl: 2, - NetworkLvl: 3, - RPCLvl: 4, - StateLvl: 5, - RuntimeLvl: 6, - BlockProducerLvl: 7, - FinalityGadgetLvl: 8, - }, - }, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 1,\n\t\t\"SyncLvl\": 2,\n\t\t\"NetworkLvl\": 3,\n\t\t\"RPCLvl\": 4,\n\t\t\"StateLvl\": 5,\n\t\t\"RuntimeLvl\": 6,\n\t\t\"BlockProducerLvl\": 7,\n\t\t\"FinalityGadgetLvl\": 8\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", - }, - { - name: "init config", - fields: fields{ - Init: InitConfig{Genesis: "genesis"}, - }, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"genesis\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", - }, - { - name: "account config", - fields: fields{ - Account: AccountConfig{ - Key: "aKey", - Unlock: "unlock", - }, - }, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"aKey\",\n\t\t\"Unlock\": \"unlock\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", - }, - { - name: "core config", - fields: fields{ - Core: CoreConfig{ - Roles: 1, - BabeAuthority: true, - BABELead: true, - GrandpaAuthority: true, - WasmInterpreter: "wasm", - GrandpaInterval: 2, - }, - }, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 1,\n\t\t\"BabeAuthority\": true,\n\t\t\"BABELead\": true,\n\t\t\"GrandpaAuthority\": true,\n\t\t\"WasmInterpreter\": \"wasm\",\n\t\t\"GrandpaInterval\": 2\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", - }, - { - name: "network config", - fields: fields{ - Network: NetworkConfig{ - Port: 1, - Bootnodes: []string{"node1", "node2"}, - ProtocolID: "pID", - NoBootstrap: true, - NoMDNS: true, - MinPeers: 2, - MaxPeers: 3, - PersistentPeers: []string{"peer1", "peer2"}, - DiscoveryInterval: 4, - }, - }, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 1,\n\t\t\"Bootnodes\": [\n\t\t\t\"node1\",\n\t\t\t\"node2\"\n\t\t],\n\t\t\"ProtocolID\": \"pID\",\n\t\t\"NoBootstrap\": true,\n\t\t\"NoMDNS\": true,\n\t\t\"MinPeers\": 2,\n\t\t\"MaxPeers\": 3,\n\t\t\"PersistentPeers\": [\n\t\t\t\"peer1\",\n\t\t\t\"peer2\"\n\t\t],\n\t\t\"DiscoveryInterval\": 4\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", - }, - { - name: "rpc config", - fields: fields{ - RPC: RPCConfig{ - Enabled: true, - External: true, - Unsafe: true, - UnsafeExternal: true, - Port: 1, - Host: "host", - Modules: []string{"mod1", "mod2"}, - WSPort: 2, - WS: true, - WSExternal: true, - WSUnsafe: true, - WSUnsafeExternal: true, - }, - }, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": true,\n\t\t\"External\": true,\n\t\t\"Unsafe\": true,\n\t\t\"UnsafeExternal\": true,\n\t\t\"Port\": 1,\n\t\t\"Host\": \"host\",\n\t\t\"Modules\": [\n\t\t\t\"mod1\",\n\t\t\t\"mod2\"\n\t\t],\n\t\t\"WSPort\": 2,\n\t\t\"WS\": true,\n\t\t\"WSExternal\": true,\n\t\t\"WSUnsafe\": true,\n\t\t\"WSUnsafeExternal\": true\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", - }, - { - name: "system info", - fields: fields{ - System: types.SystemInfo{ - SystemName: "name", - SystemVersion: "version", - }, - }, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"name\",\n\t\t\"SystemVersion\": \"version\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 0\n\t}\n}", - }, - { - name: "state config", - fields: fields{ - State: StateConfig{Rewind: 2}, - }, - want: "{\n\t\"Global\": {\n\t\t\"Name\": \"\",\n\t\t\"ID\": \"\",\n\t\t\"BasePath\": \"\",\n\t\t\"LogLvl\": 0,\n\t\t\"PublishMetrics\": false,\n\t\t\"MetricsPort\": 0,\n\t\t\"NoTelemetry\": false,\n\t\t\"TelemetryURLs\": null,\n\t\t\"RetainBlocks\": 0,\n\t\t\"Pruning\": \"\"\n\t},\n\t\"Log\": {\n\t\t\"CoreLvl\": 0,\n\t\t\"SyncLvl\": 0,\n\t\t\"NetworkLvl\": 0,\n\t\t\"RPCLvl\": 0,\n\t\t\"StateLvl\": 0,\n\t\t\"RuntimeLvl\": 0,\n\t\t\"BlockProducerLvl\": 0,\n\t\t\"FinalityGadgetLvl\": 0\n\t},\n\t\"Init\": {\n\t\t\"Genesis\": \"\"\n\t},\n\t\"Account\": {\n\t\t\"Key\": \"\",\n\t\t\"Unlock\": \"\"\n\t},\n\t\"Core\": {\n\t\t\"Roles\": 0,\n\t\t\"BabeAuthority\": false,\n\t\t\"BABELead\": false,\n\t\t\"GrandpaAuthority\": false,\n\t\t\"WasmInterpreter\": \"\",\n\t\t\"GrandpaInterval\": 0\n\t},\n\t\"Network\": {\n\t\t\"Port\": 0,\n\t\t\"Bootnodes\": null,\n\t\t\"ProtocolID\": \"\",\n\t\t\"NoBootstrap\": false,\n\t\t\"NoMDNS\": false,\n\t\t\"MinPeers\": 0,\n\t\t\"MaxPeers\": 0,\n\t\t\"PersistentPeers\": null,\n\t\t\"DiscoveryInterval\": 0\n\t},\n\t\"RPC\": {\n\t\t\"Enabled\": false,\n\t\t\"External\": false,\n\t\t\"Unsafe\": false,\n\t\t\"UnsafeExternal\": false,\n\t\t\"Port\": 0,\n\t\t\"Host\": \"\",\n\t\t\"Modules\": null,\n\t\t\"WSPort\": 0,\n\t\t\"WS\": false,\n\t\t\"WSExternal\": false,\n\t\t\"WSUnsafe\": false,\n\t\t\"WSUnsafeExternal\": false\n\t},\n\t\"System\": {\n\t\t\"SystemName\": \"\",\n\t\t\"SystemVersion\": \"\"\n\t},\n\t\"State\": {\n\t\t\"Rewind\": 2\n\t}\n}", - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - c := &Config{ - Global: tt.fields.Global, - Log: tt.fields.Log, - Init: tt.fields.Init, - Account: tt.fields.Account, - Core: tt.fields.Core, - Network: tt.fields.Network, - RPC: tt.fields.RPC, - System: tt.fields.System, - State: tt.fields.State, - } - got := c.String() - assert.Equal(t, tt.want, got) - }) - } -} - func TestDevConfig(t *testing.T) { t.Parallel() diff --git a/dot/services_test.go b/dot/services_test.go index e42b85b03e..464ff83e01 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -24,10 +24,8 @@ import ( "github.com/stretchr/testify/require" "io/ioutil" "path/filepath" - "reflect" "testing" - "github.com/ChainSafe/chaindb" "github.com/ChainSafe/gossamer/dot/core" "github.com/ChainSafe/gossamer/dot/digest" "github.com/ChainSafe/gossamer/dot/network" @@ -576,79 +574,152 @@ func Test_createRuntime(t *testing.T) { } func Test_createRuntimeStorage(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + type args struct { st *state.Service } tests := []struct { - name string - args args - want *runtime.NodeStorage - wantErr bool + name string + args args + want *runtime.NodeStorage + err error }{ - // TODO: Add test cases. + { + name: "working example", + args: args{st: stateSrvc}, + want: &runtime.NodeStorage{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createRuntimeStorage(tt.args.st) - if (err != nil) != tt.wantErr { - t.Errorf("createRuntimeStorage() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createRuntimeStorage() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } } func Test_createStateService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + cfg2 := NewTestConfig(t) + cfg2.Global.BasePath = "" + type args struct { cfg *Config } tests := []struct { - name string - args args - want *state.Service - wantErr bool + name string + args args + want *state.Service + err error }{ - // TODO: Add test cases. + { + name: "working example", + args: args{cfg: cfg}, + want: &state.Service{}, + }, + { + name: "broken config test", + args: args{cfg: cfg2}, + err: errors.New("failed to start state service: failed to create block state: cannot get block 0: Key not found"), + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createStateService(tt.args.cfg) - if (err != nil) != tt.wantErr { - t.Errorf("createStateService() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createStateService() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } } func Test_createSystemService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + type args struct { cfg *types.SystemInfo stateSrvc *state.Service } tests := []struct { - name string - args args - want *system.Service - wantErr bool + name string + args args + want *system.Service + err error }{ - // TODO: Add test cases. + { + name: "working example", + args: args{ + stateSrvc: stateSrvc, + }, + want: &system.Service{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := createSystemService(tt.args.cfg, tt.args.stateSrvc) - if (err != nil) != tt.wantErr { - t.Errorf("createSystemService() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("createSystemService() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } @@ -659,28 +730,50 @@ func Test_newInMemoryDB(t *testing.T) { path string } tests := []struct { - name string - args args - want chaindb.Database - wantErr bool + name string + args args + want bool + err error }{ - // TODO: Add test cases. + { + name: "working example", + args: args{path: ""}, + want: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := newInMemoryDB(tt.args.path) - if (err != nil) != tt.wantErr { - t.Errorf("newInMemoryDB() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("newInMemoryDB() got = %v, want %v", got, tt.want) + + if tt.want { + assert.NotNil(t, got) } }) } } func Test_newSyncService(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + + stateSrvc, err := createStateService(cfg) + require.NoError(t, err) + type args struct { cfg *Config st *state.Service @@ -690,22 +783,40 @@ func Test_newSyncService(t *testing.T) { net *network.Service } tests := []struct { - name string - args args - want *sync.Service - wantErr bool + name string + args args + want *sync.Service + err error }{ - // TODO: Add test cases. + { + name: "missing FinalityGadget test", + args: args{ + cfg: cfg, + st: stateSrvc, + }, + err: errors.New("cannot have nil FinalityGadget"), + }, + { + name: "working example", + args: args{ + cfg: cfg, + st: stateSrvc, + fg: &grandpa.Service{}, + }, + want: &sync.Service{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, err := newSyncService(tt.args.cfg, tt.args.st, tt.args.fg, tt.args.verifier, tt.args.cs, tt.args.net) - if (err != nil) != tt.wantErr { - t.Errorf("newSyncService() error = %v, wantErr %v", err, tt.wantErr) - return + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + } else { + assert.NoError(t, err) } - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("newSyncService() got = %v, want %v", got, tt.want) + + if tt.want != nil { + assert.NotNil(t, got) } }) } From 1c0afe5970c23981d13dc3827f4cd1cde22304f3 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Thu, 11 Nov 2021 19:17:47 -0500 Subject: [PATCH 19/43] implement utils tests --- dot/import_integration_test.go | 41 +++-- dot/utils_test.go | 281 ++++++++++++++++++++++++++------- lib/babe/verify.go | 2 +- 3 files changed, 247 insertions(+), 77 deletions(-) diff --git a/dot/import_integration_test.go b/dot/import_integration_test.go index 60e8c1a340..25d2ee1348 100644 --- a/dot/import_integration_test.go +++ b/dot/import_integration_test.go @@ -20,7 +20,6 @@ package dot import ( - "encoding/json" "io/ioutil" "math/big" "testing" @@ -33,26 +32,26 @@ import ( "github.com/stretchr/testify/require" ) -func setupStateFile(t *testing.T) string { - filename := "../lib/runtime/test_data/kusama/block1482002.out" - - data, err := ioutil.ReadFile(filename) - require.NoError(t, err) - - rpcPairs := make(map[string]interface{}) - err = json.Unmarshal(data, &rpcPairs) - require.NoError(t, err) - pairs := rpcPairs["result"].([]interface{}) - - bz, err := json.Marshal(pairs) - require.NoError(t, err) - - fp := "./test_data/state.json" - err = ioutil.WriteFile(fp, bz, 0777) - require.NoError(t, err) - - return fp -} +//func setupStateFile(t *testing.T) string { +// filename := "../lib/runtime/test_data/kusama/block1482002.out" +// +// data, err := ioutil.ReadFile(filename) +// require.NoError(t, err) +// +// rpcPairs := make(map[string]interface{}) +// err = json.Unmarshal(data, &rpcPairs) +// require.NoError(t, err) +// pairs := rpcPairs["result"].([]interface{}) +// +// bz, err := json.Marshal(pairs) +// require.NoError(t, err) +// +// fp := "./test_data/state.json" +// err = ioutil.WriteFile(fp, bz, 0777) +// require.NoError(t, err) +// +// return fp +//} func setupHeaderFile(t *testing.T) string { headerStr := "{\"digest\":{\"logs\":[\"0x0642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c\",\"0x054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86\"]},\"extrinsicsRoot\":\"0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0\",\"number\":\"0x169d12\",\"parentHash\":\"0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975\",\"stateRoot\":\"0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb\"}" diff --git a/dot/utils_test.go b/dot/utils_test.go index 3bb76779c1..e67ca1bbaa 100644 --- a/dot/utils_test.go +++ b/dot/utils_test.go @@ -17,8 +17,10 @@ package dot import ( + "github.com/ChainSafe/gossamer/dot/types" + "github.com/stretchr/testify/assert" "os" - "reflect" + "strings" "testing" ctoml "github.com/ChainSafe/gossamer/dot/config/toml" @@ -35,12 +37,20 @@ func TestCreateJSONRawFile(t *testing.T) { args args want *os.File }{ - // TODO: Add test cases. + { + name: "working example", + args: args{ + bs: &BuildSpec{genesis: NewTestGenesis(t)}, + fp: "test.json", + }, + want: &os.File{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := CreateJSONRawFile(tt.args.bs, tt.args.fp); !reflect.DeepEqual(got, tt.want) { - t.Errorf("CreateJSONRawFile() = %v, want %v", got, tt.want) + got := CreateJSONRawFile(tt.args.bs, tt.args.fp) + if tt.want != nil { + assert.NotNil(t, got) } }) } @@ -56,12 +66,20 @@ func TestExportConfig(t *testing.T) { args args want *os.File }{ - // TODO: Add test cases. + { + name: "working example", + args: args{ + cfg: &Config{}, + fp: "test.json", + }, + want: &os.File{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := ExportConfig(tt.args.cfg, tt.args.fp); !reflect.DeepEqual(got, tt.want) { - t.Errorf("ExportConfig() = %v, want %v", got, tt.want) + got := ExportConfig(tt.args.cfg, tt.args.fp) + if tt.want != nil { + assert.NotNil(t, got) } }) } @@ -77,12 +95,20 @@ func TestExportTomlConfig(t *testing.T) { args args want *os.File }{ - // TODO: Add test cases. + { + name: "working example", + args: args{ + cfg: &ctoml.Config{}, + fp: "test.json", + }, + want: &os.File{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := ExportTomlConfig(tt.args.cfg, tt.args.fp); !reflect.DeepEqual(got, tt.want) { - t.Errorf("ExportTomlConfig() = %v, want %v", got, tt.want) + got := ExportTomlConfig(tt.args.cfg, tt.args.fp) + if tt.want != nil { + assert.NotNil(t, got) } }) } @@ -97,12 +123,77 @@ func TestNewTestConfig(t *testing.T) { args args want *Config }{ - // TODO: Add test cases. + { + name: "working example", + args: args{t: t}, + want: &Config{ + Global: GlobalConfig{ + Name: "Gossamer", + ID: "gssmr", + BasePath: "test_data/TestNewTestConfig", + LogLvl: 3, + PublishMetrics: false, + MetricsPort: 0, + NoTelemetry: false, + TelemetryURLs: nil, + RetainBlocks: 0, + Pruning: "", + }, + Log: LogConfig{ + CoreLvl: 3, + SyncLvl: 3, + NetworkLvl: 3, + RPCLvl: 3, + StateLvl: 3, + RuntimeLvl: 3, + BlockProducerLvl: 3, + FinalityGadgetLvl: 3, + }, + Init: InitConfig{Genesis: "./chain/gssmr/genesis-spec.json"}, + Core: CoreConfig{ + Roles: 4, + BabeAuthority: true, + BABELead: false, + GrandpaAuthority: true, + WasmInterpreter: "wasmer", + GrandpaInterval: 1000000000, + }, + Network: NetworkConfig{ + Port: 7001, + Bootnodes: nil, + ProtocolID: "", + NoBootstrap: false, + NoMDNS: false, + MinPeers: 1, + MaxPeers: 0, + PersistentPeers: nil, + DiscoveryInterval: 10000000000, + }, + RPC: RPCConfig{ + Enabled: false, + External: false, + Unsafe: false, + UnsafeExternal: false, + Port: 8545, + Host: "localhost", + Modules: []string{"system", "author", "chain", "state", "rpc", "grandpa", "offchain", "childstate", "syncstate", "payment"}, + WSPort: 8546, + WS: false, + WSExternal: false, + WSUnsafe: false, + WSUnsafeExternal: false, + }, + System: types.SystemInfo{}, + State: StateConfig{}, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := NewTestConfig(tt.args.t); !reflect.DeepEqual(got, tt.want) { - t.Errorf("NewTestConfig() = %v, want %v", got, tt.want) + got := NewTestConfig(tt.args.t) + if tt.want != nil { + assert.Equal(t, tt.want, got) + assert.NotNil(t, got) } }) } @@ -118,16 +209,79 @@ func TestNewTestConfigWithFile(t *testing.T) { want *Config want1 *os.File }{ - // TODO: Add test cases. + { + name: "working example", + args: args{t: t}, + want: &Config{ + Global: GlobalConfig{ + Name: "Gossamer", + ID: "gssmr", + BasePath: "test_data/TestNewTestConfigWithFile", + LogLvl: 3, + PublishMetrics: false, + MetricsPort: 0, + NoTelemetry: false, + TelemetryURLs: nil, + RetainBlocks: 0, + Pruning: "", + }, + Log: LogConfig{ + CoreLvl: 3, + SyncLvl: 3, + NetworkLvl: 3, + RPCLvl: 3, + StateLvl: 3, + RuntimeLvl: 3, + BlockProducerLvl: 3, + FinalityGadgetLvl: 3, + }, + Init: InitConfig{Genesis: "./chain/gssmr/genesis-spec.json"}, + Core: CoreConfig{ + Roles: 4, + BabeAuthority: true, + BABELead: false, + GrandpaAuthority: true, + WasmInterpreter: "wasmer", + GrandpaInterval: 1000000000, + }, + Network: NetworkConfig{ + Port: 7001, + Bootnodes: nil, + ProtocolID: "", + NoBootstrap: false, + NoMDNS: false, + MinPeers: 1, + MaxPeers: 0, + PersistentPeers: nil, + DiscoveryInterval: 10000000000, + }, + RPC: RPCConfig{ + Enabled: false, + External: false, + Unsafe: false, + UnsafeExternal: false, + Port: 8545, + Host: "localhost", + Modules: []string{"system", "author", "chain", "state", "rpc", "grandpa", "offchain", "childstate", "syncstate", "payment"}, + WSPort: 8546, + WS: false, + WSExternal: false, + WSUnsafe: false, + WSUnsafeExternal: false, + }, + System: types.SystemInfo{}, + State: StateConfig{}, + }, + want1: &os.File{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got, got1 := NewTestConfigWithFile(tt.args.t) - if !reflect.DeepEqual(got, tt.want) { - t.Errorf("NewTestConfigWithFile() got = %v, want %v", got, tt.want) - } - if !reflect.DeepEqual(got1, tt.want1) { - t.Errorf("NewTestConfigWithFile() got1 = %v, want %v", got1, tt.want1) + + assert.Equal(t, tt.want, got) + if tt.want1 != nil { + assert.NotNil(t, got1) } }) } @@ -142,12 +296,17 @@ func TestNewTestGenesis(t *testing.T) { args args want *genesis.Genesis }{ - // TODO: Add test cases. + { + name: "working example", + args: args{t: t}, + want: &genesis.Genesis{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := NewTestGenesis(tt.args.t); !reflect.DeepEqual(got, tt.want) { - t.Errorf("NewTestGenesis() = %v, want %v", got, tt.want) + got := NewTestGenesis(tt.args.t) + if tt.want != nil { + assert.NotNil(t, got) } }) } @@ -162,13 +321,16 @@ func TestNewTestGenesisAndRuntime(t *testing.T) { args args want string }{ - // TODO: Add test cases. + { + name: "working example", + args: args{t: t}, + want: "", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := NewTestGenesisAndRuntime(tt.args.t); got != tt.want { - t.Errorf("NewTestGenesisAndRuntime() = %v, want %v", got, tt.want) - } + got := NewTestGenesisAndRuntime(tt.args.t) + assert.True(t, strings.HasPrefix(got, "test_data/TestNewTestGenesisAndRuntime/genesis")) }) } } @@ -183,12 +345,20 @@ func TestNewTestGenesisFile(t *testing.T) { args args want *os.File }{ - // TODO: Add test cases. + { + name: "working example", + args: args{ + t: t, + cfg: &Config{}, + }, + want: &os.File{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := NewTestGenesisFile(tt.args.t, tt.args.cfg); !reflect.DeepEqual(got, tt.want) { - t.Errorf("NewTestGenesisFile() = %v, want %v", got, tt.want) + got := NewTestGenesisFile(tt.args.t, tt.args.cfg) + if tt.want != nil { + assert.NotNil(t, got) } }) } @@ -204,12 +374,20 @@ func TestNewTestGenesisRawFile(t *testing.T) { args args want *os.File }{ - // TODO: Add test cases. + { + name: "working example", + args: args{ + t: t, + cfg: &Config{}, + }, + want: &os.File{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := NewTestGenesisRawFile(tt.args.t, tt.args.cfg); !reflect.DeepEqual(got, tt.want) { - t.Errorf("NewTestGenesisRawFile() = %v, want %v", got, tt.want) + got := NewTestGenesisRawFile(tt.args.t, tt.args.cfg) + if tt.want != nil { + assert.NotNil(t, got) } }) } @@ -220,13 +398,14 @@ func TestRandomNodeName(t *testing.T) { name string want string }{ - // TODO: Add test cases. + { + name: "working example", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := RandomNodeName(); got != tt.want { - t.Errorf("RandomNodeName() = %v, want %v", got, tt.want) - } + got := RandomNodeName() + assert.Greater(t, len(got), 3) }) } } @@ -241,29 +420,21 @@ func TestWriteConfig(t *testing.T) { args args want *os.File }{ - // TODO: Add test cases. + { + name: "working example", + args: args{ + data: nil, + fp: "test.json", + }, + want: &os.File{}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := WriteConfig(tt.args.data, tt.args.fp); !reflect.DeepEqual(got, tt.want) { - t.Errorf("WriteConfig() = %v, want %v", got, tt.want) + got := WriteConfig(tt.args.data, tt.args.fp) + if tt.want != nil { + assert.NotNil(t, got) } }) } } - -func Test_setupLogger(t *testing.T) { - type args struct { - cfg *Config - } - tests := []struct { - name string - args args - }{ - // TODO: Add test cases. - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - }) - } -} diff --git a/lib/babe/verify.go b/lib/babe/verify.go index 840173cb25..52a9f02ee7 100644 --- a/lib/babe/verify.go +++ b/lib/babe/verify.go @@ -19,11 +19,11 @@ package babe import ( "errors" "fmt" - "github.com/ChainSafe/gossamer/dot/state" "math/big" "reflect" "sync" + "github.com/ChainSafe/gossamer/dot/state" "github.com/ChainSafe/gossamer/dot/types" "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/crypto/sr25519" From 0a95194f300b19d5589b8040a42e3c1c4a759967 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Fri, 12 Nov 2021 14:03:58 -0500 Subject: [PATCH 20/43] add to tests --- dot/import_integration_test.go | 14 +-- dot/node_integration_test.go | 40 +------- dot/node_test.go | 168 ++++++++++++++++----------------- dot/services_test.go | 8 +- dot/utils_test.go | 4 +- 5 files changed, 97 insertions(+), 137 deletions(-) diff --git a/dot/import_integration_test.go b/dot/import_integration_test.go index 25d2ee1348..078dd892dc 100644 --- a/dot/import_integration_test.go +++ b/dot/import_integration_test.go @@ -53,13 +53,13 @@ import ( // return fp //} -func setupHeaderFile(t *testing.T) string { - headerStr := "{\"digest\":{\"logs\":[\"0x0642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c\",\"0x054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86\"]},\"extrinsicsRoot\":\"0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0\",\"number\":\"0x169d12\",\"parentHash\":\"0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975\",\"stateRoot\":\"0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb\"}" - fp := "./test_data/header.json" - err := ioutil.WriteFile(fp, []byte(headerStr), 0777) - require.NoError(t, err) - return fp -} +//func setupHeaderFile(t *testing.T) string { +// headerStr := "{\"digest\":{\"logs\":[\"0x0642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c\",\"0x054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86\"]},\"extrinsicsRoot\":\"0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0\",\"number\":\"0x169d12\",\"parentHash\":\"0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975\",\"stateRoot\":\"0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb\"}" +// fp := "./test_data/header.json" +// err := ioutil.WriteFile(fp, []byte(headerStr), 0777) +// require.NoError(t, err) +// return fp +//} func TestNewTrieFromPairs(t *testing.T) { fp := setupStateFile(t) diff --git a/dot/node_integration_test.go b/dot/node_integration_test.go index 392c938349..23a5484748 100644 --- a/dot/node_integration_test.go +++ b/dot/node_integration_test.go @@ -38,7 +38,7 @@ import ( "github.com/ChainSafe/gossamer/lib/trie" "github.com/ChainSafe/gossamer/lib/utils" - log "github.com/ChainSafe/log15" + log "github.com/ChainSafe/gossamer/internal/log" "github.com/stretchr/testify/require" ) @@ -159,42 +159,6 @@ func TestNewNode_Authority(t *testing.T) { require.NotNil(t, fg) } -// TestStartNode -func TestStartNode(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - cfg.Core.GrandpaAuthority = false - - err := InitNode(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - err = keystore.LoadKeystore("alice", ks.Gran) - require.NoError(t, err) - err = keystore.LoadKeystore("alice", ks.Babe) - require.NoError(t, err) - - cfg.Core.Roles = types.FullNodeRole - - node, err := NewNode(cfg, ks, nil) - require.NoError(t, err) - - go func() { - <-node.started - node.Stop() - }() - - err = node.Start() - require.NoError(t, err) -} - // TestInitNode_LoadGenesisData func TestInitNode_LoadGenesisData(t *testing.T) { cfg := NewTestConfig(t) @@ -213,7 +177,7 @@ func TestInitNode_LoadGenesisData(t *testing.T) { config := state.Config{ Path: cfg.Global.BasePath, - LogLevel: log.LvlInfo, + LogLevel: log.Info, } stateSrvc := state.NewService(config) diff --git a/dot/node_test.go b/dot/node_test.go index d3514ab634..c8ba59ddce 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -19,19 +19,17 @@ package dot import ( "errors" "fmt" - "github.com/ChainSafe/gossamer/dot/types" - "github.com/ChainSafe/gossamer/lib/common" - "github.com/ChainSafe/gossamer/lib/utils" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "sync" "testing" "github.com/ChainSafe/gossamer/dot/network" "github.com/ChainSafe/gossamer/dot/state" + "github.com/ChainSafe/gossamer/dot/types" + "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/keystore" "github.com/ChainSafe/gossamer/lib/runtime" - "github.com/ChainSafe/gossamer/lib/services" + "github.com/ChainSafe/gossamer/lib/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestInitNode(t *testing.T) { @@ -39,13 +37,13 @@ func TestInitNode(t *testing.T) { cfg *Config } tests := []struct { - name string - args args - err error + name string + args args + err error }{ { - name: "no arguments", - args: args{cfg: GssmrConfig()}, + name: "no arguments", + args: args{cfg: GssmrConfig()}, }, } for _, tt := range tests { @@ -84,16 +82,16 @@ func TestLoadGlobalNodeName(t *testing.T) { name string args args wantNodename string - err error + err error }{ { name: "working example", - args: args{basepath: basePath}, + args: args{basepath: basePath}, wantNodename: "nodeName", }, { - name: "no arguments", - err: errors.New("Key not found"), + name: "no arguments", + err: errors.New("Key not found"), }, } for _, tt := range tests { @@ -132,34 +130,32 @@ func TestNewNode(t *testing.T) { cfg.Core.Roles = types.FullNodeRole - - type args struct { cfg *Config ks *keystore.GlobalKeystore stopFunc func() } tests := []struct { - name string - args args - want *Node - err error + name string + args args + want *Node + err error }{ { - name: "missing keystore", - args: args{ + name: "missing keystore", + args: args{ cfg: cfg, }, err: errors.New("failed to create core service: cannot have nil keystore"), }, // todo (ed) this second test fails with; failed to create state service: failed to start state service: Cannot acquire directory lock on "/home/emack/projects/ChainSafe/gossamer/dot/test_data/TestNewNode/db". Another process is using this Badger database.: resource temporarily unavailable { - name: "working example", - args: args{ - cfg: cfg, - ks: ks, + name: "working example", + args: args{ + cfg: cfg, + ks: ks, }, - want: &Node{Name: "Gossamer"}, + want: &Node{Name: "Gossamer"}, }, } for _, tt := range tests { @@ -179,6 +175,19 @@ func TestNewNode(t *testing.T) { } func TestNodeInitialized(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + + err := InitNode(cfg) + require.NoError(t, err) + type args struct { basepath string } @@ -187,7 +196,16 @@ func TestNodeInitialized(t *testing.T) { args args want bool }{ - // TODO: Add test cases. + { + name: "blank base path", + args: args{basepath: ""}, + want: false, + }, + { + name: "working example", + args: args{basepath: cfg.Global.BasePath}, + want: true, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -198,63 +216,41 @@ func TestNodeInitialized(t *testing.T) { } } -func TestNode_Start(t *testing.T) { - type fields struct { - Name string - Services *services.ServiceRegistry - StopFunc func() - wg sync.WaitGroup - started chan struct{} - } - tests := []struct { - name string - fields fields - wantErr bool - }{ - // TODO: Add test cases. - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - n := &Node{ - Name: tt.fields.Name, - Services: tt.fields.Services, - StopFunc: tt.fields.StopFunc, - wg: tt.fields.wg, - started: tt.fields.started, - } - if err := n.Start(); (err != nil) != tt.wantErr { - t.Errorf("Start() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} +// TestStartNode +func TestStartNode(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) -func TestNode_Stop(t *testing.T) { - type fields struct { - Name string - Services *services.ServiceRegistry - StopFunc func() - wg sync.WaitGroup - started chan struct{} - } - tests := []struct { - name string - fields fields - }{ - // TODO: Add test cases. - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - n := &Node{ - Name: tt.fields.Name, - Services: tt.fields.Services, - StopFunc: tt.fields.StopFunc, - wg: tt.fields.wg, - started: tt.fields.started, - } - fmt.Printf("node %v\n", n) - }) - } + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + cfg.Core.GrandpaAuthority = false + + err := InitNode(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + err = keystore.LoadKeystore("alice", ks.Gran) + require.NoError(t, err) + err = keystore.LoadKeystore("alice", ks.Babe) + require.NoError(t, err) + + cfg.Core.Roles = types.FullNodeRole + + node, err := NewNode(cfg, ks, nil) + require.NoError(t, err) + + go func() { + <-node.started + fmt.Printf("######################node started\n") + node.Stop() + }() + + err = node.Start() + require.NoError(t, err) } func Test_loadRuntime(t *testing.T) { diff --git a/dot/services_test.go b/dot/services_test.go index 464ff83e01..d0b15c7ed0 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -18,10 +18,6 @@ package dot import ( "errors" - "github.com/ChainSafe/gossamer/lib/runtime/wasmer" - "github.com/ChainSafe/gossamer/lib/utils" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "io/ioutil" "path/filepath" "testing" @@ -39,6 +35,10 @@ import ( "github.com/ChainSafe/gossamer/lib/grandpa" "github.com/ChainSafe/gossamer/lib/keystore" "github.com/ChainSafe/gossamer/lib/runtime" + "github.com/ChainSafe/gossamer/lib/runtime/wasmer" + "github.com/ChainSafe/gossamer/lib/utils" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func Test_createBABEService(t *testing.T) { diff --git a/dot/utils_test.go b/dot/utils_test.go index e67ca1bbaa..895e744394 100644 --- a/dot/utils_test.go +++ b/dot/utils_test.go @@ -17,14 +17,14 @@ package dot import ( - "github.com/ChainSafe/gossamer/dot/types" - "github.com/stretchr/testify/assert" "os" "strings" "testing" ctoml "github.com/ChainSafe/gossamer/dot/config/toml" + "github.com/ChainSafe/gossamer/dot/types" "github.com/ChainSafe/gossamer/lib/genesis" + "github.com/stretchr/testify/assert" ) func TestCreateJSONRawFile(t *testing.T) { From 8768a1112a5870a7a18043b01b897b34a0723a26 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Fri, 12 Nov 2021 14:20:00 -0500 Subject: [PATCH 21/43] clean-up tests --- dot/node_integration_test.go | 36 ++++++++++++++++ dot/node_test.go | 84 ------------------------------------ 2 files changed, 36 insertions(+), 84 deletions(-) diff --git a/dot/node_integration_test.go b/dot/node_integration_test.go index 23a5484748..32060b6022 100644 --- a/dot/node_integration_test.go +++ b/dot/node_integration_test.go @@ -335,6 +335,42 @@ func TestInitNode_LoadBalances(t *testing.T) { require.Equal(t, expected, bal) } +// TestStartNode +func TestStartNode(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + cfg.Core.GrandpaAuthority = false + + err := InitNode(cfg) + require.NoError(t, err) + + ks := keystore.NewGlobalKeystore() + err = keystore.LoadKeystore("alice", ks.Gran) + require.NoError(t, err) + err = keystore.LoadKeystore("alice", ks.Babe) + require.NoError(t, err) + + cfg.Core.Roles = types.FullNodeRole + + node, err := NewNode(cfg, ks, nil) + require.NoError(t, err) + + go func() { + <-node.started + node.Stop() + }() + + err = node.Start() + require.NoError(t, err) +} + func TestNode_StopFunc(t *testing.T) { testvar := "before" stopFunc := func() { diff --git a/dot/node_test.go b/dot/node_test.go index d4bb14ca7a..bab1ae7482 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -8,12 +8,10 @@ import ( "fmt" "testing" - "github.com/ChainSafe/gossamer/dot/network" "github.com/ChainSafe/gossamer/dot/state" "github.com/ChainSafe/gossamer/dot/types" "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/keystore" - "github.com/ChainSafe/gossamer/lib/runtime" "github.com/ChainSafe/gossamer/lib/utils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -202,85 +200,3 @@ func TestNodeInitialized(t *testing.T) { }) } } - -// TestStartNode -func TestStartNode(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - cfg.Core.GrandpaAuthority = false - - err := InitNode(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - err = keystore.LoadKeystore("alice", ks.Gran) - require.NoError(t, err) - err = keystore.LoadKeystore("alice", ks.Babe) - require.NoError(t, err) - - cfg.Core.Roles = types.FullNodeRole - - node, err := NewNode(cfg, ks, nil) - require.NoError(t, err) - - go func() { - <-node.started - fmt.Printf("######################node started\n") - node.Stop() - }() - - err = node.Start() - require.NoError(t, err) -} - -func Test_loadRuntime(t *testing.T) { - type args struct { - cfg *Config - ns *runtime.NodeStorage - stateSrvc *state.Service - ks *keystore.GlobalKeystore - net *network.Service - } - tests := []struct { - name string - args args - wantErr bool - }{ - // TODO: Add test cases. - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := loadRuntime(tt.args.cfg, tt.args.ns, tt.args.stateSrvc, tt.args.ks, tt.args.net); (err != nil) != tt.wantErr { - t.Errorf("loadRuntime() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} - -func Test_storeGlobalNodeName(t *testing.T) { - type args struct { - name string - basepath string - } - tests := []struct { - name string - args args - wantErr bool - }{ - // TODO: Add test cases. - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := storeGlobalNodeName(tt.args.name, tt.args.basepath); (err != nil) != tt.wantErr { - t.Errorf("storeGlobalNodeName() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} From 829a383f087c80557055578eab69c5452eb4241b Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Fri, 12 Nov 2021 15:00:11 -0500 Subject: [PATCH 22/43] clean-up created test files --- dot/node_test.go | 32 +++++++++++++++++++------------- dot/services_test.go | 4 ++-- dot/utils_test.go | 8 ++++---- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/dot/node_test.go b/dot/node_test.go index bab1ae7482..4f55fddbfa 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -5,7 +5,6 @@ package dot import ( "errors" - "fmt" "testing" "github.com/ChainSafe/gossamer/dot/state" @@ -18,6 +17,14 @@ import ( ) func TestInitNode(t *testing.T) { + cfg := NewTestConfig(t) + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + defer utils.RemoveTestDir(t) + + cfg.Init.Genesis = genFile.Name() + type args struct { cfg *Config } @@ -27,14 +34,12 @@ func TestInitNode(t *testing.T) { err error }{ { - name: "no arguments", - args: args{cfg: GssmrConfig()}, + name: "test config", + args: args{cfg: cfg}, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - // todo (ed) deal with file path to test this - fmt.Printf("gen %v\n", tt.args.cfg.Init.Genesis) err := InitNode(tt.args.cfg) if tt.err != nil { @@ -75,7 +80,8 @@ func TestLoadGlobalNodeName(t *testing.T) { wantNodename: "nodeName", }, { - name: "no arguments", + name: "wrong basepath test", + args: args{basepath: "test_data"}, err: errors.New("Key not found"), }, } @@ -126,13 +132,13 @@ func TestNewNode(t *testing.T) { want *Node err error }{ - { - name: "missing keystore", - args: args{ - cfg: cfg, - }, - err: errors.New("failed to create core service: cannot have nil keystore"), - }, + //{ + // name: "missing keystore", + // args: args{ + // cfg: cfg, + // }, + // err: errors.New("failed to create core service: cannot have nil keystore"), + //}, // todo (ed) this second test fails with; failed to create state service: failed to start state service: Cannot acquire directory lock on "/home/emack/projects/ChainSafe/gossamer/dot/test_data/TestNewNode/db". Another process is using this Badger database.: resource temporarily unavailable { name: "working example", diff --git a/dot/services_test.go b/dot/services_test.go index 26706a5cb0..cbbb4a20af 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -623,7 +623,7 @@ func Test_createStateService(t *testing.T) { require.NoError(t, err) cfg2 := NewTestConfig(t) - cfg2.Global.BasePath = "" + cfg2.Global.BasePath = "test_data" type args struct { cfg *Config @@ -724,7 +724,7 @@ func Test_newInMemoryDB(t *testing.T) { }{ { name: "working example", - args: args{path: ""}, + args: args{path: "test_data"}, want: true, }, } diff --git a/dot/utils_test.go b/dot/utils_test.go index d17e957663..5c857aafc6 100644 --- a/dot/utils_test.go +++ b/dot/utils_test.go @@ -28,7 +28,7 @@ func TestCreateJSONRawFile(t *testing.T) { name: "working example", args: args{ bs: &BuildSpec{genesis: NewTestGenesis(t)}, - fp: "test.json", + fp: "test_data/test.json", }, want: &os.File{}, }, @@ -57,7 +57,7 @@ func TestExportConfig(t *testing.T) { name: "working example", args: args{ cfg: &Config{}, - fp: "test.json", + fp: "test_data/test.json", }, want: &os.File{}, }, @@ -86,7 +86,7 @@ func TestExportTomlConfig(t *testing.T) { name: "working example", args: args{ cfg: &ctoml.Config{}, - fp: "test.json", + fp: "test_data/test.json", }, want: &os.File{}, }, @@ -411,7 +411,7 @@ func TestWriteConfig(t *testing.T) { name: "working example", args: args{ data: nil, - fp: "test.json", + fp: "test_data/test.json", }, want: &os.File{}, }, From 5f871e35894cfd1e43d5d99524622444f6ad65d8 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Fri, 12 Nov 2021 16:01:25 -0500 Subject: [PATCH 23/43] address PR comments, clean-up --- dot/build_spec_test.go | 31 +++++++++++++++++++++++++- dot/node.go | 14 +++++------- dot/services_test.go | 50 ++++++++++++++++++++++-------------------- lib/babe/verify.go | 24 ++++++++++---------- 4 files changed, 74 insertions(+), 45 deletions(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index 5b5159bc33..aa5504d5cb 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -23,10 +23,39 @@ func TestBuildSpec_ToJSON(t *testing.T) { err error }{ { - name: "normal conditions", + name: "name test", fields: fields{genesis: &genesis.Genesis{Name: "test"}}, want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, }, + { + name: "additional parameters test", + fields: fields{genesis: &genesis.Genesis{ + Name: "test", + ID: "ID", + ChainType: "chainType", + ProtocolID: "protocol", + ConsensusEngine: "babe", + }}, + want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 73, 68, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, + }, + { + name: "normal conditions", + fields: fields{genesis: &genesis.Genesis{ + Name: "test", + ID: "ID", + ChainType: "chainType", + Bootnodes: []string{"node1", "node2"}, + TelemetryEndpoints: []interface{}{"endpoint"}, + ProtocolID: "protocol", + Genesis: genesis.Fields{}, + Properties: map[string]interface{}{"key": "value"}, + ForkBlocks: []string{"1", "2"}, + BadBlocks: []string{"3", "4"}, + ConsensusEngine: "babe", + CodeSubstitutes: map[string]string{"key": "value"}, + }}, + want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 73, 68, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 91, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 110, 111, 100, 101, 49, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 110, 111, 100, 101, 50, 34, 10, 32, 32, 32, 32, 93, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 107, 101, 121, 34, 58, 32, 34, 118, 97, 108, 117, 101, 34, 10, 32, 32, 32, 32, 125, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/dot/node.go b/dot/node.go index d0c5cd4eb2..9cf16f73e6 100644 --- a/dot/node.go +++ b/dot/node.go @@ -146,7 +146,7 @@ func NodeInitialized(basepath string) bool { } // LoadGlobalNodeName returns the stored global node name from database -func LoadGlobalNodeName(basepath string) (string, error) { +func LoadGlobalNodeName(basepath string) (nodename string, err error) { // initialise database using data directory db, err := utils.SetupDatabase(basepath, false) if err != nil { @@ -154,21 +154,19 @@ func LoadGlobalNodeName(basepath string) (string, error) { } defer func() { - err = db.Close() - if err != nil { - logger.Errorf("failed to close database: %s", err) + e := db.Close() + if e != nil { + logger.Errorf("failed to close database: %s", e) return } }() basestate := state.NewBaseState(db) - nodename, err := basestate.LoadNodeGlobalName() + nodename, err = basestate.LoadNodeGlobalName() if err != nil { logger.Warnf("failed to load global node name from base path %s: %s", basepath, err) - return "", err } - - return nodename, err + return } // NewNode creates a new dot node from a dot node configuration diff --git a/dot/services_test.go b/dot/services_test.go index cbbb4a20af..f84a48cf94 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -32,10 +32,8 @@ func Test_createBABEService(t *testing.T) { t.Parallel() cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -108,6 +106,8 @@ func Test_createBABEService(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -115,10 +115,8 @@ func Test_createBABEService(t *testing.T) { func Test_createBlockVerifier(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -161,6 +159,8 @@ func Test_createBlockVerifier(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -168,10 +168,8 @@ func Test_createBlockVerifier(t *testing.T) { func Test_createCoreService(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -232,6 +230,8 @@ func Test_createCoreService(t *testing.T) { } if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -239,10 +239,8 @@ func Test_createCoreService(t *testing.T) { func Test_createDigestHandler(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -280,6 +278,8 @@ func Test_createDigestHandler(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -287,10 +287,8 @@ func Test_createDigestHandler(t *testing.T) { func Test_createGRANDPAService(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -362,6 +360,8 @@ func Test_createGRANDPAService(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -369,10 +369,8 @@ func Test_createGRANDPAService(t *testing.T) { func Test_createNetworkService(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -414,6 +412,8 @@ func Test_createNetworkService(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -421,10 +421,8 @@ func Test_createNetworkService(t *testing.T) { func Test_createRPCService(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -475,6 +473,8 @@ func Test_createRPCService(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -482,10 +482,8 @@ func Test_createRPCService(t *testing.T) { func Test_createRuntime(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -555,6 +553,8 @@ func Test_createRuntime(t *testing.T) { if tt.want { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -562,10 +562,8 @@ func Test_createRuntime(t *testing.T) { func Test_createRuntimeStorage(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -603,6 +601,8 @@ func Test_createRuntimeStorage(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -610,10 +610,8 @@ func Test_createRuntimeStorage(t *testing.T) { func Test_createStateService(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -656,6 +654,8 @@ func Test_createStateService(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -663,10 +663,8 @@ func Test_createStateService(t *testing.T) { func Test_createSystemService(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -707,6 +705,8 @@ func Test_createSystemService(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -739,6 +739,8 @@ func Test_newInMemoryDB(t *testing.T) { if tt.want { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } @@ -746,10 +748,8 @@ func Test_newInMemoryDB(t *testing.T) { func Test_newSyncService(t *testing.T) { cfg := NewTestConfig(t) - require.NotNil(t, cfg) genFile := NewTestGenesisFile(t, cfg) - require.NotNil(t, genFile) defer utils.RemoveTestDir(t) @@ -804,6 +804,8 @@ func Test_newSyncService(t *testing.T) { if tt.want != nil { assert.NotNil(t, got) + } else { + assert.Nil(t, got) } }) } diff --git a/lib/babe/verify.go b/lib/babe/verify.go index de0d9045be..9ddba9af86 100644 --- a/lib/babe/verify.go +++ b/lib/babe/verify.go @@ -47,26 +47,26 @@ type VerificationManager struct { // NewVerificationManager returns a new NewVerificationManager func NewVerificationManager(blockState BlockState, epochState EpochState) (*VerificationManager, error) { + var isNilBlock bool switch blockState.(type) { case *state.BlockState: - if blockState == (*state.BlockState)(nil) { - return nil, errNilBlockState - } + isNilBlock = blockState == (*state.BlockState)(nil) default: - if reflect.ValueOf(blockState).IsNil() { - return nil, errNilBlockState - } + isNilBlock = reflect.ValueOf(blockState).IsNil() + } + if isNilBlock { + return nil, errNilBlockState } + var isNilEpoch bool switch epochState.(type) { case *state.EpochState: - if epochState == (*state.EpochState)(nil) { - return nil, errNilEpochState - } + isNilEpoch = epochState == (*state.EpochState)(nil) default: - if reflect.ValueOf(epochState).IsNil() { - return nil, errNilEpochState - } + isNilEpoch = reflect.ValueOf(epochState).IsNil() + } + if isNilEpoch { + return nil, errNilEpochState } return &VerificationManager{ From 487cc3975c8b95d0e8978a6a770133cf9f781bcf Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Mon, 22 Nov 2021 16:40:21 -0500 Subject: [PATCH 24/43] implement NewNodeB --- dot/node.go | 215 ++++++++++++++++++++++++++++++++++++- dot/node_test.go | 71 ++++++++++++ dot/services.go | 1 + lib/blocktree/blocktree.go | 2 +- 4 files changed, 287 insertions(+), 2 deletions(-) diff --git a/dot/node.go b/dot/node.go index 9cf16f73e6..f9e3f44463 100644 --- a/dot/node.go +++ b/dot/node.go @@ -41,7 +41,9 @@ type Node struct { wg sync.WaitGroup started chan struct{} } - +func init() { + fmt.Printf("IN node INIT\n") +} // InitNode initialises a new dot node from the provided dot node configuration // and JSON formatted genesis file. func InitNode(cfg *Config) error { @@ -169,6 +171,217 @@ func LoadGlobalNodeName(basepath string) (nodename string, err error) { return } +func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { + + if !NodeInitialized(cfg.Global.BasePath) { + // initialise node (initialise state database and load genesis data) + err := InitNode(cfg) + if err != nil { + logger.Errorf("failed to initialise node: %s", err) + return nil, err + } + } + + ks, err := initKeystore(cfg) + if err != nil { + logger.Errorf("failed to initialise keystore: %s", err) + return nil, err + } + + logger.Patch(log.SetLevel(cfg.Global.LogLvl)) + + logger.Infof( + "🕸️ initialising node services with global configuration name %s, id %s and base path %s...", + cfg.Global.Name, cfg.Global.ID, cfg.Global.BasePath) + + var ( + nodeSrvcs []services.Service + networkSrvc *network.Service + ) + + stateSrvc, err := createStateService(cfg) + if err != nil { + return nil, fmt.Errorf("failed to create state service: %s", err) + } + + // check if network service is enabled + if enabled := networkServiceEnabled(cfg); enabled { + // create network service and append network service to node services + networkSrvc, err = createNetworkService(cfg, stateSrvc) + if err != nil { + return nil, fmt.Errorf("failed to create network service: %s", err) + } + nodeSrvcs = append(nodeSrvcs, networkSrvc) + } else { + // do not create or append network service if network service is not enabled + logger.Debugf("network service disabled, roles are %d", cfg.Core.Roles) + } + + // create runtime + ns, err := createRuntimeStorage(stateSrvc) + if err != nil { + return nil, err + } + + err = loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) + if err != nil { + return nil, err + } + + ver, err := createBlockVerifier(stateSrvc) + if err != nil { + return nil, err + } + + dh, err := createDigestHandler(stateSrvc) + if err != nil { + return nil, err + } + nodeSrvcs = append(nodeSrvcs, dh) + + coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + if err != nil { + return nil, fmt.Errorf("failed to create core service: %s", err) + } + nodeSrvcs = append(nodeSrvcs, coreSrvc) + + fg, err := createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, networkSrvc) + if err != nil { + return nil, err + } + nodeSrvcs = append(nodeSrvcs, fg) + + syncer, err := newSyncService(cfg, stateSrvc, fg, ver, coreSrvc, networkSrvc) + if err != nil { + return nil, err + } + + if networkSrvc != nil { + networkSrvc.SetSyncer(syncer) + networkSrvc.SetTransactionHandler(coreSrvc) + } + nodeSrvcs = append(nodeSrvcs, syncer) + + bp, err := createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) + if err != nil { + return nil, err + } + nodeSrvcs = append(nodeSrvcs, bp) + + sysSrvc, err := createSystemService(&cfg.System, stateSrvc) + if err != nil { + return nil, fmt.Errorf("failed to create system service: %s", err) + } + nodeSrvcs = append(nodeSrvcs, sysSrvc) + + // check if rpc service is enabled + if enabled := cfg.RPC.isRPCEnabled() || cfg.RPC.isWSEnabled(); enabled { + var rpcSrvc *rpc.HTTPServer + rpcSrvc, err = createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, fg) + if err != nil { + return nil, fmt.Errorf("failed to create rpc service: %s", err) + } + nodeSrvcs = append(nodeSrvcs, rpcSrvc) + } else { + logger.Debug("rpc service disabled by default") + } + + // close state service last + nodeSrvcs = append(nodeSrvcs, stateSrvc) + + serviceRegistryLogger := logger.New(log.AddContext("pkg", "services")) + node := &Node{ + Name: cfg.Global.Name, + StopFunc: stopFunc, + Services: services.NewServiceRegistry(serviceRegistryLogger), + started: make(chan struct{}), + } + + for _, srvc := range nodeSrvcs { + node.Services.RegisterService(srvc) + } + + if cfg.Global.PublishMetrics { + c := metrics.NewCollector(context.Background()) + c.AddGauge(fg) + c.AddGauge(stateSrvc) + c.AddGauge(networkSrvc) + + go c.Start() + + address := fmt.Sprintf("%s:%d", cfg.RPC.Host, cfg.Global.MetricsPort) + logger.Info("Enabling stand-alone metrics HTTP endpoint at address " + address) + metrics.PublishMetrics(address) + } + + gd, err := stateSrvc.Base.LoadGenesisData() + if err != nil { + return nil, err + } + + telemetry.GetInstance().Initialise(!cfg.Global.NoTelemetry) + + var telemetryEndpoints []*genesis.TelemetryEndpoint + if len(cfg.Global.TelemetryURLs) == 0 { + telemetryEndpoints = append(telemetryEndpoints, gd.TelemetryEndpoints...) + + } else { + telemetryURLs := cfg.Global.TelemetryURLs + for i := range telemetryURLs { + telemetryEndpoints = append(telemetryEndpoints, &telemetryURLs[i]) + } + } + + telemetry.GetInstance().AddConnections(telemetryEndpoints) + genesisHash := stateSrvc.Block.GenesisHash() + peerID := "" + if networkSrvc != nil { + peerID = networkSrvc.NetworkState().PeerID + } + err = telemetry.GetInstance().SendMessage(telemetry.NewSystemConnectedTM( + cfg.Core.GrandpaAuthority, + sysSrvc.ChainName(), + &genesisHash, + sysSrvc.SystemName(), + cfg.Global.Name, + peerID, + strconv.FormatInt(time.Now().UnixNano(), 10), + sysSrvc.SystemVersion())) + if err != nil { + logger.Debugf("problem sending system.connected telemetry message: %s", err) + } + return node, nil +} + +func initKeystore(cfg *Config) (*keystore.GlobalKeystore, error){ + ks := keystore.NewGlobalKeystore() + // load built-in test keys if specified by `cfg.Account.Key` + err := keystore.LoadKeystore(cfg.Account.Key, ks.Acco) + if err != nil { + logger.Errorf("failed to load account keystore: %s", err) + return nil, err + } + + err = keystore.LoadKeystore(cfg.Account.Key, ks.Babe) + if err != nil { + logger.Errorf("failed to load BABE keystore: %s", err) + return nil, err + } + + err = keystore.LoadKeystore(cfg.Account.Key, ks.Gran) + if err != nil { + logger.Errorf("failed to load grandpa keystore: %s", err) + return nil, err + } + + // if authority node, should have at least 1 key in keystore + if cfg.Core.Roles == types.AuthorityRole && (ks.Babe.Size() == 0 || ks.Gran.Size() == 0) { + return nil, ErrNoKeysProvided + } + + return ks, nil +} + // NewNode creates a new dot node from a dot node configuration func NewNode(cfg *Config, ks *keystore.GlobalKeystore, stopFunc func()) (*Node, error) { // set garbage collection percent to 10% diff --git a/dot/node_test.go b/dot/node_test.go index 4f55fddbfa..b27c231595 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -5,6 +5,7 @@ package dot import ( "errors" + "github.com/ChainSafe/gossamer/lib/runtime/wasmer" "testing" "github.com/ChainSafe/gossamer/dot/state" @@ -99,6 +100,76 @@ func TestLoadGlobalNodeName(t *testing.T) { } } +func TestNewNodeB(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + defer utils.RemoveTestDir(t) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + type args struct { + cfg *Config + stopFunc func() + } + tests := []struct { + name string + args args + want *Node + err error + }{ + { + name: "missing account key", + args: args{ + cfg: &Config{ + Global: GlobalConfig{BasePath: cfg.Global.BasePath}, + Init: InitConfig{Genesis: genFile.Name()}, + Core: CoreConfig{Roles: types.AuthorityRole }, + }, + }, + err: errors.New("no keys provided for authority node"), + }, + // TODO this is commented out because in holds a lock on badger db, causing next test to foil + //{ + // name: "missing wasm config", + // args: args{ + // cfg: &Config{ + // Global: GlobalConfig{BasePath: cfg.Global.BasePath}, + // Init: InitConfig{Genesis: genFile.Name()}, + // Account: AccountConfig{Key: "alice"}, + // }, + // }, + // err: errors.New("failed to get runtime instance"), + //}, + { + name: "minimal config", + args: args{ + cfg: &Config{ + Global: GlobalConfig{BasePath: cfg.Global.BasePath,}, + Init: InitConfig{Genesis: genFile.Name()}, + Account: AccountConfig{Key: "alice"}, + Core: CoreConfig{WasmInterpreter: wasmer.Name,}, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := NewNodeB(tt.args.cfg, tt.args.stopFunc) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + utils.RemoveTestDir(t) + } else { + assert.NoError(t, err) + } + + if tt.want != nil { + assert.Equal(t, tt.want.Name, got.Name) + } + }) + } +} + func TestNewNode(t *testing.T) { cfg := NewTestConfig(t) require.NotNil(t, cfg) diff --git a/dot/services.go b/dot/services.go index 245dcc1271..4aca1531c7 100644 --- a/dot/services.go +++ b/dot/services.go @@ -107,6 +107,7 @@ func createRuntime(cfg *Config, ns runtime.NodeStorage, st *state.Service, ks *k var rt runtime.Instance switch cfg.Core.WasmInterpreter { + // TODO no default case to handle if cfg.Core.WasmInterpreter is not set or set incorrectly case wasmer.Name: rtCfg := &wasmer.Config{ Imports: wasmer.ImportsNodeRuntime, diff --git a/lib/blocktree/blocktree.go b/lib/blocktree/blocktree.go index 9cd7ba7c43..155a260abc 100644 --- a/lib/blocktree/blocktree.go +++ b/lib/blocktree/blocktree.go @@ -438,7 +438,7 @@ func (bt *BlockTree) StoreRuntime(hash common.Hash, in runtime.Instance) { // GetBlockRuntime returns block runtime for corresponding block hash. func (bt *BlockTree) GetBlockRuntime(hash common.Hash) (runtime.Instance, error) { ins, ok := bt.runtime.Load(hash) - if !ok { + if !ok || ins == nil { return nil, ErrFailedToGetRuntime } return ins.(runtime.Instance), nil From 64f1d86e4f75a745fcea5dbc8a5a78e188d7fbeb Mon Sep 17 00:00:00 2001 From: Ed Mack Date: Mon, 29 Nov 2021 15:57:04 -0500 Subject: [PATCH 25/43] implement interface for new node --- dot/build_spec_test.go | 3 +- dot/import_test.go | 3 +- dot/node.go | 104 +++++++++++++++++++++++++++++++++++++---- dot/node_test.go | 80 +++++++++++++++++++++++++++++-- dot/services.go | 2 +- dot/services_test.go | 60 ++++++++++++++---------- 6 files changed, 212 insertions(+), 40 deletions(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index aa5504d5cb..1ff48dd5e3 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -77,7 +77,8 @@ func TestBuildFromDB(t *testing.T) { // initialise node (initialise state database and load genesis data) cfg := NewTestConfig(t) cfg.Init.Genesis = "../chain/gssmr/genesis.json" - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) assert.NoError(t, err) type args struct { diff --git a/dot/import_test.go b/dot/import_test.go index 4c5ae1aa07..798db9140a 100644 --- a/dot/import_test.go +++ b/dot/import_test.go @@ -35,7 +35,8 @@ func TestImportState(t *testing.T) { cfg.Init.Genesis = genFile.Name() cfg.Global.BasePath = basepath - err = InitNode(cfg) + ni := nodeInterface{} + err = ni.initNode(cfg) require.NoError(t, err) stateFP := setupStateFile(t) diff --git a/dot/node.go b/dot/node.go index f9e3f44463..8b4fc4989d 100644 --- a/dot/node.go +++ b/dot/node.go @@ -41,12 +41,10 @@ type Node struct { wg sync.WaitGroup started chan struct{} } -func init() { - fmt.Printf("IN node INIT\n") -} + // InitNode initialises a new dot node from the provided dot node configuration // and JSON formatted genesis file. -func InitNode(cfg *Config) error { +func (nodeInterface)initNode(cfg *Config) error { logger.Patch(log.SetLevel(cfg.Global.LogLvl)) logger.Infof( "🕸️ initialising node with name %s, id %s, base path %s and genesis %s...", @@ -108,6 +106,7 @@ func InitNode(cfg *Config) error { return nil } +// todo (ed) remove and use nodeInterface impl instead // NodeInitialized returns true if, within the configured data directory for the // node, the state database has been created and the genesis data has been loaded func NodeInitialized(basepath string) bool { @@ -171,18 +170,102 @@ func LoadGlobalNodeName(basepath string) (nodename string, err error) { return } -func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { +func NewNodeC(cfg *Config) (*Node, error) { + return newNodeC(cfg, nodeInterface{}) +} + +//func newNodeC(cfg *Config, checkInitalized func(string) bool) (*Node, error) { +func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { + if !nn.nodeInitialised(cfg.Global.BasePath) { + err := nn.initNode(cfg) + if err != nil { + return nil, err + } + } + + ks, err := nn.initKeystore(cfg) + if err != nil { + logger.Errorf("failed to initialise keystore: %s", err) + return nil, err + } + + logger.Patch(log.SetLevel(cfg.Global.LogLvl)) + + logger.Infof( + "🕸️ initialising node services with global configuration name %s, id %s and base path %s...", + cfg.Global.Name, cfg.Global.ID, cfg.Global.BasePath) + + stateSrvc, err := nn.createStateService(cfg) + if err != nil { + return nil, fmt.Errorf("failed to create state service: %s", err) + } + + fmt.Printf("ks %v, stateSrvc %v\n", ks, stateSrvc) + + return nil, nil +} + +type newNodeIface interface { + nodeInitialised(string) bool + initNode(config *Config) error + initKeystore(config *Config) (*keystore.GlobalKeystore, error) + createStateService(config *Config) (*state.Service, error) +} + +type nodeInterface struct {} + +// NodeInitialised returns true if, within the configured data directory for the +// node, the state database has been created and the genesis data has been loaded +func (nodeInterface)nodeInitialised(basepath string) bool { + // check if key registry exists + registry := path.Join(basepath, utils.DefaultDatabaseDir, "KEYREGISTRY") + + _, err := os.Stat(registry) + if os.IsNotExist(err) { + logger.Debug("node has not been initialised from base path " + basepath + + ": failed to locate KEYREGISTRY file in data directory") + + return false + } + + // initialise database using data directory + db, err := utils.SetupDatabase(basepath, false) + if err != nil { + logger.Debugf("failed to create database from base path %s: %s", basepath, err) + return false + } + + defer func() { + // close database + err = db.Close() + if err != nil { + logger.Errorf("failed to close database: %s", err) + } + }() + + // load genesis data from initialised node database + _, err = state.NewBaseState(db).LoadGenesisData() + if err != nil { + logger.Errorf("node has not been initialised from base path %s: %s", basepath, err) + return false + } + + return true +} + +func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { + nodeI := nodeInterface{} if !NodeInitialized(cfg.Global.BasePath) { // initialise node (initialise state database and load genesis data) - err := InitNode(cfg) + err := nodeI.initNode(cfg) if err != nil { logger.Errorf("failed to initialise node: %s", err) return nil, err } } - ks, err := initKeystore(cfg) + ks, err := nodeI.initKeystore(cfg) if err != nil { logger.Errorf("failed to initialise keystore: %s", err) return nil, err @@ -199,7 +282,7 @@ func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { networkSrvc *network.Service ) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := nodeI.createStateService(cfg) if err != nil { return nil, fmt.Errorf("failed to create state service: %s", err) } @@ -353,7 +436,7 @@ func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { return node, nil } -func initKeystore(cfg *Config) (*keystore.GlobalKeystore, error){ +func (nodeInterface)initKeystore(cfg *Config) (*keystore.GlobalKeystore, error){ ks := keystore.NewGlobalKeystore() // load built-in test keys if specified by `cfg.Account.Key` err := keystore.LoadKeystore(cfg.Account.Key, ks.Acco) @@ -384,6 +467,7 @@ func initKeystore(cfg *Config) (*keystore.GlobalKeystore, error){ // NewNode creates a new dot node from a dot node configuration func NewNode(cfg *Config, ks *keystore.GlobalKeystore, stopFunc func()) (*Node, error) { + nodeI := nodeInterface{} // set garbage collection percent to 10% // can be overwritten by setting the GOGC env variable, which defaults to 100 prev := debug.SetGCPercent(10) @@ -407,7 +491,7 @@ func NewNode(cfg *Config, ks *keystore.GlobalKeystore, stopFunc func()) (*Node, networkSrvc *network.Service ) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := nodeI.createStateService(cfg) if err != nil { return nil, fmt.Errorf("failed to create state service: %s", err) } diff --git a/dot/node_test.go b/dot/node_test.go index b27c231595..57dbd4a858 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -41,7 +41,8 @@ func TestInitNode(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err := InitNode(tt.args.cfg) + ni := nodeInterface{} + err := ni.initNode(tt.args.cfg) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) @@ -170,6 +171,77 @@ func TestNewNodeB(t *testing.T) { } } +func TestNewNodeC(t *testing.T) { + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + defer utils.RemoveTestDir(t) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + type args struct { + cfg *Config + stopFunc func() + } + tests := []struct { + name string + args args + want *Node + err error + }{ + { + name: "missing account key", + args: args{ + cfg: &Config{ + Global: GlobalConfig{BasePath: cfg.Global.BasePath}, + Init: InitConfig{Genesis: genFile.Name()}, + Core: CoreConfig{Roles: types.AuthorityRole }, + }, + }, + err: errors.New("no keys provided for authority node"), + }, + // TODO this is commented out because in holds a lock on badger db, causing next test to foil + //{ + // name: "missing wasm config", + // args: args{ + // cfg: &Config{ + // Global: GlobalConfig{BasePath: cfg.Global.BasePath}, + // Init: InitConfig{Genesis: genFile.Name()}, + // Account: AccountConfig{Key: "alice"}, + // }, + // }, + // err: errors.New("failed to get runtime instance"), + //}, + { + name: "minimal config", + args: args{ + cfg: &Config{ + Global: GlobalConfig{BasePath: cfg.Global.BasePath,}, + Init: InitConfig{Genesis: genFile.Name()}, + Account: AccountConfig{Key: "alice"}, + Core: CoreConfig{WasmInterpreter: wasmer.Name,}, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + //got, err := NewNodeB(tt.args.cfg, tt.args.stopFunc) + got, err := NewNodeC(tt.args.cfg) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + utils.RemoveTestDir(t) + } else { + assert.NoError(t, err) + } + + if tt.want != nil { + assert.Equal(t, tt.want.Name, got.Name) + } + }) + } +} + func TestNewNode(t *testing.T) { cfg := NewTestConfig(t) require.NotNil(t, cfg) @@ -181,7 +253,8 @@ func TestNewNode(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) ks := keystore.NewGlobalKeystore() @@ -247,7 +320,8 @@ func TestNodeInitialized(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) type args struct { diff --git a/dot/services.go b/dot/services.go index 4aca1531c7..85bce66ee4 100644 --- a/dot/services.go +++ b/dot/services.go @@ -39,7 +39,7 @@ func newInMemoryDB(path string) (chaindb.Database, error) { // State Service // createStateService creates the state service and initialise state database -func createStateService(cfg *Config) (*state.Service, error) { +func (nodeInterface)createStateService(cfg *Config) (*state.Service, error) { logger.Debug("creating state service...") config := state.Config{ diff --git a/dot/services_test.go b/dot/services_test.go index f84a48cf94..68e25885b9 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -40,10 +40,11 @@ func Test_createBABEService(t *testing.T) { cfg.Core.Roles = types.FullNodeRole cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) ks := keystore.NewGlobalKeystore() @@ -122,10 +123,11 @@ func Test_createBlockVerifier(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) type args struct { @@ -178,10 +180,11 @@ func Test_createCoreService(t *testing.T) { cfg.Core.GrandpaAuthority = false cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) ks := keystore.NewGlobalKeystore() @@ -246,10 +249,11 @@ func Test_createDigestHandler(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) type args struct { @@ -295,10 +299,11 @@ func Test_createGRANDPAService(t *testing.T) { cfg.Core.Roles = types.AuthorityRole cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) ks := keystore.NewGlobalKeystore() @@ -376,10 +381,11 @@ func Test_createNetworkService(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) type args struct { @@ -431,10 +437,11 @@ func Test_createRPCService(t *testing.T) { cfg.Core.GrandpaAuthority = false cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) type args struct { @@ -489,10 +496,11 @@ func Test_createRuntime(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) _ = wasmer.NewTestInstance(t, runtime.NODE_RUNTIME) @@ -569,10 +577,11 @@ func Test_createRuntimeStorage(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) type args struct { @@ -617,7 +626,8 @@ func Test_createStateService(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) cfg2 := NewTestConfig(t) @@ -645,7 +655,7 @@ func Test_createStateService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createStateService(tt.args.cfg) + got, err := ni.createStateService(tt.args.cfg) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -670,10 +680,11 @@ func Test_createSystemService(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) type args struct { @@ -755,10 +766,11 @@ func Test_newSyncService(t *testing.T) { cfg.Init.Genesis = genFile.Name() - err := InitNode(cfg) + ni := nodeInterface{} + err := ni.initNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) type args struct { From 91dc01b994ab9a70ca94f8535ba45ecb96eaf390 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Mon, 29 Nov 2021 17:28:51 -0500 Subject: [PATCH 26/43] implement inteface functions for newNodeC --- dot/node.go | 240 +++++++++++++++++++++++++++++++++++++------ dot/services.go | 20 ++-- dot/services_test.go | 34 +++--- 3 files changed, 233 insertions(+), 61 deletions(-) diff --git a/dot/node.go b/dot/node.go index 8b4fc4989d..e2f15019c2 100644 --- a/dot/node.go +++ b/dot/node.go @@ -6,29 +6,35 @@ package dot import ( "context" "fmt" - "os" - "os/signal" - "path" - "runtime/debug" - "strconv" - "sync" - "syscall" - "time" - + "github.com/ChainSafe/gossamer/dot/core" + "github.com/ChainSafe/gossamer/dot/digest" "github.com/ChainSafe/gossamer/dot/metrics" "github.com/ChainSafe/gossamer/dot/network" "github.com/ChainSafe/gossamer/dot/rpc" + "github.com/ChainSafe/gossamer/dot/rpc/modules" "github.com/ChainSafe/gossamer/dot/state" "github.com/ChainSafe/gossamer/dot/state/pruner" + gsync "github.com/ChainSafe/gossamer/dot/sync" + "github.com/ChainSafe/gossamer/dot/system" "github.com/ChainSafe/gossamer/dot/telemetry" "github.com/ChainSafe/gossamer/dot/types" "github.com/ChainSafe/gossamer/internal/log" + "github.com/ChainSafe/gossamer/lib/babe" "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/genesis" + "github.com/ChainSafe/gossamer/lib/grandpa" "github.com/ChainSafe/gossamer/lib/keystore" "github.com/ChainSafe/gossamer/lib/runtime" "github.com/ChainSafe/gossamer/lib/services" "github.com/ChainSafe/gossamer/lib/utils" + "os" + "os/signal" + "path" + "runtime/debug" + "strconv" + "sync" + "syscall" + "time" ) var logger = log.NewFromGlobal(log.AddContext("pkg", "dot")) @@ -196,14 +202,130 @@ func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { "🕸️ initialising node services with global configuration name %s, id %s and base path %s...", cfg.Global.Name, cfg.Global.ID, cfg.Global.BasePath) + var ( + nodeSrvcs []services.Service + networkSrvc *network.Service + ) + stateSrvc, err := nn.createStateService(cfg) if err != nil { return nil, fmt.Errorf("failed to create state service: %s", err) } - fmt.Printf("ks %v, stateSrvc %v\n", ks, stateSrvc) + // check if network service is enabled + if enabled := networkServiceEnabled(cfg); enabled { + // create network service and append network service to node services + networkSrvc, err = nn.createNetworkService(cfg, stateSrvc) + if err != nil { + return nil, fmt.Errorf("failed to create network service: %s", err) + } + nodeSrvcs = append(nodeSrvcs, networkSrvc) + } else { + // do not create or append network service if network service is not enabled + logger.Debugf("network service disabled, roles are %d", cfg.Core.Roles) + } + + // create runtime + ns, err := nn.createRuntimeStorage(stateSrvc) + if err != nil { + return nil, err + } - return nil, nil + err = nn.loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) + if err != nil { + return nil, err + } + + ver, err := nn.createBlockVerifier(stateSrvc) + if err != nil { + return nil, err + } + + dh, err := nn.createDigestHandler(stateSrvc) + if err != nil { + return nil, err + } + nodeSrvcs = append(nodeSrvcs, dh) + + coreSrvc, err := nn.createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + if err != nil { + return nil, fmt.Errorf("failed to create core service: %s", err) + } + nodeSrvcs = append(nodeSrvcs, coreSrvc) + + fg, err := nn.createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, networkSrvc) + if err != nil { + return nil, err + } + nodeSrvcs = append(nodeSrvcs, fg) + + syncer, err := nn.newSyncService(cfg, stateSrvc, fg, ver, coreSrvc, networkSrvc) + if err != nil { + return nil, err + } + + if networkSrvc != nil { + networkSrvc.SetSyncer(syncer) + networkSrvc.SetTransactionHandler(coreSrvc) + } + nodeSrvcs = append(nodeSrvcs, syncer) + + bp, err := nn.createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) + if err != nil { + return nil, err + } + nodeSrvcs = append(nodeSrvcs, bp) + + sysSrvc, err := nn.createSystemService(&cfg.System, stateSrvc) + if err != nil { + return nil, fmt.Errorf("failed to create system service: %s", err) + } + nodeSrvcs = append(nodeSrvcs, sysSrvc) + + // check if rpc service is enabled + if enabled := cfg.RPC.isRPCEnabled() || cfg.RPC.isWSEnabled(); enabled { + var rpcSrvc *rpc.HTTPServer + rpcSrvc, err = nn.createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, fg) + if err != nil { + return nil, fmt.Errorf("failed to create rpc service: %s", err) + } + nodeSrvcs = append(nodeSrvcs, rpcSrvc) + } else { + logger.Debug("rpc service disabled by default") + } + + // close state service last + nodeSrvcs = append(nodeSrvcs, stateSrvc) + + serviceRegistryLogger := logger.New(log.AddContext("pkg", "services")) + node := &Node{ + Name: cfg.Global.Name, + // todo (ed) deal with adding stopFunc + //StopFunc: stopFunc, + Services: services.NewServiceRegistry(serviceRegistryLogger), + started: make(chan struct{}), + } + + for _, srvc := range nodeSrvcs { + node.Services.RegisterService(srvc) + } + + if cfg.Global.PublishMetrics { + c := metrics.NewCollector(context.Background()) + c.AddGauge(fg) + c.AddGauge(stateSrvc) + c.AddGauge(networkSrvc) + + go c.Start() + + address := fmt.Sprintf("%s:%d", cfg.RPC.Host, cfg.Global.MetricsPort) + logger.Info("Enabling stand-alone metrics HTTP endpoint at address " + address) + metrics.PublishMetrics(address) + } + + nn.initialiseTelemetry(cfg, stateSrvc, networkSrvc, sysSrvc) + + return node, nil } type newNodeIface interface { @@ -211,6 +333,18 @@ type newNodeIface interface { initNode(config *Config) error initKeystore(config *Config) (*keystore.GlobalKeystore, error) createStateService(config *Config) (*state.Service, error) + createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Service, error) + createRuntimeStorage(st *state.Service) (*runtime.NodeStorage, error) + loadRuntime(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, ks *keystore.GlobalKeystore, net *network.Service) error + createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) + createDigestHandler(st *state.Service) (*digest.Handler, error) + createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Service, net *network.Service, dh *digest.Handler) (*core.Service, error) + createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, net *network.Service) (*grandpa.Service, error) + newSyncService(cfg *Config, st *state.Service, fg gsync.FinalityGadget, verifier *babe.VerificationManager, cs *core.Service, net *network.Service) (*gsync.Service, error) + createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, cs *core.Service) (*babe.Service, error) + createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*system.Service, error) + createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, coreSrvc *core.Service, networkSrvc *network.Service, bp modules.BlockProducerAPI, sysSrvc *system.Service, finSrvc *grandpa.Service) (*rpc.HTTPServer, error) + initialiseTelemetry(cfg *Config, stateSrvc *state.Service, networkSrvc *network.Service, sysSrvc *system.Service) } type nodeInterface struct {} @@ -254,6 +388,44 @@ func (nodeInterface)nodeInitialised(basepath string) bool { return true } +func (nodeInterface) initialiseTelemetry(cfg *Config, stateSrvc *state.Service, networkSrvc *network.Service, sysSrvc *system.Service) { + gd, err := stateSrvc.Base.LoadGenesisData() + if err != nil { + logger.Debugf("problem initialising telemetry: %s", err) + } + + telemetry.GetInstance().Initialise(!cfg.Global.NoTelemetry) + + var telemetryEndpoints []*genesis.TelemetryEndpoint + if len(cfg.Global.TelemetryURLs) == 0 { + telemetryEndpoints = append(telemetryEndpoints, gd.TelemetryEndpoints...) + + } else { + telemetryURLs := cfg.Global.TelemetryURLs + for i := range telemetryURLs { + telemetryEndpoints = append(telemetryEndpoints, &telemetryURLs[i]) + } + } + + telemetry.GetInstance().AddConnections(telemetryEndpoints) + genesisHash := stateSrvc.Block.GenesisHash() + peerID := "" + if networkSrvc != nil { + peerID = networkSrvc.NetworkState().PeerID + } + err = telemetry.GetInstance().SendMessage(telemetry.NewSystemConnectedTM( + cfg.Core.GrandpaAuthority, + sysSrvc.ChainName(), + &genesisHash, + sysSrvc.SystemName(), + cfg.Global.Name, + peerID, + strconv.FormatInt(time.Now().UnixNano(), 10), + sysSrvc.SystemVersion())) + if err != nil { + logger.Debugf("problem sending system.connected telemetry message: %s", err) + } +} func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { nodeI := nodeInterface{} if !NodeInitialized(cfg.Global.BasePath) { @@ -290,7 +462,7 @@ func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { // check if network service is enabled if enabled := networkServiceEnabled(cfg); enabled { // create network service and append network service to node services - networkSrvc, err = createNetworkService(cfg, stateSrvc) + networkSrvc, err = nodeI.createNetworkService(cfg, stateSrvc) if err != nil { return nil, fmt.Errorf("failed to create network service: %s", err) } @@ -301,40 +473,40 @@ func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { } // create runtime - ns, err := createRuntimeStorage(stateSrvc) + ns, err := nodeI.createRuntimeStorage(stateSrvc) if err != nil { return nil, err } - err = loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) + err = nodeI.loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) if err != nil { return nil, err } - ver, err := createBlockVerifier(stateSrvc) + ver, err := nodeI.createBlockVerifier(stateSrvc) if err != nil { return nil, err } - dh, err := createDigestHandler(stateSrvc) + dh, err := nodeI.createDigestHandler(stateSrvc) if err != nil { return nil, err } nodeSrvcs = append(nodeSrvcs, dh) - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + coreSrvc, err := nodeI.createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) if err != nil { return nil, fmt.Errorf("failed to create core service: %s", err) } nodeSrvcs = append(nodeSrvcs, coreSrvc) - fg, err := createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, networkSrvc) + fg, err := nodeI.createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, networkSrvc) if err != nil { return nil, err } nodeSrvcs = append(nodeSrvcs, fg) - syncer, err := newSyncService(cfg, stateSrvc, fg, ver, coreSrvc, networkSrvc) + syncer, err := nodeI.newSyncService(cfg, stateSrvc, fg, ver, coreSrvc, networkSrvc) if err != nil { return nil, err } @@ -345,13 +517,13 @@ func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { } nodeSrvcs = append(nodeSrvcs, syncer) - bp, err := createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) + bp, err := nodeI.createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) if err != nil { return nil, err } nodeSrvcs = append(nodeSrvcs, bp) - sysSrvc, err := createSystemService(&cfg.System, stateSrvc) + sysSrvc, err := nodeI.createSystemService(&cfg.System, stateSrvc) if err != nil { return nil, fmt.Errorf("failed to create system service: %s", err) } @@ -360,7 +532,7 @@ func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { // check if rpc service is enabled if enabled := cfg.RPC.isRPCEnabled() || cfg.RPC.isWSEnabled(); enabled { var rpcSrvc *rpc.HTTPServer - rpcSrvc, err = createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, fg) + rpcSrvc, err = nodeI.createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, fg) if err != nil { return nil, fmt.Errorf("failed to create rpc service: %s", err) } @@ -499,7 +671,7 @@ func NewNode(cfg *Config, ks *keystore.GlobalKeystore, stopFunc func()) (*Node, // check if network service is enabled if enabled := networkServiceEnabled(cfg); enabled { // create network service and append network service to node services - networkSrvc, err = createNetworkService(cfg, stateSrvc) + networkSrvc, err = nodeI.createNetworkService(cfg, stateSrvc) if err != nil { return nil, fmt.Errorf("failed to create network service: %s", err) } @@ -510,40 +682,40 @@ func NewNode(cfg *Config, ks *keystore.GlobalKeystore, stopFunc func()) (*Node, } // create runtime - ns, err := createRuntimeStorage(stateSrvc) + ns, err := nodeI.createRuntimeStorage(stateSrvc) if err != nil { return nil, err } - err = loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) + err = nodeI.loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) if err != nil { return nil, err } - ver, err := createBlockVerifier(stateSrvc) + ver, err := nodeI.createBlockVerifier(stateSrvc) if err != nil { return nil, err } - dh, err := createDigestHandler(stateSrvc) + dh, err := nodeI.createDigestHandler(stateSrvc) if err != nil { return nil, err } nodeSrvcs = append(nodeSrvcs, dh) - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + coreSrvc, err := nodeI.createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) if err != nil { return nil, fmt.Errorf("failed to create core service: %s", err) } nodeSrvcs = append(nodeSrvcs, coreSrvc) - fg, err := createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, networkSrvc) + fg, err := nodeI.createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, networkSrvc) if err != nil { return nil, err } nodeSrvcs = append(nodeSrvcs, fg) - syncer, err := newSyncService(cfg, stateSrvc, fg, ver, coreSrvc, networkSrvc) + syncer, err := nodeI.newSyncService(cfg, stateSrvc, fg, ver, coreSrvc, networkSrvc) if err != nil { return nil, err } @@ -554,13 +726,13 @@ func NewNode(cfg *Config, ks *keystore.GlobalKeystore, stopFunc func()) (*Node, } nodeSrvcs = append(nodeSrvcs, syncer) - bp, err := createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) + bp, err := nodeI.createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) if err != nil { return nil, err } nodeSrvcs = append(nodeSrvcs, bp) - sysSrvc, err := createSystemService(&cfg.System, stateSrvc) + sysSrvc, err := nodeI.createSystemService(&cfg.System, stateSrvc) if err != nil { return nil, fmt.Errorf("failed to create system service: %s", err) } @@ -569,7 +741,7 @@ func NewNode(cfg *Config, ks *keystore.GlobalKeystore, stopFunc func()) (*Node, // check if rpc service is enabled if enabled := cfg.RPC.isRPCEnabled() || cfg.RPC.isWSEnabled(); enabled { var rpcSrvc *rpc.HTTPServer - rpcSrvc, err = createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, fg) + rpcSrvc, err = nodeI.createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, fg) if err != nil { return nil, fmt.Errorf("failed to create rpc service: %s", err) } @@ -699,7 +871,7 @@ func (n *Node) Stop() { n.wg.Done() } -func loadRuntime(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, ks *keystore.GlobalKeystore, net *network.Service) error { +func (nodeInterface)loadRuntime(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, ks *keystore.GlobalKeystore, net *network.Service) error { blocks := stateSrvc.Block.GetNonFinalisedBlocks() runtimeCode := make(map[string]runtime.Instance) for i := range blocks { diff --git a/dot/services.go b/dot/services.go index 85bce66ee4..138fce3f55 100644 --- a/dot/services.go +++ b/dot/services.go @@ -65,7 +65,7 @@ func (nodeInterface)createStateService(cfg *Config) (*state.Service, error) { return stateSrvc, nil } -func createRuntimeStorage(st *state.Service) (*runtime.NodeStorage, error) { +func (nodeInterface)createRuntimeStorage(st *state.Service) (*runtime.NodeStorage, error) { localStorage, err := newInMemoryDB(st.DB().Path()) if err != nil { return nil, err @@ -155,7 +155,7 @@ func asAuthority(authority bool) string { return "" } -func createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, cs *core.Service) (*babe.Service, error) { +func (nodeInterface)createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, cs *core.Service) (*babe.Service, error) { logger.Info("creating BABE service" + asAuthority(cfg.Core.BabeAuthority) + "...") @@ -198,7 +198,7 @@ func createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, cs // Core Service // createCoreService creates the core service from the provided core configuration -func createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Service, net *network.Service, dh *digest.Handler) (*core.Service, error) { +func (nodeInterface)createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Service, net *network.Service, dh *digest.Handler) (*core.Service, error) { logger.Debug("creating core service" + asAuthority(cfg.Core.Roles == types.AuthorityRole) + "...") @@ -240,7 +240,7 @@ func createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Servi // Network Service // createNetworkService creates a network service from the command configuration and genesis data -func createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Service, error) { +func (nodeInterface)createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Service, error) { logger.Debugf( "creating network service with roles %d, port %d, bootnodes %s, protocol ID %s, nobootstrap=%t and noMDNS=%t...", cfg.Core.Roles, cfg.Network.Port, strings.Join(cfg.Network.Bootnodes, ","), cfg.Network.ProtocolID, @@ -276,7 +276,7 @@ func createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Servi // RPC Service // createRPCService creates the RPC service from the provided core configuration -func createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, coreSrvc *core.Service, networkSrvc *network.Service, bp modules.BlockProducerAPI, sysSrvc *system.Service, finSrvc *grandpa.Service) (*rpc.HTTPServer, error) { +func (nodeInterface)createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, coreSrvc *core.Service, networkSrvc *network.Service, bp modules.BlockProducerAPI, sysSrvc *system.Service, finSrvc *grandpa.Service) (*rpc.HTTPServer, error) { logger.Infof( "creating rpc service with host %s, external=%t, port %d, modules %s, ws=%t, ws port %d and ws external=%t", cfg.RPC.Host, cfg.RPC.External, cfg.RPC.Port, strings.Join(cfg.RPC.Modules, ","), cfg.RPC.WS, @@ -325,7 +325,7 @@ func createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Ser } // createSystemService creates a systemService for providing system related information -func createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*system.Service, error) { +func (nodeInterface)createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*system.Service, error) { genesisData, err := stateSrvc.Base.LoadGenesisData() if err != nil { return nil, err @@ -335,7 +335,7 @@ func createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*syst } // createGRANDPAService creates a new GRANDPA service -func createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, net *network.Service) (*grandpa.Service, error) { +func (nodeInterface)createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, net *network.Service) (*grandpa.Service, error) { rt, err := st.Block.GetRuntime(nil) if err != nil { return nil, err @@ -375,7 +375,7 @@ func createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks return grandpa.NewService(gsCfg) } -func createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) { +func (nodeInterface)createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) { ver, err := babe.NewVerificationManager(st.Block, st.Epoch) if err != nil { return nil, err @@ -384,7 +384,7 @@ func createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) { return ver, nil } -func newSyncService(cfg *Config, st *state.Service, fg sync.FinalityGadget, verifier *babe.VerificationManager, cs *core.Service, net *network.Service) (*sync.Service, error) { +func (nodeInterface)newSyncService(cfg *Config, st *state.Service, fg sync.FinalityGadget, verifier *babe.VerificationManager, cs *core.Service, net *network.Service) (*sync.Service, error) { slotDuration, err := st.Epoch.GetSlotDuration() if err != nil { return nil, err @@ -407,6 +407,6 @@ func newSyncService(cfg *Config, st *state.Service, fg sync.FinalityGadget, veri return sync.NewService(syncCfg) } -func createDigestHandler(st *state.Service) (*digest.Handler, error) { +func (nodeInterface)createDigestHandler(st *state.Service) (*digest.Handler, error) { return digest.NewHandler(st.Block, st.Epoch, st.Grandpa) } diff --git a/dot/services_test.go b/dot/services_test.go index 68e25885b9..05c5c550b3 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -52,15 +52,15 @@ func Test_createBABEService(t *testing.T) { require.NoError(t, err) ks.Babe.Insert(kr.Alice()) - ns, err := createRuntimeStorage(stateSrvc) + ns, err := ni.createRuntimeStorage(stateSrvc) require.NoError(t, err) - err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) + err = ni.loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) require.NoError(t, err) - dh, err := createDigestHandler(stateSrvc) + dh, err := ni.createDigestHandler(stateSrvc) require.NoError(t, err) - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) + coreSrvc, err := ni.createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) require.NoError(t, err) type args struct { @@ -98,7 +98,7 @@ func Test_createBABEService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createBABEService(tt.args.cfg, tt.args.st, tt.args.ks, tt.args.cs) + got, err := ni.createBABEService(tt.args.cfg, tt.args.st, tt.args.ks, tt.args.cs) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -152,7 +152,7 @@ func Test_createBlockVerifier(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createBlockVerifier(tt.args.st) + got, err := ni.createBlockVerifier(tt.args.st) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -225,7 +225,7 @@ func Test_createCoreService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createCoreService(tt.args.cfg, tt.args.ks, tt.args.st, tt.args.net, tt.args.dh) + got, err := ni.createCoreService(tt.args.cfg, tt.args.ks, tt.args.st, tt.args.net, tt.args.dh) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -273,7 +273,7 @@ func Test_createDigestHandler(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createDigestHandler(tt.args.st) + got, err := ni.createDigestHandler(tt.args.st) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -311,13 +311,13 @@ func Test_createGRANDPAService(t *testing.T) { require.NoError(t, err) ks.Gran.Insert(kr.Alice()) - ns, err := createRuntimeStorage(stateSrvc) + ns, err := ni.createRuntimeStorage(stateSrvc) require.NoError(t, err) - err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) + err = ni.loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) require.NoError(t, err) - dh, err := createDigestHandler(stateSrvc) + dh, err := ni.createDigestHandler(stateSrvc) require.NoError(t, err) type args struct { @@ -356,7 +356,7 @@ func Test_createGRANDPAService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createGRANDPAService(tt.args.cfg, tt.args.st, tt.args.dh, tt.args.ks, tt.args.net) + got, err := ni.createGRANDPAService(tt.args.cfg, tt.args.st, tt.args.dh, tt.args.ks, tt.args.net) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -409,7 +409,7 @@ func Test_createNetworkService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createNetworkService(tt.args.cfg, tt.args.stateSrvc) + got, err := ni.createNetworkService(tt.args.cfg, tt.args.stateSrvc) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -471,7 +471,7 @@ func Test_createRPCService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createRPCService(tt.args.cfg, tt.args.ns, tt.args.stateSrvc, tt.args.coreSrvc, tt.args.networkSrvc, tt.args.bp, tt.args.sysSrvc, tt.args.finSrvc) + got, err := ni.createRPCService(tt.args.cfg, tt.args.ns, tt.args.stateSrvc, tt.args.coreSrvc, tt.args.networkSrvc, tt.args.bp, tt.args.sysSrvc, tt.args.finSrvc) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -601,7 +601,7 @@ func Test_createRuntimeStorage(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createRuntimeStorage(tt.args.st) + got, err := ni.createRuntimeStorage(tt.args.st) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -707,7 +707,7 @@ func Test_createSystemService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createSystemService(tt.args.cfg, tt.args.stateSrvc) + got, err := ni.createSystemService(tt.args.cfg, tt.args.stateSrvc) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -807,7 +807,7 @@ func Test_newSyncService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := newSyncService(tt.args.cfg, tt.args.st, tt.args.fg, tt.args.verifier, tt.args.cs, tt.args.net) + got, err := ni.newSyncService(tt.args.cfg, tt.args.st, tt.args.fg, tt.args.verifier, tt.args.cs, tt.args.net) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { From 65f9df8880f6dd585dc6010ca88173dd590ce8ea Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Thu, 2 Dec 2021 16:38:53 -0500 Subject: [PATCH 27/43] add mocks for newNodeIface --- dot/mock_node.go | 281 +++++++++++++++++++++++++++++++++++++++++++++++ dot/node.go | 1 + dot/node_test.go | 70 +++++++++++- 3 files changed, 346 insertions(+), 6 deletions(-) create mode 100644 dot/mock_node.go diff --git a/dot/mock_node.go b/dot/mock_node.go new file mode 100644 index 0000000000..422645877a --- /dev/null +++ b/dot/mock_node.go @@ -0,0 +1,281 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: node.go + +// Package dot is a generated GoMock package. +package dot + +import ( + reflect "reflect" + + core "github.com/ChainSafe/gossamer/dot/core" + digest "github.com/ChainSafe/gossamer/dot/digest" + network "github.com/ChainSafe/gossamer/dot/network" + rpc "github.com/ChainSafe/gossamer/dot/rpc" + modules "github.com/ChainSafe/gossamer/dot/rpc/modules" + state "github.com/ChainSafe/gossamer/dot/state" + sync "github.com/ChainSafe/gossamer/dot/sync" + system "github.com/ChainSafe/gossamer/dot/system" + types "github.com/ChainSafe/gossamer/dot/types" + babe "github.com/ChainSafe/gossamer/lib/babe" + grandpa "github.com/ChainSafe/gossamer/lib/grandpa" + keystore "github.com/ChainSafe/gossamer/lib/keystore" + runtime "github.com/ChainSafe/gossamer/lib/runtime" + gomock "github.com/golang/mock/gomock" +) + +// MocknewNodeIface is a mock of newNodeIface interface. +type MocknewNodeIface struct { + ctrl *gomock.Controller + recorder *MocknewNodeIfaceMockRecorder +} + +// MocknewNodeIfaceMockRecorder is the mock recorder for MocknewNodeIface. +type MocknewNodeIfaceMockRecorder struct { + mock *MocknewNodeIface +} + +// NewMocknewNodeIface creates a new mock instance. +func NewMocknewNodeIface(ctrl *gomock.Controller) *MocknewNodeIface { + mock := &MocknewNodeIface{ctrl: ctrl} + mock.recorder = &MocknewNodeIfaceMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MocknewNodeIface) EXPECT() *MocknewNodeIfaceMockRecorder { + return m.recorder +} + +// createBABEService mocks base method. +func (m *MocknewNodeIface) createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, cs *core.Service) (*babe.Service, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createBABEService", cfg, st, ks, cs) + ret0, _ := ret[0].(*babe.Service) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createBABEService indicates an expected call of createBABEService. +func (mr *MocknewNodeIfaceMockRecorder) createBABEService(cfg, st, ks, cs interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createBABEService", reflect.TypeOf((*MocknewNodeIface)(nil).createBABEService), cfg, st, ks, cs) +} + +// createBlockVerifier mocks base method. +func (m *MocknewNodeIface) createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createBlockVerifier", st) + ret0, _ := ret[0].(*babe.VerificationManager) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createBlockVerifier indicates an expected call of createBlockVerifier. +func (mr *MocknewNodeIfaceMockRecorder) createBlockVerifier(st interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createBlockVerifier", reflect.TypeOf((*MocknewNodeIface)(nil).createBlockVerifier), st) +} + +// createCoreService mocks base method. +func (m *MocknewNodeIface) createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Service, net *network.Service, dh *digest.Handler) (*core.Service, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createCoreService", cfg, ks, st, net, dh) + ret0, _ := ret[0].(*core.Service) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createCoreService indicates an expected call of createCoreService. +func (mr *MocknewNodeIfaceMockRecorder) createCoreService(cfg, ks, st, net, dh interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createCoreService", reflect.TypeOf((*MocknewNodeIface)(nil).createCoreService), cfg, ks, st, net, dh) +} + +// createDigestHandler mocks base method. +func (m *MocknewNodeIface) createDigestHandler(st *state.Service) (*digest.Handler, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createDigestHandler", st) + ret0, _ := ret[0].(*digest.Handler) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createDigestHandler indicates an expected call of createDigestHandler. +func (mr *MocknewNodeIfaceMockRecorder) createDigestHandler(st interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createDigestHandler", reflect.TypeOf((*MocknewNodeIface)(nil).createDigestHandler), st) +} + +// createGRANDPAService mocks base method. +func (m *MocknewNodeIface) createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, net *network.Service) (*grandpa.Service, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createGRANDPAService", cfg, st, dh, ks, net) + ret0, _ := ret[0].(*grandpa.Service) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createGRANDPAService indicates an expected call of createGRANDPAService. +func (mr *MocknewNodeIfaceMockRecorder) createGRANDPAService(cfg, st, dh, ks, net interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createGRANDPAService", reflect.TypeOf((*MocknewNodeIface)(nil).createGRANDPAService), cfg, st, dh, ks, net) +} + +// createNetworkService mocks base method. +func (m *MocknewNodeIface) createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Service, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createNetworkService", cfg, stateSrvc) + ret0, _ := ret[0].(*network.Service) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createNetworkService indicates an expected call of createNetworkService. +func (mr *MocknewNodeIfaceMockRecorder) createNetworkService(cfg, stateSrvc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createNetworkService", reflect.TypeOf((*MocknewNodeIface)(nil).createNetworkService), cfg, stateSrvc) +} + +// createRPCService mocks base method. +func (m *MocknewNodeIface) createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, coreSrvc *core.Service, networkSrvc *network.Service, bp modules.BlockProducerAPI, sysSrvc *system.Service, finSrvc *grandpa.Service) (*rpc.HTTPServer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createRPCService", cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, finSrvc) + ret0, _ := ret[0].(*rpc.HTTPServer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createRPCService indicates an expected call of createRPCService. +func (mr *MocknewNodeIfaceMockRecorder) createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, finSrvc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createRPCService", reflect.TypeOf((*MocknewNodeIface)(nil).createRPCService), cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, finSrvc) +} + +// createRuntimeStorage mocks base method. +func (m *MocknewNodeIface) createRuntimeStorage(st *state.Service) (*runtime.NodeStorage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createRuntimeStorage", st) + ret0, _ := ret[0].(*runtime.NodeStorage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createRuntimeStorage indicates an expected call of createRuntimeStorage. +func (mr *MocknewNodeIfaceMockRecorder) createRuntimeStorage(st interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createRuntimeStorage", reflect.TypeOf((*MocknewNodeIface)(nil).createRuntimeStorage), st) +} + +// createStateService mocks base method. +func (m *MocknewNodeIface) createStateService(config *Config) (*state.Service, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createStateService", config) + ret0, _ := ret[0].(*state.Service) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createStateService indicates an expected call of createStateService. +func (mr *MocknewNodeIfaceMockRecorder) createStateService(config interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createStateService", reflect.TypeOf((*MocknewNodeIface)(nil).createStateService), config) +} + +// createSystemService mocks base method. +func (m *MocknewNodeIface) createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*system.Service, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "createSystemService", cfg, stateSrvc) + ret0, _ := ret[0].(*system.Service) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// createSystemService indicates an expected call of createSystemService. +func (mr *MocknewNodeIfaceMockRecorder) createSystemService(cfg, stateSrvc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createSystemService", reflect.TypeOf((*MocknewNodeIface)(nil).createSystemService), cfg, stateSrvc) +} + +// initKeystore mocks base method. +func (m *MocknewNodeIface) initKeystore(config *Config) (*keystore.GlobalKeystore, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "initKeystore", config) + ret0, _ := ret[0].(*keystore.GlobalKeystore) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// initKeystore indicates an expected call of initKeystore. +func (mr *MocknewNodeIfaceMockRecorder) initKeystore(config interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "initKeystore", reflect.TypeOf((*MocknewNodeIface)(nil).initKeystore), config) +} + +// initNode mocks base method. +func (m *MocknewNodeIface) initNode(config *Config) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "initNode", config) + ret0, _ := ret[0].(error) + return ret0 +} + +// initNode indicates an expected call of initNode. +func (mr *MocknewNodeIfaceMockRecorder) initNode(config interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "initNode", reflect.TypeOf((*MocknewNodeIface)(nil).initNode), config) +} + +// initialiseTelemetry mocks base method. +func (m *MocknewNodeIface) initialiseTelemetry(cfg *Config, stateSrvc *state.Service, networkSrvc *network.Service, sysSrvc *system.Service) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "initialiseTelemetry", cfg, stateSrvc, networkSrvc, sysSrvc) +} + +// initialiseTelemetry indicates an expected call of initialiseTelemetry. +func (mr *MocknewNodeIfaceMockRecorder) initialiseTelemetry(cfg, stateSrvc, networkSrvc, sysSrvc interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "initialiseTelemetry", reflect.TypeOf((*MocknewNodeIface)(nil).initialiseTelemetry), cfg, stateSrvc, networkSrvc, sysSrvc) +} + +// loadRuntime mocks base method. +func (m *MocknewNodeIface) loadRuntime(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, ks *keystore.GlobalKeystore, net *network.Service) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "loadRuntime", cfg, ns, stateSrvc, ks, net) + ret0, _ := ret[0].(error) + return ret0 +} + +// loadRuntime indicates an expected call of loadRuntime. +func (mr *MocknewNodeIfaceMockRecorder) loadRuntime(cfg, ns, stateSrvc, ks, net interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "loadRuntime", reflect.TypeOf((*MocknewNodeIface)(nil).loadRuntime), cfg, ns, stateSrvc, ks, net) +} + +// newSyncService mocks base method. +func (m *MocknewNodeIface) newSyncService(cfg *Config, st *state.Service, fg sync.FinalityGadget, verifier *babe.VerificationManager, cs *core.Service, net *network.Service) (*sync.Service, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "newSyncService", cfg, st, fg, verifier, cs, net) + ret0, _ := ret[0].(*sync.Service) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// newSyncService indicates an expected call of newSyncService. +func (mr *MocknewNodeIfaceMockRecorder) newSyncService(cfg, st, fg, verifier, cs, net interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "newSyncService", reflect.TypeOf((*MocknewNodeIface)(nil).newSyncService), cfg, st, fg, verifier, cs, net) +} + +// nodeInitialised mocks base method. +func (m *MocknewNodeIface) nodeInitialised(arg0 string) bool { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "nodeInitialised", arg0) + ret0, _ := ret[0].(bool) + return ret0 +} + +// nodeInitialised indicates an expected call of nodeInitialised. +func (mr *MocknewNodeIfaceMockRecorder) nodeInitialised(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "nodeInitialised", reflect.TypeOf((*MocknewNodeIface)(nil).nodeInitialised), arg0) +} diff --git a/dot/node.go b/dot/node.go index 88bb77c8f6..e7931260fe 100644 --- a/dot/node.go +++ b/dot/node.go @@ -326,6 +326,7 @@ func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { return node, nil } +//go:generate mockgen -source=node.go -destination=mock_node.go -package=dot type newNodeIface interface { nodeInitialised(string) bool diff --git a/dot/node_test.go b/dot/node_test.go index 65d588550a..d25bbe2728 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -6,6 +6,7 @@ package dot import ( "errors" "github.com/ChainSafe/gossamer/lib/runtime/wasmer" + "github.com/golang/mock/gomock" "testing" "github.com/ChainSafe/gossamer/dot/state" @@ -200,17 +201,75 @@ func TestNewNodeC(t *testing.T) { }, err: errors.New("no keys provided for authority node"), }, - // TODO this is commented out because in holds a lock on badger db, causing next test to foil + { + name: "minimal config", + args: args{ + cfg: &Config{ + Global: GlobalConfig{BasePath: cfg.Global.BasePath,}, + Init: InitConfig{Genesis: genFile.Name()}, + Account: AccountConfig{Key: "alice"}, + Core: CoreConfig{WasmInterpreter: wasmer.Name,}, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := NewNodeC(tt.args.cfg) + if tt.err != nil { + assert.EqualError(t, err, tt.err.Error()) + utils.RemoveTestDir(t) + } else { + assert.NoError(t, err) + } + + if tt.want != nil { + assert.Equal(t, tt.want.Name, got.Name) + } + }) + } +} + +func TestNewNodeMock(t *testing.T) { + ctrl := gomock.NewController(t) + + m := NewMocknewNodeIface(ctrl) + m.EXPECT().nodeInitialised(gomock.Any()).Return(true) + m.EXPECT().initKeystore(gomock.Any()) + m.EXPECT().createStateService(gomock.Any()) + m.EXPECT().createRuntimeStorage(gomock.Any()) + m.EXPECT().loadRuntime(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) + m.EXPECT().createBlockVerifier(gomock.Any()) + m.EXPECT().createDigestHandler(gomock.Any()) + m.EXPECT().createCoreService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) + + cfg := NewTestConfig(t) + require.NotNil(t, cfg) + defer utils.RemoveTestDir(t) + + genFile := NewTestGenesisRawFile(t, cfg) + require.NotNil(t, genFile) + + type args struct { + cfg *Config + stopFunc func() + } + tests := []struct { + name string + args args + want *Node + err error + }{ //{ - // name: "missing wasm config", + // name: "missing account key", // args: args{ // cfg: &Config{ // Global: GlobalConfig{BasePath: cfg.Global.BasePath}, // Init: InitConfig{Genesis: genFile.Name()}, - // Account: AccountConfig{Key: "alice"}, + // Core: CoreConfig{Roles: types.AuthorityRole }, // }, // }, - // err: errors.New("failed to get runtime instance"), + // err: errors.New("no keys provided for authority node"), //}, { name: "minimal config", @@ -226,8 +285,7 @@ func TestNewNodeC(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - //got, err := NewNodeB(tt.args.cfg, tt.args.stopFunc) - got, err := NewNodeC(tt.args.cfg) + got, err := newNodeC(tt.args.cfg, m) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) utils.RemoveTestDir(t) From 800e0e9ce38ea2132829ea32ccb8180d13b8e4bc Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Fri, 3 Dec 2021 15:50:34 -0500 Subject: [PATCH 28/43] implement mocks for tests --- dot/node.go | 9 ++++ dot/node_integration_test.go | 17 +++---- dot/node_test.go | 55 ++++++++++++--------- dot/services_integration_test.go | 85 ++++++++++++++++++-------------- 4 files changed, 97 insertions(+), 69 deletions(-) diff --git a/dot/node.go b/dot/node.go index e7931260fe..21e624732f 100644 --- a/dot/node.go +++ b/dot/node.go @@ -176,6 +176,7 @@ func LoadGlobalNodeName(basepath string) (nodename string, err error) { } +// NewNodeC to create node func NewNodeC(cfg *Config) (*Node, error) { return newNodeC(cfg, nodeInterface{}) } @@ -426,6 +427,8 @@ func (nodeInterface) initialiseTelemetry(cfg *Config, stateSrvc *state.Service, logger.Debugf("problem sending system.connected telemetry message: %s", err) } } + +// NewNodeB to create new node (to be replaced) func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { nodeI := nodeInterface{} if !NodeInitialized(cfg.Global.BasePath) { @@ -637,6 +640,12 @@ func (nodeInterface)initKeystore(cfg *Config) (*keystore.GlobalKeystore, error){ return ks, nil } +// InitNode init Node +func InitNode(cfg *Config) error { + nodeI := nodeInterface{} + return nodeI.initNode(cfg) +} + // NewNode creates a new dot node from a dot node configuration func NewNode(cfg *Config, ks *keystore.GlobalKeystore) (*Node, error) { // set garbage collection percent to 10% diff --git a/dot/node_integration_test.go b/dot/node_integration_test.go index 32060b6022..b7a0ec48b6 100644 --- a/dot/node_integration_test.go +++ b/dot/node_integration_test.go @@ -117,7 +117,7 @@ func TestNewNode_Integration(t *testing.T) { cfg.Core.Roles = types.FullNodeRole - node, err := NewNode(cfg, ks, nil) + node, err := NewNode(cfg, ks) require.NoError(t, err) bp := node.Services.Get(&babe.Service{}) @@ -150,7 +150,7 @@ func TestNewNode_Authority(t *testing.T) { cfg.Core.Roles = types.AuthorityRole - node, err := NewNode(cfg, ks, nil) + node, err := NewNode(cfg, ks) require.NoError(t, err) bp := node.Services.Get(&babe.Service{}) @@ -249,7 +249,7 @@ func TestInitNode_LoadStorageRoot(t *testing.T) { ks.Gran.Insert(ed25519Keyring.Alice()) sr25519Keyring, _ := keystore.NewSr25519Keyring() ks.Babe.Insert(sr25519Keyring.Alice()) - node, err := NewNode(cfg, ks, nil) + node, err := NewNode(cfg, ks) require.NoError(t, err) if reflect.TypeOf(node) != reflect.TypeOf(&Node{}) { @@ -307,7 +307,7 @@ func TestInitNode_LoadBalances(t *testing.T) { ed25519Keyring, _ := keystore.NewEd25519Keyring() ks.Gran.Insert(ed25519Keyring.Alice()) - node, err := NewNode(cfg, ks, nil) + node, err := NewNode(cfg, ks) require.NoError(t, err) if reflect.TypeOf(node) != reflect.TypeOf(&Node{}) { @@ -359,7 +359,7 @@ func TestStartNode(t *testing.T) { cfg.Core.Roles = types.FullNodeRole - node, err := NewNode(cfg, ks, nil) + node, err := NewNode(cfg, ks) require.NoError(t, err) go func() { @@ -373,13 +373,12 @@ func TestStartNode(t *testing.T) { func TestNode_StopFunc(t *testing.T) { testvar := "before" - stopFunc := func() { - testvar = "after" - } + //stopFunc := func() { + // testvar = "after" + //} node := &Node{ Services: &services.ServiceRegistry{}, - StopFunc: stopFunc, wg: sync.WaitGroup{}, } node.wg.Add(1) diff --git a/dot/node_test.go b/dot/node_test.go index d25bbe2728..04655032c7 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -182,7 +182,7 @@ func TestNewNodeC(t *testing.T) { type args struct { cfg *Config - stopFunc func() + //stopFunc func() } tests := []struct { name string @@ -234,14 +234,25 @@ func TestNewNodeMock(t *testing.T) { ctrl := gomock.NewController(t) m := NewMocknewNodeIface(ctrl) - m.EXPECT().nodeInitialised(gomock.Any()).Return(true) - m.EXPECT().initKeystore(gomock.Any()) - m.EXPECT().createStateService(gomock.Any()) - m.EXPECT().createRuntimeStorage(gomock.Any()) - m.EXPECT().loadRuntime(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) - m.EXPECT().createBlockVerifier(gomock.Any()) - m.EXPECT().createDigestHandler(gomock.Any()) - m.EXPECT().createCoreService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()) + m.EXPECT().nodeInitialised(gomock.Any()).Return(true).AnyTimes() + m.EXPECT().initKeystore(gomock.Any()).DoAndReturn(func (config *Config) (*keystore.GlobalKeystore, error) { + if len(config.Account.Key) == 0 { + return nil, errors.New("no keys provided for authority node") + } + return &keystore.GlobalKeystore{}, nil + }).AnyTimes() + m.EXPECT().createStateService(gomock.Any()).Return(&state.Service{}, nil).AnyTimes() + m.EXPECT().createRuntimeStorage(gomock.Any()).AnyTimes() + m.EXPECT().loadRuntime(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + m.EXPECT().createBlockVerifier(gomock.Any()).AnyTimes() + m.EXPECT().createDigestHandler(gomock.Any()).AnyTimes() + m.EXPECT().createCoreService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + m.EXPECT().createGRANDPAService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + m.EXPECT().newSyncService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + m.EXPECT().createBABEService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + m.EXPECT().createSystemService(gomock.Any(), gomock.Any()).AnyTimes() + m.EXPECT().initialiseTelemetry(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + m.EXPECT().createNetworkService(gomock.Any(), gomock.Any()).AnyTimes() cfg := NewTestConfig(t) require.NotNil(t, cfg) @@ -252,7 +263,7 @@ func TestNewNodeMock(t *testing.T) { type args struct { cfg *Config - stopFunc func() + //stopFunc func() } tests := []struct { name string @@ -260,17 +271,17 @@ func TestNewNodeMock(t *testing.T) { want *Node err error }{ - //{ - // name: "missing account key", - // args: args{ - // cfg: &Config{ - // Global: GlobalConfig{BasePath: cfg.Global.BasePath}, - // Init: InitConfig{Genesis: genFile.Name()}, - // Core: CoreConfig{Roles: types.AuthorityRole }, - // }, - // }, - // err: errors.New("no keys provided for authority node"), - //}, + { + name: "missing account key", + args: args{ + cfg: &Config{ + Global: GlobalConfig{BasePath: cfg.Global.BasePath}, + Init: InitConfig{Genesis: genFile.Name()}, + Core: CoreConfig{Roles: types.AuthorityRole }, + }, + }, + err: errors.New("no keys provided for authority node"), + }, { name: "minimal config", args: args{ @@ -328,7 +339,7 @@ func TestNewNode(t *testing.T) { type args struct { cfg *Config ks *keystore.GlobalKeystore - stopFunc func() + //stopFunc func() } tests := []struct { name string diff --git a/dot/services_integration_test.go b/dot/services_integration_test.go index d4a6d146e7..532ae82c15 100644 --- a/dot/services_integration_test.go +++ b/dot/services_integration_test.go @@ -50,7 +50,8 @@ func TestCreateStateService(t *testing.T) { err := InitNode(cfg) require.Nil(t, err) - stateSrvc, err := createStateService(cfg) + nodeI := nodeInterface{} + stateSrvc, err := nodeI.createStateService(cfg) require.Nil(t, err) require.NotNil(t, stateSrvc) } @@ -73,7 +74,8 @@ func TestCreateCoreService(t *testing.T) { err := InitNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + nodeI := nodeInterface{} + stateSrvc, err := nodeI.createStateService(cfg) require.NoError(t, err) ks := keystore.NewGlobalKeystore() @@ -83,10 +85,10 @@ func TestCreateCoreService(t *testing.T) { networkSrvc := &network.Service{} - dh, err := createDigestHandler(stateSrvc) + dh, err := nodeI.createDigestHandler(stateSrvc) require.NoError(t, err) - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + coreSrvc, err := nodeI.createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) require.NoError(t, err) require.NotNil(t, coreSrvc) } @@ -105,10 +107,11 @@ func TestCreateBlockVerifier(t *testing.T) { err := InitNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + nodeI := nodeInterface{} + stateSrvc, err := nodeI.createStateService(cfg) require.NoError(t, err) - _, err = createBlockVerifier(stateSrvc) + _, err = nodeI.createBlockVerifier(stateSrvc) require.NoError(t, err) } @@ -126,22 +129,23 @@ func TestCreateSyncService(t *testing.T) { err := InitNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + nodeI := nodeInterface{} + stateSrvc, err := nodeI.createStateService(cfg) require.NoError(t, err) ks := keystore.NewGlobalKeystore() require.NotNil(t, ks) - ver, err := createBlockVerifier(stateSrvc) + ver, err := nodeI.createBlockVerifier(stateSrvc) require.NoError(t, err) - dh, err := createDigestHandler(stateSrvc) + dh, err := nodeI.createDigestHandler(stateSrvc) require.NoError(t, err) - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) + coreSrvc, err := nodeI.createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) require.NoError(t, err) - _, err = newSyncService(cfg, stateSrvc, &grandpa.Service{}, ver, coreSrvc, &network.Service{}) + _, err = nodeI.newSyncService(cfg, stateSrvc, &grandpa.Service{}, ver, coreSrvc, &network.Service{}) require.NoError(t, err) } @@ -160,10 +164,11 @@ func TestCreateNetworkService(t *testing.T) { err := InitNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + nodeI := nodeInterface{} + stateSrvc, err := nodeI.createStateService(cfg) require.NoError(t, err) - networkSrvc, err := createNetworkService(cfg, stateSrvc) + networkSrvc, err := nodeI.createNetworkService(cfg, stateSrvc) require.NoError(t, err) require.NotNil(t, networkSrvc) } @@ -186,7 +191,8 @@ func TestCreateRPCService(t *testing.T) { err := InitNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + nodeI := nodeInterface{} + stateSrvc, err := nodeI.createStateService(cfg) require.NoError(t, err) networkSrvc := &network.Service{} @@ -195,21 +201,21 @@ func TestCreateRPCService(t *testing.T) { ed25519Keyring, _ := keystore.NewEd25519Keyring() ks.Gran.Insert(ed25519Keyring.Alice()) - ns, err := createRuntimeStorage(stateSrvc) + ns, err := nodeI.createRuntimeStorage(stateSrvc) require.NoError(t, err) - err = loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) + err = nodeI.loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) require.NoError(t, err) - dh, err := createDigestHandler(stateSrvc) + dh, err := nodeI.createDigestHandler(stateSrvc) require.NoError(t, err) - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + coreSrvc, err := nodeI.createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) require.NoError(t, err) - sysSrvc, err := createSystemService(&cfg.System, stateSrvc) + sysSrvc, err := nodeI.createSystemService(&cfg.System, stateSrvc) require.NoError(t, err) - rpcSrvc, err := createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, nil, sysSrvc, nil) + rpcSrvc, err := nodeI.createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, nil, sysSrvc, nil) require.NoError(t, err) require.NotNil(t, rpcSrvc) } @@ -229,7 +235,8 @@ func TestCreateBABEService(t *testing.T) { err := InitNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + nodeI := nodeInterface{} + stateSrvc, err := nodeI.createStateService(cfg) require.NoError(t, err) ks := keystore.NewGlobalKeystore() @@ -237,18 +244,18 @@ func TestCreateBABEService(t *testing.T) { require.NoError(t, err) ks.Babe.Insert(kr.Alice()) - ns, err := createRuntimeStorage(stateSrvc) + ns, err := nodeI.createRuntimeStorage(stateSrvc) require.NoError(t, err) - err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) + err = nodeI.loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) require.NoError(t, err) - dh, err := createDigestHandler(stateSrvc) + dh, err := nodeI.createDigestHandler(stateSrvc) require.NoError(t, err) - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) + coreSrvc, err := nodeI.createCoreService(cfg, ks, stateSrvc, &network.Service{}, dh) require.NoError(t, err) - bs, err := createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) + bs, err := nodeI.createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) require.NoError(t, err) require.NotNil(t, bs) } @@ -268,7 +275,8 @@ func TestCreateGrandpaService(t *testing.T) { err := InitNode(cfg) require.NoError(t, err) - stateSrvc, err := createStateService(cfg) + nodeI := nodeInterface{} + stateSrvc, err := nodeI.createStateService(cfg) require.NoError(t, err) ks := keystore.NewGlobalKeystore() @@ -276,16 +284,16 @@ func TestCreateGrandpaService(t *testing.T) { require.NoError(t, err) ks.Gran.Insert(kr.Alice()) - ns, err := createRuntimeStorage(stateSrvc) + ns, err := nodeI.createRuntimeStorage(stateSrvc) require.NoError(t, err) - err = loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) + err = nodeI.loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) require.NoError(t, err) - dh, err := createDigestHandler(stateSrvc) + dh, err := nodeI.createDigestHandler(stateSrvc) require.NoError(t, err) - gs, err := createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, &network.Service{}) + gs, err := nodeI.createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, &network.Service{}) require.NoError(t, err) require.NotNil(t, gs) } @@ -323,7 +331,8 @@ func TestNewWebSocketServer(t *testing.T) { err := InitNode(cfg) require.Nil(t, err) - stateSrvc, err := createStateService(cfg) + nodeI := nodeInterface{} + stateSrvc, err := nodeI.createStateService(cfg) require.Nil(t, err) networkSrvc := &network.Service{} @@ -332,21 +341,21 @@ func TestNewWebSocketServer(t *testing.T) { ed25519Keyring, _ := keystore.NewEd25519Keyring() ks.Gran.Insert(ed25519Keyring.Alice()) - ns, err := createRuntimeStorage(stateSrvc) + ns, err := nodeI.createRuntimeStorage(stateSrvc) require.NoError(t, err) - err = loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) + err = nodeI.loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) require.NoError(t, err) - dh, err := createDigestHandler(stateSrvc) + dh, err := nodeI.createDigestHandler(stateSrvc) require.NoError(t, err) - coreSrvc, err := createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) + coreSrvc, err := nodeI.createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) require.Nil(t, err) - sysSrvc, err := createSystemService(&cfg.System, stateSrvc) + sysSrvc, err := nodeI.createSystemService(&cfg.System, stateSrvc) require.NoError(t, err) - rpcSrvc, err := createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, nil, sysSrvc, nil) + rpcSrvc, err := nodeI.createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, nil, sysSrvc, nil) require.NoError(t, err) err = rpcSrvc.Start() require.Nil(t, err) From 89366c3434ba09824c2055d56d24bf217259c5b5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Dec 2021 12:03:03 -0500 Subject: [PATCH 29/43] chore(deps): bump actions/setup-node from 2.4.1 to 2.5.0 (#2104) Bumps [actions/setup-node](https://github.com/actions/setup-node) from 2.4.1 to 2.5.0. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v2.4.1...v2.5.0) --- updated-dependencies: - dependency-name: actions/setup-node dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e5f6cddd3b..d3f5b6b57b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -14,7 +14,7 @@ jobs: with: fetch-depth: 0 - name: Setup Node.js - uses: actions/setup-node@v2.4.1 + uses: actions/setup-node@v2.5.0 with: node-version: 16 - name: Install dependencies From 2a18498f13715a41fb43e2df021cff7981a68df7 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Mon, 6 Dec 2021 14:25:40 -0500 Subject: [PATCH 30/43] lint --- dot/build_spec_test.go | 201 ++++++++++++++++++++----------- dot/import_integration_test.go | 34 +----- dot/node.go | 54 +++++---- dot/node_integration_test.go | 6 +- dot/node_test.go | 50 ++++---- dot/services.go | 23 ++-- dot/services_integration_test.go | 15 ++- dot/services_test.go | 32 +---- dot/utils_integration_test.go | 3 +- dot/utils_test.go | 30 ++--- 10 files changed, 232 insertions(+), 216 deletions(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index 21b4352e16..2dbedd5a2f 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -25,7 +25,19 @@ func TestBuildSpec_ToJSON(t *testing.T) { { name: "name test", fields: fields{genesis: &genesis.Genesis{Name: "test"}}, - want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, + want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, + 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, + 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, + 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, + 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, + 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, + 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, + 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, + 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, + 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, + 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, + 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, + 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, }, { name: "additional parameters test", @@ -36,7 +48,20 @@ func TestBuildSpec_ToJSON(t *testing.T) { ProtocolID: "protocol", ConsensusEngine: "babe", }}, - want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 73, 68, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, + want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, + 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 73, 68, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, + 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 44, + 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, + 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, + 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, + 99, 111, 108, 73, 100, 34, 58, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 34, 44, 10, 32, 32, 32, + 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, + 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, + 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, + 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, + 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, + 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, + 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, }, { name: "normal conditions", @@ -54,7 +79,23 @@ func TestBuildSpec_ToJSON(t *testing.T) { ConsensusEngine: "babe", CodeSubstitutes: map[string]string{"key": "value"}, }}, - want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 73, 68, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 91, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 110, 111, 100, 101, 49, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 110, 111, 100, 101, 50, 34, 10, 32, 32, 32, 32, 93, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 107, 101, 121, 34, 58, 32, 34, 118, 97, 108, 117, 101, 34, 10, 32, 32, 32, 32, 125, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, + want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, + 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 73, 68, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, + 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 44, + 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 91, 10, 32, 32, 32, + 32, 32, 32, 32, 32, 34, 110, 111, 100, 101, 49, 34, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 110, + 111, 100, 101, 50, 34, 10, 32, 32, 32, 32, 93, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, + 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, + 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 112, 114, + 111, 116, 111, 99, 111, 108, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, + 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, + 58, 32, 123, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 107, 101, 121, 34, 58, 32, 34, 118, 97, 108, + 117, 101, 34, 10, 32, 32, 32, 32, 125, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, + 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, + 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, + 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, + 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, + 10, 125}, }, } for _, tt := range tests { @@ -71,54 +112,54 @@ func TestBuildSpec_ToJSON(t *testing.T) { assert.Equal(t, tt.want, got) }) } -//<<<<<<< HEAD -//======= -// -// bs.genesis.ChainType = expectedChainType -// bs.genesis.Properties = expectedProperties -// -// require.NoError(t, err) -// -// // confirm human-readable fields -// hr, err := bs.ToJSON() -// require.NoError(t, err) -// jGen := genesis.Genesis{} -// err = json.Unmarshal(hr, &jGen) -// require.NoError(t, err) -// genesis.TestGenesis.Genesis = genesis.TestFieldsHR -// require.Equal(t, genesis.TestGenesis.Genesis.Runtime, jGen.Genesis.Runtime) -// require.Equal(t, expectedChainType, jGen.ChainType) -// require.Equal(t, expectedProperties, jGen.Properties) -// -// // confirm raw fields -// raw, err := bs.ToJSONRaw() -// require.NoError(t, err) -// jGenRaw := genesis.Genesis{} -// err = json.Unmarshal(raw, &jGenRaw) -// require.NoError(t, err) -// genesis.TestGenesis.Genesis = genesis.TestFieldsRaw -// require.Equal(t, genesis.TestGenesis.Genesis.Raw, jGenRaw.Genesis.Raw) -// require.Equal(t, expectedChainType, jGenRaw.ChainType) -// require.Equal(t, expectedProperties, jGenRaw.Properties) -//} -// -//func TestBuildFromGenesis_WhenGenesisDoesNotExists(t *testing.T) { -// bs, err := BuildFromGenesis("/not/exists/genesis.json", 0) -// require.Nil(t, bs) -// require.Error(t, err, os.ErrNotExist) -//} -// -//func TestWriteGenesisSpecFileWhenFileAlreadyExists(t *testing.T) { -// f, err := os.CreateTemp("", "existing file data") -// require.NoError(t, err) -// defer os.Remove(f.Name()) -// -// someBytes := []byte("Testing some bytes") -// err = WriteGenesisSpecFile(someBytes, f.Name()) -// -// require.Error(t, err, -// fmt.Sprintf("file %s already exists, rename to avoid overwritten", f.Name())) -//>>>>>>> development + //<<<<<<< HEAD + //======= + // + // bs.genesis.ChainType = expectedChainType + // bs.genesis.Properties = expectedProperties + // + // require.NoError(t, err) + // + // // confirm human-readable fields + // hr, err := bs.ToJSON() + // require.NoError(t, err) + // jGen := genesis.Genesis{} + // err = json.Unmarshal(hr, &jGen) + // require.NoError(t, err) + // genesis.TestGenesis.Genesis = genesis.TestFieldsHR + // require.Equal(t, genesis.TestGenesis.Genesis.Runtime, jGen.Genesis.Runtime) + // require.Equal(t, expectedChainType, jGen.ChainType) + // require.Equal(t, expectedProperties, jGen.Properties) + // + // // confirm raw fields + // raw, err := bs.ToJSONRaw() + // require.NoError(t, err) + // jGenRaw := genesis.Genesis{} + // err = json.Unmarshal(raw, &jGenRaw) + // require.NoError(t, err) + // genesis.TestGenesis.Genesis = genesis.TestFieldsRaw + // require.Equal(t, genesis.TestGenesis.Genesis.Raw, jGenRaw.Genesis.Raw) + // require.Equal(t, expectedChainType, jGenRaw.ChainType) + // require.Equal(t, expectedProperties, jGenRaw.Properties) + //} + // + //func TestBuildFromGenesis_WhenGenesisDoesNotExists(t *testing.T) { + // bs, err := BuildFromGenesis("/not/exists/genesis.json", 0) + // require.Nil(t, bs) + // require.Error(t, err, os.ErrNotExist) + //} + // + //func TestWriteGenesisSpecFileWhenFileAlreadyExists(t *testing.T) { + // f, err := os.CreateTemp("", "existing file data") + // require.NoError(t, err) + // defer os.Remove(f.Name()) + // + // someBytes := []byte("Testing some bytes") + // err = WriteGenesisSpecFile(someBytes, f.Name()) + // + // require.Error(t, err, + // fmt.Sprintf("file %s already exists, rename to avoid overwritten", f.Name())) + //>>>>>>> development } func TestBuildFromDB(t *testing.T) { @@ -138,8 +179,10 @@ func TestBuildFromDB(t *testing.T) { want *BuildSpec err error }{ - {name: "normal conditions", args: args{path: "test_data/TestBuildFromDB"}, want: &BuildSpec{genesis: &genesis.Genesis{Name: "Gossamer"}}}, - {name: "invalid db path", args: args{path: "foo/bar"}, err: errors.New("failed to create block state: cannot get block 0: Key not found")}, + {name: "normal conditions", args: args{path: "test_data/TestBuildFromDB"}, + want: &BuildSpec{genesis: &genesis.Genesis{Name: "Gossamer"}}}, + {name: "invalid db path", args: args{path: "foo/bar"}, + err: errors.New("failed to create block state: cannot get block 0: Key not found")}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -164,25 +207,25 @@ func TestBuildFromGenesis(t *testing.T) { file, err := genesis.CreateTestGenesisJSONFile(false) assert.NoError(t, err) defer os.Remove(file) -//======= -// for _, tmpFile := range tmpFiles { -// err = WriteGenesisSpecFile(data, tmpFile) -// require.NoError(t, err) -// require.FileExists(t, tmpFile) -// -// defer os.Remove(tmpFile) -// -// file, err := os.Open(tmpFile) -// require.NoError(t, err) -// defer file.Close() -// -// genesisBytes, err := io.ReadAll(file) -// require.NoError(t, err) -// -// gen := new(genesis.Genesis) -// err = json.Unmarshal(genesisBytes, gen) -// require.NoError(t, err) -//>>>>>>> development + //======= + // for _, tmpFile := range tmpFiles { + // err = WriteGenesisSpecFile(data, tmpFile) + // require.NoError(t, err) + // require.FileExists(t, tmpFile) + // + // defer os.Remove(tmpFile) + // + // file, err := os.Open(tmpFile) + // require.NoError(t, err) + // defer file.Close() + // + // genesisBytes, err := io.ReadAll(file) + // require.NoError(t, err) + // + // gen := new(genesis.Genesis) + // err = json.Unmarshal(genesisBytes, gen) + // require.NoError(t, err) + //>>>>>>> development type args struct { path string @@ -237,7 +280,19 @@ func TestBuildSpec_ToJSONRaw(t *testing.T) { { name: "normal conditions", fields: fields{genesis: &genesis.Genesis{Name: "test"}}, - want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, + want: []byte{123, 10, 32, 32, 32, 32, 34, 110, 97, 109, 101, 34, 58, 32, 34, 116, 101, 115, 116, 34, + 44, 10, 32, 32, 32, 32, 34, 105, 100, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 104, 97, + 105, 110, 84, 121, 112, 101, 34, 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 98, 111, 111, 116, 78, + 111, 100, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, 32, 32, 32, 34, 116, 101, 108, 101, + 109, 101, 116, 114, 121, 69, 110, 100, 112, 111, 105, 110, 116, 115, 34, 58, 32, 110, 117, 108, 108, + 44, 10, 32, 32, 32, 32, 34, 112, 114, 111, 116, 111, 99, 111, 108, 73, 100, 34, 58, 32, 34, 34, 44, + 10, 32, 32, 32, 32, 34, 103, 101, 110, 101, 115, 105, 115, 34, 58, 32, 123, 125, 44, 10, 32, 32, 32, + 32, 34, 112, 114, 111, 112, 101, 114, 116, 105, 101, 115, 34, 58, 32, 110, 117, 108, 108, 44, 10, 32, + 32, 32, 32, 34, 102, 111, 114, 107, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, + 10, 32, 32, 32, 32, 34, 98, 97, 100, 66, 108, 111, 99, 107, 115, 34, 58, 32, 110, 117, 108, 108, 44, + 10, 32, 32, 32, 32, 34, 99, 111, 110, 115, 101, 110, 115, 117, 115, 69, 110, 103, 105, 110, 101, 34, + 58, 32, 34, 34, 44, 10, 32, 32, 32, 32, 34, 99, 111, 100, 101, 83, 117, 98, 115, 116, 105, 116, 117, + 116, 101, 115, 34, 58, 32, 110, 117, 108, 108, 10, 125}, }, } for _, tt := range tests { diff --git a/dot/import_integration_test.go b/dot/import_integration_test.go index 078dd892dc..c390a8017d 100644 --- a/dot/import_integration_test.go +++ b/dot/import_integration_test.go @@ -32,35 +32,6 @@ import ( "github.com/stretchr/testify/require" ) -//func setupStateFile(t *testing.T) string { -// filename := "../lib/runtime/test_data/kusama/block1482002.out" -// -// data, err := ioutil.ReadFile(filename) -// require.NoError(t, err) -// -// rpcPairs := make(map[string]interface{}) -// err = json.Unmarshal(data, &rpcPairs) -// require.NoError(t, err) -// pairs := rpcPairs["result"].([]interface{}) -// -// bz, err := json.Marshal(pairs) -// require.NoError(t, err) -// -// fp := "./test_data/state.json" -// err = ioutil.WriteFile(fp, bz, 0777) -// require.NoError(t, err) -// -// return fp -//} - -//func setupHeaderFile(t *testing.T) string { -// headerStr := "{\"digest\":{\"logs\":[\"0x0642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c\",\"0x054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86\"]},\"extrinsicsRoot\":\"0xda26dc8c1455f8f81cae12e4fc59e23ce961b2c837f6d3f664283af906d344e0\",\"number\":\"0x169d12\",\"parentHash\":\"0x3b45c9c22dcece75a30acc9c2968cb311e6b0557350f83b430f47559db786975\",\"stateRoot\":\"0x09f9ca28df0560c2291aa16b56e15e07d1e1927088f51356d522722aa90ca7cb\"}" -// fp := "./test_data/header.json" -// err := ioutil.WriteFile(fp, []byte(headerStr), 0777) -// require.NoError(t, err) -// return fp -//} - func TestNewTrieFromPairs(t *testing.T) { fp := setupStateFile(t) tr, err := newTrieFromPairs(fp) @@ -75,7 +46,10 @@ func TestNewHeaderFromFile(t *testing.T) { header, err := newHeaderFromFile(fp) require.NoError(t, err) - digestBytes := common.MustHexToBytes("0x080642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e290497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86") + digestBytes := common.MustHexToBytes("0x080642414245b501013c0000009659bd0f0000000070edad1c9064fff78cb18435223d8" + + "adaf5ea04c24b1a8766e3dc01eb03cc6a0c11b79793d4e31cc0990838229c44fed1669a7c7c79e1e6d0a96374d6496728069d1ef739e2" + + "90497a0e3b728fa88fcbdd3a5504e0efde0242e7a806dd4fa9260c054241424501019e7f28dddcf27c1e6b328d5694c368d5b2ec5dbe0e" + + "412ae1c98f88d53be4d8502fac571f3f19c9caaf281a673319241e0c5095a683ad34316204088a36a4bd86") digest := types.NewDigest() err = scale.Unmarshal(digestBytes, &digest) require.NoError(t, err) diff --git a/dot/node.go b/dot/node.go index 21e624732f..65bbdce621 100644 --- a/dot/node.go +++ b/dot/node.go @@ -6,6 +6,15 @@ package dot import ( "context" "fmt" + "os" + "os/signal" + "path" + "runtime/debug" + "strconv" + "sync" + "syscall" + "time" + "github.com/ChainSafe/gossamer/dot/core" "github.com/ChainSafe/gossamer/dot/digest" "github.com/ChainSafe/gossamer/dot/metrics" @@ -27,14 +36,6 @@ import ( "github.com/ChainSafe/gossamer/lib/runtime" "github.com/ChainSafe/gossamer/lib/services" "github.com/ChainSafe/gossamer/lib/utils" - "os" - "os/signal" - "path" - "runtime/debug" - "strconv" - "sync" - "syscall" - "time" ) var logger = log.NewFromGlobal(log.AddContext("pkg", "dot")) @@ -49,7 +50,7 @@ type Node struct { // InitNode initialises a new dot node from the provided dot node configuration // and JSON formatted genesis file. -func (nodeInterface)initNode(cfg *Config) error { +func (nodeInterface) initNode(cfg *Config) error { logger.Patch(log.SetLevel(cfg.Global.LogLvl)) logger.Infof( "🕸️ initialising node with name %s, id %s, base path %s and genesis %s...", @@ -111,9 +112,9 @@ func (nodeInterface)initNode(cfg *Config) error { return nil } -// todo (ed) remove and use nodeInterface impl instead // NodeInitialized returns true if, within the configured data directory for the // node, the state database has been created and the genesis data has been loaded +// todo (ed) remove and use nodeInterface impl instead func NodeInitialized(basepath string) bool { // check if key registry exists registry := path.Join(basepath, utils.DefaultDatabaseDir, "KEYREGISTRY") @@ -175,7 +176,6 @@ func LoadGlobalNodeName(basepath string) (nodename string, err error) { return } - // NewNodeC to create node func NewNodeC(cfg *Config) (*Node, error) { return newNodeC(cfg, nodeInterface{}) @@ -299,7 +299,7 @@ func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { serviceRegistryLogger := logger.New(log.AddContext("pkg", "services")) node := &Node{ - Name: cfg.Global.Name, + Name: cfg.Global.Name, // todo (ed) deal with adding stopFunc //StopFunc: stopFunc, Services: services.NewServiceRegistry(serviceRegistryLogger), @@ -327,6 +327,7 @@ func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { return node, nil } + //go:generate mockgen -source=node.go -destination=mock_node.go -package=dot type newNodeIface interface { @@ -336,23 +337,29 @@ type newNodeIface interface { createStateService(config *Config) (*state.Service, error) createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Service, error) createRuntimeStorage(st *state.Service) (*runtime.NodeStorage, error) - loadRuntime(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, ks *keystore.GlobalKeystore, net *network.Service) error + loadRuntime(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, ks *keystore.GlobalKeystore, + net *network.Service) error createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) createDigestHandler(st *state.Service) (*digest.Handler, error) - createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Service, net *network.Service, dh *digest.Handler) (*core.Service, error) - createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, net *network.Service) (*grandpa.Service, error) - newSyncService(cfg *Config, st *state.Service, fg gsync.FinalityGadget, verifier *babe.VerificationManager, cs *core.Service, net *network.Service) (*gsync.Service, error) + createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Service, net *network.Service, + dh *digest.Handler) (*core.Service, error) + createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, + net *network.Service) (*grandpa.Service, error) + newSyncService(cfg *Config, st *state.Service, fg gsync.FinalityGadget, verifier *babe.VerificationManager, + cs *core.Service, net *network.Service) (*gsync.Service, error) createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, cs *core.Service) (*babe.Service, error) createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*system.Service, error) - createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, coreSrvc *core.Service, networkSrvc *network.Service, bp modules.BlockProducerAPI, sysSrvc *system.Service, finSrvc *grandpa.Service) (*rpc.HTTPServer, error) + createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, coreSrvc *core.Service, + networkSrvc *network.Service, bp modules.BlockProducerAPI, sysSrvc *system.Service, + finSrvc *grandpa.Service) (*rpc.HTTPServer, error) initialiseTelemetry(cfg *Config, stateSrvc *state.Service, networkSrvc *network.Service, sysSrvc *system.Service) } -type nodeInterface struct {} +type nodeInterface struct{} // NodeInitialised returns true if, within the configured data directory for the // node, the state database has been created and the genesis data has been loaded -func (nodeInterface)nodeInitialised(basepath string) bool { +func (nodeInterface) nodeInitialised(basepath string) bool { // check if key registry exists registry := path.Join(basepath, utils.DefaultDatabaseDir, "KEYREGISTRY") @@ -389,7 +396,8 @@ func (nodeInterface)nodeInitialised(basepath string) bool { return true } -func (nodeInterface) initialiseTelemetry(cfg *Config, stateSrvc *state.Service, networkSrvc *network.Service, sysSrvc *system.Service) { +func (nodeInterface) initialiseTelemetry(cfg *Config, stateSrvc *state.Service, networkSrvc *network.Service, + sysSrvc *system.Service) { gd, err := stateSrvc.Base.LoadGenesisData() if err != nil { logger.Debugf("problem initialising telemetry: %s", err) @@ -549,7 +557,7 @@ func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { serviceRegistryLogger := logger.New(log.AddContext("pkg", "services")) node := &Node{ - Name: cfg.Global.Name, + Name: cfg.Global.Name, //StopFunc: stopFunc, Services: services.NewServiceRegistry(serviceRegistryLogger), started: make(chan struct{}), @@ -611,7 +619,7 @@ func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { return node, nil } -func (nodeInterface)initKeystore(cfg *Config) (*keystore.GlobalKeystore, error){ +func (nodeInterface) initKeystore(cfg *Config) (*keystore.GlobalKeystore, error) { ks := keystore.NewGlobalKeystore() // load built-in test keys if specified by `cfg.Account.Key` err := keystore.LoadKeystore(cfg.Account.Key, ks.Acco) @@ -878,7 +886,7 @@ func (n *Node) Stop() { n.wg.Done() } -func (nodeInterface)loadRuntime(cfg *Config, ns *runtime.NodeStorage, +func (nodeInterface) loadRuntime(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, ks *keystore.GlobalKeystore, net *network.Service) error { blocks := stateSrvc.Block.GetNonFinalisedBlocks() diff --git a/dot/node_integration_test.go b/dot/node_integration_test.go index b7a0ec48b6..1356db02d9 100644 --- a/dot/node_integration_test.go +++ b/dot/node_integration_test.go @@ -187,7 +187,8 @@ func TestInitNode_LoadGenesisData(t *testing.T) { genTrie, err := genesis.NewTrieFromGenesis(gen) require.NoError(t, err) - genesisHeader, err := types.NewHeader(common.NewHash([]byte{0}), genTrie.MustHash(), trie.EmptyHash, big.NewInt(0), types.NewDigest()) + genesisHeader, err := types.NewHeader(common.NewHash([]byte{0}), genTrie.MustHash(), trie.EmptyHash, + big.NewInt(0), types.NewDigest()) require.NoError(t, err) err = stateSrvc.Initialise(gen, genesisHeader, genTrie) @@ -218,7 +219,8 @@ func TestInitNode_LoadGenesisData(t *testing.T) { require.NoError(t, err) stateRoot := genesisHeader.StateRoot - expectedHeader, err := types.NewHeader(common.NewHash([]byte{0}), stateRoot, trie.EmptyHash, big.NewInt(0), types.NewDigest()) + expectedHeader, err := types.NewHeader(common.NewHash([]byte{0}), stateRoot, trie.EmptyHash, big.NewInt(0), + types.NewDigest()) require.NoError(t, err) require.Equal(t, expectedHeader.Hash(), genesisHeader.Hash()) } diff --git a/dot/node_test.go b/dot/node_test.go index 04655032c7..bf16bd4cad 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -5,15 +5,15 @@ package dot import ( "errors" - "github.com/ChainSafe/gossamer/lib/runtime/wasmer" - "github.com/golang/mock/gomock" "testing" "github.com/ChainSafe/gossamer/dot/state" "github.com/ChainSafe/gossamer/dot/types" "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/keystore" + "github.com/ChainSafe/gossamer/lib/runtime/wasmer" "github.com/ChainSafe/gossamer/lib/utils" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -126,10 +126,10 @@ func TestNewNodeB(t *testing.T) { cfg: &Config{ Global: GlobalConfig{BasePath: cfg.Global.BasePath}, Init: InitConfig{Genesis: genFile.Name()}, - Core: CoreConfig{Roles: types.AuthorityRole }, + Core: CoreConfig{Roles: types.AuthorityRole}, }, }, - err: errors.New("no keys provided for authority node"), + err: errors.New("no keys provided for authority node"), }, // TODO this is commented out because in holds a lock on badger db, causing next test to foil //{ @@ -147,10 +147,10 @@ func TestNewNodeB(t *testing.T) { name: "minimal config", args: args{ cfg: &Config{ - Global: GlobalConfig{BasePath: cfg.Global.BasePath,}, + Global: GlobalConfig{BasePath: cfg.Global.BasePath}, Init: InitConfig{Genesis: genFile.Name()}, Account: AccountConfig{Key: "alice"}, - Core: CoreConfig{WasmInterpreter: wasmer.Name,}, + Core: CoreConfig{WasmInterpreter: wasmer.Name}, }, }, }, @@ -181,7 +181,7 @@ func TestNewNodeC(t *testing.T) { require.NotNil(t, genFile) type args struct { - cfg *Config + cfg *Config //stopFunc func() } tests := []struct { @@ -196,19 +196,19 @@ func TestNewNodeC(t *testing.T) { cfg: &Config{ Global: GlobalConfig{BasePath: cfg.Global.BasePath}, Init: InitConfig{Genesis: genFile.Name()}, - Core: CoreConfig{Roles: types.AuthorityRole }, + Core: CoreConfig{Roles: types.AuthorityRole}, }, }, - err: errors.New("no keys provided for authority node"), + err: errors.New("no keys provided for authority node"), }, { name: "minimal config", args: args{ cfg: &Config{ - Global: GlobalConfig{BasePath: cfg.Global.BasePath,}, + Global: GlobalConfig{BasePath: cfg.Global.BasePath}, Init: InitConfig{Genesis: genFile.Name()}, Account: AccountConfig{Key: "alice"}, - Core: CoreConfig{WasmInterpreter: wasmer.Name,}, + Core: CoreConfig{WasmInterpreter: wasmer.Name}, }, }, }, @@ -235,7 +235,7 @@ func TestNewNodeMock(t *testing.T) { m := NewMocknewNodeIface(ctrl) m.EXPECT().nodeInitialised(gomock.Any()).Return(true).AnyTimes() - m.EXPECT().initKeystore(gomock.Any()).DoAndReturn(func (config *Config) (*keystore.GlobalKeystore, error) { + m.EXPECT().initKeystore(gomock.Any()).DoAndReturn(func(config *Config) (*keystore.GlobalKeystore, error) { if len(config.Account.Key) == 0 { return nil, errors.New("no keys provided for authority node") } @@ -248,7 +248,8 @@ func TestNewNodeMock(t *testing.T) { m.EXPECT().createDigestHandler(gomock.Any()).AnyTimes() m.EXPECT().createCoreService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() m.EXPECT().createGRANDPAService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - m.EXPECT().newSyncService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + m.EXPECT().newSyncService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), + gomock.Any()).AnyTimes() m.EXPECT().createBABEService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() m.EXPECT().createSystemService(gomock.Any(), gomock.Any()).AnyTimes() m.EXPECT().initialiseTelemetry(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() @@ -262,7 +263,7 @@ func TestNewNodeMock(t *testing.T) { require.NotNil(t, genFile) type args struct { - cfg *Config + cfg *Config //stopFunc func() } tests := []struct { @@ -277,19 +278,19 @@ func TestNewNodeMock(t *testing.T) { cfg: &Config{ Global: GlobalConfig{BasePath: cfg.Global.BasePath}, Init: InitConfig{Genesis: genFile.Name()}, - Core: CoreConfig{Roles: types.AuthorityRole }, + Core: CoreConfig{Roles: types.AuthorityRole}, }, }, - err: errors.New("no keys provided for authority node"), + err: errors.New("no keys provided for authority node"), }, { name: "minimal config", args: args{ cfg: &Config{ - Global: GlobalConfig{BasePath: cfg.Global.BasePath,}, + Global: GlobalConfig{BasePath: cfg.Global.BasePath}, Init: InitConfig{Genesis: genFile.Name()}, Account: AccountConfig{Key: "alice"}, - Core: CoreConfig{WasmInterpreter: wasmer.Name,}, + Core: CoreConfig{WasmInterpreter: wasmer.Name}, }, }, }, @@ -337,9 +338,8 @@ func TestNewNode(t *testing.T) { cfg.Core.Roles = types.FullNodeRole type args struct { - cfg *Config - ks *keystore.GlobalKeystore - //stopFunc func() + cfg *Config + ks *keystore.GlobalKeystore } tests := []struct { name string @@ -347,14 +347,6 @@ func TestNewNode(t *testing.T) { want *Node err error }{ - //{ - // name: "missing keystore", - // args: args{ - // cfg: cfg, - // }, - // err: errors.New("failed to create core service: cannot have nil keystore"), - //}, - // todo (ed) this second test fails with; failed to create state service: failed to start state service: Cannot acquire directory lock on "/home/emack/projects/ChainSafe/gossamer/dot/test_data/TestNewNode/db". Another process is using this Badger database.: resource temporarily unavailable { name: "working example", args: args{ diff --git a/dot/services.go b/dot/services.go index 3c81fde1fe..e0173861f7 100644 --- a/dot/services.go +++ b/dot/services.go @@ -42,7 +42,7 @@ func newInMemoryDB(path string) (chaindb.Database, error) { // State Service // createStateService creates the state service and initialise state database -func (nodeInterface)createStateService(cfg *Config) (*state.Service, error) { +func (nodeInterface) createStateService(cfg *Config) (*state.Service, error) { logger.Debug("creating state service...") config := state.Config{ @@ -68,7 +68,7 @@ func (nodeInterface)createStateService(cfg *Config) (*state.Service, error) { return stateSrvc, nil } -func (nodeInterface)createRuntimeStorage(st *state.Service) (*runtime.NodeStorage, error) { +func (nodeInterface) createRuntimeStorage(st *state.Service) (*runtime.NodeStorage, error) { localStorage, err := newInMemoryDB(st.DB().Path()) if err != nil { return nil, err @@ -160,7 +160,8 @@ func asAuthority(authority bool) string { return "" } -func (nodeInterface)createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, cs *core.Service) (*babe.Service, error) { +func (nodeInterface) createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, + cs *core.Service) (*babe.Service, error) { logger.Info("creating BABE service" + asAuthority(cfg.Core.BabeAuthority) + "...") @@ -203,7 +204,7 @@ func (nodeInterface)createBABEService(cfg *Config, st *state.Service, ks keystor // Core Service // createCoreService creates the core service from the provided core configuration -func (nodeInterface)createCoreService(cfg *Config, ks *keystore.GlobalKeystore, +func (nodeInterface) createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Service, net *network.Service, dh *digest.Handler) ( *core.Service, error) { logger.Debug("creating core service" + @@ -247,7 +248,7 @@ func (nodeInterface)createCoreService(cfg *Config, ks *keystore.GlobalKeystore, // Network Service // createNetworkService creates a network service from the command configuration and genesis data -func (nodeInterface)createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Service, error) { +func (nodeInterface) createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Service, error) { logger.Debugf( "creating network service with roles %d, port %d, bootnodes %s, protocol ID %s, nobootstrap=%t and noMDNS=%t...", cfg.Core.Roles, cfg.Network.Port, strings.Join(cfg.Network.Bootnodes, ","), cfg.Network.ProtocolID, @@ -290,7 +291,7 @@ func (nodeInterface)createNetworkService(cfg *Config, stateSrvc *state.Service) // RPC Service // createRPCService creates the RPC service from the provided core configuration -func (nodeInterface)createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, +func (nodeInterface) createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, coreSrvc *core.Service, networkSrvc *network.Service, bp modules.BlockProducerAPI, sysSrvc *system.Service, finSrvc *grandpa.Service) (*rpc.HTTPServer, error) { logger.Infof( @@ -341,7 +342,7 @@ func (nodeInterface)createRPCService(cfg *Config, ns *runtime.NodeStorage, state } // createSystemService creates a systemService for providing system related information -func (nodeInterface)createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*system.Service, error) { +func (nodeInterface) createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*system.Service, error) { genesisData, err := stateSrvc.Base.LoadGenesisData() if err != nil { return nil, err @@ -351,7 +352,7 @@ func (nodeInterface)createSystemService(cfg *types.SystemInfo, stateSrvc *state. } // createGRANDPAService creates a new GRANDPA service -func (nodeInterface)createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, +func (nodeInterface) createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, net *network.Service) (*grandpa.Service, error) { rt, err := st.Block.GetRuntime(nil) if err != nil { @@ -392,7 +393,7 @@ func (nodeInterface)createGRANDPAService(cfg *Config, st *state.Service, dh *dig return grandpa.NewService(gsCfg) } -func (nodeInterface)createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) { +func (nodeInterface) createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) { ver, err := babe.NewVerificationManager(st.Block, st.Epoch) if err != nil { return nil, err @@ -401,7 +402,7 @@ func (nodeInterface)createBlockVerifier(st *state.Service) (*babe.VerificationMa return ver, nil } -func (nodeInterface)newSyncService(cfg *Config, st *state.Service, fg sync.FinalityGadget, +func (nodeInterface) newSyncService(cfg *Config, st *state.Service, fg sync.FinalityGadget, verifier *babe.VerificationManager, cs *core.Service, net *network.Service) ( *sync.Service, error) { slotDuration, err := st.Epoch.GetSlotDuration() @@ -426,7 +427,7 @@ func (nodeInterface)newSyncService(cfg *Config, st *state.Service, fg sync.Final return sync.NewService(syncCfg) } -func (nodeInterface)createDigestHandler(st *state.Service) (*digest.Handler, error) { +func (nodeInterface) createDigestHandler(st *state.Service) (*digest.Handler, error) { return digest.NewHandler(st.Block, st.Epoch, st.Grandpa) } diff --git a/dot/services_integration_test.go b/dot/services_integration_test.go index 532ae82c15..e7687ad749 100644 --- a/dot/services_integration_test.go +++ b/dot/services_integration_test.go @@ -303,11 +303,16 @@ var testCalls = []struct { call []byte expected []byte }{ - {[]byte(`{"jsonrpc":"2.0","method":"system_name","params":[],"id":1}`), []byte(`{"id":1,"jsonrpc":"2.0","result":"gossamer"}` + "\n")}, // working request - {[]byte(`{"jsonrpc":"2.0","method":"unknown","params":[],"id":2}`), []byte(`{"error":{"code":-32000,"data":null,"message":"rpc error method unknown not found"},"id":2,"jsonrpc":"2.0"}` + "\n")}, // unknown method - {[]byte{}, []byte(`{"jsonrpc":"2.0","error":{"code":-32600,"message":"Invalid request"},"id":0}` + "\n")}, // empty request - {[]byte(`{"jsonrpc":"2.0","method":"chain_subscribeNewHeads","params":[],"id":3}`), []byte(`{"jsonrpc":"2.0","result":1,"id":3}` + "\n")}, - {[]byte(`{"jsonrpc":"2.0","method":"state_subscribeStorage","params":[],"id":4}`), []byte(`{"jsonrpc":"2.0","result":2,"id":4}` + "\n")}, + {[]byte(`{"jsonrpc":"2.0","method":"system_name","params":[],"id":1}`), []byte(`{"id":1,"jsonrpc":"2.0", +"result":"gossamer"}` + "\n")}, // working request + {[]byte(`{"jsonrpc":"2.0","method":"unknown","params":[],"id":2}`), []byte(`{"error":{"code":-32000,"data":null, +"message":"rpc error method unknown not found"},"id":2,"jsonrpc":"2.0"}` + "\n")}, // unknown method + {[]byte{}, []byte(`{"jsonrpc":"2.0","error":{"code":-32600,"message":"Invalid request"},"id":0}` + "\n")}, + // empty request + {[]byte(`{"jsonrpc":"2.0","method":"chain_subscribeNewHeads","params":[],"id":3}`), []byte(`{"jsonrpc":"2.0", +"result":1,"id":3}` + "\n")}, + {[]byte(`{"jsonrpc":"2.0","method":"state_subscribeStorage","params":[],"id":4}`), []byte(`{"jsonrpc":"2.0", +"result":2,"id":4}` + "\n")}, } func TestNewWebSocketServer(t *testing.T) { diff --git a/dot/services_test.go b/dot/services_test.go index 8ab77c0846..6c471b75c2 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -473,7 +473,8 @@ func Test_createRPCService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := ni.createRPCService(tt.args.cfg, tt.args.ns, tt.args.stateSrvc, tt.args.coreSrvc, tt.args.networkSrvc, tt.args.bp, tt.args.sysSrvc, tt.args.finSrvc) + got, err := ni.createRPCService(tt.args.cfg, tt.args.ns, tt.args.stateSrvc, tt.args.coreSrvc, + tt.args.networkSrvc, tt.args.bp, tt.args.sysSrvc, tt.args.finSrvc) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -540,7 +541,8 @@ func Test_createRuntime(t *testing.T) { st: stateSrvc, code: []byte(`fake code`), }, - err: errors.New("failed to create runtime executor: Failed to instantiate the module:\n compile error: Validation error \"Bad magic number\""), + err: errors.New("failed to create runtime executor: Failed to instantiate the module:\n compile error" + + ": Validation error \"Bad magic number\""), }, { name: "working example", @@ -675,32 +677,6 @@ func Test_createStateService(t *testing.T) { } }) } -//var addr = flag.String("addr", "localhost:8546", "http service address") -//var testCalls = []struct { -// call []byte -// expected []byte -//}{ -// { -// call: []byte(`{"jsonrpc":"2.0","method":"system_name","params":[],"id":1}`), -// expected: []byte(`{"id":1,"jsonrpc":"2.0","result":"gossamer"}` + "\n")}, // working request -// { -// call: []byte(`{"jsonrpc":"2.0","method":"unknown","params":[],"id":2}`), -// // unknown method -// expected: []byte(`{"error":{"code":-32000,"data":null,` + -// `"message":"rpc error method unknown not found"},"id":2,` + -// `"jsonrpc":"2.0"}` + "\n")}, -// { -// call: []byte{}, -// // empty request -// expected: []byte(`{"jsonrpc":"2.0","error":{"code":-32600,` + -// `"message":"Invalid request"},"id":0}` + "\n")}, -// { -// call: []byte(`{"jsonrpc":"2.0","method":"chain_subscribeNewHeads","params":[],"id":3}`), -// expected: []byte(`{"jsonrpc":"2.0","result":1,"id":3}` + "\n")}, -// { -// call: []byte(`{"jsonrpc":"2.0","method":"state_subscribeStorage","params":[],"id":4}`), -// expected: []byte(`{"jsonrpc":"2.0","result":2,"id":4}` + "\n")}, -// } func Test_createSystemService(t *testing.T) { diff --git a/dot/utils_integration_test.go b/dot/utils_integration_test.go index 081fc8be52..baa78183ab 100644 --- a/dot/utils_integration_test.go +++ b/dot/utils_integration_test.go @@ -126,7 +126,8 @@ func TestDeepCopyVsSnapshot(t *testing.T) { trieMap[i] = newTrie } - log.Printf("\nAlloc = %v MB \nTotalAlloc = %v MB \nSys = %v MB \nNumGC = %v \n\n", m.Alloc/(1024*1024), m.TotalAlloc/(1024*1024), m.Sys/(1024*1024), m.NumGC) + log.Printf("\nAlloc = %v MB \nTotalAlloc = %v MB \nSys = %v MB \nNumGC = %v \n\n", m.Alloc/(1024*1024), + m.TotalAlloc/(1024*1024), m.Sys/(1024*1024), m.NumGC) elapsed := time.Since(start) log.Printf("DeepCopy to trie took %s", elapsed) runtime.GC() diff --git a/dot/utils_test.go b/dot/utils_test.go index 5c857aafc6..2564bd257d 100644 --- a/dot/utils_test.go +++ b/dot/utils_test.go @@ -157,13 +157,14 @@ func TestNewTestConfig(t *testing.T) { DiscoveryInterval: 10000000000, }, RPC: RPCConfig{ - Enabled: false, - External: false, - Unsafe: false, - UnsafeExternal: false, - Port: 8545, - Host: "localhost", - Modules: []string{"system", "author", "chain", "state", "rpc", "grandpa", "offchain", "childstate", "syncstate", "payment"}, + Enabled: false, + External: false, + Unsafe: false, + UnsafeExternal: false, + Port: 8545, + Host: "localhost", + Modules: []string{"system", "author", "chain", "state", "rpc", "grandpa", "offchain", + "childstate", "syncstate", "payment"}, WSPort: 8546, WS: false, WSExternal: false, @@ -243,13 +244,14 @@ func TestNewTestConfigWithFile(t *testing.T) { DiscoveryInterval: 10000000000, }, RPC: RPCConfig{ - Enabled: false, - External: false, - Unsafe: false, - UnsafeExternal: false, - Port: 8545, - Host: "localhost", - Modules: []string{"system", "author", "chain", "state", "rpc", "grandpa", "offchain", "childstate", "syncstate", "payment"}, + Enabled: false, + External: false, + Unsafe: false, + UnsafeExternal: false, + Port: 8545, + Host: "localhost", + Modules: []string{"system", "author", "chain", "state", "rpc", "grandpa", "offchain", + "childstate", "syncstate", "payment"}, WSPort: 8546, WS: false, WSExternal: false, From 2842ba78874ac76f600dbfa5dfa0b35f2253d6fb Mon Sep 17 00:00:00 2001 From: Alexandre Vardai <44412643+1garo@users.noreply.github.com> Date: Mon, 6 Dec 2021 16:34:45 -0300 Subject: [PATCH 31/43] feat(wasmer/crypto): move sig verifier to crypto pkg (#2057) --- lib/crypto/ed25519/ed25519.go | 18 ++++ lib/crypto/ed25519/ed25519_test.go | 63 +++++++++++- lib/crypto/secp256k1/secp256k1.go | 12 +++ lib/crypto/secp256k1/secp256k1_test.go | 47 +++++++++ lib/{runtime => crypto}/sig_verifier.go | 70 ++++--------- lib/crypto/sig_verifier_test.go | 126 ++++++++++++++++++++++++ lib/crypto/sr25519/sr25519.go | 19 ++++ lib/crypto/sr25519/sr25519_test.go | 63 ++++++++++++ lib/runtime/life/instance.go | 3 +- lib/runtime/life/resolver.go | 20 ++-- lib/runtime/test_helpers.go | 14 +-- lib/runtime/types.go | 3 +- lib/runtime/types_test.go | 40 ++++---- lib/runtime/wasmer/imports.go | 40 ++++---- lib/runtime/wasmer/instance.go | 4 +- 15 files changed, 432 insertions(+), 110 deletions(-) rename lib/{runtime => crypto}/sig_verifier.go (64%) create mode 100644 lib/crypto/sig_verifier_test.go diff --git a/lib/crypto/ed25519/ed25519.go b/lib/crypto/ed25519/ed25519.go index b91e5e9af8..28ab6c34d2 100644 --- a/lib/crypto/ed25519/ed25519.go +++ b/lib/crypto/ed25519/ed25519.go @@ -44,6 +44,24 @@ type PublicKey ed25519.PublicKey // PublicKeyBytes is an encoded ed25519 public key type PublicKeyBytes [PublicKeyLength]byte +// VerifySignature verifies a signature given a public key and a message +func VerifySignature(publicKey, signature, message []byte) error { + pubKey, err := NewPublicKey(publicKey) + if err != nil { + return fmt.Errorf("ed25519: %w", err) + } + + ok, err := pubKey.Verify(message, signature) + if err != nil { + return fmt.Errorf("ed25519: %w", err) + } else if !ok { + return fmt.Errorf("ed25519: %w: for message 0x%x, signature 0x%x and public key 0x%x", + crypto.ErrSignatureVerificationFailed, message, signature, publicKey) + } + + return nil +} + // String returns the PublicKeyBytes formatted as a hex string func (b PublicKeyBytes) String() string { pk := [PublicKeyLength]byte(b) diff --git a/lib/crypto/ed25519/ed25519_test.go b/lib/crypto/ed25519/ed25519_test.go index f83a3a8554..765c493741 100644 --- a/lib/crypto/ed25519/ed25519_test.go +++ b/lib/crypto/ed25519/ed25519_test.go @@ -4,11 +4,13 @@ package ed25519 import ( - ed25519 "crypto/ed25519" + "crypto/ed25519" + "fmt" "reflect" "testing" "github.com/ChainSafe/gossamer/lib/common" + "github.com/ChainSafe/gossamer/lib/crypto" bip39 "github.com/cosmos/go-bip39" "github.com/stretchr/testify/require" @@ -99,3 +101,62 @@ func TestNewKeypairFromMnenomic_Again(t *testing.T) { expectedPubkey := common.MustHexToBytes("0xf56d9231e7b7badd3f1e10ad15ef8aa08b70839723d0a2d10d7329f0ea2b8c61") require.Equal(t, expectedPubkey, kp.Public().Encode()) } + +func TestVerifySignature(t *testing.T) { + t.Parallel() + keypair, err := GenerateKeypair() + require.NoError(t, err) + + publicKey := keypair.public.Encode() + + message := []byte("Hello world!") + + signature, err := keypair.Sign(message) + require.NoError(t, err) + + testCase := map[string]struct { + publicKey, signature, message []byte + err error + }{ + "success": { + publicKey: publicKey, + signature: signature, + message: message, + }, + "bad public key input": { + publicKey: []byte{}, + signature: signature, + message: message, + err: fmt.Errorf("ed25519: cannot create public key: input is not 32 bytes"), + }, + "invalid signature length": { + publicKey: publicKey, + signature: []byte{}, + message: message, + err: fmt.Errorf("ed25519: invalid signature length"), + }, + "verification failed": { + publicKey: publicKey, + signature: signature, + message: []byte("a225e8c75da7da319af6335e7642d473"), + err: fmt.Errorf("ed25519: %w: for message 0x%x, signature 0x%x and public key 0x%x", + crypto.ErrSignatureVerificationFailed, []byte("a225e8c75da7da319af6335e7642d473"), signature, publicKey), + }, + } + + for name, value := range testCase { + testCase := value + t.Run(name, func(t *testing.T) { + t.Parallel() + + err := VerifySignature(testCase.publicKey, testCase.signature, testCase.message) + + if testCase.err != nil { + require.EqualError(t, err, testCase.err.Error()) + return + } + require.NoError(t, err) + }) + } + +} diff --git a/lib/crypto/secp256k1/secp256k1.go b/lib/crypto/secp256k1/secp256k1.go index 29dccfeb2c..dc4790ae8c 100644 --- a/lib/crypto/secp256k1/secp256k1.go +++ b/lib/crypto/secp256k1/secp256k1.go @@ -7,6 +7,7 @@ import ( "crypto/ecdsa" "encoding/hex" "errors" + "fmt" "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/crypto" @@ -36,6 +37,17 @@ type PublicKey struct { key ecdsa.PublicKey } +// VerifySignature verifies a signature given a public key and a message +func VerifySignature(publicKey, signature, message []byte) error { + ok := secp256k1.VerifySignature(publicKey, message, signature) + if ok { + return nil + } + + return fmt.Errorf("secp256k1: %w: for message 0x%x, signature 0x%x and public key 0x%x", + crypto.ErrSignatureVerificationFailed, message, signature, publicKey) +} + // RecoverPublicKey returns the 64-byte uncompressed public key that created the given signature. func RecoverPublicKey(msg, sig []byte) ([]byte, error) { // update recovery bit diff --git a/lib/crypto/secp256k1/secp256k1_test.go b/lib/crypto/secp256k1/secp256k1_test.go index 7ae002066d..a0aaecacc5 100644 --- a/lib/crypto/secp256k1/secp256k1_test.go +++ b/lib/crypto/secp256k1/secp256k1_test.go @@ -4,10 +4,12 @@ package secp256k1 import ( + "fmt" "reflect" "testing" "github.com/ChainSafe/gossamer/lib/common" + "github.com/ChainSafe/gossamer/lib/crypto" "github.com/stretchr/testify/require" ) @@ -154,3 +156,48 @@ func TestRecoverPublicKeyCompressed(t *testing.T) { require.NoError(t, err) require.Equal(t, kp.Public(), r) } + +func TestVerifySignature(t *testing.T) { + t.Parallel() + keypair, err := GenerateKeypair() + require.NoError(t, err) + + message := []byte("a225e8c75da7da319af6335e7642d473") + + signature, err := keypair.Sign(message) + require.NoError(t, err) + + testCase := map[string]struct { + publicKey, signature, message []byte + err error + }{ + "success": { + publicKey: keypair.public.Encode(), + signature: signature[:64], + message: message, + }, + "verification failed": { + publicKey: keypair.public.Encode(), + signature: []byte{}, + message: message, + err: fmt.Errorf("secp256k1: %w: for message 0x%x, signature 0x and public key 0x%x", + crypto.ErrSignatureVerificationFailed, message, keypair.public.Encode()), + }, + } + + for name, value := range testCase { + testCase := value + t.Run(name, func(t *testing.T) { + t.Parallel() + + err := VerifySignature(testCase.publicKey, testCase.signature, testCase.message) + + if testCase.err != nil { + require.EqualError(t, err, testCase.err.Error()) + return + } + require.NoError(t, err) + }) + } + +} diff --git a/lib/runtime/sig_verifier.go b/lib/crypto/sig_verifier.go similarity index 64% rename from lib/runtime/sig_verifier.go rename to lib/crypto/sig_verifier.go index 5e1e8c59ad..80b5ca8be4 100644 --- a/lib/runtime/sig_verifier.go +++ b/lib/crypto/sig_verifier.go @@ -1,31 +1,32 @@ // Copyright 2021 ChainSafe Systems (ON) // SPDX-License-Identifier: LGPL-3.0-only -package runtime +package crypto import ( - "fmt" + "errors" "sync" "time" "github.com/ChainSafe/gossamer/internal/log" - "github.com/ChainSafe/gossamer/lib/crypto" - "github.com/ChainSafe/gossamer/lib/crypto/ed25519" - "github.com/ChainSafe/gossamer/lib/crypto/sr25519" - "github.com/ethereum/go-ethereum/crypto/secp256k1" ) -// Signature ... -type Signature struct { - PubKey []byte - Sign []byte - Msg []byte - KeyTypeID crypto.KeyType +var ErrSignatureVerificationFailed = errors.New("failed to verify signature") + +// SigVerifyFunc verifies a signature given a public key and a message +type SigVerifyFunc func(pubkey, sig, msg []byte) (err error) + +// SignatureInfo ... +type SignatureInfo struct { + PubKey []byte + Sign []byte + Msg []byte + VerifyFunc SigVerifyFunc } // SignatureVerifier ... type SignatureVerifier struct { - batch []*Signature + batch []*SignatureInfo init bool // Indicates whether the batch processing is started. invalid bool // Set to true if any signature verification fails. logger log.LeveledLogger @@ -41,7 +42,7 @@ type SignatureVerifier struct { // Signatures can be added to the batch using Add(). func NewSignatureVerifier(logger log.LeveledLogger) *SignatureVerifier { return &SignatureVerifier{ - batch: make([]*Signature, 0), + batch: make([]*SignatureInfo, 0), init: false, invalid: false, logger: logger, @@ -66,11 +67,11 @@ func (sv *SignatureVerifier) Start() { case <-sv.closeCh: return default: - sign := sv.Remove() - if sign == nil { + signature := sv.Remove() + if signature == nil { continue } - err := sign.verify() + err := signature.VerifyFunc(signature.PubKey, signature.Sign, signature.Msg) if err != nil { sv.logger.Errorf("[ext_crypto_start_batch_verify_version_1]: %s", err) sv.Invalid() @@ -103,7 +104,7 @@ func (sv *SignatureVerifier) Invalid() { } // Add ... -func (sv *SignatureVerifier) Add(s *Signature) { +func (sv *SignatureVerifier) Add(s *SignatureInfo) { if sv.IsInvalid() { return } @@ -114,7 +115,7 @@ func (sv *SignatureVerifier) Add(s *Signature) { } // Remove returns the first signature from the batch. Returns nil if batch is empty. -func (sv *SignatureVerifier) Remove() *Signature { +func (sv *SignatureVerifier) Remove() *SignatureInfo { sv.Lock() defer sv.Unlock() if len(sv.batch) == 0 { @@ -130,7 +131,7 @@ func (sv *SignatureVerifier) Reset() { sv.Lock() defer sv.Unlock() sv.init = false - sv.batch = make([]*Signature, 0) + sv.batch = make([]*SignatureInfo, 0) sv.invalid = false sv.closeCh = make(chan struct{}) } @@ -153,32 +154,3 @@ func (sv *SignatureVerifier) Finish() bool { sv.Reset() return !isInvalid } - -func (sig *Signature) verify() error { - switch sig.KeyTypeID { - case crypto.Ed25519Type: - pubKey, err := ed25519.NewPublicKey(sig.PubKey) - if err != nil { - return fmt.Errorf("failed to fetch ed25519 public key: %s", err) - } - ok, err := pubKey.Verify(sig.Msg, sig.Sign) - if err != nil || !ok { - return fmt.Errorf("failed to verify ed25519 signature: %s", err) - } - case crypto.Sr25519Type: - pubKey, err := sr25519.NewPublicKey(sig.PubKey) - if err != nil { - return fmt.Errorf("failed to fetch sr25519 public key: %s", err) - } - ok, err := pubKey.Verify(sig.Msg, sig.Sign) - if err != nil || !ok { - return fmt.Errorf("failed to verify sr25519 signature: %s", err) - } - case crypto.Secp256k1Type: - ok := secp256k1.VerifySignature(sig.PubKey, sig.Msg, sig.Sign) - if !ok { - return fmt.Errorf("failed to verify secp256k1 signature") - } - } - return nil -} diff --git a/lib/crypto/sig_verifier_test.go b/lib/crypto/sig_verifier_test.go new file mode 100644 index 0000000000..fcaec07b88 --- /dev/null +++ b/lib/crypto/sig_verifier_test.go @@ -0,0 +1,126 @@ +// Copyright 2021 ChainSafe Systems (ON) +// SPDX-License-Identifier: LGPL-3.0-only + +package crypto_test + +import ( + "io" + "testing" + + "github.com/ChainSafe/gossamer/internal/log" + "github.com/ChainSafe/gossamer/lib/crypto" + "github.com/ChainSafe/gossamer/lib/crypto/ed25519" + "github.com/ChainSafe/gossamer/lib/crypto/secp256k1" + "github.com/ChainSafe/gossamer/lib/crypto/sr25519" + + "github.com/stretchr/testify/require" +) + +func TestVerifySignature(t *testing.T) { + t.Parallel() + + message := []byte("a225e8c75da7da319af6335e7642d473") + + edKeypair, err := ed25519.GenerateKeypair() + require.NoError(t, err) + edSign, err := edKeypair.Sign(message) + require.NoError(t, err) + + secpKeypair, err := secp256k1.GenerateKeypair() + require.NoError(t, err) + secpSign, err := secpKeypair.Sign(message) + require.NoError(t, err) + + srKeypair, err := sr25519.GenerateKeypair() + require.NoError(t, err) + srSign, err := srKeypair.Sign(message) + require.NoError(t, err) + + testCase := map[string]struct { + expect bool + signaturesToVerify []*crypto.SignatureInfo + }{ + "success": { + expect: true, + signaturesToVerify: []*crypto.SignatureInfo{ + 0: { + PubKey: edKeypair.Public().Encode(), + Sign: edSign, + Msg: message, + VerifyFunc: ed25519.VerifySignature, + }, + 1: { + PubKey: secpKeypair.Public().Encode(), + Sign: secpSign[:64], + Msg: message, + VerifyFunc: secp256k1.VerifySignature, + }, + 2: { + PubKey: srKeypair.Public().Encode(), + Sign: srSign, + Msg: message, + VerifyFunc: sr25519.VerifySignature, + }, + }, + }, + "bad public key input": { + expect: false, + signaturesToVerify: []*crypto.SignatureInfo{ + 0: { + PubKey: []byte{}, + Sign: edSign, + Msg: message, + VerifyFunc: ed25519.VerifySignature, + }, + 1: { + PubKey: []byte{}, + Sign: srSign, + Msg: message, + VerifyFunc: sr25519.VerifySignature, + }, + }, + }, + "verification failed": { + expect: false, + signaturesToVerify: []*crypto.SignatureInfo{ + 0: { + PubKey: edKeypair.Public().Encode(), + Sign: []byte{}, + Msg: message, + VerifyFunc: ed25519.VerifySignature, + }, + 1: { + PubKey: srKeypair.Public().Encode(), + Sign: []byte{}, + Msg: message, + VerifyFunc: sr25519.VerifySignature, + }, + 2: { + PubKey: secpKeypair.Public().Encode(), + Sign: []byte{}, + Msg: message, + VerifyFunc: secp256k1.VerifySignature, + }, + }, + }, + } + + for name, value := range testCase { + testCase := value + t.Run(name, func(t *testing.T) { + t.Parallel() + + signVerify := crypto.NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) + + for _, sig := range testCase.signaturesToVerify { + signVerify.Add(sig) + } + + signVerify.Start() + + ok := signVerify.Finish() + require.Equal(t, testCase.expect, ok) + }) + } + +} diff --git a/lib/crypto/sr25519/sr25519.go b/lib/crypto/sr25519/sr25519.go index 339da172a1..799f720d54 100644 --- a/lib/crypto/sr25519/sr25519.go +++ b/lib/crypto/sr25519/sr25519.go @@ -6,6 +6,7 @@ package sr25519 import ( "encoding/hex" "errors" + "fmt" "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/crypto" @@ -48,6 +49,24 @@ type PrivateKey struct { key *sr25519.SecretKey } +// VerifySignature verifies a signature given a public key and a message +func VerifySignature(publicKey, signature, message []byte) error { + pubKey, err := NewPublicKey(publicKey) + if err != nil { + return fmt.Errorf("sr25519: %w", err) + } + + ok, err := pubKey.Verify(message, signature) + if err != nil { + return fmt.Errorf("sr25519: %w", err) + } else if !ok { + return fmt.Errorf("sr25519: %w: for message 0x%x, signature 0x%x and public key 0x%x", + crypto.ErrSignatureVerificationFailed, message, signature, publicKey) + } + + return nil +} + // NewKeypair returns a sr25519 Keypair given a schnorrkel secret key func NewKeypair(priv *sr25519.SecretKey) (*Keypair, error) { pub, err := priv.Public() diff --git a/lib/crypto/sr25519/sr25519_test.go b/lib/crypto/sr25519/sr25519_test.go index a6440c738e..53fbfe7e52 100644 --- a/lib/crypto/sr25519/sr25519_test.go +++ b/lib/crypto/sr25519/sr25519_test.go @@ -5,8 +5,11 @@ package sr25519 import ( "crypto/rand" + "errors" + "fmt" "testing" + "github.com/ChainSafe/gossamer/lib/crypto" bip39 "github.com/cosmos/go-bip39" "github.com/gtank/merlin" "github.com/stretchr/testify/require" @@ -119,3 +122,63 @@ func TestNewKeypairFromMnenomic(t *testing.T) { _, err = NewKeypairFromMnenomic(mnemonic, "") require.NoError(t, err) } + +func TestVerifySignature(t *testing.T) { + t.Parallel() + + keypair, err := GenerateKeypair() + require.NoError(t, err) + + publicKey := keypair.public.Encode() + + message := []byte("Hello world!") + + signature, err := keypair.Sign(message) + require.NoError(t, err) + + testCase := map[string]struct { + publicKey, signature, message []byte + err error + }{ + "success": { + publicKey: publicKey, + signature: signature, + message: message, + }, + "bad public key input": { + publicKey: []byte{}, + signature: signature, + message: message, + err: errors.New("sr25519: cannot create public key: input is not 32 bytes"), + }, + "invalid signature length": { + publicKey: publicKey, + signature: []byte{}, + message: message, + err: fmt.Errorf("sr25519: invalid signature length"), + }, + "verification failed": { + publicKey: publicKey, + signature: signature, + message: []byte("a225e8c75da7da319af6335e7642d473"), + err: fmt.Errorf("sr25519: %w: for message 0x%x, signature 0x%x and public key 0x%x", + crypto.ErrSignatureVerificationFailed, []byte("a225e8c75da7da319af6335e7642d473"), signature, publicKey), + }, + } + + for name, value := range testCase { + testCase := value + t.Run(name, func(t *testing.T) { + t.Parallel() + + err := VerifySignature(testCase.publicKey, testCase.signature, testCase.message) + + if testCase.err != nil { + require.EqualError(t, err, testCase.err.Error()) + return + } + require.NoError(t, err) + }) + } + +} diff --git a/lib/runtime/life/instance.go b/lib/runtime/life/instance.go index ec22bf7eb3..f5d50f2732 100644 --- a/lib/runtime/life/instance.go +++ b/lib/runtime/life/instance.go @@ -12,6 +12,7 @@ import ( "github.com/ChainSafe/gossamer/internal/log" "github.com/ChainSafe/gossamer/lib/common" + "github.com/ChainSafe/gossamer/lib/crypto" "github.com/ChainSafe/gossamer/lib/keystore" "github.com/ChainSafe/gossamer/lib/runtime" @@ -112,7 +113,7 @@ func NewInstance(code []byte, cfg *Config) (*Instance, error) { NodeStorage: cfg.NodeStorage, Network: cfg.Network, Transaction: cfg.Transaction, - SigVerifier: runtime.NewSignatureVerifier(logger), + SigVerifier: crypto.NewSignatureVerifier(logger), } logger.Debugf("creating new runtime instance with context: %v", runtimeCtx) diff --git a/lib/runtime/life/resolver.go b/lib/runtime/life/resolver.go index 3ce00cb6d7..7f19ea5869 100644 --- a/lib/runtime/life/resolver.go +++ b/lib/runtime/life/resolver.go @@ -935,11 +935,11 @@ func ext_crypto_ed25519_verify_version_1(vm *exec.VirtualMachine) int64 { } if sigVerifier.IsStarted() { - signature := runtime.Signature{ - PubKey: pubKey.Encode(), - Sign: signature, - Msg: message, - KeyTypeID: crypto.Ed25519Type, + signature := crypto.SignatureInfo{ + PubKey: pubKey.Encode(), + Sign: signature, + Msg: message, + VerifyFunc: ed25519.VerifySignature, } sigVerifier.Add(&signature) return 1 @@ -1124,11 +1124,11 @@ func ext_crypto_sr25519_verify_version_1(vm *exec.VirtualMachine) int64 { pub.Hex(), message, signature) if sigVerifier.IsStarted() { - signature := runtime.Signature{ - PubKey: pub.Encode(), - Sign: signature, - Msg: message, - KeyTypeID: crypto.Sr25519Type, + signature := crypto.SignatureInfo{ + PubKey: pub.Encode(), + Sign: signature, + Msg: message, + VerifyFunc: sr25519.VerifySignature, } sigVerifier.Add(&signature) return 1 diff --git a/lib/runtime/test_helpers.go b/lib/runtime/test_helpers.go index 4da3c3b963..e9e7d0f5f9 100644 --- a/lib/runtime/test_helpers.go +++ b/lib/runtime/test_helpers.go @@ -115,9 +115,9 @@ func (*TestRuntimeNetwork) NetworkState() common.NetworkState { } } -func generateEd25519Signatures(t *testing.T, n int) []*Signature { +func generateEd25519Signatures(t *testing.T, n int) []*crypto.SignatureInfo { t.Helper() - signs := make([]*Signature, n) + signs := make([]*crypto.SignatureInfo, n) for i := 0; i < n; i++ { msg := []byte("Hello") key, err := ed25519.GenerateKeypair() @@ -126,11 +126,11 @@ func generateEd25519Signatures(t *testing.T, n int) []*Signature { sign, err := key.Private().Sign(msg) require.NoError(t, err) - signs[i] = &Signature{ - PubKey: key.Public().Encode(), - Sign: sign, - Msg: msg, - KeyTypeID: crypto.Ed25519Type, + signs[i] = &crypto.SignatureInfo{ + PubKey: key.Public().Encode(), + Sign: sign, + Msg: msg, + VerifyFunc: ed25519.VerifySignature, } } return signs diff --git a/lib/runtime/types.go b/lib/runtime/types.go index b246920ddb..312be14058 100644 --- a/lib/runtime/types.go +++ b/lib/runtime/types.go @@ -6,6 +6,7 @@ package runtime import ( "github.com/ChainSafe/gossamer/internal/log" "github.com/ChainSafe/gossamer/lib/common" + "github.com/ChainSafe/gossamer/lib/crypto" "github.com/ChainSafe/gossamer/lib/keystore" "github.com/ChainSafe/gossamer/lib/runtime/offchain" ) @@ -67,7 +68,7 @@ type Context struct { NodeStorage NodeStorage Network BasicNetwork Transaction TransactionState - SigVerifier *SignatureVerifier + SigVerifier *crypto.SignatureVerifier OffchainHTTPSet *offchain.HTTPSet } diff --git a/lib/runtime/types_test.go b/lib/runtime/types_test.go index af5c2bf569..98627f241d 100644 --- a/lib/runtime/types_test.go +++ b/lib/runtime/types_test.go @@ -19,7 +19,7 @@ import ( func TestBackgroundSignVerification(t *testing.T) { signs := generateEd25519Signatures(t, 2) - signVerify := NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) + signVerify := crypto.NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) signVerify.Start() @@ -34,7 +34,7 @@ func TestBackgroundSignVerification(t *testing.T) { func TestBackgroundSignVerificationMultipleStart(t *testing.T) { signs := generateEd25519Signatures(t, 2) - signVerify := NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) + signVerify := crypto.NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) for ii := 0; ii < 5; ii++ { require.False(t, signVerify.IsStarted()) @@ -60,16 +60,16 @@ func TestInvalidSignatureBatch(t *testing.T) { sigData, err := common.HexToBytes("0x90f27b8b488db00b00606796d2987f6a5f59ae62ea05effe84fef5b8b0e549984a691139ad57a3f0b906637673aa2f63d1f55cb1a69199d4009eea23ceaddc9301") //nolint:lll require.Nil(t, err) - signature := &Signature{ - PubKey: key.Public().Encode(), - Sign: sigData, - Msg: msg, - KeyTypeID: crypto.Ed25519Type, + signature := &crypto.SignatureInfo{ + PubKey: key.Public().Encode(), + Sign: sigData, + Msg: msg, + VerifyFunc: ed25519.VerifySignature, } signs = append(signs, signature) - signVerify := NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) + signVerify := crypto.NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) signVerify.Start() for _, sig := range signs { @@ -80,7 +80,7 @@ func TestInvalidSignatureBatch(t *testing.T) { func TestValidSignatureBatch(t *testing.T) { signs := generateEd25519Signatures(t, 2) - signVerify := NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) + signVerify := crypto.NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) signVerify.Start() @@ -101,11 +101,11 @@ func TestAllCryptoTypeSignature(t *testing.T) { srSig, err := srKey.Private().Sign(srMsg) require.NoError(t, err) - srSignature := &Signature{ - PubKey: srKey.Public().Encode(), - Sign: srSig, - Msg: srMsg, - KeyTypeID: crypto.Sr25519Type, + srSignature := &crypto.SignatureInfo{ + PubKey: srKey.Public().Encode(), + Sign: srSig, + Msg: srMsg, + VerifyFunc: sr25519.VerifySignature, } blakeHash, err := common.Blake2bHash([]byte("secp256k1")) @@ -118,14 +118,14 @@ func TestAllCryptoTypeSignature(t *testing.T) { require.NoError(t, err) secpSigData = secpSigData[:len(secpSigData)-1] // remove recovery id - secpSignature := &Signature{ - PubKey: kp.Public().Encode(), - Sign: secpSigData, - Msg: blakeHash.ToBytes(), - KeyTypeID: crypto.Secp256k1Type, + secpSignature := &crypto.SignatureInfo{ + PubKey: kp.Public().Encode(), + Sign: secpSigData, + Msg: blakeHash.ToBytes(), + VerifyFunc: secp256k1.VerifySignature, } - signVerify := NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) + signVerify := crypto.NewSignatureVerifier(log.New(log.SetWriter(io.Discard))) signVerify.Start() diff --git a/lib/runtime/wasmer/imports.go b/lib/runtime/wasmer/imports.go index 119a6f9585..1d9244e3fc 100644 --- a/lib/runtime/wasmer/imports.go +++ b/lib/runtime/wasmer/imports.go @@ -384,11 +384,11 @@ func ext_crypto_ed25519_verify_version_1(context unsafe.Pointer, sig C.int32_t, } if sigVerifier.IsStarted() { - signature := runtime.Signature{ - PubKey: pubKey.Encode(), - Sign: signature, - Msg: message, - KeyTypeID: crypto.Ed25519Type, + signature := crypto.SignatureInfo{ + PubKey: pubKey.Encode(), + Sign: signature, + Msg: message, + VerifyFunc: ed25519.VerifySignature, } sigVerifier.Add(&signature) return 1 @@ -475,11 +475,11 @@ func ext_crypto_ecdsa_verify_version_2(context unsafe.Pointer, sig C.int32_t, ms } if sigVerifier.IsStarted() { - signature := runtime.Signature{ - PubKey: pub.Encode(), - Sign: signature, - Msg: hash[:], - KeyTypeID: crypto.Secp256k1Type, + signature := crypto.SignatureInfo{ + PubKey: pub.Encode(), + Sign: signature, + Msg: hash[:], + VerifyFunc: secp256k1.VerifySignature, } sigVerifier.Add(&signature) return C.int32_t(1) @@ -701,11 +701,11 @@ func ext_crypto_sr25519_verify_version_1(context unsafe.Pointer, sig C.int32_t, pub.Hex(), message, signature) if sigVerifier.IsStarted() { - signature := runtime.Signature{ - PubKey: pub.Encode(), - Sign: signature, - Msg: message, - KeyTypeID: crypto.Sr25519Type, + signature := crypto.SignatureInfo{ + PubKey: pub.Encode(), + Sign: signature, + Msg: message, + VerifyFunc: sr25519.VerifySignature, } sigVerifier.Add(&signature) return 1 @@ -743,11 +743,11 @@ func ext_crypto_sr25519_verify_version_2(context unsafe.Pointer, sig C.int32_t, pub.Hex(), message, signature) if sigVerifier.IsStarted() { - signature := runtime.Signature{ - PubKey: pub.Encode(), - Sign: signature, - Msg: message, - KeyTypeID: crypto.Sr25519Type, + signature := crypto.SignatureInfo{ + PubKey: pub.Encode(), + Sign: signature, + Msg: message, + VerifyFunc: sr25519.VerifySignature, } sigVerifier.Add(&signature) return 1 diff --git a/lib/runtime/wasmer/instance.go b/lib/runtime/wasmer/instance.go index 303fc93901..7c87ceb287 100644 --- a/lib/runtime/wasmer/instance.go +++ b/lib/runtime/wasmer/instance.go @@ -15,6 +15,8 @@ import ( "github.com/ChainSafe/gossamer/lib/runtime/offchain" "github.com/ChainSafe/gossamer/lib/trie" + "github.com/ChainSafe/gossamer/lib/crypto" + wasm "github.com/wasmerio/go-ext-wasm/wasmer" ) @@ -137,7 +139,7 @@ func NewInstance(code []byte, cfg *Config) (*Instance, error) { NodeStorage: cfg.NodeStorage, Network: cfg.Network, Transaction: cfg.Transaction, - SigVerifier: runtime.NewSignatureVerifier(logger), + SigVerifier: crypto.NewSignatureVerifier(logger), OffchainHTTPSet: offchain.NewHTTPSet(), } From 219ca79740958e0e8da5b642e44b3bd3867a8526 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Mon, 6 Dec 2021 14:48:55 -0500 Subject: [PATCH 32/43] remove testing NewNodeB --- dot/node.go | 195 ++--------------------------------------------- dot/node_test.go | 71 ----------------- 2 files changed, 8 insertions(+), 258 deletions(-) diff --git a/dot/node.go b/dot/node.go index 65bbdce621..48c9ff5fa1 100644 --- a/dot/node.go +++ b/dot/node.go @@ -181,8 +181,14 @@ func NewNodeC(cfg *Config) (*Node, error) { return newNodeC(cfg, nodeInterface{}) } -//func newNodeC(cfg *Config, checkInitalized func(string) bool) (*Node, error) { func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { + // set garbage collection percent to 10% + // can be overwritten by setting the GOGC env variable, which defaults to 100 + prev := debug.SetGCPercent(10) + if prev != 100 { + debug.SetGCPercent(prev) + } + if !nn.nodeInitialised(cfg.Global.BasePath) { err := nn.initNode(cfg) if err != nil { @@ -299,9 +305,7 @@ func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { serviceRegistryLogger := logger.New(log.AddContext("pkg", "services")) node := &Node{ - Name: cfg.Global.Name, - // todo (ed) deal with adding stopFunc - //StopFunc: stopFunc, + Name: cfg.Global.Name, Services: services.NewServiceRegistry(serviceRegistryLogger), started: make(chan struct{}), } @@ -436,189 +440,6 @@ func (nodeInterface) initialiseTelemetry(cfg *Config, stateSrvc *state.Service, } } -// NewNodeB to create new node (to be replaced) -func NewNodeB(cfg *Config, stopFunc func()) (*Node, error) { - nodeI := nodeInterface{} - if !NodeInitialized(cfg.Global.BasePath) { - // initialise node (initialise state database and load genesis data) - err := nodeI.initNode(cfg) - if err != nil { - logger.Errorf("failed to initialise node: %s", err) - return nil, err - } - } - - ks, err := nodeI.initKeystore(cfg) - if err != nil { - logger.Errorf("failed to initialise keystore: %s", err) - return nil, err - } - - logger.Patch(log.SetLevel(cfg.Global.LogLvl)) - - logger.Infof( - "🕸️ initialising node services with global configuration name %s, id %s and base path %s...", - cfg.Global.Name, cfg.Global.ID, cfg.Global.BasePath) - - var ( - nodeSrvcs []services.Service - networkSrvc *network.Service - ) - - stateSrvc, err := nodeI.createStateService(cfg) - if err != nil { - return nil, fmt.Errorf("failed to create state service: %s", err) - } - - // check if network service is enabled - if enabled := networkServiceEnabled(cfg); enabled { - // create network service and append network service to node services - networkSrvc, err = nodeI.createNetworkService(cfg, stateSrvc) - if err != nil { - return nil, fmt.Errorf("failed to create network service: %s", err) - } - nodeSrvcs = append(nodeSrvcs, networkSrvc) - } else { - // do not create or append network service if network service is not enabled - logger.Debugf("network service disabled, roles are %d", cfg.Core.Roles) - } - - // create runtime - ns, err := nodeI.createRuntimeStorage(stateSrvc) - if err != nil { - return nil, err - } - - err = nodeI.loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) - if err != nil { - return nil, err - } - - ver, err := nodeI.createBlockVerifier(stateSrvc) - if err != nil { - return nil, err - } - - dh, err := nodeI.createDigestHandler(stateSrvc) - if err != nil { - return nil, err - } - nodeSrvcs = append(nodeSrvcs, dh) - - coreSrvc, err := nodeI.createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) - if err != nil { - return nil, fmt.Errorf("failed to create core service: %s", err) - } - nodeSrvcs = append(nodeSrvcs, coreSrvc) - - fg, err := nodeI.createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, networkSrvc) - if err != nil { - return nil, err - } - nodeSrvcs = append(nodeSrvcs, fg) - - syncer, err := nodeI.newSyncService(cfg, stateSrvc, fg, ver, coreSrvc, networkSrvc) - if err != nil { - return nil, err - } - - if networkSrvc != nil { - networkSrvc.SetSyncer(syncer) - networkSrvc.SetTransactionHandler(coreSrvc) - } - nodeSrvcs = append(nodeSrvcs, syncer) - - bp, err := nodeI.createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) - if err != nil { - return nil, err - } - nodeSrvcs = append(nodeSrvcs, bp) - - sysSrvc, err := nodeI.createSystemService(&cfg.System, stateSrvc) - if err != nil { - return nil, fmt.Errorf("failed to create system service: %s", err) - } - nodeSrvcs = append(nodeSrvcs, sysSrvc) - - // check if rpc service is enabled - if enabled := cfg.RPC.isRPCEnabled() || cfg.RPC.isWSEnabled(); enabled { - var rpcSrvc *rpc.HTTPServer - rpcSrvc, err = nodeI.createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, fg) - if err != nil { - return nil, fmt.Errorf("failed to create rpc service: %s", err) - } - nodeSrvcs = append(nodeSrvcs, rpcSrvc) - } else { - logger.Debug("rpc service disabled by default") - } - - // close state service last - nodeSrvcs = append(nodeSrvcs, stateSrvc) - - serviceRegistryLogger := logger.New(log.AddContext("pkg", "services")) - node := &Node{ - Name: cfg.Global.Name, - //StopFunc: stopFunc, - Services: services.NewServiceRegistry(serviceRegistryLogger), - started: make(chan struct{}), - } - - for _, srvc := range nodeSrvcs { - node.Services.RegisterService(srvc) - } - - if cfg.Global.PublishMetrics { - c := metrics.NewCollector(context.Background()) - c.AddGauge(fg) - c.AddGauge(stateSrvc) - c.AddGauge(networkSrvc) - - go c.Start() - - address := fmt.Sprintf("%s:%d", cfg.RPC.Host, cfg.Global.MetricsPort) - logger.Info("Enabling stand-alone metrics HTTP endpoint at address " + address) - metrics.PublishMetrics(address) - } - - gd, err := stateSrvc.Base.LoadGenesisData() - if err != nil { - return nil, err - } - - telemetry.GetInstance().Initialise(!cfg.Global.NoTelemetry) - - var telemetryEndpoints []*genesis.TelemetryEndpoint - if len(cfg.Global.TelemetryURLs) == 0 { - telemetryEndpoints = append(telemetryEndpoints, gd.TelemetryEndpoints...) - - } else { - telemetryURLs := cfg.Global.TelemetryURLs - for i := range telemetryURLs { - telemetryEndpoints = append(telemetryEndpoints, &telemetryURLs[i]) - } - } - - telemetry.GetInstance().AddConnections(telemetryEndpoints) - genesisHash := stateSrvc.Block.GenesisHash() - peerID := "" - if networkSrvc != nil { - peerID = networkSrvc.NetworkState().PeerID - } - err = telemetry.GetInstance().SendMessage(telemetry.NewSystemConnectedTM( - cfg.Core.GrandpaAuthority, - sysSrvc.ChainName(), - &genesisHash, - sysSrvc.SystemName(), - cfg.Global.Name, - peerID, - strconv.FormatInt(time.Now().UnixNano(), 10), - sysSrvc.SystemVersion())) - if err != nil { - logger.Debugf("problem sending system.connected telemetry message: %s", err) - } - return node, nil -} - func (nodeInterface) initKeystore(cfg *Config) (*keystore.GlobalKeystore, error) { ks := keystore.NewGlobalKeystore() // load built-in test keys if specified by `cfg.Account.Key` diff --git a/dot/node_test.go b/dot/node_test.go index bf16bd4cad..7587cf6f6e 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -102,76 +102,6 @@ func TestLoadGlobalNodeName(t *testing.T) { } } -func TestNewNodeB(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - defer utils.RemoveTestDir(t) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - type args struct { - cfg *Config - stopFunc func() - } - tests := []struct { - name string - args args - want *Node - err error - }{ - { - name: "missing account key", - args: args{ - cfg: &Config{ - Global: GlobalConfig{BasePath: cfg.Global.BasePath}, - Init: InitConfig{Genesis: genFile.Name()}, - Core: CoreConfig{Roles: types.AuthorityRole}, - }, - }, - err: errors.New("no keys provided for authority node"), - }, - // TODO this is commented out because in holds a lock on badger db, causing next test to foil - //{ - // name: "missing wasm config", - // args: args{ - // cfg: &Config{ - // Global: GlobalConfig{BasePath: cfg.Global.BasePath}, - // Init: InitConfig{Genesis: genFile.Name()}, - // Account: AccountConfig{Key: "alice"}, - // }, - // }, - // err: errors.New("failed to get runtime instance"), - //}, - { - name: "minimal config", - args: args{ - cfg: &Config{ - Global: GlobalConfig{BasePath: cfg.Global.BasePath}, - Init: InitConfig{Genesis: genFile.Name()}, - Account: AccountConfig{Key: "alice"}, - Core: CoreConfig{WasmInterpreter: wasmer.Name}, - }, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := NewNodeB(tt.args.cfg, tt.args.stopFunc) - if tt.err != nil { - assert.EqualError(t, err, tt.err.Error()) - utils.RemoveTestDir(t) - } else { - assert.NoError(t, err) - } - - if tt.want != nil { - assert.Equal(t, tt.want.Name, got.Name) - } - }) - } -} - func TestNewNodeC(t *testing.T) { cfg := NewTestConfig(t) require.NotNil(t, cfg) @@ -182,7 +112,6 @@ func TestNewNodeC(t *testing.T) { type args struct { cfg *Config - //stopFunc func() } tests := []struct { name string From d97225837c31a517ebc0fa9dbd82c88b796a2730 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Mon, 6 Dec 2021 16:41:39 -0500 Subject: [PATCH 33/43] change init keystore --- dot/core/service.go | 10 +- dot/mock_node.go | 15 -- dot/node.go | 387 ++++++++++---------------------------------- dot/node_test.go | 103 ++---------- 4 files changed, 103 insertions(+), 412 deletions(-) diff --git a/dot/core/service.go b/dot/core/service.go index 91b97aff49..b1d7088ee7 100644 --- a/dot/core/service.go +++ b/dot/core/service.go @@ -7,6 +7,7 @@ import ( "context" "fmt" "math/big" + "reflect" "sync" "github.com/ChainSafe/gossamer/dot/network" @@ -89,7 +90,14 @@ func NewService(cfg *Config) (*Service, error) { return nil, ErrNilStorageState } - if cfg.Network == nil { + var isNilNetwork bool + switch cfg.Network.(type) { + case Network: + isNilNetwork = cfg.Network == (*network.Service)(nil) + default: + isNilNetwork = reflect.ValueOf(cfg.Network).IsNil() + } + if isNilNetwork { return nil, ErrNilNetwork } diff --git a/dot/mock_node.go b/dot/mock_node.go index 422645877a..76e56ba222 100644 --- a/dot/mock_node.go +++ b/dot/mock_node.go @@ -196,21 +196,6 @@ func (mr *MocknewNodeIfaceMockRecorder) createSystemService(cfg, stateSrvc inter return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "createSystemService", reflect.TypeOf((*MocknewNodeIface)(nil).createSystemService), cfg, stateSrvc) } -// initKeystore mocks base method. -func (m *MocknewNodeIface) initKeystore(config *Config) (*keystore.GlobalKeystore, error) { - m.ctrl.T.Helper() - ret := m.ctrl.Call(m, "initKeystore", config) - ret0, _ := ret[0].(*keystore.GlobalKeystore) - ret1, _ := ret[1].(error) - return ret0, ret1 -} - -// initKeystore indicates an expected call of initKeystore. -func (mr *MocknewNodeIfaceMockRecorder) initKeystore(config interface{}) *gomock.Call { - mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "initKeystore", reflect.TypeOf((*MocknewNodeIface)(nil).initKeystore), config) -} - // initNode mocks base method. func (m *MocknewNodeIface) initNode(config *Config) error { m.ctrl.T.Helper() diff --git a/dot/node.go b/dot/node.go index 48c9ff5fa1..11ef870a86 100644 --- a/dot/node.go +++ b/dot/node.go @@ -48,6 +48,84 @@ type Node struct { started chan struct{} } +//go:generate mockgen -source=node.go -destination=mock_node.go -package=dot + +type newNodeIface interface { + nodeInitialised(string) bool + initNode(config *Config) error + createStateService(config *Config) (*state.Service, error) + createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Service, error) + createRuntimeStorage(st *state.Service) (*runtime.NodeStorage, error) + loadRuntime(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, ks *keystore.GlobalKeystore, + net *network.Service) error + createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) + createDigestHandler(st *state.Service) (*digest.Handler, error) + createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Service, net *network.Service, + dh *digest.Handler) (*core.Service, error) + createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, + net *network.Service) (*grandpa.Service, error) + newSyncService(cfg *Config, st *state.Service, fg gsync.FinalityGadget, verifier *babe.VerificationManager, + cs *core.Service, net *network.Service) (*gsync.Service, error) + createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, cs *core.Service) (*babe.Service, error) + createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*system.Service, error) + createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, coreSrvc *core.Service, + networkSrvc *network.Service, bp modules.BlockProducerAPI, sysSrvc *system.Service, + finSrvc *grandpa.Service) (*rpc.HTTPServer, error) + initialiseTelemetry(cfg *Config, stateSrvc *state.Service, networkSrvc *network.Service, sysSrvc *system.Service) +} + +type nodeInterface struct{} + +// NodeInitialized returns true if, within the configured data directory for the +// node, the state database has been created and the genesis data has been loaded +func NodeInitialized(basepath string) bool { + nodeI := nodeInterface{} + return nodeI.nodeInitialised(basepath) +} + +func (nodeInterface) nodeInitialised(basepath string) bool { + // check if key registry exists + registry := path.Join(basepath, utils.DefaultDatabaseDir, "KEYREGISTRY") + + _, err := os.Stat(registry) + if os.IsNotExist(err) { + logger.Debug("node has not been initialised from base path " + basepath + + ": failed to locate KEYREGISTRY file in data directory") + + return false + } + + // initialise database using data directory + db, err := utils.SetupDatabase(basepath, false) + if err != nil { + logger.Debugf("failed to create database from base path %s: %s", basepath, err) + return false + } + + defer func() { + // close database + err = db.Close() + if err != nil { + logger.Errorf("failed to close database: %s", err) + } + }() + + // load genesis data from initialised node database + _, err = state.NewBaseState(db).LoadGenesisData() + if err != nil { + logger.Errorf("node has not been initialised from base path %s: %s", basepath, err) + return false + } + + return true +} + +// InitNode init Node +func InitNode(cfg *Config) error { + nodeI := nodeInterface{} + return nodeI.initNode(cfg) +} + // InitNode initialises a new dot node from the provided dot node configuration // and JSON formatted genesis file. func (nodeInterface) initNode(cfg *Config) error { @@ -112,46 +190,6 @@ func (nodeInterface) initNode(cfg *Config) error { return nil } -// NodeInitialized returns true if, within the configured data directory for the -// node, the state database has been created and the genesis data has been loaded -// todo (ed) remove and use nodeInterface impl instead -func NodeInitialized(basepath string) bool { - // check if key registry exists - registry := path.Join(basepath, utils.DefaultDatabaseDir, "KEYREGISTRY") - - _, err := os.Stat(registry) - if os.IsNotExist(err) { - logger.Debug("node has not been initialised from base path " + basepath + - ": failed to locate KEYREGISTRY file in data directory") - - return false - } - - // initialise database using data directory - db, err := utils.SetupDatabase(basepath, false) - if err != nil { - logger.Debugf("failed to create database from base path %s: %s", basepath, err) - return false - } - - defer func() { - // close database - err = db.Close() - if err != nil { - logger.Errorf("failed to close database: %s", err) - } - }() - - // load genesis data from initialised node database - _, err = state.NewBaseState(db).LoadGenesisData() - if err != nil { - logger.Errorf("node has not been initialised from base path %s: %s", basepath, err) - return false - } - - return true -} - // LoadGlobalNodeName returns the stored global node name from database func LoadGlobalNodeName(basepath string) (nodename string, err error) { // initialise database using data directory @@ -176,12 +214,12 @@ func LoadGlobalNodeName(basepath string) (nodename string, err error) { return } -// NewNodeC to create node -func NewNodeC(cfg *Config) (*Node, error) { - return newNodeC(cfg, nodeInterface{}) +// NewNode to create node +func NewNode(cfg *Config, ks *keystore.GlobalKeystore) (*Node, error) { + return newNode(cfg, ks, nodeInterface{}) } -func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { +func newNode(cfg *Config, ks *keystore.GlobalKeystore, nn newNodeIface) (*Node, error) { // set garbage collection percent to 10% // can be overwritten by setting the GOGC env variable, which defaults to 100 prev := debug.SetGCPercent(10) @@ -196,12 +234,6 @@ func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { } } - ks, err := nn.initKeystore(cfg) - if err != nil { - logger.Errorf("failed to initialise keystore: %s", err) - return nil, err - } - logger.Patch(log.SetLevel(cfg.Global.LogLvl)) logger.Infof( @@ -332,74 +364,6 @@ func newNodeC(cfg *Config, nn newNodeIface) (*Node, error) { return node, nil } -//go:generate mockgen -source=node.go -destination=mock_node.go -package=dot - -type newNodeIface interface { - nodeInitialised(string) bool - initNode(config *Config) error - initKeystore(config *Config) (*keystore.GlobalKeystore, error) - createStateService(config *Config) (*state.Service, error) - createNetworkService(cfg *Config, stateSrvc *state.Service) (*network.Service, error) - createRuntimeStorage(st *state.Service) (*runtime.NodeStorage, error) - loadRuntime(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, ks *keystore.GlobalKeystore, - net *network.Service) error - createBlockVerifier(st *state.Service) (*babe.VerificationManager, error) - createDigestHandler(st *state.Service) (*digest.Handler, error) - createCoreService(cfg *Config, ks *keystore.GlobalKeystore, st *state.Service, net *network.Service, - dh *digest.Handler) (*core.Service, error) - createGRANDPAService(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, - net *network.Service) (*grandpa.Service, error) - newSyncService(cfg *Config, st *state.Service, fg gsync.FinalityGadget, verifier *babe.VerificationManager, - cs *core.Service, net *network.Service) (*gsync.Service, error) - createBABEService(cfg *Config, st *state.Service, ks keystore.Keystore, cs *core.Service) (*babe.Service, error) - createSystemService(cfg *types.SystemInfo, stateSrvc *state.Service) (*system.Service, error) - createRPCService(cfg *Config, ns *runtime.NodeStorage, stateSrvc *state.Service, coreSrvc *core.Service, - networkSrvc *network.Service, bp modules.BlockProducerAPI, sysSrvc *system.Service, - finSrvc *grandpa.Service) (*rpc.HTTPServer, error) - initialiseTelemetry(cfg *Config, stateSrvc *state.Service, networkSrvc *network.Service, sysSrvc *system.Service) -} - -type nodeInterface struct{} - -// NodeInitialised returns true if, within the configured data directory for the -// node, the state database has been created and the genesis data has been loaded -func (nodeInterface) nodeInitialised(basepath string) bool { - // check if key registry exists - registry := path.Join(basepath, utils.DefaultDatabaseDir, "KEYREGISTRY") - - _, err := os.Stat(registry) - if os.IsNotExist(err) { - logger.Debug("node has not been initialised from base path " + basepath + - ": failed to locate KEYREGISTRY file in data directory") - - return false - } - - // initialise database using data directory - db, err := utils.SetupDatabase(basepath, false) - if err != nil { - logger.Debugf("failed to create database from base path %s: %s", basepath, err) - return false - } - - defer func() { - // close database - err = db.Close() - if err != nil { - logger.Errorf("failed to close database: %s", err) - } - }() - - // load genesis data from initialised node database - _, err = state.NewBaseState(db).LoadGenesisData() - if err != nil { - logger.Errorf("node has not been initialised from base path %s: %s", basepath, err) - return false - } - - return true -} - func (nodeInterface) initialiseTelemetry(cfg *Config, stateSrvc *state.Service, networkSrvc *network.Service, sysSrvc *system.Service) { gd, err := stateSrvc.Base.LoadGenesisData() @@ -440,7 +404,8 @@ func (nodeInterface) initialiseTelemetry(cfg *Config, stateSrvc *state.Service, } } -func (nodeInterface) initKeystore(cfg *Config) (*keystore.GlobalKeystore, error) { +//InitKeystore to initialize node keystore +func InitKeystore(cfg *Config) (*keystore.GlobalKeystore, error) { ks := keystore.NewGlobalKeystore() // load built-in test keys if specified by `cfg.Account.Key` err := keystore.LoadKeystore(cfg.Account.Key, ks.Acco) @@ -469,190 +434,6 @@ func (nodeInterface) initKeystore(cfg *Config) (*keystore.GlobalKeystore, error) return ks, nil } -// InitNode init Node -func InitNode(cfg *Config) error { - nodeI := nodeInterface{} - return nodeI.initNode(cfg) -} - -// NewNode creates a new dot node from a dot node configuration -func NewNode(cfg *Config, ks *keystore.GlobalKeystore) (*Node, error) { - // set garbage collection percent to 10% - // can be overwritten by setting the GOGC env variable, which defaults to 100 - prev := debug.SetGCPercent(10) - if prev != 100 { - debug.SetGCPercent(prev) - } - - logger.Patch(log.SetLevel(cfg.Global.LogLvl)) - - // if authority node, should have at least 1 key in keystore - if cfg.Core.Roles == types.AuthorityRole && (ks.Babe.Size() == 0 || ks.Gran.Size() == 0) { - return nil, ErrNoKeysProvided - } - - logger.Infof( - "🕸️ initialising node services with global configuration name %s, id %s and base path %s...", - cfg.Global.Name, cfg.Global.ID, cfg.Global.BasePath) - - var ( - nodeSrvcs []services.Service - networkSrvc *network.Service - ) - - if cfg.Pprof.Enabled { - nodeSrvcs = append(nodeSrvcs, createPprofService(cfg.Pprof.Settings)) - } - nodeI := nodeInterface{} - stateSrvc, err := nodeI.createStateService(cfg) - if err != nil { - return nil, fmt.Errorf("failed to create state service: %s", err) - } - - // check if network service is enabled - if enabled := networkServiceEnabled(cfg); enabled { - // create network service and append network service to node services - networkSrvc, err = nodeI.createNetworkService(cfg, stateSrvc) - if err != nil { - return nil, fmt.Errorf("failed to create network service: %s", err) - } - nodeSrvcs = append(nodeSrvcs, networkSrvc) - } else { - // do not create or append network service if network service is not enabled - logger.Debugf("network service disabled, roles are %d", cfg.Core.Roles) - } - - // create runtime - ns, err := nodeI.createRuntimeStorage(stateSrvc) - if err != nil { - return nil, err - } - - err = nodeI.loadRuntime(cfg, ns, stateSrvc, ks, networkSrvc) - if err != nil { - return nil, err - } - - ver, err := nodeI.createBlockVerifier(stateSrvc) - if err != nil { - return nil, err - } - - dh, err := nodeI.createDigestHandler(stateSrvc) - if err != nil { - return nil, err - } - nodeSrvcs = append(nodeSrvcs, dh) - - coreSrvc, err := nodeI.createCoreService(cfg, ks, stateSrvc, networkSrvc, dh) - if err != nil { - return nil, fmt.Errorf("failed to create core service: %s", err) - } - nodeSrvcs = append(nodeSrvcs, coreSrvc) - - fg, err := nodeI.createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, networkSrvc) - if err != nil { - return nil, err - } - nodeSrvcs = append(nodeSrvcs, fg) - - syncer, err := nodeI.newSyncService(cfg, stateSrvc, fg, ver, coreSrvc, networkSrvc) - if err != nil { - return nil, err - } - - if networkSrvc != nil { - networkSrvc.SetSyncer(syncer) - networkSrvc.SetTransactionHandler(coreSrvc) - } - nodeSrvcs = append(nodeSrvcs, syncer) - - bp, err := nodeI.createBABEService(cfg, stateSrvc, ks.Babe, coreSrvc) - if err != nil { - return nil, err - } - nodeSrvcs = append(nodeSrvcs, bp) - - sysSrvc, err := nodeI.createSystemService(&cfg.System, stateSrvc) - if err != nil { - return nil, fmt.Errorf("failed to create system service: %s", err) - } - nodeSrvcs = append(nodeSrvcs, sysSrvc) - - // check if rpc service is enabled - if enabled := cfg.RPC.isRPCEnabled() || cfg.RPC.isWSEnabled(); enabled { - var rpcSrvc *rpc.HTTPServer - rpcSrvc, err = nodeI.createRPCService(cfg, ns, stateSrvc, coreSrvc, networkSrvc, bp, sysSrvc, fg) - if err != nil { - return nil, fmt.Errorf("failed to create rpc service: %s", err) - } - nodeSrvcs = append(nodeSrvcs, rpcSrvc) - } else { - logger.Debug("rpc service disabled by default") - } - - // close state service last - nodeSrvcs = append(nodeSrvcs, stateSrvc) - - serviceRegistryLogger := logger.New(log.AddContext("pkg", "services")) - node := &Node{ - Name: cfg.Global.Name, - Services: services.NewServiceRegistry(serviceRegistryLogger), - started: make(chan struct{}), - } - - for _, srvc := range nodeSrvcs { - node.Services.RegisterService(srvc) - } - - if cfg.Global.PublishMetrics { - c := metrics.NewCollector(context.Background()) - c.AddGauge(fg) - c.AddGauge(stateSrvc) - c.AddGauge(networkSrvc) - - go c.Start() - - address := fmt.Sprintf("%s:%d", cfg.RPC.Host, cfg.Global.MetricsPort) - logger.Info("Enabling stand-alone metrics HTTP endpoint at address " + address) - metrics.PublishMetrics(address) - } - - gd, err := stateSrvc.Base.LoadGenesisData() - if err != nil { - return nil, err - } - - telemetry.GetInstance().Initialise(!cfg.Global.NoTelemetry) - - var telemetryEndpoints []*genesis.TelemetryEndpoint - if len(cfg.Global.TelemetryURLs) == 0 { - telemetryEndpoints = append(telemetryEndpoints, gd.TelemetryEndpoints...) - - } else { - telemetryURLs := cfg.Global.TelemetryURLs - for i := range telemetryURLs { - telemetryEndpoints = append(telemetryEndpoints, &telemetryURLs[i]) - } - } - - telemetry.GetInstance().AddConnections(telemetryEndpoints) - genesisHash := stateSrvc.Block.GenesisHash() - err = telemetry.GetInstance().SendMessage(telemetry.NewSystemConnectedTM( - cfg.Core.GrandpaAuthority, - sysSrvc.ChainName(), - &genesisHash, - sysSrvc.SystemName(), - cfg.Global.Name, - networkSrvc.NetworkState().PeerID, - strconv.FormatInt(time.Now().UnixNano(), 10), - sysSrvc.SystemVersion())) - if err != nil { - logger.Debugf("problem sending system.connected telemetry message: %s", err) - } - return node, nil -} - // stores the global node name to reuse func storeGlobalNodeName(name, basepath string) (err error) { db, err := utils.SetupDatabase(basepath, false) diff --git a/dot/node_test.go b/dot/node_test.go index 7587cf6f6e..1fda77793e 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -10,7 +10,6 @@ import ( "github.com/ChainSafe/gossamer/dot/state" "github.com/ChainSafe/gossamer/dot/types" "github.com/ChainSafe/gossamer/lib/common" - "github.com/ChainSafe/gossamer/lib/keystore" "github.com/ChainSafe/gossamer/lib/runtime/wasmer" "github.com/ChainSafe/gossamer/lib/utils" "github.com/golang/mock/gomock" @@ -119,17 +118,6 @@ func TestNewNodeC(t *testing.T) { want *Node err error }{ - { - name: "missing account key", - args: args{ - cfg: &Config{ - Global: GlobalConfig{BasePath: cfg.Global.BasePath}, - Init: InitConfig{Genesis: genFile.Name()}, - Core: CoreConfig{Roles: types.AuthorityRole}, - }, - }, - err: errors.New("no keys provided for authority node"), - }, { name: "minimal config", args: args{ @@ -137,14 +125,19 @@ func TestNewNodeC(t *testing.T) { Global: GlobalConfig{BasePath: cfg.Global.BasePath}, Init: InitConfig{Genesis: genFile.Name()}, Account: AccountConfig{Key: "alice"}, - Core: CoreConfig{WasmInterpreter: wasmer.Name}, + Core: CoreConfig{ + Roles: types.FullNodeRole, + WasmInterpreter: wasmer.Name, + }, }, }, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := NewNodeC(tt.args.cfg) + ks, err := InitKeystore(tt.args.cfg) + assert.NoError(t, err) + got, err := NewNode(tt.args.cfg, ks) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) utils.RemoveTestDir(t) @@ -164,12 +157,6 @@ func TestNewNodeMock(t *testing.T) { m := NewMocknewNodeIface(ctrl) m.EXPECT().nodeInitialised(gomock.Any()).Return(true).AnyTimes() - m.EXPECT().initKeystore(gomock.Any()).DoAndReturn(func(config *Config) (*keystore.GlobalKeystore, error) { - if len(config.Account.Key) == 0 { - return nil, errors.New("no keys provided for authority node") - } - return &keystore.GlobalKeystore{}, nil - }).AnyTimes() m.EXPECT().createStateService(gomock.Any()).Return(&state.Service{}, nil).AnyTimes() m.EXPECT().createRuntimeStorage(gomock.Any()).AnyTimes() m.EXPECT().loadRuntime(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() @@ -193,7 +180,6 @@ func TestNewNodeMock(t *testing.T) { type args struct { cfg *Config - //stopFunc func() } tests := []struct { name string @@ -201,17 +187,6 @@ func TestNewNodeMock(t *testing.T) { want *Node err error }{ - { - name: "missing account key", - args: args{ - cfg: &Config{ - Global: GlobalConfig{BasePath: cfg.Global.BasePath}, - Init: InitConfig{Genesis: genFile.Name()}, - Core: CoreConfig{Roles: types.AuthorityRole}, - }, - }, - err: errors.New("no keys provided for authority node"), - }, { name: "minimal config", args: args{ @@ -226,7 +201,9 @@ func TestNewNodeMock(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := newNodeC(tt.args.cfg, m) + ks, err := InitKeystore(tt.args.cfg) + assert.NoError(t, err) + got, err := newNode(tt.args.cfg, ks, m) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) utils.RemoveTestDir(t) @@ -241,66 +218,6 @@ func TestNewNodeMock(t *testing.T) { } } -func TestNewNode(t *testing.T) { - cfg := NewTestConfig(t) - require.NotNil(t, cfg) - - genFile := NewTestGenesisRawFile(t, cfg) - require.NotNil(t, genFile) - - defer utils.RemoveTestDir(t) - - cfg.Init.Genesis = genFile.Name() - cfg.Core.GrandpaAuthority = false - cfg.Core.BABELead = true - - ni := nodeInterface{} - err := ni.initNode(cfg) - require.NoError(t, err) - - ks := keystore.NewGlobalKeystore() - err = keystore.LoadKeystore("alice", ks.Gran) - require.NoError(t, err) - err = keystore.LoadKeystore("alice", ks.Babe) - require.NoError(t, err) - - cfg.Core.Roles = types.FullNodeRole - - type args struct { - cfg *Config - ks *keystore.GlobalKeystore - } - tests := []struct { - name string - args args - want *Node - err error - }{ - { - name: "working example", - args: args{ - cfg: cfg, - ks: ks, - }, - want: &Node{Name: "Gossamer"}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := NewNode(tt.args.cfg, tt.args.ks) - if tt.err != nil { - assert.EqualError(t, err, tt.err.Error()) - } else { - assert.NoError(t, err) - } - - if tt.want != nil { - assert.Equal(t, tt.want.Name, got.Name) - } - }) - } -} - func TestNodeInitialized(t *testing.T) { cfg := NewTestConfig(t) require.NotNil(t, cfg) From cdbe54c1a2d6280455ecee49ce1af8f684a2dbf1 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Mon, 6 Dec 2021 16:53:43 -0500 Subject: [PATCH 34/43] remove newNodeC --- dot/{mock_node.go => mock_node_test.go} | 0 dot/node.go | 2 +- dot/node_test.go | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename dot/{mock_node.go => mock_node_test.go} (100%) diff --git a/dot/mock_node.go b/dot/mock_node_test.go similarity index 100% rename from dot/mock_node.go rename to dot/mock_node_test.go diff --git a/dot/node.go b/dot/node.go index 11ef870a86..3dbbe6c0d3 100644 --- a/dot/node.go +++ b/dot/node.go @@ -48,7 +48,7 @@ type Node struct { started chan struct{} } -//go:generate mockgen -source=node.go -destination=mock_node.go -package=dot +//go:generate mockgen -source=node.go -destination=mock_node_test.go -package=$GOPACKAGE type newNodeIface interface { nodeInitialised(string) bool diff --git a/dot/node_test.go b/dot/node_test.go index 1fda77793e..f79766bc27 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -212,7 +212,7 @@ func TestNewNodeMock(t *testing.T) { } if tt.want != nil { - assert.Equal(t, tt.want.Name, got.Name) + assert.Equal(t, tt.want, got) } }) } From 1d05a8d4303fcd588326edb3db92f1ebbf50b063 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 7 Dec 2021 17:42:29 -0500 Subject: [PATCH 35/43] remove gomocks.Any from tests --- dot/node_test.go | 53 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/dot/node_test.go b/dot/node_test.go index f79766bc27..8b8bac8876 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -7,9 +7,17 @@ import ( "errors" "testing" + "github.com/ChainSafe/gossamer/dot/core" + "github.com/ChainSafe/gossamer/dot/digest" + "github.com/ChainSafe/gossamer/dot/network" "github.com/ChainSafe/gossamer/dot/state" + gsync "github.com/ChainSafe/gossamer/dot/sync" + "github.com/ChainSafe/gossamer/dot/system" "github.com/ChainSafe/gossamer/dot/types" + "github.com/ChainSafe/gossamer/lib/babe" "github.com/ChainSafe/gossamer/lib/common" + "github.com/ChainSafe/gossamer/lib/grandpa" + "github.com/ChainSafe/gossamer/lib/runtime" "github.com/ChainSafe/gossamer/lib/runtime/wasmer" "github.com/ChainSafe/gossamer/lib/utils" "github.com/golang/mock/gomock" @@ -154,22 +162,7 @@ func TestNewNodeC(t *testing.T) { func TestNewNodeMock(t *testing.T) { ctrl := gomock.NewController(t) - - m := NewMocknewNodeIface(ctrl) - m.EXPECT().nodeInitialised(gomock.Any()).Return(true).AnyTimes() - m.EXPECT().createStateService(gomock.Any()).Return(&state.Service{}, nil).AnyTimes() - m.EXPECT().createRuntimeStorage(gomock.Any()).AnyTimes() - m.EXPECT().loadRuntime(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - m.EXPECT().createBlockVerifier(gomock.Any()).AnyTimes() - m.EXPECT().createDigestHandler(gomock.Any()).AnyTimes() - m.EXPECT().createCoreService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - m.EXPECT().createGRANDPAService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - m.EXPECT().newSyncService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), - gomock.Any()).AnyTimes() - m.EXPECT().createBABEService(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - m.EXPECT().createSystemService(gomock.Any(), gomock.Any()).AnyTimes() - m.EXPECT().initialiseTelemetry(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() - m.EXPECT().createNetworkService(gomock.Any(), gomock.Any()).AnyTimes() + defer ctrl.Finish() cfg := NewTestConfig(t) require.NotNil(t, cfg) @@ -194,7 +187,10 @@ func TestNewNodeMock(t *testing.T) { Global: GlobalConfig{BasePath: cfg.Global.BasePath}, Init: InitConfig{Genesis: genFile.Name()}, Account: AccountConfig{Key: "alice"}, - Core: CoreConfig{WasmInterpreter: wasmer.Name}, + Core: CoreConfig{ + Roles: types.FullNodeRole, + WasmInterpreter: wasmer.Name, + }, }, }, }, @@ -203,6 +199,29 @@ func TestNewNodeMock(t *testing.T) { t.Run(tt.name, func(t *testing.T) { ks, err := InitKeystore(tt.args.cfg) assert.NoError(t, err) + m := NewMocknewNodeIface(ctrl) + m.EXPECT().nodeInitialised(tt.args.cfg.Global.BasePath).Return(true) + m.EXPECT().createStateService(tt.args.cfg).Return(&state.Service{}, nil) + m.EXPECT().createRuntimeStorage(&state.Service{}).Return(&runtime.NodeStorage{}, nil) + m.EXPECT().loadRuntime(tt.args.cfg, &runtime.NodeStorage{}, &state.Service{}, ks, &network.Service{}).Return(nil) + m.EXPECT().createBlockVerifier(&state.Service{}).Return(&babe.VerificationManager{}, nil) + m.EXPECT().createDigestHandler(&state.Service{}).Return(&digest.Handler{}, nil) + m.EXPECT().createCoreService(tt.args.cfg, ks, &state.Service{}, &network.Service{}, + &digest.Handler{}).Return(&core.Service{}, nil) + m.EXPECT().createGRANDPAService(tt.args.cfg, &state.Service{}, &digest.Handler{}, ks.Gran, + &network.Service{}).Return(&grandpa.Service{}, nil) + m.EXPECT().newSyncService(tt.args.cfg, &state.Service{}, &grandpa.Service{}, &babe.VerificationManager{}, + &core.Service{}, &network.Service{}).Return(&gsync.Service{}, nil) + m.EXPECT().createBABEService(tt.args.cfg, &state.Service{}, ks.Babe, + &core.Service{}).Return(&babe.Service{}, nil) + m.EXPECT().createSystemService(&tt.args.cfg.System, &state.Service{}).Return(&system.Service{}, nil) + netA := &network.Service{} + netA.SetTransactionHandler(&core.Service{}) + netA.SetSyncer(&gsync.Service{}) + m.EXPECT().initialiseTelemetry(tt.args.cfg, &state.Service{}, netA, + &system.Service{}) + m.EXPECT().createNetworkService(tt.args.cfg, &state.Service{}).Return(&network.Service{}, nil) + got, err := newNode(tt.args.cfg, ks, m) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) From eeb1115b40e041b7c986c47b0ea917d64451983f Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 7 Dec 2021 17:47:40 -0500 Subject: [PATCH 36/43] remove naked return --- dot/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/node.go b/dot/node.go index 3dbbe6c0d3..9d05e3226d 100644 --- a/dot/node.go +++ b/dot/node.go @@ -211,7 +211,7 @@ func LoadGlobalNodeName(basepath string) (nodename string, err error) { if err != nil { logger.Warnf("failed to load global node name from base path %s: %s", basepath, err) } - return + return nodename, err } // NewNode to create node From c84ca41b39d9a83052cf653b16d0af4d7a33344d Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Tue, 7 Dec 2021 17:53:32 -0500 Subject: [PATCH 37/43] rename e to closeErr --- dot/node.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dot/node.go b/dot/node.go index 9d05e3226d..8cf19cb03a 100644 --- a/dot/node.go +++ b/dot/node.go @@ -199,9 +199,9 @@ func LoadGlobalNodeName(basepath string) (nodename string, err error) { } defer func() { - e := db.Close() - if e != nil { - logger.Errorf("failed to close database: %s", e) + closeErr := db.Close() + if closeErr != nil { + logger.Errorf("failed to close database: %s", closeErr) return } }() From 2830f7bef2b0ff6acddf70cd388bd50b52580e5a Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Wed, 8 Dec 2021 12:58:14 -0500 Subject: [PATCH 38/43] WIP save --- dot/services_test.go | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/dot/services_test.go b/dot/services_test.go index 6c471b75c2..0e3c5cb3a8 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -5,6 +5,7 @@ package dot import ( "errors" + "github.com/golang/mock/gomock" "io/ioutil" "path/filepath" "testing" @@ -292,6 +293,9 @@ func Test_createDigestHandler(t *testing.T) { } func Test_createGRANDPAService(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + cfg := NewTestConfig(t) genFile := NewTestGenesisRawFile(t, cfg) @@ -301,26 +305,27 @@ func Test_createGRANDPAService(t *testing.T) { cfg.Core.Roles = types.AuthorityRole cfg.Init.Genesis = genFile.Name() - ni := nodeInterface{} - err := ni.initNode(cfg) - require.NoError(t, err) + //ni := nodeInterface{} + //err := ni.initNode(cfg) + //require.NoError(t, err) - stateSrvc, err := ni.createStateService(cfg) - require.NoError(t, err) + //stateSrvc, err := ni.createStateService(cfg) + //require.NoError(t, err) ks := keystore.NewGlobalKeystore() kr, err := keystore.NewEd25519Keyring() require.NoError(t, err) ks.Gran.Insert(kr.Alice()) - ns, err := ni.createRuntimeStorage(stateSrvc) - require.NoError(t, err) - err = ni.loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) - require.NoError(t, err) + //ns, err := ni.createRuntimeStorage(stateSrvc) + //require.NoError(t, err) - dh, err := ni.createDigestHandler(stateSrvc) - require.NoError(t, err) + //err = ni.loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) + //require.NoError(t, err) + + //dh, err := ni.createDigestHandler(stateSrvc) + //require.NoError(t, err) type args struct { cfg *Config @@ -339,8 +344,8 @@ func Test_createGRANDPAService(t *testing.T) { name: "invalid key type test", args: args{ cfg: cfg, - st: stateSrvc, - dh: dh, + //st: stateSrvc, + //dh: dh, ks: ks.Babe, }, err: errors.New("invalid keystore type"), @@ -349,8 +354,8 @@ func Test_createGRANDPAService(t *testing.T) { name: "working example", args: args{ cfg: cfg, - st: stateSrvc, - dh: dh, + //st: stateSrvc, + //dh: dh, ks: ks.Gran, }, want: &grandpa.Service{}, @@ -358,7 +363,10 @@ func Test_createGRANDPAService(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := ni.createGRANDPAService(tt.args.cfg, tt.args.st, tt.args.dh, tt.args.ks, tt.args.net) + mockNodeIface := NewMocknewNodeIface(ctrl) + mockNodeIface.EXPECT().createGRANDPAService(tt.args.cfg, nil, nil, tt.args.ks, + nil).Return(&grandpa.Service{}, nil) + got, err := mockNodeIface.createGRANDPAService(tt.args.cfg, tt.args.st, tt.args.dh, tt.args.ks, tt.args.net) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) } else { @@ -632,10 +640,6 @@ func Test_createStateService(t *testing.T) { ni := nodeInterface{} err := ni.initNode(cfg) - //networkSrvc, err := createNetworkService(cfg, stateSrvc) - //require.NoError(t, err) - // - //gs, err := createGRANDPAService(cfg, stateSrvc, dh, ks.Gran, networkSrvc) require.NoError(t, err) cfg2 := NewTestConfig(t) From 1ef3897e5a99087c6be58861de84bc901a3787e4 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Wed, 8 Dec 2021 15:52:20 -0500 Subject: [PATCH 39/43] fix Test_createGRANDPAService test to use mocks --- dot/services_test.go | 35 ++++++++++------------------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/dot/services_test.go b/dot/services_test.go index 0e3c5cb3a8..c89777dc3e 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -5,7 +5,6 @@ package dot import ( "errors" - "github.com/golang/mock/gomock" "io/ioutil" "path/filepath" "testing" @@ -19,14 +18,15 @@ import ( "github.com/ChainSafe/gossamer/dot/sync" "github.com/ChainSafe/gossamer/dot/system" "github.com/ChainSafe/gossamer/dot/types" - "github.com/ChainSafe/gossamer/lib/babe" - "github.com/ChainSafe/gossamer/internal/pprof" + "github.com/ChainSafe/gossamer/lib/babe" + "github.com/ChainSafe/gossamer/lib/crypto" "github.com/ChainSafe/gossamer/lib/grandpa" "github.com/ChainSafe/gossamer/lib/keystore" "github.com/ChainSafe/gossamer/lib/runtime" "github.com/ChainSafe/gossamer/lib/runtime/wasmer" "github.com/ChainSafe/gossamer/lib/utils" + "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -305,28 +305,11 @@ func Test_createGRANDPAService(t *testing.T) { cfg.Core.Roles = types.AuthorityRole cfg.Init.Genesis = genFile.Name() - //ni := nodeInterface{} - //err := ni.initNode(cfg) - //require.NoError(t, err) - - //stateSrvc, err := ni.createStateService(cfg) - //require.NoError(t, err) - ks := keystore.NewGlobalKeystore() kr, err := keystore.NewEd25519Keyring() require.NoError(t, err) ks.Gran.Insert(kr.Alice()) - - //ns, err := ni.createRuntimeStorage(stateSrvc) - //require.NoError(t, err) - - //err = ni.loadRuntime(cfg, ns, stateSrvc, ks, &network.Service{}) - //require.NoError(t, err) - - //dh, err := ni.createDigestHandler(stateSrvc) - //require.NoError(t, err) - type args struct { cfg *Config st *state.Service @@ -344,8 +327,6 @@ func Test_createGRANDPAService(t *testing.T) { name: "invalid key type test", args: args{ cfg: cfg, - //st: stateSrvc, - //dh: dh, ks: ks.Babe, }, err: errors.New("invalid keystore type"), @@ -354,8 +335,6 @@ func Test_createGRANDPAService(t *testing.T) { name: "working example", args: args{ cfg: cfg, - //st: stateSrvc, - //dh: dh, ks: ks.Gran, }, want: &grandpa.Service{}, @@ -365,7 +344,13 @@ func Test_createGRANDPAService(t *testing.T) { t.Run(tt.name, func(t *testing.T) { mockNodeIface := NewMocknewNodeIface(ctrl) mockNodeIface.EXPECT().createGRANDPAService(tt.args.cfg, nil, nil, tt.args.ks, - nil).Return(&grandpa.Service{}, nil) + nil).DoAndReturn(func(cfg *Config, st *state.Service, dh *digest.Handler, ks keystore.Keystore, + net *network.Service) (*grandpa.Service, error) { + if ks.Name() != "gran" || ks.Type() != crypto.Ed25519Type { + return nil, ErrInvalidKeystoreType + } + return &grandpa.Service{}, nil + }) got, err := mockNodeIface.createGRANDPAService(tt.args.cfg, tt.args.st, tt.args.dh, tt.args.ks, tt.args.net) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) From 29d8975eda058c2504ef6c93b988125b54cdf8cc Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Thu, 9 Dec 2021 10:50:18 -0500 Subject: [PATCH 40/43] fix failing tests --- dot/node_test.go | 5 ++++- dot/services_test.go | 6 +++++- dot/utils_test.go | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/dot/node_test.go b/dot/node_test.go index 8b8bac8876..e5ba149cf7 100644 --- a/dot/node_test.go +++ b/dot/node_test.go @@ -5,6 +5,7 @@ package dot import ( "errors" + "os" "testing" "github.com/ChainSafe/gossamer/dot/core" @@ -91,7 +92,7 @@ func TestLoadGlobalNodeName(t *testing.T) { }, { name: "wrong basepath test", - args: args{basepath: "test_data"}, + args: args{basepath: "wrong_path"}, err: errors.New("Key not found"), }, } @@ -100,6 +101,8 @@ func TestLoadGlobalNodeName(t *testing.T) { gotNodename, err := LoadGlobalNodeName(tt.args.basepath) if tt.err != nil { assert.EqualError(t, err, tt.err.Error()) + err := os.RemoveAll(tt.args.basepath) + require.NoError(t, err) } else { assert.NoError(t, err) } diff --git a/dot/services_test.go b/dot/services_test.go index c89777dc3e..7f225c8c36 100644 --- a/dot/services_test.go +++ b/dot/services_test.go @@ -190,6 +190,9 @@ func Test_createCoreService(t *testing.T) { stateSrvc, err := ni.createStateService(cfg) require.NoError(t, err) + networkSrvc, err := ni.createNetworkService(cfg, stateSrvc) + require.NoError(t, err) + ks := keystore.NewGlobalKeystore() require.NotNil(t, ks) ed25519Keyring, _ := keystore.NewEd25519Keyring() @@ -222,6 +225,7 @@ func Test_createCoreService(t *testing.T) { cfg: cfg, ks: ks, st: stateSrvc, + net: networkSrvc, }, want: &core.Service{}, }, @@ -534,7 +538,7 @@ func Test_createRuntime(t *testing.T) { st: stateSrvc, code: []byte(`fake code`), }, - err: errors.New("failed to create runtime executor: Failed to instantiate the module:\n compile error" + + err: errors.New("failed to create runtime executor: Failed to instantiate the module:\n compile error" + ": Validation error \"Bad magic number\""), }, { diff --git a/dot/utils_test.go b/dot/utils_test.go index 2564bd257d..0ce7bd8f24 100644 --- a/dot/utils_test.go +++ b/dot/utils_test.go @@ -152,7 +152,7 @@ func TestNewTestConfig(t *testing.T) { NoBootstrap: false, NoMDNS: false, MinPeers: 1, - MaxPeers: 0, + MaxPeers: 50, PersistentPeers: nil, DiscoveryInterval: 10000000000, }, @@ -239,7 +239,7 @@ func TestNewTestConfigWithFile(t *testing.T) { NoBootstrap: false, NoMDNS: false, MinPeers: 1, - MaxPeers: 0, + MaxPeers: 50, PersistentPeers: nil, DiscoveryInterval: 10000000000, }, From 2880f52520e15c29ab104cbf7d9d1974ae14334d Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Thu, 9 Dec 2021 16:09:26 -0500 Subject: [PATCH 41/43] add to comment --- dot/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/node.go b/dot/node.go index 8cf19cb03a..95dc27d01a 100644 --- a/dot/node.go +++ b/dot/node.go @@ -120,7 +120,7 @@ func (nodeInterface) nodeInitialised(basepath string) bool { return true } -// InitNode init Node +// InitNode initialise the node with given Config func InitNode(cfg *Config) error { nodeI := nodeInterface{} return nodeI.initNode(cfg) From 5665356638f061580c4c01b053deddbc74cede48 Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Thu, 9 Dec 2021 16:18:54 -0500 Subject: [PATCH 42/43] test commit --- dot/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/node.go b/dot/node.go index 95dc27d01a..5eb295dc20 100644 --- a/dot/node.go +++ b/dot/node.go @@ -120,7 +120,7 @@ func (nodeInterface) nodeInitialised(basepath string) bool { return true } -// InitNode initialise the node with given Config +// InitNode initialise the Node with given Config func InitNode(cfg *Config) error { nodeI := nodeInterface{} return nodeI.initNode(cfg) From f3936af43e93b57e9d11b2958b5e21706a7a0c8e Mon Sep 17 00:00:00 2001 From: Edward Mack Date: Thu, 9 Dec 2021 17:20:13 -0500 Subject: [PATCH 43/43] test commit --- dot/node.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/node.go b/dot/node.go index 5eb295dc20..95dc27d01a 100644 --- a/dot/node.go +++ b/dot/node.go @@ -120,7 +120,7 @@ func (nodeInterface) nodeInitialised(basepath string) bool { return true } -// InitNode initialise the Node with given Config +// InitNode initialise the node with given Config func InitNode(cfg *Config) error { nodeI := nodeInterface{} return nodeI.initNode(cfg)