From caa4c04c1464a448ceb385c7aa0a05128ba7e410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Mon, 12 Apr 2021 19:29:30 -0400 Subject: [PATCH 01/17] feat: Add properties and chainId on build-spec command closes #1257 --- cmd/gossamer/flags.go | 5 +++++ cmd/gossamer/main.go | 15 +++++++++++---- dot/build_spec.go | 3 +++ lib/genesis/helpers.go | 1 + 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/cmd/gossamer/flags.go b/cmd/gossamer/flags.go index 8708433a73..fcc620fe1b 100644 --- a/cmd/gossamer/flags.go +++ b/cmd/gossamer/flags.go @@ -141,6 +141,10 @@ var ( Name: "genesis-spec", Usage: "Path to human-readable genesis JSON file", } + OutputSpecFlag = cli.StringFlag{ + Name: "output", + Usage: "Path to output the recently created genesis JSON file", + } ) // Network service configuration flags @@ -321,6 +325,7 @@ var ( BuildSpecFlags = append([]cli.Flag{ RawFlag, GenesisSpecFlag, + OutputSpecFlag, }, GlobalFlags...) // ExportFlags are the flags that are valid for use with the export subcommand diff --git a/cmd/gossamer/main.go b/cmd/gossamer/main.go index a0ae8e7e3f..02ad4c9278 100644 --- a/cmd/gossamer/main.go +++ b/cmd/gossamer/main.go @@ -353,6 +353,7 @@ func buildSpecAction(ctx *cli.Context) error { } var bs *dot.BuildSpec + if genesis := ctx.String(GenesisSpecFlag.Name); genesis != "" { bspec, e := dot.BuildFromGenesis(genesis, 0) if e != nil { @@ -378,18 +379,24 @@ func buildSpecAction(ctx *cli.Context) error { if bs == nil { return fmt.Errorf("error building genesis") } - res := []byte{} //nolint + + var res []byte + if ctx.Bool(RawFlag.Name) { res, err = bs.ToJSONRaw() } else { res, err = bs.ToJSON() } + if err != nil { return err } - // TODO implement --output flag so that user can specify redirecting output a file. - // then this can be removed (See issue #1029) - fmt.Printf("%s", res) + + if outputPath := ctx.String(OutputSpecFlag.Name); outputPath != "" { + dot.WriteConfig(res, outputPath) + } else { + fmt.Printf("%s", res) + } return nil } diff --git a/dot/build_spec.go b/dot/build_spec.go index 6e2fb6e073..dfb6c7f52d 100644 --- a/dot/build_spec.go +++ b/dot/build_spec.go @@ -35,8 +35,10 @@ func (b *BuildSpec) ToJSON() ([]byte, error) { tmpGen := &genesis.Genesis{ Name: b.genesis.Name, ID: b.genesis.ID, + ChainType: b.genesis.ChainType, Bootnodes: b.genesis.Bootnodes, ProtocolID: b.genesis.ProtocolID, + Properties: b.genesis.Properties, Genesis: genesis.Fields{ Runtime: b.genesis.GenesisFields().Runtime, }, @@ -52,6 +54,7 @@ func (b *BuildSpec) ToJSONRaw() ([]byte, error) { ChainType: b.genesis.ChainType, Bootnodes: b.genesis.Bootnodes, ProtocolID: b.genesis.ProtocolID, + Properties: b.genesis.Properties, Genesis: genesis.Fields{ Raw: b.genesis.GenesisFields().Raw, }, diff --git a/lib/genesis/helpers.go b/lib/genesis/helpers.go index b9f0eb8af7..5415968119 100644 --- a/lib/genesis/helpers.go +++ b/lib/genesis/helpers.go @@ -147,6 +147,7 @@ func NewGenesisSpecFromJSON(file string) (*Genesis, error) { g := new(Genesis) err = json.Unmarshal(data, g) + if err != nil { return nil, err } From 9f2b4f721c353d958ed434e84608bd48d16b88ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Mon, 12 Apr 2021 23:47:08 -0400 Subject: [PATCH 02/17] chore: Add output file writting on build-spec closes #1029 --- cmd/gossamer/main.go | 4 +++- dot/build_spec.go | 21 +++++++++++++++++ dot/build_spec_test.go | 52 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) diff --git a/cmd/gossamer/main.go b/cmd/gossamer/main.go index 02ad4c9278..84dbe34650 100644 --- a/cmd/gossamer/main.go +++ b/cmd/gossamer/main.go @@ -393,7 +393,9 @@ func buildSpecAction(ctx *cli.Context) error { } if outputPath := ctx.String(OutputSpecFlag.Name); outputPath != "" { - dot.WriteConfig(res, outputPath) + if err = dot.WriteGenesisSpecFile(res, outputPath); err != nil { + return err + } } else { fmt.Printf("%s", res) } diff --git a/dot/build_spec.go b/dot/build_spec.go index dfb6c7f52d..5e107995c0 100644 --- a/dot/build_spec.go +++ b/dot/build_spec.go @@ -18,10 +18,13 @@ package dot import ( "encoding/json" + "fmt" + "path/filepath" "github.com/ChainSafe/gossamer/dot/state" "github.com/ChainSafe/gossamer/lib/common" "github.com/ChainSafe/gossamer/lib/genesis" + "github.com/ChainSafe/gossamer/lib/utils" log "github.com/ChainSafe/log15" ) @@ -74,6 +77,24 @@ func BuildFromGenesis(path string, authCount int) (*BuildSpec, error) { return bs, nil } +// WriteGenesisSpecFile writes the build-spec in the output filepath +func WriteGenesisSpecFile(data []byte, fp string) error { + var err error + var absfp string + + if absfp, err = filepath.Abs(filepath.Clean(fp)); err != nil { + return err + } + + // if file already exists then dont apply any written on it + if utils.PathExists(absfp) { + return fmt.Errorf("file %s already exists, rename to avoid overwritten", absfp) + } + + WriteConfig(data, fp) + return nil +} + // BuildFromDB builds a BuildSpec from the DB located at path func BuildFromDB(path string) (*BuildSpec, error) { tmpGen := &genesis.Genesis{ diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index 98dea7b16b..230bb1ceb5 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -17,6 +17,7 @@ package dot import ( "encoding/json" + "io" "os" "testing" @@ -29,6 +30,17 @@ func TestBuildFromGenesis(t *testing.T) { defer os.Remove(file) require.NoError(t, err) bs, err := BuildFromGenesis(file, 0) + + expectedChainType := "TESTCHAINTYPE" + expectedProperties := map[string]interface{}{ + "ss58Format": 00, + "tokenDecimals": 00, + "tokenSymbol": "TEST", + } + + bs.genesis.ChainType = expectedChainType + bs.genesis.Properties = expectedProperties + require.NoError(t, err) // confirm human-readable fields @@ -39,6 +51,8 @@ func TestBuildFromGenesis(t *testing.T) { 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() @@ -48,6 +62,44 @@ func TestBuildFromGenesis(t *testing.T) { 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 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 := BuildFromDB(cfg.Global.BasePath) + require.NoError(t, err) + + data, err := bs.ToJSONRaw() + require.NoError(t, err) + + tmpFile := "/tmp/unique-raw-genesis.json" + err = WriteGenesisSpecFile(data, tmpFile) + require.NoError(t, err) + require.FileExists(t, tmpFile) + + defer os.Remove(tmpFile) + + file, err := os.Open(tmpFile) + 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) + + require.Equal(t, expected, gen) } func TestBuildFromDB(t *testing.T) { From 1d2261e7fea9330e956e0fe110a19e5da3e1d471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 00:02:36 -0400 Subject: [PATCH 03/17] chore: Add one more test case --- dot/build_spec_test.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index 230bb1ceb5..3bb7fbbcff 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -17,7 +17,9 @@ package dot import ( "encoding/json" + "fmt" "io" + "io/ioutil" "os" "testing" @@ -66,6 +68,18 @@ func TestBuildFromGenesis(t *testing.T) { require.Equal(t, expectedProperties, jGenRaw.Properties) } +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" @@ -90,6 +104,7 @@ func TestWriteGenesisSpecFile(t *testing.T) { defer os.Remove(tmpFile) file, err := os.Open(tmpFile) + require.NoError(t, err) defer file.Close() genesisBytes, err := io.ReadAll(file) From fa96c6732a9014640da58aa970d3e2f80bdaa3a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 08:11:29 -0400 Subject: [PATCH 04/17] chore: Fix test cases --- dot/build_spec_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index 3bb7fbbcff..c9bba0df27 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -18,7 +18,6 @@ package dot import ( "encoding/json" "fmt" - "io" "io/ioutil" "os" "testing" @@ -107,14 +106,15 @@ func TestWriteGenesisSpecFile(t *testing.T) { require.NoError(t, err) defer file.Close() - genesisBytes, err := io.ReadAll(file) + 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, gen) + require.Equal(t, expected.ChainType, gen.ChainType) + require.Equal(t, expected.Properties, gen.Properties) } func TestBuildFromDB(t *testing.T) { From e60be2cba406e71c1857e89223179b282afbb10c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 08:38:13 -0400 Subject: [PATCH 05/17] chore: Fix test cases --- dot/build_spec_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index c9bba0df27..2995b53ce6 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -34,8 +34,8 @@ func TestBuildFromGenesis(t *testing.T) { expectedChainType := "TESTCHAINTYPE" expectedProperties := map[string]interface{}{ - "ss58Format": 00, - "tokenDecimals": 00, + "ss58Format": 0.0, + "tokenDecimals": 0.0, "tokenSymbol": "TEST", } @@ -89,7 +89,7 @@ func TestWriteGenesisSpecFile(t *testing.T) { err = InitNode(cfg) require.NoError(t, err) - bs, err := BuildFromDB(cfg.Global.BasePath) + bs, err := BuildFromGenesis(cfg.Init.Genesis, 0) require.NoError(t, err) data, err := bs.ToJSONRaw() @@ -113,7 +113,7 @@ func TestWriteGenesisSpecFile(t *testing.T) { err = json.Unmarshal(genesisBytes, gen) require.NoError(t, err) - require.Equal(t, expected.ChainType, gen.ChainType) + require.Equal(t, expected, gen.ChainType) require.Equal(t, expected.Properties, gen.Properties) } From df535c4932ae43aefb0e03e81f92c8908a9d7743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 08:57:05 -0400 Subject: [PATCH 06/17] chore: Fix typo on test case --- dot/build_spec_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index 2995b53ce6..42a231c67c 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -113,7 +113,7 @@ func TestWriteGenesisSpecFile(t *testing.T) { err = json.Unmarshal(genesisBytes, gen) require.NoError(t, err) - require.Equal(t, expected, gen.ChainType) + require.Equal(t, expected.ChainType, gen.ChainType) require.Equal(t, expected.Properties, gen.Properties) } From 82af06a5c2d32920ee603a6eab17ea1e721c7eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 11:19:53 -0400 Subject: [PATCH 07/17] chore: Add test case to cmd/gossamer/main.go cli commands --- cmd/gossamer/main_test.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cmd/gossamer/main_test.go b/cmd/gossamer/main_test.go index 65c0fc7652..3a886ace43 100644 --- a/cmd/gossamer/main_test.go +++ b/cmd/gossamer/main_test.go @@ -284,6 +284,25 @@ func TestGossamerCommand(t *testing.T) { } +func TestBuildSpecCommandWithOutput(t *testing.T) { + tmpOutputDir := "/tmp/raw-genesis-spec-output.json" + buildSpecCommand := runTestGossamer(t, + "build-spec", + "--raw", + "--genesis-spec", "../../chain/gssmr/genesis-spec.json", + "--output", tmpOutputDir) + + time.Sleep(10 * time.Second) + + _, err := os.Stat(tmpOutputDir) + require.False(t, os.IsNotExist(err)) + defer os.Remove(tmpOutputDir) + + outb, errb := buildSpecCommand.GetOutput() + require.Empty(t, outb) + require.Empty(t, errb) +} + // TODO: TestExportCommand test "gossamer export" does not error // TODO: TestInitCommand test "gossamer init" does not error From 59a72c42967622943d61a8524a5a20ec318c04c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 11:36:12 -0400 Subject: [PATCH 08/17] chore: Fix lint --- cmd/gossamer/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gossamer/main.go b/cmd/gossamer/main.go index e52927b312..84dbe34650 100644 --- a/cmd/gossamer/main.go +++ b/cmd/gossamer/main.go @@ -381,7 +381,7 @@ func buildSpecAction(ctx *cli.Context) error { } var res []byte - + if ctx.Bool(RawFlag.Name) { res, err = bs.ToJSONRaw() } else { From 14d9b8295f81bf41892b801627d89ef9b98ea78f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 14:49:46 -0400 Subject: [PATCH 09/17] chore: Improve a little bit more the tests --- cmd/gossamer/main_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmd/gossamer/main_test.go b/cmd/gossamer/main_test.go index 3a886ace43..a05ebc6eac 100644 --- a/cmd/gossamer/main_test.go +++ b/cmd/gossamer/main_test.go @@ -285,18 +285,18 @@ func TestGossamerCommand(t *testing.T) { } func TestBuildSpecCommandWithOutput(t *testing.T) { - tmpOutputDir := "/tmp/raw-genesis-spec-output.json" + tmpOutputfile := "/tmp/raw-genesis-spec-output.json" buildSpecCommand := runTestGossamer(t, "build-spec", "--raw", "--genesis-spec", "../../chain/gssmr/genesis-spec.json", - "--output", tmpOutputDir) + "--output", tmpOutputfile) - time.Sleep(10 * time.Second) + time.Sleep(5 * time.Second) - _, err := os.Stat(tmpOutputDir) + _, err := os.Stat(tmpOutputfile) require.False(t, os.IsNotExist(err)) - defer os.Remove(tmpOutputDir) + defer os.Remove(tmpOutputfile) outb, errb := buildSpecCommand.GetOutput() require.Empty(t, outb) From 44d65c5ac71ba3bbbfde100e2c6ce5b6eee3de21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 20:49:15 -0400 Subject: [PATCH 10/17] chore: Remove filepath.Clean on filepath.Abs --- dot/build_spec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/build_spec.go b/dot/build_spec.go index 5e107995c0..b46fb30b51 100644 --- a/dot/build_spec.go +++ b/dot/build_spec.go @@ -82,7 +82,7 @@ func WriteGenesisSpecFile(data []byte, fp string) error { var err error var absfp string - if absfp, err = filepath.Abs(filepath.Clean(fp)); err != nil { + if absfp, err = filepath.Abs(fp); err != nil { return err } From ea5d8c9ec7991868161996ee0781085e8eff0c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 22:59:59 -0400 Subject: [PATCH 11/17] chore: Improve code coverage --- dot/build_spec_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index 42a231c67c..765e704589 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -67,6 +67,12 @@ func TestBuildFromGenesis(t *testing.T) { 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) @@ -137,3 +143,5 @@ func TestBuildFromDB(t *testing.T) { require.Equal(t, expected.Genesis.Raw["top"]["0x3a636f6465"], jGen.Genesis.Runtime["system"]["code"]) } + +func TestBuildFromDB_When \ No newline at end of file From 25779b06aa24cfefd39a8bd6d05aaa7fa55ece47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Tue, 13 Apr 2021 23:02:40 -0400 Subject: [PATCH 12/17] chore: Fix typo --- dot/build_spec_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index 765e704589..db27857d3c 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -143,5 +143,3 @@ func TestBuildFromDB(t *testing.T) { require.Equal(t, expected.Genesis.Raw["top"]["0x3a636f6465"], jGen.Genesis.Runtime["system"]["code"]) } - -func TestBuildFromDB_When \ No newline at end of file From 72a89412f59caf17530c1706a6f8ba937409680a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Wed, 14 Apr 2021 06:51:07 -0400 Subject: [PATCH 13/17] chore: Remove the filepath.Abs --- dot/build_spec.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/dot/build_spec.go b/dot/build_spec.go index b46fb30b51..20bc6655fb 100644 --- a/dot/build_spec.go +++ b/dot/build_spec.go @@ -19,7 +19,6 @@ package dot import ( "encoding/json" "fmt" - "path/filepath" "github.com/ChainSafe/gossamer/dot/state" "github.com/ChainSafe/gossamer/lib/common" @@ -79,16 +78,9 @@ func BuildFromGenesis(path string, authCount int) (*BuildSpec, error) { // WriteGenesisSpecFile writes the build-spec in the output filepath func WriteGenesisSpecFile(data []byte, fp string) error { - var err error - var absfp string - - if absfp, err = filepath.Abs(fp); err != nil { - return err - } - // if file already exists then dont apply any written on it - if utils.PathExists(absfp) { - return fmt.Errorf("file %s already exists, rename to avoid overwritten", absfp) + if utils.PathExists(fp) { + return fmt.Errorf("file %s already exists, rename to avoid overwritten", fp) } WriteConfig(data, fp) From 3101c6bb3962227de9121184de5458bace1cb1a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Wed, 14 Apr 2021 07:40:26 -0400 Subject: [PATCH 14/17] chore: Fix whitespace between error and verification --- lib/genesis/helpers.go | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/genesis/helpers.go b/lib/genesis/helpers.go index ce4d1cd223..8c21513ff9 100644 --- a/lib/genesis/helpers.go +++ b/lib/genesis/helpers.go @@ -141,7 +141,6 @@ func NewGenesisSpecFromJSON(file string) (*Genesis, error) { g := new(Genesis) err = json.Unmarshal(data, g) - if err != nil { return nil, err } From ac73507bacf4c66b9a520b635d5df03488fb96ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Wed, 14 Apr 2021 08:21:44 -0400 Subject: [PATCH 15/17] chore: Create spec output path if not exists --- dot/build_spec.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dot/build_spec.go b/dot/build_spec.go index 20bc6655fb..b34ae70318 100644 --- a/dot/build_spec.go +++ b/dot/build_spec.go @@ -19,6 +19,8 @@ package dot import ( "encoding/json" "fmt" + "os" + "path/filepath" "github.com/ChainSafe/gossamer/dot/state" "github.com/ChainSafe/gossamer/lib/common" @@ -83,6 +85,10 @@ func WriteGenesisSpecFile(data []byte, fp string) error { return fmt.Errorf("file %s already exists, rename to avoid overwritten", fp) } + if err := os.MkdirAll(filepath.Dir(fp), os.ModeDir|os.ModePerm); err != nil { + return err + } + WriteConfig(data, fp) return nil } From aba012cef3805a24f4eb3f5f275d1d873a94a41e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Wed, 14 Apr 2021 08:26:21 -0400 Subject: [PATCH 16/17] chore: Add test case when output dont has nested paths --- dot/build_spec_test.go | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/dot/build_spec_test.go b/dot/build_spec_test.go index db27857d3c..10320e6327 100644 --- a/dot/build_spec_test.go +++ b/dot/build_spec_test.go @@ -101,26 +101,32 @@ func TestWriteGenesisSpecFile(t *testing.T) { data, err := bs.ToJSONRaw() require.NoError(t, err) - tmpFile := "/tmp/unique-raw-genesis.json" - err = WriteGenesisSpecFile(data, tmpFile) - require.NoError(t, err) - require.FileExists(t, tmpFile) + tmpFiles := []string{ + "/tmp/unique-raw-genesis.json", + "./unique-raw-genesis.json", + } - defer os.Remove(tmpFile) + for _, tmpFile := range tmpFiles { + err = WriteGenesisSpecFile(data, tmpFile) + require.NoError(t, err) + require.FileExists(t, tmpFile) - file, err := os.Open(tmpFile) - require.NoError(t, err) - defer file.Close() + defer os.Remove(tmpFile) - genesisBytes, err := ioutil.ReadAll(file) - require.NoError(t, err) + file, err := os.Open(tmpFile) + require.NoError(t, err) + defer file.Close() - gen := new(genesis.Genesis) - err = json.Unmarshal(genesisBytes, gen) - require.NoError(t, err) + 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) + require.Equal(t, expected.ChainType, gen.ChainType) + require.Equal(t, expected.Properties, gen.Properties) + } } func TestBuildFromDB(t *testing.T) { From f5d52f0f5fd1c73a930e502ca610baeeba0bb09a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ecl=C3=A9sio=20Melo=20J=C3=BAnior?= Date: Wed, 14 Apr 2021 15:37:53 -0400 Subject: [PATCH 17/17] chore: Fix typo --- dot/build_spec.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dot/build_spec.go b/dot/build_spec.go index b34ae70318..70558f6825 100644 --- a/dot/build_spec.go +++ b/dot/build_spec.go @@ -82,7 +82,7 @@ func BuildFromGenesis(path string, authCount int) (*BuildSpec, error) { func WriteGenesisSpecFile(data []byte, fp string) error { // if file already exists then dont apply any written on it if utils.PathExists(fp) { - return fmt.Errorf("file %s already exists, rename to avoid overwritten", fp) + return fmt.Errorf("file %s already exists, rename to avoid overwriting", fp) } if err := os.MkdirAll(filepath.Dir(fp), os.ModeDir|os.ModePerm); err != nil {