package engine import ( "errors" "io/ioutil" "os" "testing" "github.com/thrasher-corp/gocryptotrader/config" ) func TestLoadConfigWithSettings(t *testing.T) { empty := "" somePath := "somePath" // Clean up after the tests defer os.RemoveAll(somePath) tests := []struct { name string flags []string settings *Settings want *string wantErr bool }{ { name: "invalid file", settings: &Settings{ ConfigFile: "nonExistent.json", }, wantErr: true, }, { name: "test file", settings: &Settings{ ConfigFile: config.TestFile, EnableDryRun: true, }, want: &empty, wantErr: false, }, { name: "data dir in settings overrides config data dir", flags: []string{"datadir"}, settings: &Settings{ ConfigFile: config.TestFile, DataDir: somePath, EnableDryRun: true, }, want: &somePath, wantErr: false, }, } for _, tt := range tests { tt := tt t.Run(tt.name, func(t *testing.T) { // prepare the 'flags' flagSet := make(map[string]bool) for _, v := range tt.flags { flagSet[v] = true } // Run the test got, err := loadConfigWithSettings(tt.settings, flagSet) if (err != nil) != tt.wantErr { t.Errorf("loadConfigWithSettings() error = %v, wantErr %v", err, tt.wantErr) return } if got != nil || tt.want != nil { if (got == nil && tt.want != nil) || (got != nil && tt.want == nil) { t.Errorf("loadConfigWithSettings() = is nil %v, want nil %v", got == nil, tt.want == nil) } else if got.DataDirectory != *tt.want { t.Errorf("loadConfigWithSettings() = %v, want %v", got.DataDirectory, *tt.want) } } }) } } func TestStartStopDoesNotCausePanic(t *testing.T) { t.Parallel() botOne, err := NewFromSettings(&Settings{ ConfigFile: config.TestFile, EnableDryRun: true, }, nil) if err != nil { t.Error(err) } botOne.Settings.EnableGRPCProxy = false if err = botOne.Start(); err != nil { t.Error(err) } botOne.Stop() } var enableExperimentalTest = false func TestStartStopTwoDoesNotCausePanic(t *testing.T) { t.Parallel() if !enableExperimentalTest { t.Skip("test is functional, however does not need to be included in go test runs") } tempDir, err := ioutil.TempDir("", "") if err != nil { t.Fatalf("Problem creating temp dir at %s: %s\n", tempDir, err) } tempDir2, err := ioutil.TempDir("", "") if err != nil { t.Fatalf("Problem creating temp dir at %s: %s\n", tempDir, err) } defer func() { err = os.RemoveAll(tempDir) if err != nil { t.Error(err) } err = os.RemoveAll(tempDir2) if err != nil { t.Error(err) } }() botOne, err := NewFromSettings(&Settings{ ConfigFile: config.TestFile, EnableDryRun: true, DataDir: tempDir, }, nil) if err != nil { t.Error(err) } botOne.Settings.EnableGRPCProxy = false botTwo, err := NewFromSettings(&Settings{ ConfigFile: config.TestFile, EnableDryRun: true, DataDir: tempDir2, }, nil) if err != nil { t.Error(err) } botTwo.Settings.EnableGRPCProxy = false if err = botOne.Start(); err != nil { t.Error(err) } if err = botTwo.Start(); err != nil { t.Error(err) } botOne.Stop() botTwo.Stop() } func TestCheckExchangeExists(t *testing.T) { e := CreateTestBot(t) if e.GetExchangeByName(testExchange) == nil { t.Errorf("TestGetExchangeExists: Unable to find exchange") } if e.GetExchangeByName("Asdsad") != nil { t.Errorf("TestGetExchangeExists: Non-existent exchange found") } } func TestGetExchangeByName(t *testing.T) { e := CreateTestBot(t) exch := e.GetExchangeByName(testExchange) if exch == nil { t.Errorf("TestGetExchangeByName: Failed to get exchange") } if !exch.IsEnabled() { t.Errorf("TestGetExchangeByName: Unexpected result") } exch.SetEnabled(false) bfx := e.GetExchangeByName(testExchange) if bfx.IsEnabled() { t.Errorf("TestGetExchangeByName: Unexpected result") } if exch.GetName() != testExchange { t.Errorf("TestGetExchangeByName: Unexpected result") } exch = e.GetExchangeByName("Asdasd") if exch != nil { t.Errorf("TestGetExchangeByName: Non-existent exchange found") } } func TestUnloadExchange(t *testing.T) { e := CreateTestBot(t) err := e.UnloadExchange("asdf") if !errors.Is(err, config.ErrExchangeNotFound) { t.Errorf("error '%v', expected '%v'", err, config.ErrExchangeNotFound) } err = e.UnloadExchange(testExchange) if err != nil { t.Errorf("TestUnloadExchange: Failed to get exchange. %s", err) } err = e.UnloadExchange(testExchange) if !errors.Is(err, ErrNoExchangesLoaded) { t.Errorf("error '%v', expected '%v'", err, ErrNoExchangesLoaded) } } func TestDryRunParamInteraction(t *testing.T) { bot := CreateTestBot(t) // Simulate overiding default settings and ensure that enabling exchange // verbose mode will be set on Bitfinex var err error if err = bot.UnloadExchange(testExchange); err != nil { t.Error(err) } bot.Settings.CheckParamInteraction = false bot.Settings.EnableExchangeVerbose = false if err = bot.LoadExchange(testExchange, false, nil); err != nil { t.Error(err) } exchCfg, err := bot.Config.GetExchangeConfig(testExchange) if err != nil { t.Error(err) } if exchCfg.Verbose { t.Error("verbose should have been disabled") } if err = bot.UnloadExchange(testExchange); err != nil { t.Error(err) } // Now set dryrun mode to true, // enable exchange verbose mode and verify that verbose mode // will be set on Bitfinex bot.Settings.EnableDryRun = true bot.Settings.CheckParamInteraction = true bot.Settings.EnableExchangeVerbose = true if err = bot.LoadExchange(testExchange, false, nil); err != nil { t.Error(err) } exchCfg, err = bot.Config.GetExchangeConfig(testExchange) if err != nil { t.Error(err) } if !bot.Settings.EnableDryRun || !exchCfg.Verbose { t.Error("dryrun should be true and verbose should be true") } }