diff options
Diffstat (limited to 'cmd/swarm/config_test.go')
-rw-r--r-- | cmd/swarm/config_test.go | 459 |
1 files changed, 459 insertions, 0 deletions
diff --git a/cmd/swarm/config_test.go b/cmd/swarm/config_test.go new file mode 100644 index 000000000..7ffe2cfb9 --- /dev/null +++ b/cmd/swarm/config_test.go @@ -0,0 +1,459 @@ +// Copyright 2017 The go-ethereum Authors +// This file is part of go-ethereum. +// +// go-ethereum is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// go-ethereum 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 General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. + +package main + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "os/exec" + "testing" + "time" + + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/swarm" + "github.com/ethereum/go-ethereum/swarm/api" + + "github.com/docker/docker/pkg/reexec" +) + +func TestDumpConfig(t *testing.T) { + swarm := runSwarm(t, "dumpconfig") + defaultConf := api.NewDefaultConfig() + out, err := tomlSettings.Marshal(&defaultConf) + if err != nil { + t.Fatal(err) + } + swarm.Expect(string(out)) + swarm.ExpectExit() +} + +func TestFailsSwapEnabledNoSwapApi(t *testing.T) { + flags := []string{ + fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", + fmt.Sprintf("--%s", SwarmPortFlag.Name), "54545", + fmt.Sprintf("--%s", SwarmSwapEnabledFlag.Name), + } + + swarm := runSwarm(t, flags...) + swarm.Expect("Fatal: " + SWARM_ERR_SWAP_SET_NO_API + "\n") + swarm.ExpectExit() +} + +func TestFailsNoBzzAccount(t *testing.T) { + flags := []string{ + fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", + fmt.Sprintf("--%s", SwarmPortFlag.Name), "54545", + } + + swarm := runSwarm(t, flags...) + swarm.Expect("Fatal: " + SWARM_ERR_NO_BZZACCOUNT + "\n") + swarm.ExpectExit() +} + +func TestCmdLineOverrides(t *testing.T) { + dir, err := ioutil.TempDir("", "bzztest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + + conf, account := getTestAccount(t, dir) + node := &testNode{Dir: dir} + + // assign ports + httpPort, err := assignTCPPort() + if err != nil { + t.Fatal(err) + } + + flags := []string{ + fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", + fmt.Sprintf("--%s", SwarmPortFlag.Name), httpPort, + fmt.Sprintf("--%s", SwarmSyncEnabledFlag.Name), + fmt.Sprintf("--%s", CorsStringFlag.Name), "*", + fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), + fmt.Sprintf("--%s", EnsAPIFlag.Name), "", + "--datadir", dir, + "--ipcpath", conf.IPCPath, + } + node.Cmd = runSwarm(t, flags...) + node.Cmd.InputLine(testPassphrase) + defer func() { + if t.Failed() { + node.Shutdown() + } + }() + // wait for the node to start + for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { + node.Client, err = rpc.Dial(conf.IPCEndpoint()) + if err == nil { + break + } + } + if node.Client == nil { + t.Fatal(err) + } + + // load info + var info swarm.Info + if err := node.Client.Call(&info, "bzz_info"); err != nil { + t.Fatal(err) + } + + if info.Port != httpPort { + t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) + } + + if info.NetworkId != 42 { + t.Fatalf("Expected network ID to be %d, got %d", 42, info.NetworkId) + } + + if info.SyncEnabled != true { + t.Fatal("Expected Sync to be enabled, but is false") + } + + if info.Cors != "*" { + t.Fatalf("Expected Cors flag to be set to %s, got %s", "*", info.Cors) + } + + node.Shutdown() +} + +func TestFileOverrides(t *testing.T) { + + // assign ports + httpPort, err := assignTCPPort() + if err != nil { + t.Fatal(err) + } + + //create a config file + //first, create a default conf + defaultConf := api.NewDefaultConfig() + //change some values in order to test if they have been loaded + defaultConf.SyncEnabled = true + defaultConf.NetworkId = 54 + defaultConf.Port = httpPort + defaultConf.StoreParams.DbCapacity = 9000000 + defaultConf.ChunkerParams.Branches = 64 + defaultConf.HiveParams.CallInterval = 6000000000 + defaultConf.Swap.Params.Strategy.AutoCashInterval = 600 * time.Second + defaultConf.SyncParams.KeyBufferSize = 512 + //create a TOML string + out, err := tomlSettings.Marshal(&defaultConf) + if err != nil { + t.Fatalf("Error creating TOML file in TestFileOverride: %v", err) + } + //create file + f, err := ioutil.TempFile("", "testconfig.toml") + if err != nil { + t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) + } + //write file + _, err = f.WriteString(string(out)) + if err != nil { + t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) + } + f.Sync() + + dir, err := ioutil.TempDir("", "bzztest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + conf, account := getTestAccount(t, dir) + node := &testNode{Dir: dir} + + flags := []string{ + fmt.Sprintf("--%s", SwarmTomlConfigPathFlag.Name), f.Name(), + fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), + "--ens-api", "", + "--ipcpath", conf.IPCPath, + "--datadir", dir, + } + node.Cmd = runSwarm(t, flags...) + node.Cmd.InputLine(testPassphrase) + defer func() { + if t.Failed() { + node.Shutdown() + } + }() + // wait for the node to start + for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { + node.Client, err = rpc.Dial(conf.IPCEndpoint()) + if err == nil { + break + } + } + if node.Client == nil { + t.Fatal(err) + } + + // load info + var info swarm.Info + if err := node.Client.Call(&info, "bzz_info"); err != nil { + t.Fatal(err) + } + + if info.Port != httpPort { + t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) + } + + if info.NetworkId != 54 { + t.Fatalf("Expected network ID to be %d, got %d", 54, info.NetworkId) + } + + if info.SyncEnabled != true { + t.Fatal("Expected Sync to be enabled, but is false") + } + + if info.StoreParams.DbCapacity != 9000000 { + t.Fatalf("Expected network ID to be %d, got %d", 54, info.NetworkId) + } + + if info.ChunkerParams.Branches != 64 { + t.Fatalf("Expected chunker params branches to be %d, got %d", 64, info.ChunkerParams.Branches) + } + + if info.HiveParams.CallInterval != 6000000000 { + t.Fatalf("Expected HiveParams CallInterval to be %d, got %d", uint64(6000000000), uint64(info.HiveParams.CallInterval)) + } + + if info.Swap.Params.Strategy.AutoCashInterval != 600*time.Second { + t.Fatalf("Expected SwapParams AutoCashInterval to be %ds, got %d", 600, info.Swap.Params.Strategy.AutoCashInterval) + } + + if info.SyncParams.KeyBufferSize != 512 { + t.Fatalf("Expected info.SyncParams.KeyBufferSize to be %d, got %d", 512, info.SyncParams.KeyBufferSize) + } + + node.Shutdown() +} + +func TestEnvVars(t *testing.T) { + // assign ports + httpPort, err := assignTCPPort() + if err != nil { + t.Fatal(err) + } + + envVars := os.Environ() + envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmPortFlag.EnvVar, httpPort)) + envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmNetworkIdFlag.EnvVar, "999")) + envVars = append(envVars, fmt.Sprintf("%s=%s", CorsStringFlag.EnvVar, "*")) + envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmSyncEnabledFlag.EnvVar, "true")) + + dir, err := ioutil.TempDir("", "bzztest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + conf, account := getTestAccount(t, dir) + node := &testNode{Dir: dir} + flags := []string{ + fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), + "--ens-api", "", + "--datadir", dir, + "--ipcpath", conf.IPCPath, + } + + //node.Cmd = runSwarm(t,flags...) + //node.Cmd.cmd.Env = envVars + //the above assignment does not work, so we need a custom Cmd here in order to pass envVars: + cmd := &exec.Cmd{ + Path: reexec.Self(), + Args: append([]string{"swarm-test"}, flags...), + Stderr: os.Stderr, + Stdout: os.Stdout, + } + cmd.Env = envVars + //stdout, err := cmd.StdoutPipe() + //if err != nil { + // t.Fatal(err) + //} + //stdout = bufio.NewReader(stdout) + var stdin io.WriteCloser + if stdin, err = cmd.StdinPipe(); err != nil { + t.Fatal(err) + } + if err := cmd.Start(); err != nil { + t.Fatal(err) + } + + //cmd.InputLine(testPassphrase) + io.WriteString(stdin, testPassphrase+"\n") + defer func() { + if t.Failed() { + node.Shutdown() + cmd.Process.Kill() + } + }() + // wait for the node to start + for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { + node.Client, err = rpc.Dial(conf.IPCEndpoint()) + if err == nil { + break + } + } + + if node.Client == nil { + t.Fatal(err) + } + + // load info + var info swarm.Info + if err := node.Client.Call(&info, "bzz_info"); err != nil { + t.Fatal(err) + } + + if info.Port != httpPort { + t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) + } + + if info.NetworkId != 999 { + t.Fatalf("Expected network ID to be %d, got %d", 999, info.NetworkId) + } + + if info.Cors != "*" { + t.Fatalf("Expected Cors flag to be set to %s, got %s", "*", info.Cors) + } + + if info.SyncEnabled != true { + t.Fatal("Expected Sync to be enabled, but is false") + } + + node.Shutdown() + cmd.Process.Kill() +} + +func TestCmdLineOverridesFile(t *testing.T) { + + // assign ports + httpPort, err := assignTCPPort() + if err != nil { + t.Fatal(err) + } + + //create a config file + //first, create a default conf + defaultConf := api.NewDefaultConfig() + //change some values in order to test if they have been loaded + defaultConf.SyncEnabled = false + defaultConf.NetworkId = 54 + defaultConf.Port = "8588" + defaultConf.StoreParams.DbCapacity = 9000000 + defaultConf.ChunkerParams.Branches = 64 + defaultConf.HiveParams.CallInterval = 6000000000 + defaultConf.Swap.Params.Strategy.AutoCashInterval = 600 * time.Second + defaultConf.SyncParams.KeyBufferSize = 512 + //create a TOML file + out, err := tomlSettings.Marshal(&defaultConf) + if err != nil { + t.Fatalf("Error creating TOML file in TestFileOverride: %v", err) + } + //write file + f, err := ioutil.TempFile("", "testconfig.toml") + if err != nil { + t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) + } + //write file + _, err = f.WriteString(string(out)) + if err != nil { + t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) + } + f.Sync() + + dir, err := ioutil.TempDir("", "bzztest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(dir) + conf, account := getTestAccount(t, dir) + node := &testNode{Dir: dir} + + expectNetworkId := uint64(77) + + flags := []string{ + fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "77", + fmt.Sprintf("--%s", SwarmPortFlag.Name), httpPort, + fmt.Sprintf("--%s", SwarmSyncEnabledFlag.Name), + fmt.Sprintf("--%s", SwarmTomlConfigPathFlag.Name), f.Name(), + fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), + "--ens-api", "", + "--datadir", dir, + "--ipcpath", conf.IPCPath, + } + node.Cmd = runSwarm(t, flags...) + node.Cmd.InputLine(testPassphrase) + defer func() { + if t.Failed() { + node.Shutdown() + } + }() + // wait for the node to start + for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { + node.Client, err = rpc.Dial(conf.IPCEndpoint()) + if err == nil { + break + } + } + if node.Client == nil { + t.Fatal(err) + } + + // load info + var info swarm.Info + if err := node.Client.Call(&info, "bzz_info"); err != nil { + t.Fatal(err) + } + + if info.Port != httpPort { + t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) + } + + if info.NetworkId != expectNetworkId { + t.Fatalf("Expected network ID to be %d, got %d", expectNetworkId, info.NetworkId) + } + + if info.SyncEnabled != true { + t.Fatal("Expected Sync to be enabled, but is false") + } + + if info.StoreParams.DbCapacity != 9000000 { + t.Fatalf("Expected network ID to be %d, got %d", 54, info.NetworkId) + } + + if info.ChunkerParams.Branches != 64 { + t.Fatalf("Expected chunker params branches to be %d, got %d", 64, info.ChunkerParams.Branches) + } + + if info.HiveParams.CallInterval != 6000000000 { + t.Fatalf("Expected HiveParams CallInterval to be %d, got %d", uint64(6000000000), uint64(info.HiveParams.CallInterval)) + } + + if info.Swap.Params.Strategy.AutoCashInterval != 600*time.Second { + t.Fatalf("Expected SwapParams AutoCashInterval to be %ds, got %d", 600, info.Swap.Params.Strategy.AutoCashInterval) + } + + if info.SyncParams.KeyBufferSize != 512 { + t.Fatalf("Expected info.SyncParams.KeyBufferSize to be %d, got %d", 512, info.SyncParams.KeyBufferSize) + } + + node.Shutdown() +} |