diff --git a/cmd/config/config_test.go b/cmd/config/config_test.go index cd266ae5..7542cc09 100644 --- a/cmd/config/config_test.go +++ b/cmd/config/config_test.go @@ -6,13 +6,13 @@ func TestEncryptOrDecrypt(t *testing.T) { reValue := EncryptOrDecrypt(true) if reValue != "encrypted" { t.Error( - "Test failed - Tools/Config/Config_test.go - EncryptOrDecrypt Error", + "Tools/Config/Config_test.go - EncryptOrDecrypt Error", ) } reValue = EncryptOrDecrypt(false) if reValue != "decrypted" { t.Error( - "Test failed - Tools/Config/Config_test.go - EncryptOrDecrypt Error", + "Tools/Config/Config_test.go - EncryptOrDecrypt Error", ) } } diff --git a/cmd/exchange_template/test_file.tmpl b/cmd/exchange_template/test_file.tmpl index 38e4db70..87ee2bdc 100644 --- a/cmd/exchange_template/test_file.tmpl +++ b/cmd/exchange_template/test_file.tmpl @@ -24,7 +24,7 @@ func TestSetup(t *testing.T) { cfg.LoadConfig("../../testdata/configtest.json") {{.Name}}Config, err := cfg.GetExchangeConfig("{{.CapitalName}}") if err != nil { - t.Error("Test Failed - {{.CapitalName}} Setup() init error") + t.Error("{{.CapitalName}} Setup() init error") } {{.Name}}Config.API.AuthenticatedSupport = true diff --git a/cmd/websocket_client/main.go b/cmd/websocket_client/main.go index 7eba7875..c71b8876 100644 --- a/cmd/websocket_client/main.go +++ b/cmd/websocket_client/main.go @@ -76,7 +76,7 @@ func SendWebsocketEvent(event string, reqData interface{}, result *WebsocketEven func main() { cfg := config.GetConfig() - err := cfg.LoadConfig(config.ConfigFile, true) + err := cfg.LoadConfig(config.File, true) if err != nil { log.Fatalf("Failed to load config file: %s", err) } diff --git a/common/common_test.go b/common/common_test.go index 41f7e35d..d8bf9f84 100644 --- a/common/common_test.go +++ b/common/common_test.go @@ -16,13 +16,13 @@ func TestIsEnabled(t *testing.T) { expected := "Enabled" actual := IsEnabled(true) if actual != expected { - t.Errorf("Test failed. Expected %s. Actual %s", expected, actual) + t.Errorf("Expected %s. Actual %s", expected, actual) } expected = "Disabled" actual = IsEnabled(false) if actual != expected { - t.Errorf("Test failed. Expected %s. Actual %s", expected, actual) + t.Errorf("Expected %s. Actual %s", expected, actual) } } @@ -30,44 +30,44 @@ func TestIsValidCryptoAddress(t *testing.T) { t.Parallel() b, err := IsValidCryptoAddress("1Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX", "bTC") if err != nil && !b { - t.Errorf("Test Failed - Common IsValidCryptoAddress error: %s", err) + t.Errorf("Common IsValidCryptoAddress error: %s", err) } b, err = IsValidCryptoAddress("0Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX", "btc") if err == nil && b { - t.Error("Test Failed - Common IsValidCryptoAddress error") + t.Error("Common IsValidCryptoAddress error") } b, err = IsValidCryptoAddress("1Mz7153HMuxXTuR2R1t78mGSdzaAtNbBWX", "lTc") if err == nil && b { - t.Error("Test Failed - Common IsValidCryptoAddress error") + t.Error("Common IsValidCryptoAddress error") } b, err = IsValidCryptoAddress("3CDJNfdWX8m2NwuGUV3nhXHXEeLygMXoAj", "ltc") if err != nil && !b { - t.Errorf("Test Failed - Common IsValidCryptoAddress error: %s", err) + t.Errorf("Common IsValidCryptoAddress error: %s", err) } b, err = IsValidCryptoAddress("NCDJNfdWX8m2NwuGUV3nhXHXEeLygMXoAj", "lTc") if err == nil && b { - t.Error("Test Failed - Common IsValidCryptoAddress error") + t.Error("Common IsValidCryptoAddress error") } b, err = IsValidCryptoAddress( "0xb794f5ea0ba39494ce839613fffba74279579268", "eth", ) if err != nil && b { - t.Errorf("Test Failed - Common IsValidCryptoAddress error: %s", err) + t.Errorf("Common IsValidCryptoAddress error: %s", err) } b, err = IsValidCryptoAddress( "xxb794f5ea0ba39494ce839613fffba74279579268", "eTh", ) if err == nil && b { - t.Error("Test Failed - Common IsValidCryptoAddress error") + t.Error("Common IsValidCryptoAddress error") } b, err = IsValidCryptoAddress( "xxb794f5ea0ba39494ce839613fffba74279579268", "ding", ) if err == nil && b { - t.Error("Test Failed - Common IsValidCryptoAddress error") + t.Error("Common IsValidCryptoAddress error") } } @@ -78,7 +78,7 @@ func TestStringSliceDifference(t *testing.T) { expectedOutput := []string{"hello moto"} actualResult := StringSliceDifference(originalInputOne, originalInputTwo) if reflect.DeepEqual(expectedOutput, actualResult) { - t.Errorf("Test failed. Expected '%s'. Actual '%s'", + t.Errorf("Expected '%s'. Actual '%s'", expectedOutput, actualResult) } } @@ -92,12 +92,12 @@ func TestStringDataContains(t *testing.T) { expectedOutputTwo := false actualResult := StringDataContains(originalHaystack, originalNeedle) if actualResult != expectedOutput { - t.Errorf("Test failed. Expected '%v'. Actual '%v'", + t.Errorf("Expected '%v'. Actual '%v'", expectedOutput, actualResult) } actualResult = StringDataContains(originalHaystack, anotherNeedle) if actualResult != expectedOutputTwo { - t.Errorf("Test failed. Expected '%v'. Actual '%v'", + t.Errorf("Expected '%v'. Actual '%v'", expectedOutput, actualResult) } } @@ -111,12 +111,12 @@ func TestStringDataCompare(t *testing.T) { expectedOutputTwo := false actualResult := StringDataCompare(originalHaystack, originalNeedle) if actualResult != expectedOutput { - t.Errorf("Test failed. Expected '%v'. Actual '%v'", + t.Errorf("Expected '%v'. Actual '%v'", expectedOutput, actualResult) } actualResult = StringDataCompare(originalHaystack, anotherNeedle) if actualResult != expectedOutputTwo { - t.Errorf("Test failed. Expected '%v'. Actual '%v'", + t.Errorf("Expected '%v'. Actual '%v'", expectedOutput, actualResult) } } @@ -130,13 +130,13 @@ func TestStringDataCompareUpper(t *testing.T) { expectedOutputTwo := false actualResult := StringDataCompareInsensitive(originalHaystack, originalNeedle) if actualResult != expectedOutput { - t.Errorf("Test failed. Expected '%v'. Actual '%v'", + t.Errorf("Expected '%v'. Actual '%v'", expectedOutput, actualResult) } actualResult = StringDataCompareInsensitive(originalHaystack, anotherNeedle) if actualResult != expectedOutputTwo { - t.Errorf("Test failed. Expected '%v'. Actual '%v'", + t.Errorf("Expected '%v'. Actual '%v'", expectedOutput, actualResult) } } @@ -150,12 +150,12 @@ func TestStringDataContainsUpper(t *testing.T) { expectedOutputTwo := false actualResult := StringDataContainsInsensitive(originalHaystack, originalNeedle) if actualResult != expectedOutput { - t.Errorf("Test failed. Expected '%v'. Actual '%v'", + t.Errorf("Expected '%v'. Actual '%v'", expectedOutput, actualResult) } actualResult = StringDataContainsInsensitive(originalHaystack, anotherNeedle) if actualResult != expectedOutputTwo { - t.Errorf("Test failed. Expected '%v'. Actual '%v'", + t.Errorf("Expected '%v'. Actual '%v'", expectedOutput, actualResult) } } @@ -163,13 +163,13 @@ func TestStringDataContainsUpper(t *testing.T) { func TestYesOrNo(t *testing.T) { t.Parallel() if !YesOrNo("y") { - t.Error("Test failed - Common YesOrNo Error.") + t.Error("Common YesOrNo Error.") } if !YesOrNo("yes") { - t.Error("Test failed - Common YesOrNo Error.") + t.Error("Common YesOrNo Error.") } if YesOrNo("ding") { - t.Error("Test failed - Common YesOrNo Error.") + t.Error("Common YesOrNo Error.") } } @@ -187,42 +187,42 @@ func TestSendHTTPRequest(t *testing.T) { strings.NewReader(""), ) if err == nil { - t.Error("Test failed. ") + t.Error("Expected error 'invalid HTTP method specified'") } _, err = SendHTTPRequest( methodPost, "https://www.google.com", headers, strings.NewReader(""), ) if err != nil { - t.Errorf("Test failed. %s ", err) + t.Error(err) } _, err = SendHTTPRequest( methodGet, "https://www.google.com", headers, strings.NewReader(""), ) if err != nil { - t.Errorf("Test failed. %s ", err) + t.Error(err) } _, err = SendHTTPRequest( methodDelete, "https://www.google.com", headers, strings.NewReader(""), ) if err != nil { - t.Errorf("Test failed. %s ", err) + t.Error(err) } _, err = SendHTTPRequest( methodGet, ":missingprotocolscheme", headers, strings.NewReader(""), ) if err == nil { - t.Error("Test failed. Common HTTPRequest accepted missing protocol") + t.Error("Common HTTPRequest accepted missing protocol") } _, err = SendHTTPRequest( methodGet, "test://unsupportedprotocolscheme", headers, strings.NewReader(""), ) if err == nil { - t.Error("Test failed. Common HTTPRequest accepted invalid protocol") + t.Error("Common HTTPRequest accepted invalid protocol") } } @@ -243,23 +243,23 @@ func TestSendHTTPGetRequest(t *testing.T) { err := SendHTTPGetRequest(ethURL, true, true, &result) if err != nil { - t.Errorf("Test failed - common SendHTTPGetRequest error: %s", err) + t.Errorf("common SendHTTPGetRequest error: %s", err) } err = SendHTTPGetRequest("DINGDONG", true, false, &result) if err == nil { - t.Error("Test failed - common SendHTTPGetRequest error") + t.Error("common SendHTTPGetRequest error") } err = SendHTTPGetRequest(ethURL, false, false, &result) if err != nil { - t.Errorf("Test failed - common SendHTTPGetRequest error: %s", err) + t.Errorf("common SendHTTPGetRequest error: %s", err) } err = SendHTTPGetRequest("https://httpstat.us/202", false, false, &result) if err == nil { - t.Error("Test failed = common SendHTTPGetRequest error: Ignored unexpected status code") + t.Error("= common SendHTTPGetRequest error: Ignored unexpected status code") } err = SendHTTPGetRequest(ethURL, true, false, &badresult) if err == nil { - t.Error("Test failed - common SendHTTPGetRequest error: Unmarshalled into bad type") + t.Error("common SendHTTPGetRequest error: Unmarshalled into bad type") } } @@ -282,14 +282,14 @@ func TestJSONEncode(t *testing.T) { bitey, err := JSONEncode(v) if err != nil { - t.Errorf("Test failed - common JSONEncode error: %s", err) + t.Errorf("common JSONEncode error: %s", err) } if string(bitey) != expectOutputString { - t.Error("Test failed - common JSONEncode error") + t.Error("common JSONEncode error") } _, err = JSONEncode("WigWham") if err != nil { - t.Errorf("Test failed - common JSONEncode error: %s", err) + t.Errorf("common JSONEncode error: %s", err) } } @@ -299,7 +299,7 @@ func TestJSONDecode(t *testing.T) { result := "Not a memory address" err := JSONDecode(data, result) if err == nil { - t.Error("Test failed. Common JSONDecode, unmarshalled when address not supplied") + t.Error("Common JSONDecode, unmarshalled when address not supplied") } type test struct { @@ -314,7 +314,7 @@ func TestJSONDecode(t *testing.T) { data = []byte(`{"status":1,"data":null}`) err = JSONDecode(data, &v) if err != nil || v.Status != 1 { - t.Errorf("Test failed. Common JSONDecode. Data: %v \nError: %s", + t.Errorf("Common JSONDecode. Data: %v \nError: %s", v, err) } } @@ -329,7 +329,7 @@ func TestEncodeURLValues(t *testing.T) { output := EncodeURLValues(urlstring, values) if output != expectedOutput { - t.Error("Test Failed - common EncodeURLValues error") + t.Error("common EncodeURLValues error") } } @@ -341,12 +341,12 @@ func TestExtractHost(t *testing.T) { actualResult := ExtractHost(address) if expectedOutput != actualResult { t.Errorf( - "Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) + "Expected '%s'. Actual '%s'.", expectedOutput, actualResult) } actualResultTwo := ExtractHost(addresstwo) if expectedOutput != actualResultTwo { t.Errorf( - "Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) + "Expected '%s'. Actual '%s'.", expectedOutput, actualResult) } address = "192.168.1.100:1337" @@ -354,7 +354,7 @@ func TestExtractHost(t *testing.T) { actualResult = ExtractHost(address) if expectedOutput != actualResult { t.Errorf( - "Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) + "Expected '%s'. Actual '%s'.", expectedOutput, actualResult) } } @@ -365,7 +365,7 @@ func TestExtractPort(t *testing.T) { actualResult := ExtractPort(address) if expectedOutput != actualResult { t.Errorf( - "Test failed. Expected '%d'. Actual '%d'.", expectedOutput, actualResult) + "Expected '%d'. Actual '%d'.", expectedOutput, actualResult) } } @@ -378,11 +378,11 @@ func TestOutputCSV(t *testing.T) { err := OutputCSV(path, data) if err != nil { - t.Errorf("Test failed - common OutputCSV error: %s", err) + t.Errorf("common OutputCSV error: %s", err) } err = OutputCSV("/:::notapath:::", data) if err == nil { - t.Error("Test failed - common OutputCSV, tried writing to invalid path") + t.Error("common OutputCSV, tried writing to invalid path") } } @@ -397,7 +397,7 @@ func TestGetURIPath(t *testing.T) { for testInput, expectedOutput := range testTable { actualOutput := GetURIPath(testInput) if actualOutput != expectedOutput { - t.Errorf("Test failed. Expected '%s'. Actual '%s'.", + t.Errorf("Expected '%s'. Actual '%s'.", expectedOutput, actualOutput) } } @@ -407,7 +407,7 @@ func TestGetExecutablePath(t *testing.T) { t.Parallel() _, err := GetExecutablePath() if err != nil { - t.Errorf("Test failed. Common GetExecutablePath. Error: %s", err) + t.Errorf("Common GetExecutablePath. Error: %s", err) } } diff --git a/common/convert/convert_test.go b/common/convert/convert_test.go index e4fe11a5..03aabb3d 100644 --- a/common/convert/convert_test.go +++ b/common/convert/convert_test.go @@ -12,20 +12,20 @@ func TestFloatFromString(t *testing.T) { actualOutput, err := FloatFromString(testString) if actualOutput != expectedOutput || err != nil { - t.Errorf("Test failed. Common FloatFromString. Expected '%v'. Actual '%v'. Error: %s", + t.Errorf("Common FloatFromString. Expected '%v'. Actual '%v'. Error: %s", expectedOutput, actualOutput, err) } var testByte []byte _, err = FloatFromString(testByte) if err == nil { - t.Error("Test failed. Common FloatFromString. Converted non-string.") + t.Error("Common FloatFromString. Converted non-string.") } testString = " something unconvertible " _, err = FloatFromString(testString) if err == nil { - t.Error("Test failed. Common FloatFromString. Converted invalid syntax.") + t.Error("Common FloatFromString. Converted invalid syntax.") } } @@ -36,20 +36,20 @@ func TestIntFromString(t *testing.T) { actualOutput, err := IntFromString(testString) if actualOutput != expectedOutput || err != nil { - t.Errorf("Test failed. Common IntFromString. Expected '%v'. Actual '%v'. Error: %s", + t.Errorf("Common IntFromString. Expected '%v'. Actual '%v'. Error: %s", expectedOutput, actualOutput, err) } var testByte []byte _, err = IntFromString(testByte) if err == nil { - t.Error("Test failed. Common IntFromString. Converted non-string.") + t.Error("Common IntFromString. Converted non-string.") } testString = "1.41421356237" _, err = IntFromString(testString) if err == nil { - t.Error("Test failed. Common IntFromString. Converted invalid syntax.") + t.Error("Common IntFromString. Converted invalid syntax.") } } @@ -60,20 +60,20 @@ func TestInt64FromString(t *testing.T) { actualOutput, err := Int64FromString(testString) if actualOutput != expectedOutput || err != nil { - t.Errorf("Test failed. Common Int64FromString. Expected '%v'. Actual '%v'. Error: %s", + t.Errorf("Common Int64FromString. Expected '%v'. Actual '%v'. Error: %s", expectedOutput, actualOutput, err) } var testByte []byte _, err = Int64FromString(testByte) if err == nil { - t.Error("Test failed. Common Int64FromString. Converted non-string.") + t.Error("Common Int64FromString. Converted non-string.") } testString = "1.41421356237" _, err = Int64FromString(testString) if err == nil { - t.Error("Test failed. Common Int64FromString. Converted invalid syntax.") + t.Error("Common Int64FromString. Converted invalid syntax.") } } @@ -84,14 +84,14 @@ func TestTimeFromUnixTimestampFloat(t *testing.T) { actualOutput, err := TimeFromUnixTimestampFloat(testTimestamp) if actualOutput.UTC().String() != expectedOutput.UTC().String() || err != nil { - t.Errorf("Test failed. Common TimeFromUnixTimestampFloat. Expected '%v'. Actual '%v'. Error: %s", + t.Errorf("Common TimeFromUnixTimestampFloat. Expected '%v'. Actual '%v'. Error: %s", expectedOutput, actualOutput, err) } testString := "Time" _, err = TimeFromUnixTimestampFloat(testString) if err == nil { - t.Error("Test failed. Common TimeFromUnixTimestampFloat. Converted invalid syntax.") + t.Error("Common TimeFromUnixTimestampFloat. Converted invalid syntax.") } } @@ -103,7 +103,7 @@ func TestUnixTimestampToTime(t *testing.T) { actualResult := UnixTimestampToTime(testTime) if tm.String() != actualResult.String() { t.Errorf( - "Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) + "Expected '%s'. Actual '%s'.", expectedOutput, actualResult) } } @@ -118,11 +118,11 @@ func TestUnixTimestampStrToTime(t *testing.T) { } if actualResult.UTC().String() != expectedOutput { t.Errorf( - "Test failed. Expected '%s'. Actual '%s'.", expectedOutput, actualResult) + "Expected '%s'. Actual '%s'.", expectedOutput, actualResult) } actualResult, err = UnixTimestampStrToTime(incorrectTime) if err == nil { - t.Error("Test failed. Common UnixTimestampStrToTime error") + t.Error("Common UnixTimestampStrToTime error") } } @@ -133,7 +133,7 @@ func TestUnixMillis(t *testing.T) { actualOutput := UnixMillis(testTime) if actualOutput != expectedOutput { - t.Errorf("Test failed. Common UnixMillis. Expected '%d'. Actual '%d'.", + t.Errorf("Common UnixMillis. Expected '%d'. Actual '%d'.", expectedOutput, actualOutput) } } @@ -145,7 +145,7 @@ func TestRecvWindow(t *testing.T) { actualOutput := RecvWindow(testTime) if actualOutput != expectedOutput { - t.Errorf("Test failed. Common RecvWindow. Expected '%d'. Actual '%d'", + t.Errorf("Common RecvWindow. Expected '%d'. Actual '%d'", expectedOutput, actualOutput) } } diff --git a/common/crypto/crypto_test.go b/common/crypto/crypto_test.go index 38f929e7..2db54953 100644 --- a/common/crypto/crypto_test.go +++ b/common/crypto/crypto_test.go @@ -11,7 +11,7 @@ func TestHexEncodeToString(t *testing.T) { expectedOutput := "737472696e67" actualResult := HexEncodeToString(originalInput) if actualResult != expectedOutput { - t.Errorf("Test failed. Expected '%s'. Actual '%s'", + t.Errorf("Expected '%s'. Actual '%s'", expectedOutput, actualResult) } } @@ -22,13 +22,13 @@ func TestBase64Decode(t *testing.T) { expectedOutput := []byte("hello") actualResult, err := Base64Decode(originalInput) if !bytes.Equal(actualResult, expectedOutput) { - t.Errorf("Test failed. Expected '%s'. Actual '%s'. Error: %s", + t.Errorf("Expected '%s'. Actual '%s'. Error: %s", expectedOutput, actualResult, err) } _, err = Base64Decode("-") if err == nil { - t.Error("Test failed. Bad base64 string failed returned nil error") + t.Error("Bad base64 string failed returned nil error") } } @@ -38,7 +38,7 @@ func TestBase64Encode(t *testing.T) { expectedOutput := "aGVsbG8=" actualResult := Base64Encode(originalInput) if actualResult != expectedOutput { - t.Errorf("Test failed. Expected '%s'. Actual '%s'", + t.Errorf("Expected '%s'. Actual '%s'", expectedOutput, actualResult) } } @@ -48,7 +48,7 @@ func TestGetRandomSalt(t *testing.T) { _, err := GetRandomSalt(nil, -1) if err == nil { - t.Fatal("Test failed. Expected err on negative salt length") + t.Fatal("Expected err on negative salt length") } salt, err := GetRandomSalt(nil, 10) @@ -57,7 +57,7 @@ func TestGetRandomSalt(t *testing.T) { } if len(salt) != 10 { - t.Fatal("Test failed. Expected salt of len=10") + t.Fatal("Expected salt of len=10") } salt, err = GetRandomSalt([]byte("RAWR"), 12) @@ -66,7 +66,7 @@ func TestGetRandomSalt(t *testing.T) { } if len(salt) != 16 { - t.Fatal("Test failed. Expected salt of len=16") + t.Fatal("Expected salt of len=16") } } @@ -77,7 +77,7 @@ func TestGetMD5(t *testing.T) { actualOutput := GetMD5(originalString) actualStr := HexEncodeToString(actualOutput) if !bytes.Equal(expectedOutput, []byte(actualStr)) { - t.Errorf("Test failed. Expected '%s'. Actual '%s'", + t.Errorf("Expected '%s'. Actual '%s'", expectedOutput, []byte(actualStr)) } @@ -92,7 +92,7 @@ func TestGetSHA512(t *testing.T) { actualOutput := GetSHA512(originalString) actualStr := HexEncodeToString(actualOutput) if !bytes.Equal(expectedOutput, []byte(actualStr)) { - t.Errorf("Test failed. Expected '%x'. Actual '%x'", + t.Errorf("Expected '%x'. Actual '%x'", expectedOutput, []byte(actualStr)) } } @@ -106,7 +106,7 @@ func TestGetSHA256(t *testing.T) { actualOutput := GetSHA256(originalString) actualStr := HexEncodeToString(actualOutput) if !bytes.Equal(expectedOutput, []byte(actualStr)) { - t.Errorf("Test failed. Expected '%x'. Actual '%x'", expectedOutput, + t.Errorf("Expected '%x'. Actual '%x'", expectedOutput, []byte(actualStr)) } } @@ -138,31 +138,31 @@ func TestGetHMAC(t *testing.T) { sha1 := GetHMAC(HashSHA1, []byte("Hello,World"), []byte("1234")) if string(sha1) != string(expectedSha1) { - t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", + t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'", expectedSha1, sha1, ) } sha256 := GetHMAC(HashSHA256, []byte("Hello,World"), []byte("1234")) if string(sha256) != string(expectedsha256) { - t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", + t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'", expectedsha256, sha256, ) } sha512 := GetHMAC(HashSHA512, []byte("Hello,World"), []byte("1234")) if string(sha512) != string(expectedsha512) { - t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", + t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'", expectedsha512, sha512, ) } sha512384 := GetHMAC(HashSHA512_384, []byte("Hello,World"), []byte("1234")) if string(sha512384) != string(expectedsha512384) { - t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", + t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'", expectedsha512384, sha512384, ) } md5 := GetHMAC(HashMD5, []byte("Hello World"), []byte("1234")) if string(md5) != string(expectedmd5) { - t.Errorf("Test failed. Common GetHMAC error: Expected '%x'. Actual '%x'", + t.Errorf("Common GetHMAC error: Expected '%x'. Actual '%x'", expectedmd5, md5, ) } @@ -174,7 +174,7 @@ func TestSha1Tohex(t *testing.T) { expectedResult := "fcfbfcd7d31d994ef660f6972399ab5d7a890149" actualResult := Sha1ToHex("Testing Sha1ToHex") if actualResult != expectedResult { - t.Errorf("Test failed. Expected '%s'. Actual '%s'", + t.Errorf("Expected '%s'. Actual '%s'", expectedResult, actualResult) } } diff --git a/common/math/math_test.go b/common/math/math_test.go index 93c43a21..37de7cdf 100644 --- a/common/math/math_test.go +++ b/common/math/math_test.go @@ -10,7 +10,7 @@ func TestCalculateFee(t *testing.T) { actualResult := CalculateFee(originalInput, fee) if expectedOutput != actualResult { t.Errorf( - "Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) + "Expected '%f'. Actual '%f'.", expectedOutput, actualResult) } } @@ -22,7 +22,7 @@ func TestCalculateAmountWithFee(t *testing.T) { actualResult := CalculateAmountWithFee(originalInput, fee) if expectedOutput != actualResult { t.Errorf( - "Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) + "Expected '%f'. Actual '%f'.", expectedOutput, actualResult) } } @@ -34,7 +34,7 @@ func TestCalculatePercentageGainOrLoss(t *testing.T) { actualResult := CalculatePercentageGainOrLoss(originalInput, secondInput) if expectedOutput != actualResult { t.Errorf( - "Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) + "Expected '%f'. Actual '%f'.", expectedOutput, actualResult) } } @@ -46,7 +46,7 @@ func TestCalculatePercentageDifference(t *testing.T) { actualResult := CalculatePercentageDifference(originalInput, secondAmount) if expectedOutput != actualResult { t.Errorf( - "Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) + "Expected '%f'. Actual '%f'.", expectedOutput, actualResult) } } @@ -60,7 +60,7 @@ func TestCalculateNetProfit(t *testing.T) { actualResult := CalculateNetProfit(amount, priceThen, priceNow, costs) if expectedOutput != actualResult { t.Errorf( - "Test failed. Expected '%f'. Actual '%f'.", expectedOutput, actualResult) + "Expected '%f'. Actual '%f'.", expectedOutput, actualResult) } } @@ -74,7 +74,7 @@ func TestRoundFloat(t *testing.T) { for testInput, expectedOutput := range testTable { actualOutput := RoundFloat(testInput, 2) if actualOutput != expectedOutput { - t.Errorf("Test failed. RoundFloat Expected '%f'. Actual '%f'.", + t.Errorf("RoundFloat Expected '%f'. Actual '%f'.", expectedOutput, actualOutput) } } diff --git a/communications/base/base_test.go b/communications/base/base_test.go index 71cb86cb..37f9613f 100644 --- a/communications/base/base_test.go +++ b/communications/base/base_test.go @@ -19,19 +19,19 @@ func TestStart(t *testing.T) { func TestIsEnabled(t *testing.T) { if !b.IsEnabled() { - t.Error("test failed - base IsEnabled() error") + t.Error("base IsEnabled() error") } } func TestIsConnected(t *testing.T) { if !b.IsConnected() { - t.Error("test failed - base IsConnected() error") + t.Error("base IsConnected() error") } } func TestGetName(t *testing.T) { if b.GetName() != "test" { - t.Error("test failed - base GetName() error") + t.Error("base GetName() error") } } diff --git a/communications/communications_test.go b/communications/communications_test.go index 2a145aab..cbc90dc5 100644 --- a/communications/communications_test.go +++ b/communications/communications_test.go @@ -23,7 +23,7 @@ func TestNewComm(t *testing.T) { } if len(communications.IComm) != 4 { - t.Errorf("Test failed, communications NewComm, expected len 4, got len %d", + t.Errorf("communications NewComm, expected len 4, got len %d", len(communications.IComm)) } } diff --git a/communications/slack/slack_test.go b/communications/slack/slack_test.go index 73eb850d..2e954165 100644 --- a/communications/slack/slack_test.go +++ b/communications/slack/slack_test.go @@ -54,7 +54,7 @@ func TestSetup(t *testing.T) { func TestConnect(t *testing.T) { err := s.Connect() if err == nil { - t.Error("test failed - slack Connect() error cannot be nil") + t.Error("slack Connect() error cannot be nil") } } @@ -62,7 +62,7 @@ func TestPushEvent(t *testing.T) { t.Parallel() err := s.PushEvent(base.Event{}) if err == nil { - t.Error("test failed - slack PushEvent() error cannot be nil") + t.Error("slack PushEvent() error cannot be nil") } } @@ -70,7 +70,7 @@ func TestBuildURL(t *testing.T) { t.Parallel() v := s.BuildURL("lol123") if v != "https://slack.com/api/rtm.start?token=lol123" { - t.Error("test failed - slack BuildURL() error") + t.Error("slack BuildURL() error") } } @@ -101,14 +101,14 @@ func TestGetChannelsString(t *testing.T) { } } if !testpassed { - t.Error("test failed - slack GetChannelsString() error") + t.Error("slack GetChannelsString() error") } } func TestGetUsernameByID(t *testing.T) { username := s.GetUsernameByID("1337") if username != "" { - t.Error("test failed - slack GetUsernameByID() error") + t.Error("slack GetUsernameByID() error") } s.Details.Users = append(s.Details.Users, struct { @@ -141,7 +141,7 @@ func TestGetUsernameByID(t *testing.T) { username = s.GetUsernameByID("1337") if username != "cranktakular" { - t.Error("test failed - slack GetUsernameByID() error") + t.Error("slack GetUsernameByID() error") } } @@ -149,7 +149,7 @@ func TestGetUsernameByID(t *testing.T) { func TestGetIDByName(t *testing.T) { id, err := s.GetIDByName("batman") if err == nil || id != "" { - t.Error("test failed - slack GetIDByName() error") + t.Error("slack GetIDByName() error") } s.Details.Groups = append(s.Details.Groups, group{ @@ -158,7 +158,7 @@ func TestGetIDByName(t *testing.T) { }) id, err = s.GetIDByName("this is a group") if err != nil || id != "210314" { - t.Errorf("test failed - slack GetIDByName() Expected '210314' Actual '%s' Error: %s", + t.Errorf("slack GetIDByName() Expected '210314' Actual '%s' Error: %s", id, err) } } @@ -166,7 +166,7 @@ func TestGetIDByName(t *testing.T) { func TestGetGroupIDByName(t *testing.T) { id, err := s.GetGroupIDByName("batman") if err == nil || id != "" { - t.Error("test failed - slack GetGroupIDByName() error") + t.Error("slack GetGroupIDByName() error") } s.Details.Groups = append(s.Details.Groups, group{ @@ -175,7 +175,7 @@ func TestGetGroupIDByName(t *testing.T) { }) id, err = s.GetGroupIDByName("another group") if err != nil || id != "11223344" { - t.Errorf("test failed - slack GetGroupIDByName() Expected '11223344' Actual '%s' Error: %s", + t.Errorf("slack GetGroupIDByName() Expected '11223344' Actual '%s' Error: %s", id, err) } @@ -184,7 +184,7 @@ func TestGetGroupIDByName(t *testing.T) { func TestGetChannelIDByName(t *testing.T) { id, err := s.GetChannelIDByName("1337") if err == nil || id != "" { - t.Error("test failed - slack GetChannelIDByName() error") + t.Error("slack GetChannelIDByName() error") } s.Details.Channels = append(s.Details.Channels, struct { @@ -208,7 +208,7 @@ func TestGetChannelIDByName(t *testing.T) { id, err = s.GetChannelIDByName("Slack Test") if err != nil || id != "2048" { - t.Errorf("test failed - slack GetChannelIDByName() Expected '2048' Actual '%s' Error: %s", + t.Errorf("slack GetChannelIDByName() Expected '2048' Actual '%s' Error: %s", id, err) } } @@ -216,7 +216,7 @@ func TestGetChannelIDByName(t *testing.T) { func TestGetUsersInGroup(t *testing.T) { username := s.GetUsersInGroup("supergroup") if len(username) != 0 { - t.Error("test failed - slack GetUsersInGroup() error") + t.Error("slack GetUsersInGroup() error") } s.Details.Groups = append(s.Details.Groups, group{ @@ -227,7 +227,7 @@ func TestGetUsersInGroup(t *testing.T) { username = s.GetUsersInGroup("three guys") if len(username) != 3 { - t.Errorf("test failed - slack GetUsersInGroup() Expected '3' Actual '%s'", + t.Errorf("slack GetUsersInGroup() Expected '3' Actual '%s'", username) } } @@ -235,14 +235,14 @@ func TestGetUsersInGroup(t *testing.T) { func TestNewConnection(t *testing.T) { err := s.NewConnection() if err == nil { - t.Error("test failed - slack NewConnection() error") + t.Error("slack NewConnection() error") } } func TestWebsocketConnect(t *testing.T) { err := s.WebsocketConnect() if err == nil { - t.Error("test failed - slack WebsocketConnect() error") + t.Error("slack WebsocketConnect() error") } } @@ -253,13 +253,13 @@ func TestHandlePresenceChange(t *testing.T) { err := s.handlePresenceChange([]byte(`{"malformedjson}`)) if err == nil { - t.Error("test failed - slack handlePresenceChange(), unmarshalled malformed json") + t.Error("slack handlePresenceChange(), unmarshalled malformed json") } data, _ := common.JSONEncode(pres) err = s.handlePresenceChange(data) if err != nil { - t.Errorf("test failed - slack handlePresenceChange() Error: %s", err) + t.Errorf("slack handlePresenceChange() Error: %s", err) } } @@ -269,7 +269,7 @@ func TestHandleMessageResponse(t *testing.T) { err := s.handleMessageResponse(nil, data) if err.Error() != "reply to is != 0" { - t.Errorf("test failed - slack handleMessageResponse(), Incorrect Error: %s", + t.Errorf("slack handleMessageResponse(), Incorrect Error: %s", err) } @@ -277,7 +277,7 @@ func TestHandleMessageResponse(t *testing.T) { err = s.handleMessageResponse([]byte(`{"malformedjson}`), data) if err == nil { - t.Error("test failed - slack handleMessageResponse(), unmarshalled malformed json") + t.Error("slack handleMessageResponse(), unmarshalled malformed json") } var msg Message @@ -287,7 +287,7 @@ func TestHandleMessageResponse(t *testing.T) { err = s.handleMessageResponse(resp, data) if err != nil { - t.Error("test failed - slack HandleMessage(), Sent message through nil websocket") + t.Error("slack HandleMessage(), Sent message through nil websocket") } msg.Text = "!notacommand" @@ -295,7 +295,7 @@ func TestHandleMessageResponse(t *testing.T) { err = s.handleMessageResponse(resp, data) if err == nil { - t.Errorf("test failed - slack handleMessageResponse() Error: %s", err) + t.Errorf("slack handleMessageResponse() Expected error") } } @@ -303,13 +303,13 @@ func TestHandleErrorResponse(t *testing.T) { var data WebsocketResponse err := s.handleErrorResponse(data) if err == nil { - t.Error("test failed - slack handleErrorResponse() Ignored strange input") + t.Error("slack handleErrorResponse() Ignored strange input") } data.Error.Msg = "Socket URL has expired" err = s.handleErrorResponse(data) if err == nil { - t.Error("test failed - slack handleErrorResponse() Didn't error on nil websocket") + t.Error("slack handleErrorResponse() Didn't error on nil websocket") } } @@ -320,7 +320,7 @@ func TestHandleHelloResponse(t *testing.T) { func TestHandleReconnectResponse(t *testing.T) { err := s.handleReconnectResponse([]byte(`{"malformedjson}`)) if err == nil { - t.Error("test failed - slack handleReconnectResponse(), unmarshalled malformed json") + t.Error("slack handleReconnectResponse(), unmarshalled malformed json") } var testURL struct { @@ -332,7 +332,7 @@ func TestHandleReconnectResponse(t *testing.T) { err = s.handleReconnectResponse(data) if err != nil || s.ReconnectURL != "https://www.thrasher.io" { - t.Errorf("test failed - slack handleReconnectResponse() Expected 'https://www.thrasher.io' Actual '%s' Error: %s", + t.Errorf("slack handleReconnectResponse() Expected 'https://www.thrasher.io' Actual '%s' Error: %s", s.ReconnectURL, err) } } @@ -340,7 +340,7 @@ func TestHandleReconnectResponse(t *testing.T) { func TestWebsocketSend(t *testing.T) { err := s.WebsocketSend("test", "Hello World!") if err == nil { - t.Error("test failed - slack WebsocketSend(), Sent message through nil websocket") + t.Error("slack WebsocketSend(), Sent message through nil websocket") } } @@ -348,16 +348,16 @@ func TestHandleMessage(t *testing.T) { msg := &Message{} err := s.HandleMessage(msg) if err == nil { - t.Error("test failed - slack HandleMessage(), Sent message through nil websocket") + t.Error("slack HandleMessage(), Sent message through nil websocket") } msg.Text = cmdStatus err = s.HandleMessage(msg) if err == nil { - t.Error("test failed - slack HandleMessage(), Sent message through nil websocket") + t.Error("slack HandleMessage(), Sent message through nil websocket") } msg.Text = cmdHelp err = s.HandleMessage(msg) if err == nil { - t.Error("test failed - slack HandleMessage(), Sent message through nil websocket") + t.Error("slack HandleMessage(), Sent message through nil websocket") } } diff --git a/communications/smsglobal/smsglobal_test.go b/communications/smsglobal/smsglobal_test.go index 2ffef201..0db1298f 100644 --- a/communications/smsglobal/smsglobal_test.go +++ b/communications/smsglobal/smsglobal_test.go @@ -22,82 +22,82 @@ func TestSetup(t *testing.T) { func TestConnect(t *testing.T) { err := s.Connect() if err != nil { - t.Error("test failed - SMSGlobal Connect() error", err) + t.Error("SMSGlobal Connect() error", err) } } func TestPushEvent(t *testing.T) { err := s.PushEvent(base.Event{}) if err != nil { - t.Error("test failed - SMSGlobal PushEvent() error", err) + t.Error("SMSGlobal PushEvent() error", err) } } func TestGetEnabledContacts(t *testing.T) { v := s.GetEnabledContacts() if v != 1 { - t.Error("test failed - SMSGlobal GetEnabledContacts() error") + t.Error("SMSGlobal GetEnabledContacts() error") } } func TestGetContactByNumber(t *testing.T) { _, err := s.GetContactByNumber("1231424") if err != nil { - t.Error("test failed - SMSGlobal GetContactByNumber() error", err) + t.Error("SMSGlobal GetContactByNumber() error", err) } _, err = s.GetContactByNumber("basketball") if err == nil { - t.Error("test failed - SMSGlobal GetContactByNumber() error") + t.Error("SMSGlobal GetContactByNumber() error") } } func TestGetContactByName(t *testing.T) { _, err := s.GetContactByName("StyleGherkin") if err != nil { - t.Error("test failed - SMSGlobal GetContactByName() error", err) + t.Error("SMSGlobal GetContactByName() error", err) } _, err = s.GetContactByName("blah") if err == nil { - t.Error("test failed - SMSGlobal GetContactByName() error") + t.Error("SMSGlobal GetContactByName() error") } } func TestAddContact(t *testing.T) { err := s.AddContact(Contact{Name: "bra", Number: "2876", Enabled: true}) if err != nil { - t.Error("test failed - SMSGlobal AddContact() error", err) + t.Error("SMSGlobal AddContact() error", err) } err = s.AddContact(Contact{Name: "StyleGherkin", Number: "1231424", Enabled: true}) if err == nil { - t.Error("test failed - SMSGlobal AddContact() error") + t.Error("SMSGlobal AddContact() error") } err = s.AddContact(Contact{Name: "", Number: "", Enabled: true}) if err == nil { - t.Error("test failed - SMSGlobal AddContact() error") + t.Error("SMSGlobal AddContact() error") } } func TestRemoveContact(t *testing.T) { err := s.RemoveContact(Contact{Name: "StyleGherkin", Number: "1231424", Enabled: true}) if err != nil { - t.Error("test failed - SMSGlobal RemoveContact() error", err) + t.Error("SMSGlobal RemoveContact() error", err) } err = s.RemoveContact(Contact{Name: "frieda", Number: "243453", Enabled: true}) if err == nil { - t.Error("test failed - SMSGlobal RemoveContact() error", err) + t.Error("SMSGlobal RemoveContact() Expected error") } } func TestSendMessageToAll(t *testing.T) { err := s.SendMessageToAll("Hello,World!") if err != nil { - t.Error("test failed - SMSGlobal SendMessageToAll() error", err) + t.Error("SMSGlobal SendMessageToAll() error", err) } } func TestSendMessage(t *testing.T) { err := s.SendMessage("1337", "Hello!") if err != nil { - t.Error("test failed - SMSGlobal SendMessage() error", err) + t.Error("SMSGlobal SendMessage() error", err) } } diff --git a/communications/smtpservice/smtpservice_test.go b/communications/smtpservice/smtpservice_test.go index 10124690..f1996348 100644 --- a/communications/smtpservice/smtpservice_test.go +++ b/communications/smtpservice/smtpservice_test.go @@ -22,24 +22,24 @@ func TestSetup(t *testing.T) { func TestConnect(t *testing.T) { err := s.Connect() if err != nil { - t.Error("test failed - smtpservice Connect() error", err) + t.Error("smtpservice Connect() error", err) } } func TestPushEvent(t *testing.T) { err := s.PushEvent(base.Event{}) if err == nil { - t.Error("test failed - smtpservice PushEvent() error cannot be nil") + t.Error("smtpservice PushEvent() error cannot be nil") } } func TestSend(t *testing.T) { err := s.Send("", "") if err == nil { - t.Error("test failed - smtpservice Send() error cannot be nil") + t.Error("smtpservice Send() error cannot be nil") } err = s.Send("subject", "alertmessage") if err == nil { - t.Error("test failed - smtpservice Send() error cannot be nil") + t.Error("smtpservice Send() error cannot be nil") } } diff --git a/communications/telegram/telegram_test.go b/communications/telegram/telegram_test.go index 0643037e..d50ba75e 100644 --- a/communications/telegram/telegram_test.go +++ b/communications/telegram/telegram_test.go @@ -22,7 +22,7 @@ func TestSetup(t *testing.T) { commsCfg := cfg.GetCommunicationsConfig() T.Setup(&commsCfg) if T.Name != "Telegram" || T.Enabled || T.Token != "testest" || T.Verbose { - t.Error("test failed - telegram Setup() error, unexpected setup values", + t.Error("telegram Setup() error, unexpected setup values", T.Name, T.Enabled, T.Token, @@ -33,19 +33,19 @@ func TestSetup(t *testing.T) { func TestConnect(t *testing.T) { err := T.Connect() if err == nil { - t.Error("test failed - telegram Connect() error") + t.Error("telegram Connect() error") } } func TestPushEvent(t *testing.T) { err := T.PushEvent(base.Event{}) if err != nil { - t.Error("test failed - telegram PushEvent() error", err) + t.Error("telegram PushEvent() error", err) } T.AuthorisedClients = append(T.AuthorisedClients, 1337) err = T.PushEvent(base.Event{}) if err.Error() != testErrNotFound { - t.Errorf("test failed - telegram PushEvent() error, expected 'Not found' got '%s'", + t.Errorf("telegram PushEvent() error, expected 'Not found' got '%s'", err) } } @@ -55,27 +55,27 @@ func TestHandleMessages(t *testing.T) { chatID := int64(1337) err := T.HandleMessages(cmdHelp, chatID) if err.Error() != testErrNotFound { - t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", + t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'", err) } err = T.HandleMessages(cmdStart, chatID) if err.Error() != testErrNotFound { - t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", + t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'", err) } err = T.HandleMessages(cmdStatus, chatID) if err.Error() != testErrNotFound { - t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", + t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'", err) } err = T.HandleMessages(cmdSettings, chatID) if err.Error() != testErrNotFound { - t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", + t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'", err) } err = T.HandleMessages("Not a command", chatID) if err.Error() != testErrNotFound { - t.Errorf("test failed - telegram HandleMessages() error, expected 'Not found' got '%s'", + t.Errorf("telegram HandleMessages() error, expected 'Not found' got '%s'", err) } } @@ -84,7 +84,7 @@ func TestGetUpdates(t *testing.T) { t.Parallel() _, err := T.GetUpdates() if err != nil { - t.Error("test failed - telegram GetUpdates() error", err) + t.Error("telegram GetUpdates() error", err) } } @@ -92,7 +92,7 @@ func TestTestConnection(t *testing.T) { t.Parallel() err := T.TestConnection() if err.Error() != testErrNotFound { - t.Errorf("test failed - telegram TestConnection() error, expected 'Not found' got '%s'", + t.Errorf("telegram TestConnection() error, expected 'Not found' got '%s'", err) } } @@ -101,7 +101,7 @@ func TestSendMessage(t *testing.T) { t.Parallel() err := T.SendMessage("Test message", int64(1337)) if err.Error() != testErrNotFound { - t.Errorf("test failed - telegram SendMessage() error, expected 'Not found' got '%s'", + t.Errorf("telegram SendMessage() error, expected 'Not found' got '%s'", err) } } @@ -110,6 +110,6 @@ func TestSendHTTPRequest(t *testing.T) { t.Parallel() err := T.SendHTTPRequest("0.0.0.0", nil, nil) if err == nil { - t.Error("test failed - telegram SendHTTPRequest() error") + t.Error("telegram SendHTTPRequest() error") } } diff --git a/config/config.go b/config/config.go index 27cdaf02..52373774 100644 --- a/config/config.go +++ b/config/config.go @@ -13,7 +13,6 @@ import ( "runtime" "strconv" "strings" - "sync" "time" "github.com/thrasher-corp/gocryptotrader/common" @@ -27,67 +26,6 @@ import ( log "github.com/thrasher-corp/gocryptotrader/logger" ) -// Constants declared here are filename strings and test strings -const ( - FXProviderFixer = "fixer" - EncryptedConfigFile = "config.dat" - ConfigFile = "config.json" - ConfigTestFile = "../testdata/configtest.json" - configFileEncryptionPrompt = 0 - configFileEncryptionEnabled = 1 - configFileEncryptionDisabled = -1 - configPairsLastUpdatedWarningThreshold = 30 // 30 days - configDefaultHTTPTimeout = time.Second * 15 - configDefaultWebsocketResponseCheckTimeout = time.Millisecond * 30 - configDefaultWebsocketResponseMaxLimit = time.Second * 7 - configDefaultWebsocketOrderbookBufferLimit = 5 - configDefaultWebsocketTrafficTimeout = time.Second * 30 - configMaxAuthFailures = 3 - defaultNTPAllowedDifference = 50000000 - defaultNTPAllowedNegativeDifference = 50000000 - - DefaultAPIKey = "Key" - DefaultAPISecret = "Secret" - DefaultAPIClientID = "ClientID" -) - -// Constants here hold some messages -const ( - ErrExchangeNameEmpty = "exchange #%d name is empty" - ErrExchangeAvailablePairsEmpty = "exchange %s available pairs is empty" - ErrExchangeEnabledPairsEmpty = "exchange %s enabled pairs is empty" - ErrExchangeBaseCurrenciesEmpty = "exchange %s base currencies is empty" - ErrExchangeNotFound = "exchange %s not found" - ErrNoEnabledExchanges = "no exchanges enabled" - ErrCryptocurrenciesEmpty = "cryptocurrencies variable is empty" - ErrFailureOpeningConfig = "fatal error opening %s file. Error: %s" - ErrCheckingConfigValues = "fatal error checking config values. Error: %s" - ErrSavingConfigBytesMismatch = "config file %q bytes comparison doesn't match, read %s expected %s" - WarningWebserverCredentialValuesEmpty = "webserver support disabled due to empty Username/Password values" - WarningWebserverListenAddressInvalid = "webserver support disabled due to invalid listen address" - WarningExchangeAuthAPIDefaultOrEmptyValues = "exchange %s authenticated API support disabled due to default/empty APIKey/Secret/ClientID values" - WarningPairsLastUpdatedThresholdExceeded = "exchange %s last manual update of available currency pairs has exceeded %d days. Manual update required!" -) - -// Constants here define unset default values displayed in the config.json -// file -const ( - APIURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_EXCHANGE_API" - WebsocketURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_WEBSOCKET_EXCHANGE_API" - DefaultUnsetAPIKey = "Key" - DefaultUnsetAPISecret = "Secret" - DefaultUnsetAccountPlan = "accountPlan" - DefaultForexProviderExchangeRatesAPI = "ExchangeRates" -) - -// Variables here are used for configuration -var ( - Cfg Config - IsInitialSetup bool - testBypass bool - m sync.Mutex -) - // GetCurrencyConfig returns currency configurations func (c *Config) GetCurrencyConfig() CurrencyConfig { return c.Currency @@ -982,14 +920,14 @@ func (c *Config) CheckExchangeConfigValues() error { } if !c.Exchanges[i].Features.Supports.RESTCapabilities.AutoPairUpdates && !c.Exchanges[i].Features.Supports.WebsocketCapabilities.AutoPairUpdates { lastUpdated := convert.UnixTimestampToTime(c.Exchanges[i].CurrencyPairs.LastUpdated) - lastUpdated = lastUpdated.AddDate(0, 0, configPairsLastUpdatedWarningThreshold) + lastUpdated = lastUpdated.AddDate(0, 0, pairsLastUpdatedWarningThreshold) if lastUpdated.Unix() <= time.Now().Unix() { - log.Warnf(log.ExchangeSys, WarningPairsLastUpdatedThresholdExceeded, c.Exchanges[i].Name, configPairsLastUpdatedWarningThreshold) + log.Warnf(log.ExchangeSys, WarningPairsLastUpdatedThresholdExceeded, c.Exchanges[i].Name, pairsLastUpdatedWarningThreshold) } } if c.Exchanges[i].HTTPTimeout <= 0 { - log.Warnf(log.ExchangeSys, "Exchange %s HTTP Timeout value not set, defaulting to %v.\n", c.Exchanges[i].Name, configDefaultHTTPTimeout) - c.Exchanges[i].HTTPTimeout = configDefaultHTTPTimeout + log.Warnf(log.ExchangeSys, "Exchange %s HTTP Timeout value not set, defaulting to %v.\n", c.Exchanges[i].Name, defaultHTTPTimeout) + c.Exchanges[i].HTTPTimeout = defaultHTTPTimeout } if c.Exchanges[i].HTTPRateLimiter != nil { @@ -1016,24 +954,24 @@ func (c *Config) CheckExchangeConfigValues() error { if c.Exchanges[i].WebsocketResponseCheckTimeout <= 0 { log.Warnf(log.ExchangeSys, "Exchange %s Websocket response check timeout value not set, defaulting to %v.", - c.Exchanges[i].Name, configDefaultWebsocketResponseCheckTimeout) - c.Exchanges[i].WebsocketResponseCheckTimeout = configDefaultWebsocketResponseCheckTimeout + c.Exchanges[i].Name, defaultWebsocketResponseCheckTimeout) + c.Exchanges[i].WebsocketResponseCheckTimeout = defaultWebsocketResponseCheckTimeout } if c.Exchanges[i].WebsocketResponseMaxLimit <= 0 { log.Warnf(log.ExchangeSys, "Exchange %s Websocket response max limit value not set, defaulting to %v.", - c.Exchanges[i].Name, configDefaultWebsocketResponseMaxLimit) - c.Exchanges[i].WebsocketResponseMaxLimit = configDefaultWebsocketResponseMaxLimit + c.Exchanges[i].Name, defaultWebsocketResponseMaxLimit) + c.Exchanges[i].WebsocketResponseMaxLimit = defaultWebsocketResponseMaxLimit } if c.Exchanges[i].WebsocketTrafficTimeout <= 0 { log.Warnf(log.ExchangeSys, "Exchange %s Websocket response traffic timeout value not set, defaulting to %v.", - c.Exchanges[i].Name, configDefaultWebsocketTrafficTimeout) - c.Exchanges[i].WebsocketTrafficTimeout = configDefaultWebsocketTrafficTimeout + c.Exchanges[i].Name, defaultWebsocketTrafficTimeout) + c.Exchanges[i].WebsocketTrafficTimeout = defaultWebsocketTrafficTimeout } if c.Exchanges[i].WebsocketOrderbookBufferLimit <= 0 { log.Warnf(log.ExchangeSys, "Exchange %s Websocket orderbook buffer limit value not set, defaulting to %v.", - c.Exchanges[i].Name, configDefaultWebsocketOrderbookBufferLimit) - c.Exchanges[i].WebsocketOrderbookBufferLimit = configDefaultWebsocketOrderbookBufferLimit + c.Exchanges[i].Name, defaultWebsocketOrderbookBufferLimit) + c.Exchanges[i].WebsocketOrderbookBufferLimit = defaultWebsocketOrderbookBufferLimit } err := c.CheckPairConsistency(c.Exchanges[i].Name) if err != nil { @@ -1065,10 +1003,7 @@ func (c *Config) CheckExchangeConfigValues() error { // CheckCurrencyConfigValues checks to see if the currency config values are correct or not func (c *Config) CheckCurrencyConfigValues() error { - fxProviders := forexprovider.GetAvailableForexProviders() - if len(fxProviders) == 0 { - return errors.New("no forex providers available") - } + fxProviders := forexprovider.GetSupportedForexProviders() if len(fxProviders) != len(c.Currency.ForexProviders) { for x := range fxProviders { @@ -1088,27 +1023,25 @@ func (c *Config) CheckCurrencyConfigValues() error { count := 0 for i := range c.Currency.ForexProviders { if c.Currency.ForexProviders[i].Enabled { - if c.Currency.ForexProviders[i].APIKey == DefaultUnsetAPIKey && c.Currency.ForexProviders[i].Name != DefaultForexProviderExchangeRatesAPI { + if c.Currency.ForexProviders[i].Name == "CurrencyConverter" && + c.Currency.ForexProviders[i].PrimaryProvider && + (c.Currency.ForexProviders[i].APIKey == "" || + c.Currency.ForexProviders[i].APIKey == DefaultUnsetAPIKey) { + log.Warnln(log.Global, "CurrencyConverter forex provider no longer supports unset API key requests. Switching to ExchangeRates FX provider..") + c.Currency.ForexProviders[i].Enabled = false + c.Currency.ForexProviders[i].PrimaryProvider = false + c.Currency.ForexProviders[i].APIKey = DefaultUnsetAPIKey + c.Currency.ForexProviders[i].APIKeyLvl = -1 + continue + } + if c.Currency.ForexProviders[i].APIKey == DefaultUnsetAPIKey && + c.Currency.ForexProviders[i].Name != DefaultForexProviderExchangeRatesAPI { log.Warnf(log.Global, "%s enabled forex provider API key not set. Please set this in your config.json file\n", c.Currency.ForexProviders[i].Name) c.Currency.ForexProviders[i].Enabled = false c.Currency.ForexProviders[i].PrimaryProvider = false continue } - if c.Currency.ForexProviders[i].Name == "CurrencyConverter" { - if c.Currency.ForexProviders[i].Enabled && - c.Currency.ForexProviders[i].PrimaryProvider && - (c.Currency.ForexProviders[i].APIKey == "" || - c.Currency.ForexProviders[i].APIKey == DefaultUnsetAPIKey) { - log.Warnln(log.Global, "CurrencyConverter forex provider no longer supports unset API key requests. Switching to ExchangeRates FX provider..") - c.Currency.ForexProviders[i].Enabled = false - c.Currency.ForexProviders[i].PrimaryProvider = false - c.Currency.ForexProviders[i].APIKey = DefaultUnsetAPIKey - c.Currency.ForexProviders[i].APIKeyLvl = -1 - continue - } - } - if c.Currency.ForexProviders[i].APIKeyLvl == -1 && c.Currency.ForexProviders[i].Name != DefaultForexProviderExchangeRatesAPI { log.Warnf(log.Global, "%s APIKey Level not set, functions limited. Please set this in your config.json file\n", c.Currency.ForexProviders[i].Name) @@ -1406,7 +1339,7 @@ func GetFilePath(file string) (string, error) { } if flag.Lookup("test.v") != nil && !testBypass { - return ConfigTestFile, nil + return TestFile, nil } exePath, err := common.GetExecutablePath() @@ -1415,8 +1348,8 @@ func GetFilePath(file string) (string, error) { } oldDirs := []string{ - filepath.Join(exePath, ConfigFile), - filepath.Join(exePath, EncryptedConfigFile), + filepath.Join(exePath, File), + filepath.Join(exePath, EncryptedFile), } newDir := common.GetDefaultDataDir(runtime.GOOS) @@ -1425,8 +1358,8 @@ func GetFilePath(file string) (string, error) { return "", err } newDirs := []string{ - filepath.Join(newDir, ConfigFile), - filepath.Join(newDir, EncryptedConfigFile), + filepath.Join(newDir, File), + filepath.Join(newDir, EncryptedFile), } // First upgrade the old dir config file if it exists to the corresponding @@ -1522,23 +1455,23 @@ func (c *Config) ReadConfig(configPath string, dryrun bool) error { return err } - if c.EncryptConfig == configFileEncryptionDisabled { + if c.EncryptConfig == fileEncryptionDisabled { return nil } - if c.EncryptConfig == configFileEncryptionPrompt { + if c.EncryptConfig == fileEncryptionPrompt { m.Lock() IsInitialSetup = true m.Unlock() if c.PromptForConfigEncryption(configPath, dryrun) { - c.EncryptConfig = configFileEncryptionEnabled + c.EncryptConfig = fileEncryptionEnabled return c.SaveConfig(defaultPath, dryrun) } } } else { errCounter := 0 for { - if errCounter >= configMaxAuthFailures { + if errCounter >= maxAuthFailures { return errors.New("failed to decrypt config after 3 attempts") } key, err := PromptForConfigKey(IsInitialSetup) @@ -1559,7 +1492,7 @@ func (c *Config) ReadConfig(configPath string, dryrun bool) error { err = ConfirmConfigJSON(data, &c) if err != nil { - if errCounter < configMaxAuthFailures { + if errCounter < maxAuthFailures { log.Error(log.ConfigMgr, "Invalid password.") } errCounter++ @@ -1587,7 +1520,7 @@ func (c *Config) SaveConfig(configPath string, dryrun bool) error { return err } - if c.EncryptConfig == configFileEncryptionEnabled { + if c.EncryptConfig == fileEncryptionEnabled { var key []byte if IsInitialSetup { @@ -1678,8 +1611,8 @@ func (c *Config) CheckConfig() error { } if c.GlobalHTTPTimeout <= 0 { - log.Warnf(log.ConfigMgr, "Global HTTP Timeout value not set, defaulting to %v.\n", configDefaultHTTPTimeout) - c.GlobalHTTPTimeout = configDefaultHTTPTimeout + log.Warnf(log.ConfigMgr, "Global HTTP Timeout value not set, defaulting to %v.\n", defaultHTTPTimeout) + c.GlobalHTTPTimeout = defaultHTTPTimeout } if c.NTPClient.Level != 0 { diff --git a/config/config_encryption.go b/config/config_encryption.go index c15fefdc..6ec7d3d4 100644 --- a/config/config_encryption.go +++ b/config/config_encryption.go @@ -43,7 +43,7 @@ func (c *Config) PromptForConfigEncryption(configPath string, dryrun bool) bool } if !common.YesOrNo(input) { - c.EncryptConfig = configFileEncryptionDisabled + c.EncryptConfig = fileEncryptionDisabled err := c.SaveConfig(configPath, dryrun) if err != nil { log.Errorf(log.ConfigMgr, "cannot save config %s", err) diff --git a/config/config_encryption_test.go b/config/config_encryption_test.go index 0088c881..3eabe392 100644 --- a/config/config_encryption_test.go +++ b/config/config_encryption_test.go @@ -9,7 +9,7 @@ func TestPromptForConfigEncryption(t *testing.T) { t.Parallel() if Cfg.PromptForConfigEncryption("", true) { - t.Error("Test failed. PromptForConfigEncryption return incorrect bool") + t.Error("PromptForConfigEncryption return incorrect bool") } } @@ -18,25 +18,25 @@ func TestPromptForConfigKey(t *testing.T) { byteyBite, err := PromptForConfigKey(true) if err == nil && len(byteyBite) > 1 { - t.Errorf("Test failed. PromptForConfigKey: %s", err) + t.Errorf("PromptForConfigKey: %s", err) } _, err = PromptForConfigKey(false) if err == nil { - t.Fatal(err) + t.Error("Expected error") } } func TestEncryptConfigFile(t *testing.T) { _, err := EncryptConfigFile([]byte("test"), nil) if err == nil { - t.Fatal("Test failed. Expected different result") + t.Fatal("Expected error") } sessionDK = []byte("a") _, err = EncryptConfigFile([]byte("test"), nil) if err == nil { - t.Fatal("Test failed. Expected different result") + t.Fatal("Expected error") } sessionDK, err = makeNewSessionDK([]byte("asdf")) @@ -60,17 +60,17 @@ func TestDecryptConfigFile(t *testing.T) { _, err = DecryptConfigFile(result, nil) if err == nil { - t.Fatal("Test failed. Expected different result") + t.Fatal("Expected error") } _, err = DecryptConfigFile([]byte("test"), nil) if err == nil { - t.Fatal("Test failed. Expected different result") + t.Fatal("Expected error") } _, err = DecryptConfigFile([]byte("test"), []byte("AAAAAAAAAAAAAAAA")) if err == nil { - t.Fatalf("Test failed. Expected %s", errAESBlockSize) + t.Fatalf("Expected %s", errAESBlockSize) } result, err = EncryptConfigFile([]byte("test"), []byte("key")) @@ -86,14 +86,14 @@ func TestDecryptConfigFile(t *testing.T) { func TestConfirmConfigJSON(t *testing.T) { var result interface{} - testConfirmJSON, err := ioutil.ReadFile(ConfigTestFile) + testConfirmJSON, err := ioutil.ReadFile(TestFile) if err != nil { - t.Errorf("Test failed. testConfirmJSON: %s", err) + t.Errorf("testConfirmJSON: %s", err) } err = ConfirmConfigJSON(testConfirmJSON, &result) if err != nil || result == nil { - t.Errorf("Test failed. testConfirmJSON: %s", err) + t.Errorf("testConfirmJSON: %s", err) } } @@ -102,7 +102,7 @@ func TestConfirmECS(t *testing.T) { ECStest := []byte(EncryptConfirmString) if !ConfirmECS(ECStest) { - t.Errorf("Test failed. TestConfirmECS: Error finding ECS.") + t.Errorf("TestConfirmECS: Error finding ECS.") } } @@ -113,7 +113,7 @@ func TestRemoveECS(t *testing.T) { isremoved := RemoveECS(ECStest) if string(isremoved) != "" { - t.Errorf("Test failed. TestConfirmECS: Error ECS not deleted.") + t.Errorf("TestConfirmECS: Error ECS not deleted.") } } @@ -122,6 +122,6 @@ func TestMakeNewSessionDK(t *testing.T) { _, err := makeNewSessionDK(nil) if err == nil { - t.Fatal("Test failed. makeNewSessionDK passed with nil key") + t.Fatal("makeNewSessionDK passed with nil key") } } diff --git a/config/config_test.go b/config/config_test.go index 073ea166..984f013e 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -22,40 +22,40 @@ const ( func TestGetCurrencyConfig(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. GetCurrencyConfig LoadConfig error", err) + t.Error("GetCurrencyConfig LoadConfig error", err) } _ = cfg.GetCurrencyConfig() } func TestGetExchangeBankAccounts(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. GetExchangeBankAccounts LoadConfig error", err) + t.Error("GetExchangeBankAccounts LoadConfig error", err) } _, err = cfg.GetExchangeBankAccounts("Bitfinex", "USD") if err != nil { - t.Error("Test failed. GetExchangeBankAccounts error", err) + t.Error("GetExchangeBankAccounts error", err) } _, err = cfg.GetExchangeBankAccounts("Not an exchange", "Not a currency") if err == nil { - t.Error("Test failed. GetExchangeBankAccounts, no error returned for invalid exchange") + t.Error("GetExchangeBankAccounts, no error returned for invalid exchange") } } func TestUpdateExchangeBankAccounts(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. UpdateExchangeBankAccounts LoadConfig error", err) + t.Error("UpdateExchangeBankAccounts LoadConfig error", err) } b := []BankAccount{{Enabled: false}} err = cfg.UpdateExchangeBankAccounts("Bitfinex", b) if err != nil { - t.Error("Test failed. UpdateExchangeBankAccounts error", err) + t.Error("UpdateExchangeBankAccounts error", err) } var count int for _, exch := range cfg.Exchanges { @@ -66,50 +66,50 @@ func TestUpdateExchangeBankAccounts(t *testing.T) { } } if count != 1 { - t.Error("Test failed. UpdateExchangeBankAccounts error") + t.Error("UpdateExchangeBankAccounts error") } err = cfg.UpdateExchangeBankAccounts("Not an exchange", b) if err == nil { - t.Error("Test failed. UpdateExchangeBankAccounts, no error returned for invalid exchange") + t.Error("UpdateExchangeBankAccounts, no error returned for invalid exchange") } } func TestGetClientBankAccounts(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. GetClientBankAccounts LoadConfig error", err) + t.Error("GetClientBankAccounts LoadConfig error", err) } _, err = cfg.GetClientBankAccounts("Kraken", "USD") if err != nil { - t.Error("Test failed. GetClientBankAccounts error", err) + t.Error("GetClientBankAccounts error", err) } _, err = cfg.GetClientBankAccounts("Bla", "USD") if err == nil { - t.Error("Test failed. GetClientBankAccounts error") + t.Error("GetClientBankAccounts error") } _, err = cfg.GetClientBankAccounts("Kraken", "JPY") if err == nil { - t.Error("Test failed. GetClientBankAccounts error", err) + t.Error("GetClientBankAccounts Expected error") } } func TestUpdateClientBankAccounts(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. UpdateClientBankAccounts LoadConfig error", err) + t.Error("UpdateClientBankAccounts LoadConfig error", err) } b := BankAccount{Enabled: false, BankName: "test", AccountNumber: "0234"} err = cfg.UpdateClientBankAccounts(&b) if err != nil { - t.Error("Test failed. UpdateClientBankAccounts error", err) + t.Error("UpdateClientBankAccounts error", err) } err = cfg.UpdateClientBankAccounts(&BankAccount{}) if err == nil { - t.Error("Test failed. UpdateClientBankAccounts error") + t.Error("UpdateClientBankAccounts error") } var count int @@ -121,21 +121,21 @@ func TestUpdateClientBankAccounts(t *testing.T) { } } if count != 1 { - t.Error("Test failed. UpdateClientBankAccounts error") + t.Error("UpdateClientBankAccounts error") } } func TestCheckClientBankAccounts(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. CheckClientBankAccounts LoadConfig error", err) + t.Error("CheckClientBankAccounts LoadConfig error", err) } cfg.BankAccounts = nil cfg.CheckClientBankAccounts() if len(cfg.BankAccounts) == 0 { - t.Error("Test failed. CheckClientBankAccounts error:", err) + t.Error("CheckClientBankAccounts error:", err) } cfg.BankAccounts = nil @@ -262,45 +262,45 @@ func TestPurgeExchangeCredentials(t *testing.T) { func TestGetCommunicationsConfig(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. GetCommunicationsConfig LoadConfig error", err) + t.Error("GetCommunicationsConfig LoadConfig error", err) } _ = cfg.GetCommunicationsConfig() } func TestUpdateCommunicationsConfig(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. UpdateCommunicationsConfig LoadConfig error", err) + t.Error("UpdateCommunicationsConfig LoadConfig error", err) } cfg.UpdateCommunicationsConfig(&CommunicationsConfig{SlackConfig: SlackConfig{Name: "TEST"}}) if cfg.Communications.SlackConfig.Name != "TEST" { - t.Error("Test failed. UpdateCommunicationsConfig LoadConfig error") + t.Error("UpdateCommunicationsConfig LoadConfig error") } } func TestGetCryptocurrencyProviderConfig(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. GetCryptocurrencyProviderConfig LoadConfig error", err) + t.Error("GetCryptocurrencyProviderConfig LoadConfig error", err) } _ = cfg.GetCryptocurrencyProviderConfig() } func TestUpdateCryptocurrencyProviderConfig(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. UpdateCryptocurrencyProviderConfig LoadConfig error", err) + t.Error("UpdateCryptocurrencyProviderConfig LoadConfig error", err) } orig := cfg.GetCryptocurrencyProviderConfig() cfg.UpdateCryptocurrencyProviderConfig(CryptocurrencyProvider{Name: "SERIOUS TESTING PROCEDURE!"}) if cfg.Currency.CryptocurrencyProvider.Name != "SERIOUS TESTING PROCEDURE!" { - t.Error("Test failed. UpdateCurrencyProviderConfig LoadConfig error") + t.Error("UpdateCurrencyProviderConfig LoadConfig error") } cfg.UpdateCryptocurrencyProviderConfig(orig) @@ -308,9 +308,9 @@ func TestUpdateCryptocurrencyProviderConfig(t *testing.T) { func TestCheckCommunicationsConfig(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. CheckCommunicationsConfig LoadConfig error", err) + t.Error("CheckCommunicationsConfig LoadConfig error", err) } cfg.Communications = CommunicationsConfig{} @@ -319,7 +319,7 @@ func TestCheckCommunicationsConfig(t *testing.T) { cfg.Communications.SMSGlobalConfig.Name != "SMSGlobal" || cfg.Communications.SMTPConfig.Name != "SMTP" || cfg.Communications.TelegramConfig.Name != "Telegram" { - t.Error("Test failed. CheckCommunicationsConfig unexpected data:", + t.Error("CheckCommunicationsConfig unexpected data:", cfg.Communications) } @@ -327,7 +327,7 @@ func TestCheckCommunicationsConfig(t *testing.T) { cfg.Communications.SMSGlobalConfig.Name = "" cfg.CheckCommunicationsConfig() if cfg.Communications.SMSGlobalConfig.Password != "test" { - t.Error("Test failed. CheckCommunicationsConfig error:", err) + t.Error("CheckCommunicationsConfig error:", err) } cfg.SMS.Contacts = append(cfg.SMS.Contacts, SMSContact{ @@ -338,25 +338,25 @@ func TestCheckCommunicationsConfig(t *testing.T) { cfg.Communications.SMSGlobalConfig.Name = "" cfg.CheckCommunicationsConfig() if cfg.Communications.SMSGlobalConfig.Contacts[0].Name != "Bobby" { - t.Error("Test failed. CheckCommunicationsConfig error:", err) + t.Error("CheckCommunicationsConfig error:", err) } cfg.Communications.SMSGlobalConfig.From = "" cfg.CheckCommunicationsConfig() if cfg.Communications.SMSGlobalConfig.From != cfg.Name { - t.Error("Test failed. CheckCommunicationsConfig From value should of been set to the config name") + t.Error("CheckCommunicationsConfig From value should have been set to the config name") } cfg.Communications.SMSGlobalConfig.From = "aaaaaaaaaaaaaaaaaaa" cfg.CheckCommunicationsConfig() if cfg.Communications.SMSGlobalConfig.From != "aaaaaaaaaaa" { - t.Error("Test failed. CheckCommunicationsConfig From value should of been trimmed to 11 characters") + t.Error("CheckCommunicationsConfig From value should have been trimmed to 11 characters") } cfg.SMS = &SMSGlobalConfig{} cfg.CheckCommunicationsConfig() if cfg.SMS != nil { - t.Error("Test failed. CheckCommunicationsConfig unexpected data:", + t.Error("CheckCommunicationsConfig unexpected data:", cfg.SMS) } @@ -367,7 +367,7 @@ func TestCheckCommunicationsConfig(t *testing.T) { cfg.Communications.SlackConfig.Enabled = true cfg.CheckCommunicationsConfig() if cfg.Communications.SlackConfig.Enabled { - t.Error("Test failed. CheckCommunicationsConfig Slack is enabled when it shouldn't be.") + t.Error("CheckCommunicationsConfig Slack is enabled when it shouldn't be.") } cfg.Communications.SlackConfig.Enabled = false @@ -375,7 +375,7 @@ func TestCheckCommunicationsConfig(t *testing.T) { cfg.Communications.SMSGlobalConfig.Password = "" cfg.CheckCommunicationsConfig() if cfg.Communications.SlackConfig.Enabled { - t.Error("Test failed. CheckCommunicationsConfig SMSGlobal is enabled when it shouldn't be.") + t.Error("CheckCommunicationsConfig SMSGlobal is enabled when it shouldn't be.") } cfg.Communications.SMSGlobalConfig.Enabled = false @@ -383,7 +383,7 @@ func TestCheckCommunicationsConfig(t *testing.T) { cfg.Communications.SMTPConfig.AccountPassword = "" cfg.CheckCommunicationsConfig() if cfg.Communications.SlackConfig.Enabled { - t.Error("Test failed. CheckCommunicationsConfig SMTPConfig is enabled when it shouldn't be.") + t.Error("CheckCommunicationsConfig SMTPConfig is enabled when it shouldn't be.") } cfg.Communications.SMTPConfig.Enabled = false @@ -391,7 +391,7 @@ func TestCheckCommunicationsConfig(t *testing.T) { cfg.Communications.TelegramConfig.VerificationToken = "" cfg.CheckCommunicationsConfig() if cfg.Communications.TelegramConfig.Enabled { - t.Error("Test failed. CheckCommunicationsConfig TelegramConfig is enabled when it shouldn't be.") + t.Error("CheckCommunicationsConfig TelegramConfig is enabled when it shouldn't be.") } } @@ -400,7 +400,7 @@ func TestGetExchangeAssetTypes(t *testing.T) { var c Config _, err := c.GetExchangeAssetTypes("void") if err == nil { - t.Error("err should of been thrown on a non-existent exchange") + t.Error("err should have been thrown on a non-existent exchange") } c.Exchanges = append(c.Exchanges, @@ -428,7 +428,7 @@ func TestGetExchangeAssetTypes(t *testing.T) { c.Exchanges[0].CurrencyPairs = nil _, err = c.GetExchangeAssetTypes(testFakeExchangeName) if err == nil { - t.Error("a nil pair manager should throw an error") + t.Error("Expected error from nil currency pair") } } @@ -437,7 +437,7 @@ func TestSupportsExchangeAssetType(t *testing.T) { var c Config _, err := c.SupportsExchangeAssetType("void", asset.Spot) if err == nil { - t.Error("unexpected result for non-existent exchange") + t.Error("Expected error for non-existent exchange") } c.Exchanges = append(c.Exchanges, @@ -463,13 +463,13 @@ func TestSupportsExchangeAssetType(t *testing.T) { _, err = c.SupportsExchangeAssetType(testFakeExchangeName, "asdf") if err == nil { - t.Error("invalid asset item should throw an error") + t.Error("Expected error from invalid asset item") } c.Exchanges[0].CurrencyPairs = nil _, err = c.SupportsExchangeAssetType(testFakeExchangeName, asset.Spot) if err == nil { - t.Error("a nil pair manager should throw an error") + t.Error("Expected error from nil pair manager") } } @@ -507,7 +507,7 @@ func TestCheckExchangeAssetsConsistency(t *testing.T) { } if supports { - t.Error("perpetual contract should of been removed from the pair manager") + t.Error("perpetual contract should have been removed from the pair manager") } } @@ -522,12 +522,12 @@ func TestSetPairs(t *testing.T) { err := c.SetPairs("asdf", asset.Spot, true, nil) if err == nil { - t.Error("nil pairs should throw an error") + t.Error("Expected error from nil pairs") } err = c.SetPairs("asdf", asset.Spot, true, pairs) if err == nil { - t.Error("non-existent exchange should throw an error") + t.Error("Expected error from non-existent exchange") } c.Exchanges = append(c.Exchanges, @@ -538,7 +538,7 @@ func TestSetPairs(t *testing.T) { err = c.SetPairs(testFakeExchangeName, asset.Index, true, pairs) if err == nil { - t.Error("non initialised pair manager should throw an error") + t.Error("Expected error from non initialised pair manager") } c.Exchanges[0].CurrencyPairs = ¤cy.PairsManager{ @@ -550,7 +550,7 @@ func TestSetPairs(t *testing.T) { err = c.SetPairs(testFakeExchangeName, asset.Index, true, pairs) if err == nil { - t.Error("non supported asset type should throw an error") + t.Error("Expected error from non supported asset type") } err = c.SetPairs(testFakeExchangeName, asset.Spot, true, pairs) @@ -565,7 +565,7 @@ func TestGetCurrencyPairConfig(t *testing.T) { var c Config _, err := c.GetCurrencyPairConfig("asdfg", asset.Spot) if err == nil { - t.Error("expected error with non-existent exchange") + t.Error("Expected error with non-existent exchange") } c.Exchanges = append(c.Exchanges, @@ -576,7 +576,7 @@ func TestGetCurrencyPairConfig(t *testing.T) { _, err = c.GetCurrencyPairConfig(testFakeExchangeName, asset.Index) if err == nil { - t.Error("expected error with nil currency pair store") + t.Error("Expected error with nil currency pair store") } pm := ¤cy.PairsManager{ @@ -601,7 +601,7 @@ func TestGetCurrencyPairConfig(t *testing.T) { c.Exchanges[0].CurrencyPairs = pm _, err = c.GetCurrencyPairConfig(testFakeExchangeName, asset.Index) if err == nil { - t.Error("expected error with unsupported asset") + t.Error("Expected error with unsupported asset") } var p *currency.PairStore @@ -782,10 +782,10 @@ func TestCheckPairConsistency(t *testing.T) { func TestSupportsPair(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { t.Errorf( - "Test failed. TestSupportsPair. LoadConfig Error: %s", err.Error(), + "TestSupportsPair. LoadConfig Error: %s", err.Error(), ) } @@ -794,7 +794,7 @@ func TestSupportsPair(t *testing.T) { currency.NewPair(currency.BTC, currency.USD), assetType) if err == nil { t.Error( - "Test failed. TestSupportsPair. Non-existent exchange returned nil error", + "TestSupportsPair. Expected error from Non-existent exchange", ) } @@ -802,7 +802,7 @@ func TestSupportsPair(t *testing.T) { currency.NewPair(currency.BTC, currency.USD), assetType) if err != nil { t.Errorf( - "Test failed. TestSupportsPair. Incorrect values. Err: %s", err, + "TestSupportsPair. Incorrect values. Err: %s", err, ) } } @@ -813,7 +813,7 @@ func TestGetPairFormat(t *testing.T) { var c Config _, err := c.GetPairFormat("meow", asset.Spot) if err == nil { - t.Error("non-existent exchange should throw an error") + t.Error("Expected error from non-existent exchange") } c.Exchanges = append(c.Exchanges, @@ -823,7 +823,7 @@ func TestGetPairFormat(t *testing.T) { ) _, err = c.GetPairFormat(testFakeExchangeName, asset.Spot) if err == nil { - t.Error("nil pair manager should throw an error") + t.Error("Expected error from nil pair manager") } c.Exchanges[0].CurrencyPairs = ¤cy.PairsManager{ @@ -840,12 +840,12 @@ func TestGetPairFormat(t *testing.T) { } _, err = c.GetPairFormat(testFakeExchangeName, asset.Item("invalid")) if err == nil { - t.Error("non-existent asset item should throw an error") + t.Error("Expected error from non-existent asset item") } _, err = c.GetPairFormat(testFakeExchangeName, asset.Futures) if err == nil { - t.Error("valid but non supported asset type should throw an error") + t.Error("Expected error from valid but non supported asset type") } var p currency.PairFormat @@ -862,7 +862,7 @@ func TestGetPairFormat(t *testing.T) { c.Exchanges[0].CurrencyPairs.UseGlobalFormat = false _, err = c.GetPairFormat(testFakeExchangeName, asset.Spot) if err == nil { - t.Error(err) + t.Error("Expected error") } c.Exchanges[0].CurrencyPairs.Pairs = map[asset.Item]*currency.PairStore{ @@ -889,7 +889,7 @@ func TestGetAvailablePairs(t *testing.T) { var c Config _, err := c.GetAvailablePairs("asdf", asset.Spot) if err == nil { - t.Error("non-existent exchange should throw an error") + t.Error("Expected error from non-existent exchange") } c.Exchanges = append(c.Exchanges, @@ -905,7 +905,7 @@ func TestGetAvailablePairs(t *testing.T) { _, err = c.GetAvailablePairs(testFakeExchangeName, asset.Spot) if err == nil { - t.Error("nil pair manager should throw an error") + t.Error("Expected error from nil pair manager") } c.Exchanges[0].CurrencyPairs.Pairs = map[asset.Item]*currency.PairStore{ @@ -918,7 +918,7 @@ func TestGetAvailablePairs(t *testing.T) { } _, err = c.GetAvailablePairs(testFakeExchangeName, asset.Spot) if err != nil { - t.Error("nil pairs should return a nil error") + t.Error("Expected error from nil pairs") } c.Exchanges[0].CurrencyPairs.Pairs[asset.Spot].Available = currency.Pairs{ @@ -936,7 +936,7 @@ func TestGetEnabledPairs(t *testing.T) { var c Config _, err := c.GetEnabledPairs("asdf", asset.Spot) if err == nil { - t.Error("non-existent exchange should throw an error") + t.Error("Expected error from non-existent exchange") } c.Exchanges = append(c.Exchanges, @@ -952,7 +952,7 @@ func TestGetEnabledPairs(t *testing.T) { _, err = c.GetEnabledPairs(testFakeExchangeName, asset.Spot) if err == nil { - t.Error("nil pair manager should throw an error") + t.Error("Expected error from nil pair manager") } c.Exchanges[0].CurrencyPairs.Pairs = map[asset.Item]*currency.PairStore{ @@ -979,47 +979,47 @@ func TestGetEnabledPairs(t *testing.T) { func TestGetEnabledExchanges(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { t.Errorf( - "Test failed. TestGetEnabledExchanges. LoadConfig Error: %s", err.Error(), + "TestGetEnabledExchanges. LoadConfig Error: %s", err.Error(), ) } exchanges := cfg.GetEnabledExchanges() if len(exchanges) != defaultEnabledExchanges { t.Error( - "Test failed. TestGetEnabledExchanges. Enabled exchanges value mismatch", + "TestGetEnabledExchanges. Enabled exchanges value mismatch", ) } if !common.StringDataCompare(exchanges, "Bitfinex") { t.Error( - "Test failed. TestGetEnabledExchanges. Expected exchange Bitfinex not found", + "TestGetEnabledExchanges. Expected exchange Bitfinex not found", ) } } func TestGetDisabledExchanges(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { t.Errorf( - "Test failed. TestGetDisabledExchanges. LoadConfig Error: %s", err.Error(), + "TestGetDisabledExchanges. LoadConfig Error: %s", err.Error(), ) } exchanges := cfg.GetDisabledExchanges() if len(exchanges) != 0 { t.Error( - "Test failed. TestGetDisabledExchanges. Enabled exchanges value mismatch", + "TestGetDisabledExchanges. Enabled exchanges value mismatch", ) } exchCfg, err := cfg.GetExchangeConfig("Bitfinex") if err != nil { t.Errorf( - "Test failed. TestGetDisabledExchanges. GetExchangeConfig Error: %s", err.Error(), + "TestGetDisabledExchanges. GetExchangeConfig Error: %s", err.Error(), ) } @@ -1027,150 +1027,150 @@ func TestGetDisabledExchanges(t *testing.T) { err = cfg.UpdateExchangeConfig(exchCfg) if err != nil { t.Errorf( - "Test failed. TestGetDisabledExchanges. UpdateExchangeConfig Error: %s", err.Error(), + "TestGetDisabledExchanges. UpdateExchangeConfig Error: %s", err.Error(), ) } if len(cfg.GetDisabledExchanges()) != 1 { t.Error( - "Test failed. TestGetDisabledExchanges. Enabled exchanges value mismatch", + "TestGetDisabledExchanges. Enabled exchanges value mismatch", ) } } func TestCountEnabledExchanges(t *testing.T) { GetConfigEnabledExchanges := GetConfig() - err := GetConfigEnabledExchanges.LoadConfig(ConfigTestFile, true) + err := GetConfigEnabledExchanges.LoadConfig(TestFile, true) if err != nil { t.Error( - "Test failed. GetConfigEnabledExchanges load config error: " + err.Error(), + "GetConfigEnabledExchanges load config error: " + err.Error(), ) } enabledExch := GetConfigEnabledExchanges.CountEnabledExchanges() if enabledExch != defaultEnabledExchanges { - t.Errorf("Test failed. Expected %v, Received %v", defaultEnabledExchanges, enabledExch) + t.Errorf("Expected %v, Received %v", defaultEnabledExchanges, enabledExch) } } func TestGetConfigCurrencyPairFormat(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { t.Errorf( - "Test failed. TestGetConfigCurrencyPairFormat. LoadConfig Error: %s", err.Error(), + "TestGetConfigCurrencyPairFormat. LoadConfig Error: %s", err.Error(), ) } _, err = cfg.GetConfigCurrencyPairFormat("asdasdasd") if err == nil { t.Errorf( - "Test failed. TestGetRequestCurrencyPairFormat. Non-existent exchange returned nil error", + "TestGetRequestCurrencyPairFormat. Non-existent exchange returned nil error", ) } exchFmt, err := cfg.GetConfigCurrencyPairFormat("Yobit") if err != nil { - t.Errorf("Test failed. TestGetConfigCurrencyPairFormat err: %s", err) + t.Errorf("TestGetConfigCurrencyPairFormat err: %s", err) } if !exchFmt.Uppercase || exchFmt.Delimiter != "_" { t.Errorf( - "Test failed. TestGetConfigCurrencyPairFormat. Invalid values", + "TestGetConfigCurrencyPairFormat. Invalid values", ) } } func TestGetRequestCurrencyPairFormat(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { t.Errorf( - "Test failed. TestGetRequestCurrencyPairFormat. LoadConfig Error: %s", err.Error(), + "TestGetRequestCurrencyPairFormat. LoadConfig Error: %s", err.Error(), ) } _, err = cfg.GetRequestCurrencyPairFormat("asdasdasd") if err == nil { t.Errorf( - "Test failed. TestGetRequestCurrencyPairFormat. Non-existent exchange returned nil error", + "TestGetRequestCurrencyPairFormat. Non-existent exchange returned nil error", ) } exchFmt, err := cfg.GetRequestCurrencyPairFormat("Yobit") if err != nil { - t.Errorf("Test failed. TestGetRequestCurrencyPairFormat. Err: %s", err) + t.Errorf("TestGetRequestCurrencyPairFormat. Err: %s", err) } if exchFmt.Uppercase || exchFmt.Delimiter != "_" || exchFmt.Separator != "-" { t.Errorf( - "Test failed. TestGetRequestCurrencyPairFormat. Invalid values", + "TestGetRequestCurrencyPairFormat. Invalid values", ) } } func TestGetCurrencyPairDisplayConfig(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { t.Errorf( - "Test failed. GetCurrencyPairDisplayConfig. LoadConfig Error: %s", err.Error(), + "GetCurrencyPairDisplayConfig. LoadConfig Error: %s", err.Error(), ) } settings := cfg.GetCurrencyPairDisplayConfig() if settings.Delimiter != "-" || !settings.Uppercase { t.Errorf( - "Test failed. GetCurrencyPairDisplayConfi. Invalid values", + "GetCurrencyPairDisplayConfi. Invalid values", ) } } func TestGetAllExchangeConfigs(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. GetAllExchangeConfigs. LoadConfig error", err) + t.Error("GetAllExchangeConfigs. LoadConfig error", err) } if len(cfg.GetAllExchangeConfigs()) < 26 { - t.Error("Test failed. GetAllExchangeConfigs error") + t.Error("GetAllExchangeConfigs error") } } func TestGetExchangeConfig(t *testing.T) { GetExchangeConfig := GetConfig() - err := GetExchangeConfig.LoadConfig(ConfigTestFile, true) + err := GetExchangeConfig.LoadConfig(TestFile, true) if err != nil { t.Errorf( - "Test failed. GetExchangeConfig.LoadConfig Error: %s", err.Error(), + "GetExchangeConfig.LoadConfig Error: %s", err.Error(), ) } _, err = GetExchangeConfig.GetExchangeConfig("ANX") if err != nil { - t.Errorf("Test failed. GetExchangeConfig.GetExchangeConfig Error: %s", + t.Errorf("GetExchangeConfig.GetExchangeConfig Error: %s", err.Error()) } _, err = GetExchangeConfig.GetExchangeConfig("Testy") if err == nil { - t.Error("Test failed. GetExchangeConfig.GetExchangeConfig Error") + t.Error("GetExchangeConfig.GetExchangeConfig Expected error") } } func TestGetForexProviderConfig(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. GetForexProviderConfig. LoadConfig error", err) + t.Error("GetForexProviderConfig. LoadConfig error", err) } _, err = cfg.GetForexProviderConfig("Fixer") if err != nil { - t.Error("Test failed. GetForexProviderConfig error", err) + t.Error("GetForexProviderConfig error", err) } _, err = cfg.GetForexProviderConfig("this is not a forex provider") if err == nil { - t.Error("Test failed. GetForexProviderConfig no error for invalid provider") + t.Error("GetForexProviderConfig no error for invalid provider") } } func TestGetForexProvidersConfig(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { t.Error(err) } @@ -1182,13 +1182,13 @@ func TestGetForexProvidersConfig(t *testing.T) { func TestGetPrimaryForexProvider(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. GetPrimaryForexProvider. LoadConfig error", err) + t.Error("GetPrimaryForexProvider. LoadConfig error", err) } primary := cfg.GetPrimaryForexProvider() if primary == "" { - t.Error("Test failed. GetPrimaryForexProvider error") + t.Error("GetPrimaryForexProvider error") } for i := range cfg.Currency.ForexProviders { @@ -1196,13 +1196,13 @@ func TestGetPrimaryForexProvider(t *testing.T) { } primary = cfg.GetPrimaryForexProvider() if primary != "" { - t.Error("Test failed. GetPrimaryForexProvider error, expected nil got:", primary) + t.Error("GetPrimaryForexProvider error, expected nil got:", primary) } } func TestUpdateExchangeConfig(t *testing.T) { c := GetConfig() - err := c.LoadConfig(ConfigTestFile, true) + err := c.LoadConfig(TestFile, true) if err != nil { t.Error(err) } @@ -1210,7 +1210,7 @@ func TestUpdateExchangeConfig(t *testing.T) { e := &ExchangeConfig{} err = c.UpdateExchangeConfig(e) if err == nil { - t.Error("non-existent exchange should throw an error") + t.Error("Expected error from non-existent exchange") } e, err = c.GetExchangeConfig("ANX") @@ -1232,7 +1232,7 @@ func TestCheckExchangeConfigValues(t *testing.T) { t.Error("nil exchanges should throw an err") } - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { t.Fatal(err) } @@ -1538,7 +1538,7 @@ func TestCheckExchangeConfigValues(t *testing.T) { cfg.CheckExchangeConfigValues() if cfg.Exchanges[0].Enabled { t.Errorf( - "Test failed. Exchange with no name should be empty", + "Exchange with no name should be empty", ) } @@ -1547,22 +1547,22 @@ func TestCheckExchangeConfigValues(t *testing.T) { cfg.Exchanges[0].Enabled = false err = cfg.CheckExchangeConfigValues() if err == nil { - t.Error("no enabled exchanges should throw an error") + t.Error("Expected error from no enabled exchanges") } } func TestRetrieveConfigCurrencyPairs(t *testing.T) { cfg := GetConfig() - err := cfg.LoadConfig(ConfigTestFile, true) + err := cfg.LoadConfig(TestFile, true) if err != nil { t.Errorf( - "Test failed. TestRetrieveConfigCurrencyPairs.LoadConfig: %s", err.Error(), + "TestRetrieveConfigCurrencyPairs.LoadConfig: %s", err.Error(), ) } err = cfg.RetrieveConfigCurrencyPairs(true, asset.Spot) if err != nil { t.Errorf( - "Test failed. TestRetrieveConfigCurrencyPairs.RetrieveConfigCurrencyPairs: %s", + "TestRetrieveConfigCurrencyPairs.RetrieveConfigCurrencyPairs: %s", err.Error(), ) } @@ -1570,7 +1570,7 @@ func TestRetrieveConfigCurrencyPairs(t *testing.T) { err = cfg.RetrieveConfigCurrencyPairs(false, asset.Spot) if err != nil { t.Errorf( - "Test failed. TestRetrieveConfigCurrencyPairs.RetrieveConfigCurrencyPairs: %s", + "TestRetrieveConfigCurrencyPairs.RetrieveConfigCurrencyPairs: %s", err.Error(), ) } @@ -1578,44 +1578,44 @@ func TestRetrieveConfigCurrencyPairs(t *testing.T) { func TestReadConfig(t *testing.T) { readConfig := GetConfig() - err := readConfig.ReadConfig(ConfigTestFile, true) + err := readConfig.ReadConfig(TestFile, true) if err != nil { - t.Errorf("Test failed. TestReadConfig %s", err.Error()) + t.Errorf("TestReadConfig %s", err.Error()) } err = readConfig.ReadConfig("bla", true) if err == nil { - t.Error("Test failed. TestReadConfig error cannot be nil") + t.Error("TestReadConfig error cannot be nil") } err = readConfig.ReadConfig("", true) if err != nil { - t.Error("Test failed. TestReadConfig error") + t.Error("TestReadConfig error") } } func TestLoadConfig(t *testing.T) { loadConfig := GetConfig() - err := loadConfig.LoadConfig(ConfigTestFile, true) + err := loadConfig.LoadConfig(TestFile, true) if err != nil { - t.Error("Test failed. TestLoadConfig " + err.Error()) + t.Error("TestLoadConfig " + err.Error()) } err = loadConfig.LoadConfig("testy", true) if err == nil { - t.Error("Test failed. TestLoadConfig ") + t.Error("TestLoadConfig Expected error") } } func TestSaveConfig(t *testing.T) { saveConfig := GetConfig() - err := saveConfig.LoadConfig(ConfigTestFile, true) + err := saveConfig.LoadConfig(TestFile, true) if err != nil { - t.Errorf("Test failed. TestSaveConfig.LoadConfig: %s", err.Error()) + t.Errorf("TestSaveConfig.LoadConfig: %s", err.Error()) } - err2 := saveConfig.SaveConfig(ConfigTestFile, true) + err2 := saveConfig.SaveConfig(TestFile, true) if err2 != nil { - t.Errorf("Test failed. TestSaveConfig.SaveConfig, %s", err2.Error()) + t.Errorf("TestSaveConfig.SaveConfig, %s", err2.Error()) } } @@ -1641,13 +1641,13 @@ func TestGetFilePath(t *testing.T) { expected := "blah.json" result, _ := GetFilePath("blah.json") if result != "blah.json" { - t.Errorf("Test failed. TestGetFilePath: expected %s got %s", expected, result) + t.Errorf("TestGetFilePath: expected %s got %s", expected, result) } - expected = ConfigTestFile + expected = TestFile result, _ = GetFilePath("") if result != expected { - t.Errorf("Test failed. TestGetFilePath: expected %s got %s", expected, result) + t.Errorf("TestGetFilePath: expected %s got %s", expected, result) } testBypass = true } @@ -1692,9 +1692,9 @@ func TestCheckRemoteControlConfig(t *testing.T) { func TestCheckConfig(t *testing.T) { var c Config - err := c.LoadConfig(ConfigTestFile, true) + err := c.LoadConfig(TestFile, true) if err != nil { - t.Errorf("Test failed. %s", err) + t.Errorf("%s", err) } err = c.CheckConfig() @@ -1705,42 +1705,42 @@ func TestCheckConfig(t *testing.T) { func TestUpdateConfig(t *testing.T) { var c Config - err := c.LoadConfig(ConfigTestFile, true) + err := c.LoadConfig(TestFile, true) if err != nil { - t.Errorf("Test failed. %s", err) + t.Errorf("%s", err) } newCfg := c - err = c.UpdateConfig(ConfigTestFile, &newCfg, true) + err = c.UpdateConfig(TestFile, &newCfg, true) if err != nil { - t.Fatalf("Test failed. %s", err) + t.Fatalf("%s", err) } err = c.UpdateConfig("//non-existantpath\\", &newCfg, true) if err == nil { - t.Fatalf("Test failed. Error should of been thrown for invalid path") + t.Fatalf("Error should have been thrown for invalid path") } newCfg.Currency.Cryptocurrencies = currency.NewCurrenciesFromStringArray([]string{""}) - err = c.UpdateConfig(ConfigTestFile, &newCfg, true) + err = c.UpdateConfig(TestFile, &newCfg, true) if err != nil { - t.Errorf("Test failed. %s", err) + t.Errorf("%s", err) } if c.Currency.Cryptocurrencies.Join() == "" { - t.Fatalf("Test failed. Cryptocurrencies should have been repopulated") + t.Fatalf("Cryptocurrencies should have been repopulated") } } func BenchmarkUpdateConfig(b *testing.B) { var c Config - err := c.LoadConfig(ConfigTestFile, true) + err := c.LoadConfig(TestFile, true) if err != nil { b.Errorf("Unable to benchmark UpdateConfig(): %s", err) } newCfg := c for i := 0; i < b.N; i++ { - _ = c.UpdateConfig(ConfigTestFile, &newCfg, true) + _ = c.UpdateConfig(TestFile, &newCfg, true) } } @@ -1773,7 +1773,7 @@ func TestCheckLoggerConfig(t *testing.T) { t.Error("unexpected result") } - c.LoadConfig(ConfigTestFile, true) + c.LoadConfig(TestFile, true) err = c.CheckLoggerConfig() if err != nil { t.Errorf("Failed to create logger with user settings: reason: %v", err) @@ -1784,14 +1784,14 @@ func TestDisableNTPCheck(t *testing.T) { t.Parallel() c := GetConfig() - err := c.LoadConfig(ConfigTestFile, true) + err := c.LoadConfig(TestFile, true) if err != nil { t.Fatal(err) } warn, err := c.DisableNTPCheck(strings.NewReader("w\n")) if err != nil { - t.Fatalf("test failed to create ntpclient failed reason: %v", err) + t.Fatalf("to create ntpclient failed reason: %v", err) } if warn != "Time sync has been set to warn only" { @@ -1851,11 +1851,11 @@ func TestCheckNTPConfig(t *testing.T) { c.CheckNTPConfig() _, err := ntpclient.NTPClient(c.NTPClient.Pool) if err != nil { - t.Fatalf("test failed to create ntpclient failed reason: %v", err) + t.Fatalf("to create ntpclient failed reason: %v", err) } if c.NTPClient.Pool[0] != "pool.ntp.org:123" { - t.Error("ntpclient with no valid pool should default to pool.ntp.org ") + t.Error("ntpclient with no valid pool should default to pool.ntp.org") } if c.NTPClient.AllowedDifference == nil { @@ -1866,3 +1866,66 @@ func TestCheckNTPConfig(t *testing.T) { t.Error("ntpclient with nil allowednegativedifference should default to sane value") } } + +func TestCheckCurrencyConfigValues(t *testing.T) { + c := GetConfig() + c.Currency.ForexProviders = nil + c.Currency.CryptocurrencyProvider = CryptocurrencyProvider{} + err := c.CheckCurrencyConfigValues() + if err != nil { + t.Error(err) + } + if c.Currency.ForexProviders == nil { + t.Error("Failed to populate c.Currency.ForexProviders") + } + if c.Currency.CryptocurrencyProvider.APIkey != DefaultUnsetAPIKey { + t.Error("Failed to set the api key to the default key") + } + if c.Currency.CryptocurrencyProvider.Name != "CoinMarketCap" { + t.Error("Failed to set the c.Currency.CryptocurrencyProvider.Name") + } + + c.Currency.ForexProviders[0].Enabled = true + c.Currency.ForexProviders[0].Name = "CurrencyConverter" + c.Currency.ForexProviders[0].PrimaryProvider = true + c.Currency.Cryptocurrencies = nil + c.Cryptocurrencies = nil + c.Currency.CurrencyPairFormat = nil + c.CurrencyPairFormat = &CurrencyPairFormatConfig{ + Uppercase: true, + } + c.Currency.FiatDisplayCurrency = currency.Code{} + c.FiatDisplayCurrency = ¤cy.BTC + c.Currency.CryptocurrencyProvider.Enabled = true + err = c.CheckCurrencyConfigValues() + if err != nil { + t.Error(err) + } + if c.Currency.ForexProviders[0].Enabled { + t.Error("Failed to disable invalid forex provider") + } + if !c.Currency.CurrencyPairFormat.Uppercase { + t.Error("Failed to apply c.CurrencyPairFormat format to c.Currency.CurrencyPairFormat") + } + + c.Currency.CryptocurrencyProvider.Enabled = false + c.Currency.CryptocurrencyProvider.APIkey = "" + c.Currency.CryptocurrencyProvider.AccountPlan = "" + c.FiatDisplayCurrency = ¤cy.BTC + c.Currency.ForexProviders[0].Enabled = true + c.Currency.ForexProviders[0].Name = "Name" + c.Currency.ForexProviders[0].PrimaryProvider = true + c.Currency.Cryptocurrencies = currency.Currencies{} + c.Cryptocurrencies = ¤cy.Currencies{} + err = c.CheckCurrencyConfigValues() + if err != nil { + t.Error(err) + } + if c.FiatDisplayCurrency != nil { + t.Error("Failed to clear c.FiatDisplayCurrency") + } + if c.Currency.CryptocurrencyProvider.APIkey != DefaultUnsetAPIKey || + c.Currency.CryptocurrencyProvider.AccountPlan != DefaultUnsetAccountPlan { + t.Error("Failed to set CryptocurrencyProvider.APIkey and AccountPlan") + } +} diff --git a/config/config_types.go b/config/config_types.go index 5c07f39e..6e629610 100644 --- a/config/config_types.go +++ b/config/config_types.go @@ -3,15 +3,77 @@ package config import ( "fmt" "strings" + "sync" "time" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base" "github.com/thrasher-corp/gocryptotrader/database" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" log "github.com/thrasher-corp/gocryptotrader/logger" "github.com/thrasher-corp/gocryptotrader/portfolio" ) +// Constants declared here are filename strings and test strings +const ( + FXProviderFixer = "fixer" + EncryptedFile = "config.dat" + File = "config.json" + TestFile = "../testdata/configtest.json" + fileEncryptionPrompt = 0 + fileEncryptionEnabled = 1 + fileEncryptionDisabled = -1 + pairsLastUpdatedWarningThreshold = 30 // 30 days + defaultHTTPTimeout = time.Second * 15 + defaultWebsocketResponseCheckTimeout = time.Millisecond * 30 + defaultWebsocketResponseMaxLimit = time.Second * 7 + defaultWebsocketOrderbookBufferLimit = 5 + defaultWebsocketTrafficTimeout = time.Second * 30 + maxAuthFailures = 3 + defaultNTPAllowedDifference = 50000000 + defaultNTPAllowedNegativeDifference = 50000000 + DefaultAPIKey = "Key" + DefaultAPISecret = "Secret" + DefaultAPIClientID = "ClientID" +) + +// Constants here hold some messages +const ( + ErrExchangeNameEmpty = "exchange #%d name is empty" + ErrExchangeAvailablePairsEmpty = "exchange %s available pairs is empty" + ErrExchangeEnabledPairsEmpty = "exchange %s enabled pairs is empty" + ErrExchangeBaseCurrenciesEmpty = "exchange %s base currencies is empty" + ErrExchangeNotFound = "exchange %s not found" + ErrNoEnabledExchanges = "no exchanges enabled" + ErrCryptocurrenciesEmpty = "cryptocurrencies variable is empty" + ErrFailureOpeningConfig = "fatal error opening %s file. Error: %s" + ErrCheckingConfigValues = "fatal error checking config values. Error: %s" + ErrSavingConfigBytesMismatch = "config file %q bytes comparison doesn't match, read %s expected %s" + WarningWebserverCredentialValuesEmpty = "webserver support disabled due to empty Username/Password values" + WarningWebserverListenAddressInvalid = "webserver support disabled due to invalid listen address" + WarningExchangeAuthAPIDefaultOrEmptyValues = "exchange %s authenticated API support disabled due to default/empty APIKey/Secret/ClientID values" + WarningPairsLastUpdatedThresholdExceeded = "exchange %s last manual update of available currency pairs has exceeded %d days. Manual update required!" +) + +// Constants here define unset default values displayed in the config.json +// file +const ( + APIURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_EXCHANGE_API" + WebsocketURLNonDefaultMessage = "NON_DEFAULT_HTTP_LINK_TO_WEBSOCKET_EXCHANGE_API" + DefaultUnsetAPIKey = "Key" + DefaultUnsetAPISecret = "Secret" + DefaultUnsetAccountPlan = "accountPlan" + DefaultForexProviderExchangeRatesAPI = "ExchangeRates" +) + +// Variables here are used for configuration +var ( + Cfg Config + IsInitialSetup bool + testBypass bool + m sync.Mutex +) + // Config is the overarching object that holds all the information for // prestart management of Portfolio, Communications, Webserver and Enabled // Exchanges @@ -313,39 +375,12 @@ type TelegramConfig struct { VerificationToken string `json:"verificationToken"` } -// ProtocolFeaturesConfig holds all variables for the exchanges supported features -// for a protocol (e.g REST or Websocket) -type ProtocolFeaturesConfig struct { - TickerBatching bool `json:"tickerBatching,omitempty"` - AutoPairUpdates bool `json:"autoPairUpdates,omitempty"` - AccountBalance bool `json:"accountBalance,omitempty"` - CryptoDeposit bool `json:"cryptoDeposit,omitempty"` - CryptoWithdrawal uint32 `json:"cryptoWithdrawal,omitempty"` - FiatWithdraw bool `json:"fiatWithdraw,omitempty"` - GetOrder bool `json:"getOrder,omitempty"` - GetOrders bool `json:"getOrders,omitempty"` - CancelOrders bool `json:"cancelOrders,omitempty"` - CancelOrder bool `json:"cancelOrder,omitempty"` - SubmitOrder bool `json:"submitOrder,omitempty"` - SubmitOrders bool `json:"submitOrders,omitempty"` - ModifyOrder bool `json:"modifyOrder,omitempty"` - DepositHistory bool `json:"depositHistory,omitempty"` - WithdrawalHistory bool `json:"withdrawalHistory,omitempty"` - TradeHistory bool `json:"tradeHistory,omitempty"` - UserTradeHistory bool `json:"userTradeHistory,omitempty"` - TradeFee bool `json:"tradeFee,omitempty"` - FiatDepositFee bool `json:"fiatDepositFee,omitempty"` - FiatWithdrawalFee bool `json:"fiatWithdrawalFee,omitempty"` - CryptoDepositFee bool `json:"cryptoDepositFee,omitempty"` - CryptoWithdrawalFee bool `json:"cryptoWithdrawalFee,omitempty"` -} - // FeaturesSupportedConfig stores the exchanges supported features type FeaturesSupportedConfig struct { - REST bool `json:"restAPI"` - RESTCapabilities ProtocolFeaturesConfig `json:"restCapabilities,omitempty"` - Websocket bool `json:"websocketAPI"` - WebsocketCapabilities ProtocolFeaturesConfig `json:"websocketCapabilities,omitempty"` + REST bool `json:"restAPI"` + RESTCapabilities protocol.Features `json:"restCapabilities,omitempty"` + Websocket bool `json:"websocketAPI"` + WebsocketCapabilities protocol.Features `json:"websocketCapabilities,omitempty"` } // FeaturesEnabledConfig stores the exchanges enabled features diff --git a/connchecker/connchecker_test.go b/connchecker/connchecker_test.go index 7b1b27b6..1ff3dfd7 100644 --- a/connchecker/connchecker_test.go +++ b/connchecker/connchecker_test.go @@ -9,22 +9,22 @@ func TestConnection(t *testing.T) { faultyHost := []string{"faultyHost"} _, err := New(faultyDomain, nil, 100000) if err == nil { - t.Fatal("Test Failed - New error cannot be nil") + t.Fatal("New error cannot be nil") } _, err = New(DefaultDNSList, nil, 100000) if err != nil { - t.Fatal("Test Failed - New error", err) + t.Fatal("New error", err) } _, err = New(nil, faultyHost, 100000) if err != nil { - t.Fatal("Test Failed - New error cannot be nil", err) + t.Fatal("New error cannot be nil", err) } c, err := New(nil, nil, 0) if err != nil { - t.Fatal("Test Failed - New error", err) + t.Fatal("New error", err) } if !c.IsConnected() { diff --git a/currency/code.go b/currency/code.go index 90f19ba6..e1991530 100644 --- a/currency/code.go +++ b/currency/code.go @@ -4,31 +4,10 @@ import ( "errors" "fmt" "strings" - "sync" - "time" "github.com/thrasher-corp/gocryptotrader/common" ) -// Bitmasks const for currency rolls -const ( - Unset Role = 0 - Fiat Role = 1 << (iota - 1) - Cryptocurrency - Token - Contract - - UnsetRollString = "roleUnset" - FiatCurrencyString = "fiatCurrency" - CryptocurrencyString = "cryptocurrency" - TokenString = "token" - ContractString = "contract" -) - -// Role defines a bitmask for the full currency rolls either; fiat, -// cryptocurrency, token, or contract -type Role uint8 - func (r Role) String() string { switch r { case Unset: @@ -46,7 +25,7 @@ func (r Role) String() string { } } -// MarshalJSON conforms Roll to the marshaler interface +// MarshalJSON conforms Roll to the marshaller interface func (r Role) MarshalJSON() ([]byte, error) { return common.JSONEncode(r.String()) } @@ -77,13 +56,6 @@ func (r *Role) UnmarshalJSON(d []byte) error { return nil } -// BaseCodes defines a basket of bare currency codes -type BaseCodes struct { - Items []*Item - LastMainUpdate time.Time - mtx sync.Mutex -} - // HasData returns true if the type contains data func (b *BaseCodes) HasData() bool { b.mtx.Lock() @@ -107,7 +79,7 @@ func (b *BaseCodes) GetFullCurrencyData() (File, error) { case Contract: file.Contracts = append(file.Contracts, *i) default: - return file, errors.New("roll undefined") + return file, errors.New("role undefined") } } @@ -396,24 +368,6 @@ func NewCode(c string) Code { return storage.ValidateCode(c) } -// Code defines an ISO 4217 fiat currency or unofficial cryptocurrency code -// string -type Code struct { - Item *Item - UpperCase bool -} - -// Item defines a sub type containing the main attributes of a designated -// currency code pointer -type Item struct { - ID int `json:"id"` - FullName string `json:"fullName"` - Symbol string `json:"symbol"` - Role Role `json:"role"` - AssocChain string `json:"associatedBlockchain"` - AssocExchange []string `json:"associatedExchanges"` -} - // String conforms to the stringer interface func (i *Item) String() string { return i.FullName @@ -496,1608 +450,3 @@ func (c Code) IsFiatCurrency() bool { func (c Code) IsCryptocurrency() bool { return storage.IsCryptocurrency(c) } - -// Const declarations for individual currencies/tokens/fiat -// An ever growing list. Cares not for equivalence, just is -var ( - BTC = NewCode("BTC") - LTC = NewCode("LTC") - ETH = NewCode("ETH") - XRP = NewCode("XRP") - BCH = NewCode("BCH") - EOS = NewCode("EOS") - XLM = NewCode("XLM") - USDT = NewCode("USDT") - ADA = NewCode("ADA") - XMR = NewCode("XMR") - TRX = NewCode("TRX") - MIOTA = NewCode("MIOTA") - DASH = NewCode("DASH") - BNB = NewCode("BNB") - NEO = NewCode("NEO") - ETC = NewCode("ETC") - XEM = NewCode("XEM") - XTZ = NewCode("XTZ") - VET = NewCode("VET") - DOGE = NewCode("DOGE") - ZEC = NewCode("ZEC") - OMG = NewCode("OMG") - BTG = NewCode("BTG") - MKR = NewCode("MKR") - BCN = NewCode("BCN") - ONT = NewCode("ONT") - ZRX = NewCode("ZRX") - LSK = NewCode("LSK") - DCR = NewCode("DCR") - QTUM = NewCode("QTUM") - BCD = NewCode("BCD") - BTS = NewCode("BTS") - NANO = NewCode("NANO") - ZIL = NewCode("ZIL") - SC = NewCode("SC") - DGB = NewCode("DGB") - ICX = NewCode("ICX") - STEEM = NewCode("STEEM") - AE = NewCode("AE") - XVG = NewCode("XVG") - WAVES = NewCode("WAVES") - NPXS = NewCode("NPXS") - ETN = NewCode("ETN") - BTM = NewCode("BTM") - BAT = NewCode("BAT") - ETP = NewCode("ETP") - HOT = NewCode("HOT") - STRAT = NewCode("STRAT") // nolint: misspell - GNT = NewCode("GNT") - REP = NewCode("REP") - SNT = NewCode("SNT") - PPT = NewCode("PPT") - KMD = NewCode("KMD") - TUSD = NewCode("TUSD") - CNX = NewCode("CNX") - LINK = NewCode("LINK") - WTC = NewCode("WTC") - ARDR = NewCode("ARDR") - WAN = NewCode("WAN") - MITH = NewCode("MITH") - RDD = NewCode("RDD") - IOST = NewCode("IOST") - IOT = NewCode("IOT") - KCS = NewCode("KCS") - MAID = NewCode("MAID") - XET = NewCode("XET") - MOAC = NewCode("MOAC") - HC = NewCode("HC") - AION = NewCode("AION") - AOA = NewCode("AOA") - HT = NewCode("HT") - ELF = NewCode("ELF") - LRC = NewCode("LRC") - BNT = NewCode("BNT") - CMT = NewCode("CMT") - DGD = NewCode("DGD") - DCN = NewCode("DCN") - FUN = NewCode("FUN") - GXS = NewCode("GXS") - DROP = NewCode("DROP") - MANA = NewCode("MANA") - PAY = NewCode("PAY") - MCO = NewCode("MCO") - THETA = NewCode("THETA") - NXT = NewCode("NXT") - NOAH = NewCode("NOAH") - LOOM = NewCode("LOOM") - POWR = NewCode("POWR") - WAX = NewCode("WAX") - ELA = NewCode("ELA") - PIVX = NewCode("PIVX") - XIN = NewCode("XIN") - DAI = NewCode("DAI") - BTCP = NewCode("BTCP") - NEXO = NewCode("NEXO") - XBT = NewCode("XBT") - SAN = NewCode("SAN") - GAS = NewCode("GAS") - BCC = NewCode("BCC") - HCC = NewCode("HCC") - OAX = NewCode("OAX") - DNT = NewCode("DNT") - ICN = NewCode("ICN") - LLT = NewCode("LLT") - YOYO = NewCode("YOYO") - SNGLS = NewCode("SNGLS") - BQX = NewCode("BQX") - KNC = NewCode("KNC") - SNM = NewCode("SNM") - CTR = NewCode("CTR") - SALT = NewCode("SALT") - MDA = NewCode("MDA") - IOTA = NewCode("IOTA") - SUB = NewCode("SUB") - MTL = NewCode("MTL") - MTH = NewCode("MTH") - ENG = NewCode("ENG") - AST = NewCode("AST") - CLN = NewCode("CLN") - EDG = NewCode("EDG") - FIRST = NewCode("1ST") - GOLOS = NewCode("GOLOS") - ANT = NewCode("ANT") - GBG = NewCode("GBG") - HMQ = NewCode("HMQ") - INCNT = NewCode("INCNT") - ACE = NewCode("ACE") - ACT = NewCode("ACT") - AAC = NewCode("AAC") - AIDOC = NewCode("AIDOC") - SOC = NewCode("SOC") - ATL = NewCode("ATL") - AVT = NewCode("AVT") - BKX = NewCode("BKX") - BEC = NewCode("BEC") - VEE = NewCode("VEE") - PTOY = NewCode("PTOY") - CAG = NewCode("CAG") - CIC = NewCode("CIC") - CBT = NewCode("CBT") - CAN = NewCode("CAN") - DAT = NewCode("DAT") - DNA = NewCode("DNA") - INT = NewCode("INT") - IPC = NewCode("IPC") - ILA = NewCode("ILA") - LIGHT = NewCode("LIGHT") - MAG = NewCode("MAG") - AMM = NewCode("AMM") - MOF = NewCode("MOF") - MGC = NewCode("MGC") - OF = NewCode("OF") - LA = NewCode("LA") - LEV = NewCode("LEV") - NGC = NewCode("NGC") - OKB = NewCode("OKB") - MOT = NewCode("MOT") - PRA = NewCode("PRA") - R = NewCode("R") - SSC = NewCode("SSC") - SHOW = NewCode("SHOW") - SPF = NewCode("SPF") - SNC = NewCode("SNC") - SWFTC = NewCode("SWFTC") - TRA = NewCode("TRA") - TOPC = NewCode("TOPC") - TRIO = NewCode("TRIO") - QVT = NewCode("QVT") - UCT = NewCode("UCT") - UKG = NewCode("UKG") - UTK = NewCode("UTK") - VIU = NewCode("VIU") - WFEE = NewCode("WFEE") - WRC = NewCode("WRC") - UGC = NewCode("UGC") - YEE = NewCode("YEE") - YOYOW = NewCode("YOYOW") - ZIP = NewCode("ZIP") - READ = NewCode("READ") - RCT = NewCode("RCT") - REF = NewCode("REF") - XUC = NewCode("XUC") - FAIR = NewCode("FAIR") - GSC = NewCode("GSC") - HMC = NewCode("HMC") - PLU = NewCode("PLU") - PRO = NewCode("PRO") - QRL = NewCode("QRL") - REN = NewCode("REN") - ROUND = NewCode("ROUND") - SRN = NewCode("SRN") - XID = NewCode("XID") - SBD = NewCode("SBD") - TAAS = NewCode("TAAS") - TKN = NewCode("TKN") - VEN = NewCode("VEN") - VSL = NewCode("VSL") - TRST = NewCode("TRST") - XXX = NewCode("XXX") - IND = NewCode("IND") - LDC = NewCode("LDC") - GUP = NewCode("GUP") - MGO = NewCode("MGO") - MYST = NewCode("MYST") - NEU = NewCode("NEU") - NET = NewCode("NET") - BMC = NewCode("BMC") - BCAP = NewCode("BCAP") - TIME = NewCode("TIME") - CFI = NewCode("CFI") - EVX = NewCode("EVX") - REQ = NewCode("REQ") - VIB = NewCode("VIB") - ARK = NewCode("ARK") - MOD = NewCode("MOD") - ENJ = NewCode("ENJ") - STORJ = NewCode("STORJ") - RCN = NewCode("RCN") - NULS = NewCode("NULS") - RDN = NewCode("RDN") - DLT = NewCode("DLT") - AMB = NewCode("AMB") - BCPT = NewCode("BCPT") - ARN = NewCode("ARN") - GVT = NewCode("GVT") - CDT = NewCode("CDT") - POE = NewCode("POE") - QSP = NewCode("QSP") - XZC = NewCode("XZC") - TNT = NewCode("TNT") - FUEL = NewCode("FUEL") - ADX = NewCode("ADX") - CND = NewCode("CND") - LEND = NewCode("LEND") - WABI = NewCode("WABI") - SBTC = NewCode("SBTC") - BCX = NewCode("BCX") - TNB = NewCode("TNB") - GTO = NewCode("GTO") - OST = NewCode("OST") - CVC = NewCode("CVC") - DATA = NewCode("DATA") - ETF = NewCode("ETF") - BRD = NewCode("BRD") - NEBL = NewCode("NEBL") - VIBE = NewCode("VIBE") - LUN = NewCode("LUN") - CHAT = NewCode("CHAT") - RLC = NewCode("RLC") - INS = NewCode("INS") - VIA = NewCode("VIA") - BLZ = NewCode("BLZ") - SYS = NewCode("SYS") - NCASH = NewCode("NCASH") - POA = NewCode("POA") - STORM = NewCode("STORM") - WPR = NewCode("WPR") - QLC = NewCode("QLC") - GRS = NewCode("GRS") - CLOAK = NewCode("CLOAK") - ZEN = NewCode("ZEN") - SKY = NewCode("SKY") - IOTX = NewCode("IOTX") - QKC = NewCode("QKC") - AGI = NewCode("AGI") - NXS = NewCode("NXS") - EON = NewCode("EON") - KEY = NewCode("KEY") - NAS = NewCode("NAS") - ADD = NewCode("ADD") - MEETONE = NewCode("MEETONE") - ATD = NewCode("ATD") - MFT = NewCode("MFT") - EOP = NewCode("EOP") - DENT = NewCode("DENT") - IQ = NewCode("IQ") - DOCK = NewCode("DOCK") - POLY = NewCode("POLY") - VTHO = NewCode("VTHO") - ONG = NewCode("ONG") - PHX = NewCode("PHX") - GO = NewCode("GO") - PAX = NewCode("PAX") - EDO = NewCode("EDO") - WINGS = NewCode("WINGS") - NAV = NewCode("NAV") - TRIG = NewCode("TRIG") - APPC = NewCode("APPC") - KRW = NewCode("KRW") - HSR = NewCode("HSR") - ETHOS = NewCode("ETHOS") - CTXC = NewCode("CTXC") - ITC = NewCode("ITC") - TRUE = NewCode("TRUE") - ABT = NewCode("ABT") - RNT = NewCode("RNT") - PLY = NewCode("PLY") - PST = NewCode("PST") - KICK = NewCode("KICK") - BTCZ = NewCode("BTCZ") - DXT = NewCode("DXT") - STQ = NewCode("STQ") - INK = NewCode("INK") - HBZ = NewCode("HBZ") - USDT_ETH = NewCode("USDT_ETH") // nolint: golint,stylecheck - QTUM_ETH = NewCode("QTUM_ETH") // nolint: golint - BTM_ETH = NewCode("BTM_ETH") // nolint: golint - FIL = NewCode("FIL") - STX = NewCode("STX") - BOT = NewCode("BOT") - VERI = NewCode("VERI") - ZSC = NewCode("ZSC") - QBT = NewCode("QBT") - MED = NewCode("MED") - QASH = NewCode("QASH") - MDS = NewCode("MDS") - GOD = NewCode("GOD") - SMT = NewCode("SMT") - BTF = NewCode("BTF") - NAS_ETH = NewCode("NAS_ETH") // nolint: golint - TSL = NewCode("TSL") - BIFI = NewCode("BIFI") - BNTY = NewCode("BNTY") - DRGN = NewCode("DRGN") - GTC = NewCode("GTC") - MDT = NewCode("MDT") - QUN = NewCode("QUN") - GNX = NewCode("GNX") - DDD = NewCode("DDD") - BTO = NewCode("BTO") - TIO = NewCode("TIO") - OCN = NewCode("OCN") - RUFF = NewCode("RUFF") - TNC = NewCode("TNC") - SNET = NewCode("SNET") - COFI = NewCode("COFI") - ZPT = NewCode("ZPT") - JNT = NewCode("JNT") - MTN = NewCode("MTN") - GEM = NewCode("GEM") - DADI = NewCode("DADI") - RFR = NewCode("RFR") - MOBI = NewCode("MOBI") - LEDU = NewCode("LEDU") - DBC = NewCode("DBC") - MKR_OLD = NewCode("MKR_OLD") // nolint: golint - DPY = NewCode("DPY") - BCDN = NewCode("BCDN") - EOSDAC = NewCode("EOSDAC") // nolint: golint - TIPS = NewCode("TIPS") - XMC = NewCode("XMC") - PPS = NewCode("PPS") - BOE = NewCode("BOE") - MEDX = NewCode("MEDX") - SMT_ETH = NewCode("SMT_ETH") // nolint: golint - CS = NewCode("CS") - MAN = NewCode("MAN") - REM = NewCode("REM") - LYM = NewCode("LYM") - INSTAR = NewCode("INSTAR") // nolint: golint - BFT = NewCode("BFT") - IHT = NewCode("IHT") - SENC = NewCode("SENC") - TOMO = NewCode("TOMO") - ELEC = NewCode("ELEC") - SHIP = NewCode("SHIP") - TFD = NewCode("TFD") - HAV = NewCode("HAV") - HUR = NewCode("HUR") - LST = NewCode("LST") - LINO = NewCode("LINO") - SWTH = NewCode("SWTH") - NKN = NewCode("NKN") - SOUL = NewCode("SOUL") - GALA_NEO = NewCode("GALA_NEO") // nolint: golint - LRN = NewCode("LRN") - GSE = NewCode("GSE") - RATING = NewCode("RATING") - HSC = NewCode("HSC") - HIT = NewCode("HIT") - DX = NewCode("DX") - BXC = NewCode("BXC") - GARD = NewCode("GARD") - FTI = NewCode("FTI") - SOP = NewCode("SOP") - LEMO = NewCode("LEMO") - RED = NewCode("RED") - LBA = NewCode("LBA") - KAN = NewCode("KAN") - OPEN = NewCode("OPEN") - SKM = NewCode("SKM") - NBAI = NewCode("NBAI") - UPP = NewCode("UPP") - ATMI = NewCode("ATMI") - TMT = NewCode("TMT") - BBK = NewCode("BBK") - EDR = NewCode("EDR") - MET = NewCode("MET") - TCT = NewCode("TCT") - EXC = NewCode("EXC") - CNC = NewCode("CNC") - TIX = NewCode("TIX") - XTC = NewCode("XTC") - BU = NewCode("BU") - GNO = NewCode("GNO") - MLN = NewCode("MLN") - XBC = NewCode("XBC") - BTCD = NewCode("BTCD") - BURST = NewCode("BURST") - CLAM = NewCode("CLAM") - XCP = NewCode("XCP") - EMC2 = NewCode("EMC2") - EXP = NewCode("EXP") - FCT = NewCode("FCT") - GAME = NewCode("GAME") - GRC = NewCode("GRC") - HUC = NewCode("HUC") - LBC = NewCode("LBC") - NMC = NewCode("NMC") - NEOS = NewCode("NEOS") - OMNI = NewCode("OMNI") - PASC = NewCode("PASC") - PPC = NewCode("PPC") - DSH = NewCode("DSH") - GML = NewCode("GML") - GSY = NewCode("GSY") - POT = NewCode("POT") - XPM = NewCode("XPM") - AMP = NewCode("AMP") - VRC = NewCode("VRC") - VTC = NewCode("VTC") - ZERO07 = NewCode("007") - BIT16 = NewCode("BIT16") - TWO015 = NewCode("2015") - TWO56 = NewCode("256") - TWOBACCO = NewCode("2BACCO") - TWOGIVE = NewCode("2GIVE") - THIRTY2BIT = NewCode("32BIT") - THREE65 = NewCode("365") - FOUR04 = NewCode("404") - SEVEN00 = NewCode("700") - EIGHTBIT = NewCode("8BIT") - ACLR = NewCode("ACLR") - ACES = NewCode("ACES") - ACPR = NewCode("ACPR") - ACID = NewCode("ACID") - ACOIN = NewCode("ACOIN") - ACRN = NewCode("ACRN") - ADAM = NewCode("ADAM") - ADT = NewCode("ADT") - AIB = NewCode("AIB") - ADZ = NewCode("ADZ") - AECC = NewCode("AECC") - AM = NewCode("AM") - AGRI = NewCode("AGRI") - AGT = NewCode("AGT") - AIR = NewCode("AIR") - ALEX = NewCode("ALEX") - AUM = NewCode("AUM") - ALIEN = NewCode("ALIEN") - ALIS = NewCode("ALIS") - ALL = NewCode("ALL") - ASAFE = NewCode("ASAFE") - AMBER = NewCode("AMBER") - AMS = NewCode("AMS") - ANAL = NewCode("ANAL") - ACP = NewCode("ACP") - ANI = NewCode("ANI") - ANTI = NewCode("ANTI") - ALTC = NewCode("ALTC") - APT = NewCode("APT") - ARCO = NewCode("ARCO") - ALC = NewCode("ALC") - ARB = NewCode("ARB") - ARCT = NewCode("ARCT") - ARCX = NewCode("ARCX") - ARGUS = NewCode("ARGUS") - ARH = NewCode("ARH") - ARM = NewCode("ARM") - ARNA = NewCode("ARNA") - ARPA = NewCode("ARPA") - ARTA = NewCode("ARTA") - ABY = NewCode("ABY") - ARTC = NewCode("ARTC") - AL = NewCode("AL") - ASN = NewCode("ASN") - ADCN = NewCode("ADCN") - ATB = NewCode("ATB") - ATM = NewCode("ATM") - ATMCHA = NewCode("ATMCHA") - ATOM = NewCode("ATOM") - ADC = NewCode("ADC") - ARE = NewCode("ARE") - AUR = NewCode("AUR") - AV = NewCode("AV") - AXIOM = NewCode("AXIOM") - B2B = NewCode("B2B") - B2 = NewCode("B2") - B3 = NewCode("B3") - BAB = NewCode("BAB") - BAN = NewCode("BAN") - BamitCoin = NewCode("BamitCoin") - NANAS = NewCode("NANAS") - BBCC = NewCode("BBCC") - BTA = NewCode("BTA") - BSTK = NewCode("BSTK") - BATL = NewCode("BATL") - BBH = NewCode("BBH") - BITB = NewCode("BITB") - BRDD = NewCode("BRDD") - XBTS = NewCode("XBTS") - BVC = NewCode("BVC") - CHATX = NewCode("CHATX") - BEEP = NewCode("BEEP") - BEEZ = NewCode("BEEZ") - BENJI = NewCode("BENJI") - BERN = NewCode("BERN") - PROFIT = NewCode("PROFIT") - BEST = NewCode("BEST") - BGF = NewCode("BGF") - BIGUP = NewCode("BIGUP") - BLRY = NewCode("BLRY") - BILL = NewCode("BILL") - BIOB = NewCode("BIOB") - BIO = NewCode("BIO") - BIOS = NewCode("BIOS") - BPTN = NewCode("BPTN") - BTCA = NewCode("BTCA") - BA = NewCode("BA") - BAC = NewCode("BAC") - BBT = NewCode("BBT") - BOSS = NewCode("BOSS") - BRONZ = NewCode("BRONZ") - CAT = NewCode("CAT") - BTD = NewCode("BTD") - XBTC21 = NewCode("XBTC21") - BCA = NewCode("BCA") - BCP = NewCode("BCP") - BTDOLL = NewCode("BTDOLL") - LIZA = NewCode("LIZA") - BTCRED = NewCode("BTCRED") - BTCS = NewCode("BTCS") - BTU = NewCode("BTU") - BUM = NewCode("BUM") - LITE = NewCode("LITE") - BCM = NewCode("BCM") - BCS = NewCode("BCS") - BTCU = NewCode("BTCU") - BM = NewCode("BM") - BTCRY = NewCode("BTCRY") - BTCR = NewCode("BTCR") - HIRE = NewCode("HIRE") - STU = NewCode("STU") - BITOK = NewCode("BITOK") - BITON = NewCode("BITON") - BPC = NewCode("BPC") - BPOK = NewCode("BPOK") - BTP = NewCode("BTP") - BITCNY = NewCode("bitCNY") - RNTB = NewCode("RNTB") - BSH = NewCode("BSH") - XBS = NewCode("XBS") - BITS = NewCode("BITS") - BST = NewCode("BST") - BXT = NewCode("BXT") - VEG = NewCode("VEG") - VOLT = NewCode("VOLT") - BTV = NewCode("BTV") - BITZ = NewCode("BITZ") - BTZ = NewCode("BTZ") - BHC = NewCode("BHC") - BDC = NewCode("BDC") - JACK = NewCode("JACK") - BS = NewCode("BS") - BSTAR = NewCode("BSTAR") - BLAZR = NewCode("BLAZR") - BOD = NewCode("BOD") - BLUE = NewCode("BLUE") - BLU = NewCode("BLU") - BLUS = NewCode("BLUS") - BMT = NewCode("BMT") - BOLI = NewCode("BOLI") - BOMB = NewCode("BOMB") - BON = NewCode("BON") - BOOM = NewCode("BOOM") - BOSON = NewCode("BOSON") - BSC = NewCode("BSC") - BRH = NewCode("BRH") - BRAIN = NewCode("BRAIN") - BRE = NewCode("BRE") - BTCM = NewCode("BTCM") - BTCO = NewCode("BTCO") - TALK = NewCode("TALK") - BUB = NewCode("BUB") - BUY = NewCode("BUY") - BUZZ = NewCode("BUZZ") - BTH = NewCode("BTH") - C0C0 = NewCode("C0C0") - CAB = NewCode("CAB") - CF = NewCode("CF") - CLO = NewCode("CLO") - CAM = NewCode("CAM") - CD = NewCode("CD") - CANN = NewCode("CANN") - CNNC = NewCode("CNNC") - CPC = NewCode("CPC") - CST = NewCode("CST") - CAPT = NewCode("CAPT") - CARBON = NewCode("CARBON") - CME = NewCode("CME") - CTK = NewCode("CTK") - CBD = NewCode("CBD") - CCC = NewCode("CCC") - CNT = NewCode("CNT") - XCE = NewCode("XCE") - CHRG = NewCode("CHRG") - CHEMX = NewCode("CHEMX") - CHESS = NewCode("CHESS") - CKS = NewCode("CKS") - CHILL = NewCode("CHILL") - CHIP = NewCode("CHIP") - CHOOF = NewCode("CHOOF") - CRX = NewCode("CRX") - CIN = NewCode("CIN") - POLL = NewCode("POLL") - CLICK = NewCode("CLICK") - CLINT = NewCode("CLINT") - CLUB = NewCode("CLUB") - CLUD = NewCode("CLUD") - COX = NewCode("COX") - COXST = NewCode("COXST") - CFC = NewCode("CFC") - CTIC2 = NewCode("CTIC2") - COIN = NewCode("COIN") - BTTF = NewCode("BTTF") - C2 = NewCode("C2") - CAID = NewCode("CAID") - CL = NewCode("CL") - CTIC = NewCode("CTIC") - CXT = NewCode("CXT") - CHP = NewCode("CHP") - CV2 = NewCode("CV2") - COC = NewCode("COC") - COMP = NewCode("COMP") - CMS = NewCode("CMS") - CONX = NewCode("CONX") - CCX = NewCode("CCX") - CLR = NewCode("CLR") - CORAL = NewCode("CORAL") - CORG = NewCode("CORG") - CSMIC = NewCode("CSMIC") - CMC = NewCode("CMC") - COV = NewCode("COV") - COVX = NewCode("COVX") - CRAB = NewCode("CRAB") - CRAFT = NewCode("CRAFT") - CRNK = NewCode("CRNK") - CRAVE = NewCode("CRAVE") - CRM = NewCode("CRM") - XCRE = NewCode("XCRE") - CREDIT = NewCode("CREDIT") - CREVA = NewCode("CREVA") - CRIME = NewCode("CRIME") - CROC = NewCode("CROC") - CRC = NewCode("CRC") - CRW = NewCode("CRW") - CRY = NewCode("CRY") - CBX = NewCode("CBX") - TKTX = NewCode("TKTX") - CB = NewCode("CB") - CIRC = NewCode("CIRC") - CCB = NewCode("CCB") - CDO = NewCode("CDO") - CG = NewCode("CG") - CJ = NewCode("CJ") - CJC = NewCode("CJC") - CYT = NewCode("CYT") - CRPS = NewCode("CRPS") - PING = NewCode("PING") - CWXT = NewCode("CWXT") - CCT = NewCode("CCT") - CTL = NewCode("CTL") - CURVES = NewCode("CURVES") - CC = NewCode("CC") - CYC = NewCode("CYC") - CYG = NewCode("CYG") - CYP = NewCode("CYP") - FUNK = NewCode("FUNK") - CZECO = NewCode("CZECO") - DALC = NewCode("DALC") - DLISK = NewCode("DLISK") - MOOND = NewCode("MOOND") - DB = NewCode("DB") - DCC = NewCode("DCC") - DCYP = NewCode("DCYP") - DETH = NewCode("DETH") - DKC = NewCode("DKC") - DISK = NewCode("DISK") - DRKT = NewCode("DRKT") - DTT = NewCode("DTT") - DASHS = NewCode("DASHS") - DBTC = NewCode("DBTC") - DCT = NewCode("DCT") - DBET = NewCode("DBET") - DEC = NewCode("DEC") - DECR = NewCode("DECR") - DEA = NewCode("DEA") - DPAY = NewCode("DPAY") - DCRE = NewCode("DCRE") - DC = NewCode("DC") - DES = NewCode("DES") - DEM = NewCode("DEM") - DXC = NewCode("DXC") - DCK = NewCode("DCK") - CUBE = NewCode("CUBE") - DGMS = NewCode("DGMS") - DBG = NewCode("DBG") - DGCS = NewCode("DGCS") - DBLK = NewCode("DBLK") - DIME = NewCode("DIME") - DIRT = NewCode("DIRT") - DVD = NewCode("DVD") - DMT = NewCode("DMT") - NOTE = NewCode("NOTE") - DGORE = NewCode("DGORE") - DLC = NewCode("DLC") - DRT = NewCode("DRT") - DOTA = NewCode("DOTA") - DOX = NewCode("DOX") - DRA = NewCode("DRA") - DFT = NewCode("DFT") - XDB = NewCode("XDB") - DRM = NewCode("DRM") - DRZ = NewCode("DRZ") - DRACO = NewCode("DRACO") - DBIC = NewCode("DBIC") - DUB = NewCode("DUB") - GUM = NewCode("GUM") - DUR = NewCode("DUR") - DUST = NewCode("DUST") - DUX = NewCode("DUX") - DXO = NewCode("DXO") - ECN = NewCode("ECN") - EDR2 = NewCode("EDR2") - EA = NewCode("EA") - EAGS = NewCode("EAGS") - EMT = NewCode("EMT") - EBONUS = NewCode("EBONUS") - ECCHI = NewCode("ECCHI") - EKO = NewCode("EKO") - ECLI = NewCode("ECLI") - ECOB = NewCode("ECOB") - ECO = NewCode("ECO") - EDIT = NewCode("EDIT") - EDRC = NewCode("EDRC") - EDC = NewCode("EDC") - EGAME = NewCode("EGAME") - EGG = NewCode("EGG") - EGO = NewCode("EGO") - ELC = NewCode("ELC") - ELCO = NewCode("ELCO") - ECA = NewCode("ECA") - EPC = NewCode("EPC") - ELE = NewCode("ELE") - ONE337 = NewCode("1337") - EMB = NewCode("EMB") - EMC = NewCode("EMC") - EPY = NewCode("EPY") - EMPC = NewCode("EMPC") - EMP = NewCode("EMP") - ENE = NewCode("ENE") - EET = NewCode("EET") - XNG = NewCode("XNG") - EGMA = NewCode("EGMA") - ENTER = NewCode("ENTER") - ETRUST = NewCode("ETRUST") - EQL = NewCode("EQL") - EQM = NewCode("EQM") - EQT = NewCode("EQT") - ERR = NewCode("ERR") - ESC = NewCode("ESC") - ESP = NewCode("ESP") - ENT = NewCode("ENT") - ETCO = NewCode("ETCO") - DOGETH = NewCode("DOGETH") - ECASH = NewCode("ECASH") - ELITE = NewCode("ELITE") - ETHS = NewCode("ETHS") - ETL = NewCode("ETL") - ETZ = NewCode("ETZ") - EUC = NewCode("EUC") - EURC = NewCode("EURC") - EUROPE = NewCode("EUROPE") - EVA = NewCode("EVA") - EGC = NewCode("EGC") - EOC = NewCode("EOC") - EVIL = NewCode("EVIL") - EVO = NewCode("EVO") - EXB = NewCode("EXB") - EXIT = NewCode("EXIT") - XT = NewCode("XT") - F16 = NewCode("F16") - FADE = NewCode("FADE") - FAZZ = NewCode("FAZZ") - FX = NewCode("FX") - FIDEL = NewCode("FIDEL") - FIDGT = NewCode("FIDGT") - FIND = NewCode("FIND") - FPC = NewCode("FPC") - FIRE = NewCode("FIRE") - FFC = NewCode("FFC") - FRST = NewCode("FRST") - FIST = NewCode("FIST") - FIT = NewCode("FIT") - FLX = NewCode("FLX") - FLVR = NewCode("FLVR") - FLY = NewCode("FLY") - FONZ = NewCode("FONZ") - XFCX = NewCode("XFCX") - FOREX = NewCode("FOREX") - FRN = NewCode("FRN") - FRK = NewCode("FRK") - FRWC = NewCode("FRWC") - FGZ = NewCode("FGZ") - FRE = NewCode("FRE") - FRDC = NewCode("FRDC") - FJC = NewCode("FJC") - FURY = NewCode("FURY") - FSN = NewCode("FSN") - FCASH = NewCode("FCASH") - FTO = NewCode("FTO") - FUZZ = NewCode("FUZZ") - GAKH = NewCode("GAKH") - GBT = NewCode("GBT") - UNITS = NewCode("UNITS") - FOUR20G = NewCode("420G") - GENIUS = NewCode("GENIUS") - GEN = NewCode("GEN") - GEO = NewCode("GEO") - GER = NewCode("GER") - GSR = NewCode("GSR") - SPKTR = NewCode("SPKTR") - GIFT = NewCode("GIFT") - WTT = NewCode("WTT") - GHS = NewCode("GHS") - GIG = NewCode("GIG") - GOT = NewCode("GOT") - XGTC = NewCode("XGTC") - GIZ = NewCode("GIZ") - GLO = NewCode("GLO") - GCR = NewCode("GCR") - BSTY = NewCode("BSTY") - GLC = NewCode("GLC") - GSX = NewCode("GSX") - GOAT = NewCode("GOAT") - GB = NewCode("GB") - GFL = NewCode("GFL") - MNTP = NewCode("MNTP") - GP = NewCode("GP") - GLUCK = NewCode("GLUCK") - GOON = NewCode("GOON") - GTFO = NewCode("GTFO") - GOTX = NewCode("GOTX") - GPU = NewCode("GPU") - GRF = NewCode("GRF") - GRAM = NewCode("GRAM") - GRAV = NewCode("GRAV") - GBIT = NewCode("GBIT") - GREED = NewCode("GREED") - GE = NewCode("GE") - GREENF = NewCode("GREENF") - GRE = NewCode("GRE") - GREXIT = NewCode("GREXIT") - GMCX = NewCode("GMCX") - GROW = NewCode("GROW") - GSM = NewCode("GSM") - GT = NewCode("GT") - NLG = NewCode("NLG") - HKN = NewCode("HKN") - HAC = NewCode("HAC") - HALLO = NewCode("HALLO") - HAMS = NewCode("HAMS") - HPC = NewCode("HPC") - HAWK = NewCode("HAWK") - HAZE = NewCode("HAZE") - HZT = NewCode("HZT") - HDG = NewCode("HDG") - HEDG = NewCode("HEDG") - HEEL = NewCode("HEEL") - HMP = NewCode("HMP") - PLAY = NewCode("PLAY") - HXX = NewCode("HXX") - XHI = NewCode("XHI") - HVCO = NewCode("HVCO") - HTC = NewCode("HTC") - MINH = NewCode("MINH") - HODL = NewCode("HODL") - HON = NewCode("HON") - HOPE = NewCode("HOPE") - HQX = NewCode("HQX") - HSP = NewCode("HSP") - HTML5 = NewCode("HTML5") - HYPERX = NewCode("HYPERX") - HPS = NewCode("HPS") - IOC = NewCode("IOC") - IBANK = NewCode("IBANK") - IBITS = NewCode("IBITS") - ICASH = NewCode("ICASH") - ICOB = NewCode("ICOB") - ICON = NewCode("ICON") - IETH = NewCode("IETH") - ILM = NewCode("ILM") - IMPS = NewCode("IMPS") - NKA = NewCode("NKA") - INCP = NewCode("INCP") - IN = NewCode("IN") - INC = NewCode("INC") - IMS = NewCode("IMS") - IFLT = NewCode("IFLT") - INFX = NewCode("INFX") - INGT = NewCode("INGT") - INPAY = NewCode("INPAY") - INSANE = NewCode("INSANE") - INXT = NewCode("INXT") - IFT = NewCode("IFT") - INV = NewCode("INV") - IVZ = NewCode("IVZ") - ILT = NewCode("ILT") - IONX = NewCode("IONX") - ISL = NewCode("ISL") - ITI = NewCode("ITI") - ING = NewCode("ING") - IEC = NewCode("IEC") - IW = NewCode("IW") - IXC = NewCode("IXC") - IXT = NewCode("IXT") - JPC = NewCode("JPC") - JANE = NewCode("JANE") - JWL = NewCode("JWL") - JIF = NewCode("JIF") - JOBS = NewCode("JOBS") - JOCKER = NewCode("JOCKER") - JW = NewCode("JW") - JOK = NewCode("JOK") - XJO = NewCode("XJO") - KGB = NewCode("KGB") - KARMC = NewCode("KARMC") - KARMA = NewCode("KARMA") - KASHH = NewCode("KASHH") - KAT = NewCode("KAT") - KC = NewCode("KC") - KIDS = NewCode("KIDS") - KIN = NewCode("KIN") - KISS = NewCode("KISS") - KOBO = NewCode("KOBO") - TP1 = NewCode("TP1") - KRAK = NewCode("KRAK") - KGC = NewCode("KGC") - KTK = NewCode("KTK") - KR = NewCode("KR") - KUBO = NewCode("KUBO") - KURT = NewCode("KURT") - KUSH = NewCode("KUSH") - LANA = NewCode("LANA") - LTH = NewCode("LTH") - LAZ = NewCode("LAZ") - LEA = NewCode("LEA") - LEAF = NewCode("LEAF") - LENIN = NewCode("LENIN") - LEPEN = NewCode("LEPEN") - LIR = NewCode("LIR") - LVG = NewCode("LVG") - LGBTQ = NewCode("LGBTQ") - LHC = NewCode("LHC") - EXT = NewCode("EXT") - LBTC = NewCode("LBTC") - LSD = NewCode("LSD") - LIMX = NewCode("LIMX") - LTD = NewCode("LTD") - LINDA = NewCode("LINDA") - LKC = NewCode("LKC") - LBTCX = NewCode("LBTCX") - LCC = NewCode("LCC") - LTCU = NewCode("LTCU") - LTCR = NewCode("LTCR") - LDOGE = NewCode("LDOGE") - LTS = NewCode("LTS") - LIV = NewCode("LIV") - LIZI = NewCode("LIZI") - LOC = NewCode("LOC") - LOCX = NewCode("LOCX") - LOOK = NewCode("LOOK") - LOOT = NewCode("LOOT") - XLTCG = NewCode("XLTCG") - BASH = NewCode("BASH") - LUCKY = NewCode("LUCKY") - L7S = NewCode("L7S") - LDM = NewCode("LDM") - LUMI = NewCode("LUMI") - LUNA = NewCode("LUNA") - LC = NewCode("LC") - LUX = NewCode("LUX") - MCRN = NewCode("MCRN") - XMG = NewCode("XMG") - MMXIV = NewCode("MMXIV") - MAT = NewCode("MAT") - MAO = NewCode("MAO") - MAPC = NewCode("MAPC") - MRB = NewCode("MRB") - MXT = NewCode("MXT") - MARV = NewCode("MARV") - MARX = NewCode("MARX") - MCAR = NewCode("MCAR") - MM = NewCode("MM") - MVC = NewCode("MVC") - MAVRO = NewCode("MAVRO") - MAX = NewCode("MAX") - MAZE = NewCode("MAZE") - MBIT = NewCode("MBIT") - MCOIN = NewCode("MCOIN") - MPRO = NewCode("MPRO") - XMS = NewCode("XMS") - MLITE = NewCode("MLITE") - MLNC = NewCode("MLNC") - MENTAL = NewCode("MENTAL") - MERGEC = NewCode("MERGEC") - MTLMC3 = NewCode("MTLMC3") - METAL = NewCode("METAL") - MUU = NewCode("MUU") - MILO = NewCode("MILO") - MND = NewCode("MND") - XMINE = NewCode("XMINE") - MNM = NewCode("MNM") - XNM = NewCode("XNM") - MIRO = NewCode("MIRO") - MIS = NewCode("MIS") - MMXVI = NewCode("MMXVI") - MOIN = NewCode("MOIN") - MOJO = NewCode("MOJO") - TAB = NewCode("TAB") - MONETA = NewCode("MONETA") - MUE = NewCode("MUE") - MONEY = NewCode("MONEY") - MRP = NewCode("MRP") - MOTO = NewCode("MOTO") - MULTI = NewCode("MULTI") - MST = NewCode("MST") - MVR = NewCode("MVR") - MYSTIC = NewCode("MYSTIC") - WISH = NewCode("WISH") - NKT = NewCode("NKT") - NAT = NewCode("NAT") - ENAU = NewCode("ENAU") - NEBU = NewCode("NEBU") - NEF = NewCode("NEF") - NBIT = NewCode("NBIT") - NETKO = NewCode("NETKO") - NTM = NewCode("NTM") - NETC = NewCode("NETC") - NRC = NewCode("NRC") - NTK = NewCode("NTK") - NTRN = NewCode("NTRN") - NEVA = NewCode("NEVA") - NIC = NewCode("NIC") - NKC = NewCode("NKC") - NYC = NewCode("NYC") - NZC = NewCode("NZC") - NICE = NewCode("NICE") - NDOGE = NewCode("NDOGE") - XTR = NewCode("XTR") - N2O = NewCode("N2O") - NIXON = NewCode("NIXON") - NOC = NewCode("NOC") - NODC = NewCode("NODC") - NODES = NewCode("NODES") - NODX = NewCode("NODX") - NLC = NewCode("NLC") - NLC2 = NewCode("NLC2") - NOO = NewCode("NOO") - NVC = NewCode("NVC") - NPC = NewCode("NPC") - NUBIS = NewCode("NUBIS") - NUKE = NewCode("NUKE") - N7 = NewCode("N7") - NUM = NewCode("NUM") - NMR = NewCode("NMR") - NXE = NewCode("NXE") - OBS = NewCode("OBS") - OCEAN = NewCode("OCEAN") - OCOW = NewCode("OCOW") - EIGHT88 = NewCode("888") - OCC = NewCode("OCC") - OK = NewCode("OK") - ODNT = NewCode("ODNT") - FLAV = NewCode("FLAV") - OLIT = NewCode("OLIT") - OLYMP = NewCode("OLYMP") - OMA = NewCode("OMA") - OMC = NewCode("OMC") - ONEK = NewCode("ONEK") - ONX = NewCode("ONX") - XPO = NewCode("XPO") - OPAL = NewCode("OPAL") - OTN = NewCode("OTN") - OP = NewCode("OP") - OPES = NewCode("OPES") - OPTION = NewCode("OPTION") - ORLY = NewCode("ORLY") - OS76 = NewCode("OS76") - OZC = NewCode("OZC") - P7C = NewCode("P7C") - PAC = NewCode("PAC") - PAK = NewCode("PAK") - PAL = NewCode("PAL") - PND = NewCode("PND") - PINKX = NewCode("PINKX") - POPPY = NewCode("POPPY") - DUO = NewCode("DUO") - PARA = NewCode("PARA") - PKB = NewCode("PKB") - GENE = NewCode("GENE") - PARTY = NewCode("PARTY") - PYN = NewCode("PYN") - XPY = NewCode("XPY") - CON = NewCode("CON") - PAYP = NewCode("PAYP") - GUESS = NewCode("GUESS") - PEN = NewCode("PEN") - PTA = NewCode("PTA") - PEO = NewCode("PEO") - PSB = NewCode("PSB") - XPD = NewCode("XPD") - PXL = NewCode("PXL") - PHR = NewCode("PHR") - PIE = NewCode("PIE") - PIO = NewCode("PIO") - PIPR = NewCode("PIPR") - SKULL = NewCode("SKULL") - PLANET = NewCode("PLANET") - PNC = NewCode("PNC") - XPTX = NewCode("XPTX") - PLNC = NewCode("PLNC") - XPS = NewCode("XPS") - POKE = NewCode("POKE") - PLBT = NewCode("PLBT") - POM = NewCode("POM") - PONZ2 = NewCode("PONZ2") - PONZI = NewCode("PONZI") - XSP = NewCode("XSP") - XPC = NewCode("XPC") - PEX = NewCode("PEX") - TRON = NewCode("TRON") - POST = NewCode("POST") - POSW = NewCode("POSW") - PWR = NewCode("PWR") - POWER = NewCode("POWER") - PRE = NewCode("PRE") - PRS = NewCode("PRS") - PXI = NewCode("PXI") - PEXT = NewCode("PEXT") - PRIMU = NewCode("PRIMU") - PRX = NewCode("PRX") - PRM = NewCode("PRM") - PRIX = NewCode("PRIX") - XPRO = NewCode("XPRO") - PCM = NewCode("PCM") - PROC = NewCode("PROC") - NANOX = NewCode("NANOX") - VRP = NewCode("VRP") - PTY = NewCode("PTY") - PSI = NewCode("PSI") - PSY = NewCode("PSY") - PULSE = NewCode("PULSE") - PUPA = NewCode("PUPA") - PURE = NewCode("PURE") - VIDZ = NewCode("VIDZ") - PUTIN = NewCode("PUTIN") - PX = NewCode("PX") - QTM = NewCode("QTM") - QTZ = NewCode("QTZ") - QBC = NewCode("QBC") - XQN = NewCode("XQN") - RBBT = NewCode("RBBT") - RAC = NewCode("RAC") - RADI = NewCode("RADI") - RAD = NewCode("RAD") - RAI = NewCode("RAI") - XRA = NewCode("XRA") - RATIO = NewCode("RATIO") - REA = NewCode("REA") - RCX = NewCode("RCX") - REE = NewCode("REE") - REC = NewCode("REC") - RMS = NewCode("RMS") - RBIT = NewCode("RBIT") - RNC = NewCode("RNC") - REV = NewCode("REV") - RH = NewCode("RH") - XRL = NewCode("XRL") - RICE = NewCode("RICE") - RICHX = NewCode("RICHX") - RID = NewCode("RID") - RIDE = NewCode("RIDE") - RBT = NewCode("RBT") - RING = NewCode("RING") - RIO = NewCode("RIO") - RISE = NewCode("RISE") - ROCKET = NewCode("ROCKET") - RPC = NewCode("RPC") - ROS = NewCode("ROS") - ROYAL = NewCode("ROYAL") - RSGP = NewCode("RSGP") - RBIES = NewCode("RBIES") - RUBIT = NewCode("RUBIT") - RBY = NewCode("RBY") - RUC = NewCode("RUC") - RUPX = NewCode("RUPX") - RUP = NewCode("RUP") - RUST = NewCode("RUST") - SFE = NewCode("SFE") - SLS = NewCode("SLS") - SMSR = NewCode("SMSR") - RONIN = NewCode("RONIN") - STV = NewCode("STV") - HIFUN = NewCode("HIFUN") - MAD = NewCode("MAD") - SANDG = NewCode("SANDG") - STO = NewCode("STO") - SCAN = NewCode("SCAN") - SCITW = NewCode("SCITW") - SCRPT = NewCode("SCRPT") - SCRT = NewCode("SCRT") - SED = NewCode("SED") - SEEDS = NewCode("SEEDS") - B2X = NewCode("B2X") - SEL = NewCode("SEL") - SLFI = NewCode("SLFI") - SMBR = NewCode("SMBR") - SEN = NewCode("SEN") - SENT = NewCode("SENT") - SRNT = NewCode("SRNT") - SEV = NewCode("SEV") - SP = NewCode("SP") - SXC = NewCode("SXC") - GELD = NewCode("GELD") - SHDW = NewCode("SHDW") - SDC = NewCode("SDC") - SAK = NewCode("SAK") - SHRP = NewCode("SHRP") - SHELL = NewCode("SHELL") - SH = NewCode("SH") - SHORTY = NewCode("SHORTY") - SHREK = NewCode("SHREK") - SHRM = NewCode("SHRM") - SIB = NewCode("SIB") - SIGT = NewCode("SIGT") - SLCO = NewCode("SLCO") - SIGU = NewCode("SIGU") - SIX = NewCode("SIX") - SJW = NewCode("SJW") - SKB = NewCode("SKB") - SW = NewCode("SW") - SLEEP = NewCode("SLEEP") - SLING = NewCode("SLING") - SMART = NewCode("SMART") - SMC = NewCode("SMC") - SMF = NewCode("SMF") - SOCC = NewCode("SOCC") - SCL = NewCode("SCL") - SDAO = NewCode("SDAO") - SOLAR = NewCode("SOLAR") - SOLO = NewCode("SOLO") - SCT = NewCode("SCT") - SONG = NewCode("SONG") - ALTCOM = NewCode("ALTCOM") - SPHTX = NewCode("SPHTX") - SPC = NewCode("SPC") - SPACE = NewCode("SPACE") - SBT = NewCode("SBT") - SPEC = NewCode("SPEC") - SPX = NewCode("SPX") - SCS = NewCode("SCS") - SPORT = NewCode("SPORT") - SPT = NewCode("SPT") - SPR = NewCode("SPR") - SPEX = NewCode("SPEX") - SQL = NewCode("SQL") - SBIT = NewCode("SBIT") - STHR = NewCode("STHR") - STALIN = NewCode("STALIN") - STAR = NewCode("STAR") - STA = NewCode("STA") - START = NewCode("START") - STP = NewCode("STP") - PNK = NewCode("PNK") - STEPS = NewCode("STEPS") - STK = NewCode("STK") - STONK = NewCode("STONK") - STS = NewCode("STS") - STRP = NewCode("STRP") - STY = NewCode("STY") - XMT = NewCode("XMT") - SSTC = NewCode("SSTC") - SUPER = NewCode("SUPER") - SRND = NewCode("SRND") - STRB = NewCode("STRB") - M1 = NewCode("M1") - SPM = NewCode("SPM") - BUCKS = NewCode("BUCKS") - TOKEN = NewCode("TOKEN") - SWT = NewCode("SWT") - SWEET = NewCode("SWEET") - SWING = NewCode("SWING") - CHSB = NewCode("CHSB") - SIC = NewCode("SIC") - SDP = NewCode("SDP") - XSY = NewCode("XSY") - SYNX = NewCode("SYNX") - SNRG = NewCode("SNRG") - TAG = NewCode("TAG") - TAGR = NewCode("TAGR") - TAJ = NewCode("TAJ") - TAK = NewCode("TAK") - TAKE = NewCode("TAKE") - TAM = NewCode("TAM") - XTO = NewCode("XTO") - TAP = NewCode("TAP") - TLE = NewCode("TLE") - TSE = NewCode("TSE") - TLEX = NewCode("TLEX") - TAXI = NewCode("TAXI") - TCN = NewCode("TCN") - TDFB = NewCode("TDFB") - TEAM = NewCode("TEAM") - TECH = NewCode("TECH") - TEC = NewCode("TEC") - TEK = NewCode("TEK") - TB = NewCode("TB") - TLX = NewCode("TLX") - TELL = NewCode("TELL") - TENNET = NewCode("TENNET") - TES = NewCode("TES") - TGS = NewCode("TGS") - XVE = NewCode("XVE") - TCR = NewCode("TCR") - GCC = NewCode("GCC") - MAY = NewCode("MAY") - THOM = NewCode("THOM") - TIA = NewCode("TIA") - TIDE = NewCode("TIDE") - TIE = NewCode("TIE") - TIT = NewCode("TIT") - TTC = NewCode("TTC") - TODAY = NewCode("TODAY") - TBX = NewCode("TBX") - TDS = NewCode("TDS") - TLOSH = NewCode("TLOSH") - TOKC = NewCode("TOKC") - TMRW = NewCode("TMRW") - TOOL = NewCode("TOOL") - TCX = NewCode("TCX") - TOT = NewCode("TOT") - TX = NewCode("TX") - TRANSF = NewCode("TRANSF") - TRAP = NewCode("TRAP") - TBCX = NewCode("TBCX") - TRICK = NewCode("TRICK") - TPG = NewCode("TPG") - TFL = NewCode("TFL") - TRUMP = NewCode("TRUMP") - TNG = NewCode("TNG") - TUR = NewCode("TUR") - TWERK = NewCode("TWERK") - TWIST = NewCode("TWIST") - TWO = NewCode("TWO") - UCASH = NewCode("UCASH") - UAE = NewCode("UAE") - XBU = NewCode("XBU") - UBQ = NewCode("UBQ") - U = NewCode("U") - UDOWN = NewCode("UDOWN") - GAIN = NewCode("GAIN") - USC = NewCode("USC") - UMC = NewCode("UMC") - UNF = NewCode("UNF") - UNIFY = NewCode("UNIFY") - USDE = NewCode("USDE") - UBTC = NewCode("UBTC") - UIS = NewCode("UIS") - UNIT = NewCode("UNIT") - UNI = NewCode("UNI") - UXC = NewCode("UXC") - URC = NewCode("URC") - XUP = NewCode("XUP") - UFR = NewCode("UFR") - URO = NewCode("URO") - UTLE = NewCode("UTLE") - VAL = NewCode("VAL") - VPRC = NewCode("VPRC") - VAPOR = NewCode("VAPOR") - VCOIN = NewCode("VCOIN") - VEC = NewCode("VEC") - VEC2 = NewCode("VEC2") - VLT = NewCode("VLT") - VENE = NewCode("VENE") - VNTX = NewCode("VNTX") - VTN = NewCode("VTN") - CRED = NewCode("CRED") - VERS = NewCode("VERS") - VTX = NewCode("VTX") - VTY = NewCode("VTY") - VIP = NewCode("VIP") - VISIO = NewCode("VISIO") - VK = NewCode("VK") - VOL = NewCode("VOL") - VOYA = NewCode("VOYA") - VPN = NewCode("VPN") - XVS = NewCode("XVS") - VTL = NewCode("VTL") - VULC = NewCode("VULC") - VVI = NewCode("VVI") - WGR = NewCode("WGR") - WAM = NewCode("WAM") - WARP = NewCode("WARP") - WASH = NewCode("WASH") - WGO = NewCode("WGO") - WAY = NewCode("WAY") - WCASH = NewCode("WCASH") - WEALTH = NewCode("WEALTH") - WEEK = NewCode("WEEK") - WHO = NewCode("WHO") - WIC = NewCode("WIC") - WBB = NewCode("WBB") - WINE = NewCode("WINE") - WINK = NewCode("WINK") - WISC = NewCode("WISC") - WITCH = NewCode("WITCH") - WMC = NewCode("WMC") - WOMEN = NewCode("WOMEN") - WOK = NewCode("WOK") - WRT = NewCode("WRT") - XCO = NewCode("XCO") - X2 = NewCode("X2") - XNX = NewCode("XNX") - XAU = NewCode("XAU") - XAV = NewCode("XAV") - XDE2 = NewCode("XDE2") - XDE = NewCode("XDE") - XIOS = NewCode("XIOS") - XOC = NewCode("XOC") - XSSX = NewCode("XSSX") - XBY = NewCode("XBY") - YAC = NewCode("YAC") - YMC = NewCode("YMC") - YAY = NewCode("YAY") - YBC = NewCode("YBC") - YES = NewCode("YES") - YOB2X = NewCode("YOB2X") - YOVI = NewCode("YOVI") - ZYD = NewCode("ZYD") - ZECD = NewCode("ZECD") - ZEIT = NewCode("ZEIT") - ZENI = NewCode("ZENI") - ZET2 = NewCode("ZET2") - ZET = NewCode("ZET") - ZMC = NewCode("ZMC") - ZIRK = NewCode("ZIRK") - ZLQ = NewCode("ZLQ") - ZNE = NewCode("ZNE") - ZONTO = NewCode("ZONTO") - ZOOM = NewCode("ZOOM") - ZRC = NewCode("ZRC") - ZUR = NewCode("ZUR") - ZB = NewCode("ZB") - QC = NewCode("QC") - HLC = NewCode("HLC") - SAFE = NewCode("SAFE") - BTN = NewCode("BTN") - CDC = NewCode("CDC") - DDM = NewCode("DDM") - HOTC = NewCode("HOTC") - BDS = NewCode("BDS") - AAA = NewCode("AAA") - XWC = NewCode("XWC") - PDX = NewCode("PDX") - SLT = NewCode("SLT") - HPY = NewCode("HPY") - XXBT = NewCode("XXBT") // BTC, but XXBT instead - XDG = NewCode("XDG") // DOGE - HKD = NewCode("HKD") // Hong Kong Dollar - AUD = NewCode("AUD") // Australian Dollar - USD = NewCode("USD") // United States Dollar - ZUSD = NewCode("ZUSD") // United States Dollar, but with a Z in front of it - EUR = NewCode("EUR") // Euro - ZEUR = NewCode("ZEUR") // Euro, but with a Z in front of it - CAD = NewCode("CAD") // Canadaian Dollar - ZCAD = NewCode("ZCAD") // Canadaian Dollar, but with a Z in front of it - SGD = NewCode("SGD") // Singapore Dollar - RUB = NewCode("RUB") // RUssian ruBle - RUR = NewCode("RUR") // RUssian Ruble - PLN = NewCode("PLN") // Polish zÅ‚oty - TRY = NewCode("TRY") // Turkish lira - UAH = NewCode("UAH") // Ukrainian hryvnia - JPY = NewCode("JPY") // Japanese yen - ZJPY = NewCode("ZJPY") // Japanese yen, but with a Z in front of it - LCH = NewCode("LCH") - MYR = NewCode("MYR") - AFN = NewCode("AFN") - ARS = NewCode("ARS") - AWG = NewCode("AWG") - AZN = NewCode("AZN") - BSD = NewCode("BSD") - BBD = NewCode("BBD") - BYN = NewCode("BYN") - BZD = NewCode("BZD") - BMD = NewCode("BMD") - BOB = NewCode("BOB") - BAM = NewCode("BAM") - BWP = NewCode("BWP") - BGN = NewCode("BGN") - BRL = NewCode("BRL") - BND = NewCode("BND") - KHR = NewCode("KHR") - KYD = NewCode("KYD") - CLP = NewCode("CLP") - CNY = NewCode("CNY") - COP = NewCode("COP") - HRK = NewCode("HRK") - CUP = NewCode("CUP") - CZK = NewCode("CZK") - DKK = NewCode("DKK") - DOP = NewCode("DOP") - XCD = NewCode("XCD") - EGP = NewCode("EGP") - SVC = NewCode("SVC") - FKP = NewCode("FKP") - FJD = NewCode("FJD") - GIP = NewCode("GIP") - GTQ = NewCode("GTQ") - GGP = NewCode("GGP") - GYD = NewCode("GYD") - HNL = NewCode("HNL") - HUF = NewCode("HUF") - ISK = NewCode("ISK") - INR = NewCode("INR") - IDR = NewCode("IDR") - IRR = NewCode("IRR") - IMP = NewCode("IMP") - ILS = NewCode("ILS") - JMD = NewCode("JMD") - JEP = NewCode("JEP") - KZT = NewCode("KZT") - KPW = NewCode("KPW") - KGS = NewCode("KGS") - LAK = NewCode("LAK") - LBP = NewCode("LBP") - LRD = NewCode("LRD") - MKD = NewCode("MKD") - MUR = NewCode("MUR") - MXN = NewCode("MXN") - MNT = NewCode("MNT") - MZN = NewCode("MZN") - NAD = NewCode("NAD") - NPR = NewCode("NPR") - ANG = NewCode("ANG") - NZD = NewCode("NZD") - NIO = NewCode("NIO") - NGN = NewCode("NGN") - NOK = NewCode("NOK") - OMR = NewCode("OMR") - PKR = NewCode("PKR") - PAB = NewCode("PAB") - PYG = NewCode("PYG") - PHP = NewCode("PHP") - QAR = NewCode("QAR") - RON = NewCode("RON") - SHP = NewCode("SHP") - SAR = NewCode("SAR") - RSD = NewCode("RSD") - SCR = NewCode("SCR") - SOS = NewCode("SOS") - ZAR = NewCode("ZAR") - LKR = NewCode("LKR") - SEK = NewCode("SEK") - CHF = NewCode("CHF") - SRD = NewCode("SRD") - SYP = NewCode("SYP") - TWD = NewCode("TWD") - THB = NewCode("THB") - TTD = NewCode("TTD") - TVD = NewCode("TVD") - GBP = NewCode("GBP") - UYU = NewCode("UYU") - UZS = NewCode("UZS") - VEF = NewCode("VEF") - VND = NewCode("VND") - YER = NewCode("YER") - ZWD = NewCode("ZWD") - XETH = NewCode("XETH") - FX_BTC = NewCode("FX_BTC") // nolint: golint -) diff --git a/currency/code_test.go b/currency/code_test.go index b5d7c599..e27dc4c6 100644 --- a/currency/code_test.go +++ b/currency/code_test.go @@ -8,31 +8,31 @@ import ( func TestRoleString(t *testing.T) { if Unset.String() != UnsetRollString { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", UnsetRollString, Unset) } if Fiat.String() != FiatCurrencyString { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", FiatCurrencyString, Fiat) } if Cryptocurrency.String() != CryptocurrencyString { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", CryptocurrencyString, Cryptocurrency) } if Token.String() != TokenString { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", TokenString, Token) } if Contract.String() != ContractString { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", ContractString, Contract) } @@ -40,7 +40,7 @@ func TestRoleString(t *testing.T) { var random Role = 1 << 7 if random.String() != "UNKNOWN" { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", "UNKNOWN", random) } @@ -49,17 +49,18 @@ func TestRoleString(t *testing.T) { func TestRoleMarshalJSON(t *testing.T) { d, err := common.JSONEncode(Fiat) if err != nil { - t.Error("Test Failed - Role MarshalJSON() error", err) + t.Error("Role MarshalJSON() error", err) } expected := `"fiatCurrency"` if string(d) != expected { - t.Errorf("Test Failed - Role MarshalJSON() error expected %s but received %s", + t.Errorf("Role MarshalJSON() error expected %s but received %s", expected, string(d)) } } +// TestRoleUnmarshalJSON logic test func TestRoleUnmarshalJSON(t *testing.T) { type AllTheRoles struct { RoleOne Role `json:"RoleOne"` @@ -80,136 +81,158 @@ func TestRoleUnmarshalJSON(t *testing.T) { e, err := common.JSONEncode(1337) if err != nil { - t.Fatal("Test Failed - Role UnmarshalJSON() error", err) + t.Fatal("Role UnmarshalJSON() error", err) } var incoming AllTheRoles err = common.JSONDecode(e, &incoming) if err == nil { - t.Fatal("Test Failed - Role UnmarshalJSON() error", err) + t.Fatal("Role UnmarshalJSON() Expected error") } e, err = common.JSONEncode(outgoing) if err != nil { - t.Fatal("Test Failed - Role UnmarshalJSON() error", err) + t.Fatal("Role UnmarshalJSON() error", err) } err = common.JSONDecode(e, &incoming) if err != nil { - t.Fatal("Test Failed - Role UnmarshalJSON() error", err) + t.Fatal("Role UnmarshalJSON() error", err) } if incoming.RoleOne != Unset { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", Unset, incoming.RoleOne) } if incoming.RoleTwo != Cryptocurrency { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", Cryptocurrency, incoming.RoleTwo) } if incoming.RoleThree != Fiat { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", Fiat, incoming.RoleThree) } if incoming.RoleFour != Token { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", Token, incoming.RoleFour) } if incoming.RoleFive != Contract { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", Contract, incoming.RoleFive) } if incoming.RoleUnknown != Unset { - t.Errorf("Test Failed - Role String() error expected %s but received %s", + t.Errorf("Role String() error expected %s but received %s", incoming.RoleFive, incoming.RoleUnknown) } + var unhandled Role + err = unhandled.UnmarshalJSON([]byte("\"ThisIsntReal\"")) + if err == nil { + t.Error("Expected unmarshall error") + } } func TestBaseCode(t *testing.T) { var main BaseCodes if main.HasData() { - t.Errorf("Test Failed - BaseCode HasData() error expected false but received %v", + t.Errorf("BaseCode HasData() error expected false but received %v", main.HasData()) } catsCode := main.Register("CATS") if !main.HasData() { - t.Errorf("Test Failed - BaseCode HasData() error expected true but received %v", + t.Errorf("BaseCode HasData() error expected true but received %v", main.HasData()) } if !main.Register("CATS").Match(catsCode) { - t.Errorf("Test Failed - BaseCode Match() error expected true but received %v", + t.Errorf("BaseCode Match() error expected true but received %v", false) } if main.Register("DOGS").Match(catsCode) { - t.Errorf("Test Failed - BaseCode Match() error expected false but received %v", + t.Errorf("BaseCode Match() error expected false but received %v", true) } loadedCurrencies := main.GetCurrencies() if loadedCurrencies.Contains(main.Register("OWLS")) { - t.Errorf("Test Failed - BaseCode Contains() error expected false but received %v", + t.Errorf("BaseCode Contains() error expected false but received %v", true) } if !loadedCurrencies.Contains(catsCode) { - t.Errorf("Test Failed - BaseCode Contains() error expected true but received %v", + t.Errorf("BaseCode Contains() error expected true but received %v", false) } err := main.UpdateContract("Bitcoin Perpetual", "XBTUSD", "Bitmex") if err != nil { - t.Error("Test Failed - BaseCode UpdateContract error", err) + t.Error("BaseCode UpdateContract error", err) } err = main.UpdateCryptocurrency("Bitcoin", "BTC", 1337) if err != nil { - t.Error("Test Failed - BaseCode UpdateContract error", err) + t.Error("BaseCode UpdateContract error", err) + } + + err = main.UpdateFiatCurrency("Unreal Dollar", "AUD", 1111) + if err != nil { + t.Error("BaseCode UpdateContract error", err) + } + if main.Items[5].FullName != "Unreal Dollar" { + t.Error("Expected fullname to update for AUD") } err = main.UpdateFiatCurrency("Australian Dollar", "AUD", 1336) if err != nil { - t.Error("Test Failed - BaseCode UpdateContract error", err) + t.Error("BaseCode UpdateContract error", err) + } + + main.Items[5].Role = Unset + err = main.UpdateFiatCurrency("Australian Dollar", "AUD", 1336) + if err != nil { + t.Error("BaseCode UpdateContract error", err) + } + if main.Items[5].Role != Fiat { + t.Error("Expected role to change to Fiat") } err = main.UpdateToken("Populous", "PPT", "ETH", 1335) if err != nil { - t.Error("Test Failed - BaseCode UpdateContract error", err) + t.Error("BaseCode UpdateContract error", err) } contract := main.Register("XBTUSD") if contract.IsFiatCurrency() { - t.Errorf("Test Failed - BaseCode IsFiatCurrency() error expected false but received %v", + t.Errorf("BaseCode IsFiatCurrency() error expected false but received %v", true) } if contract.IsCryptocurrency() { - t.Errorf("Test Failed - BaseCode IsFiatCurrency() error expected false but received %v", + t.Errorf("BaseCode IsFiatCurrency() error expected false but received %v", true) } if contract.IsDefaultFiatCurrency() { - t.Errorf("Test Failed - BaseCode IsDefaultFiatCurrency() error expected false but received %v", + t.Errorf("BaseCode IsDefaultFiatCurrency() error expected false but received %v", true) } if contract.IsDefaultFiatCurrency() { - t.Errorf("Test Failed - BaseCode IsFiatCurrency() error expected false but received %v", + t.Errorf("BaseCode IsFiatCurrency() error expected false but received %v", true) } @@ -220,50 +243,101 @@ func TestBaseCode(t *testing.T) { Symbol: "ADA", }) if err != nil { - t.Error("Test Failed - BaseCode LoadItem() error", err) + t.Error("BaseCode LoadItem() error", err) } full, err := main.GetFullCurrencyData() if err != nil { - t.Error("Test Failed - BaseCode GetFullCurrencyData error", err) + t.Error("BaseCode GetFullCurrencyData error", err) } if len(full.Contracts) != 1 { - t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 1 but received %v", + t.Errorf("BaseCode GetFullCurrencyData() error expected 1 but received %v", len(full.Contracts)) } if len(full.Cryptocurrency) != 2 { - t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 1 but received %v", + t.Errorf("BaseCode GetFullCurrencyData() error expected 1 but received %v", len(full.Cryptocurrency)) } if len(full.FiatCurrency) != 1 { - t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 1 but received %v", + t.Errorf("BaseCode GetFullCurrencyData() error expected 1 but received %v", len(full.FiatCurrency)) } if len(full.Token) != 1 { - t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 1 but received %v", + t.Errorf("BaseCode GetFullCurrencyData() error expected 1 but received %v", len(full.Token)) } if len(full.UnsetCurrency) != 3 { - t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 3 but received %v", + t.Errorf("BaseCode GetFullCurrencyData() error expected 3 but received %v", len(full.UnsetCurrency)) } if !full.LastMainUpdate.IsZero() { - t.Errorf("Test Failed - BaseCode GetFullCurrencyData() error expected 0 but received %s", + t.Errorf("BaseCode GetFullCurrencyData() error expected 0 but received %s", full.LastMainUpdate) } + + err = main.LoadItem(&Item{ + ID: 0, + FullName: "Cardano", + Role: Role(99), + Symbol: "ADA", + }) + if err != nil { + t.Error("BaseCode LoadItem() error", err) + } + _, err = main.GetFullCurrencyData() + if err == nil { + t.Error("Expected 'Role undefined'") + } + + main.Items[0].FullName = "Hello" + err = main.UpdateCryptocurrency("MEWOW", "CATS", 1338) + if err != nil { + t.Error("BaseCode UpdateContract error", err) + } + if main.Items[0].FullName != "MEWOW" { + t.Error("Fullname not updated") + } + err = main.UpdateCryptocurrency("MEWOW", "CATS", 1338) + if err != nil { + t.Error("BaseCode UpdateContract error", err) + } + + main.Items[0].Role = Cryptocurrency + err = main.UpdateCryptocurrency("MEWOW", "CATS", 3) + if err != nil { + t.Error("BaseCode UpdateContract error", err) + } + if main.Items[0].ID != 3 { + t.Error("ID not updated") + } + + main.Items[0].Role = Unset + err = main.UpdateCryptocurrency("MEWOW", "CATS", 1338) + if err != nil { + t.Error("BaseCode UpdateContract error", err) + } + if main.Items[0].ID != 1338 { + t.Error("ID not updated") + } + + main.Items[0].Role = Token + err = main.UpdateCryptocurrency("MEWOW", "CATS", 3) + if err == nil { + t.Error("Expecting cryptocurrency to already exist") + } } func TestCodeString(t *testing.T) { expected := "TEST" cc := NewCode("TEST") if cc.String() != expected { - t.Errorf("Test Failed - Currency Code String() error expected %s but received %s", + t.Errorf("Currency Code String() error expected %s but received %s", expected, cc) } } @@ -272,7 +346,7 @@ func TestCodeLower(t *testing.T) { expected := "test" cc := NewCode("TEST") if cc.Lower().String() != expected { - t.Errorf("Test Failed - Currency Code Lower() error expected %s but received %s", + t.Errorf("Currency Code Lower() error expected %s but received %s", expected, cc.Lower()) } @@ -282,7 +356,7 @@ func TestCodeUpper(t *testing.T) { expected := "TEST" cc := NewCode("test") if cc.Upper().String() != expected { - t.Errorf("Test Failed - Currency Code Upper() error expected %s but received %s", + t.Errorf("Currency Code Upper() error expected %s but received %s", expected, cc.Upper()) } @@ -293,21 +367,21 @@ func TestCodeUnmarshalJSON(t *testing.T) { expected := "BRO" encoded, err := common.JSONEncode(expected) if err != nil { - t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) + t.Fatal("Currency Code UnmarshalJSON error", err) } err = common.JSONDecode(encoded, &unmarshalHere) if err != nil { - t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) + t.Fatal("Currency Code UnmarshalJSON error", err) } err = common.JSONDecode(encoded, &unmarshalHere) if err != nil { - t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) + t.Fatal("Currency Code UnmarshalJSON error", err) } if unmarshalHere.String() != expected { - t.Errorf("Test Failed - Currency Code Upper() error expected %s but received %s", + t.Errorf("Currency Code Upper() error expected %s but received %s", expected, unmarshalHere) } @@ -324,11 +398,11 @@ func TestCodeMarshalJSON(t *testing.T) { encoded, err := common.JSONEncode(quickstruct) if err != nil { - t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) + t.Fatal("Currency Code UnmarshalJSON error", err) } if string(encoded) != expectedJSON { - t.Errorf("Test Failed - Currency Code Upper() error expected %s but received %s", + t.Errorf("Currency Code Upper() error expected %s but received %s", expectedJSON, string(encoded)) } @@ -341,42 +415,42 @@ func TestCodeMarshalJSON(t *testing.T) { encoded, err = common.JSONEncode(quickstruct) if err != nil { - t.Fatal("Test Failed - Currency Code UnmarshalJSON error", err) + t.Fatal("Currency Code UnmarshalJSON error", err) } newExpectedJSON := `{"sweetCodes":""}` if string(encoded) != newExpectedJSON { - t.Errorf("Test Failed - Currency Code Upper() error expected %s but received %s", + t.Errorf("Currency Code Upper() error expected %s but received %s", newExpectedJSON, string(encoded)) } } func TestIsDefaultCurrency(t *testing.T) { if !USD.IsDefaultFiatCurrency() { - t.Errorf("Test Failed. TestIsDefaultCurrency Cannot match currency %s.", + t.Errorf("TestIsDefaultCurrency Cannot match currency %s.", USD) } if !AUD.IsDefaultFiatCurrency() { - t.Errorf("Test Failed. TestIsDefaultCurrency Cannot match currency, %s.", + t.Errorf("TestIsDefaultCurrency Cannot match currency, %s.", AUD) } if LTC.IsDefaultFiatCurrency() { - t.Errorf("Test Failed. TestIsDefaultCurrency Function return is incorrect with, %s.", + t.Errorf("TestIsDefaultCurrency Function return is incorrect with, %s.", LTC) } } func TestIsDefaultCryptocurrency(t *testing.T) { if !BTC.IsDefaultCryptocurrency() { - t.Errorf("Test Failed. TestIsDefaultCryptocurrency cannot match currency, %s.", + t.Errorf("TestIsDefaultCryptocurrency cannot match currency, %s.", BTC) } if !LTC.IsDefaultCryptocurrency() { - t.Errorf("Test Failed. TestIsDefaultCryptocurrency cannot match currency, %s.", + t.Errorf("TestIsDefaultCryptocurrency cannot match currency, %s.", LTC) } if AUD.IsDefaultCryptocurrency() { - t.Errorf("Test Failed. TestIsDefaultCryptocurrency function return is incorrect with, %s.", + t.Errorf("TestIsDefaultCryptocurrency function return is incorrect with, %s.", AUD) } } @@ -384,30 +458,30 @@ func TestIsDefaultCryptocurrency(t *testing.T) { func TestIsFiatCurrency(t *testing.T) { if !USD.IsFiatCurrency() { t.Errorf( - "Test Failed. TestIsFiatCurrency cannot match currency, %s.", USD) + "TestIsFiatCurrency cannot match currency, %s.", USD) } if !CNY.IsFiatCurrency() { t.Errorf( - "Test Failed. TestIsFiatCurrency cannot match currency, %s.", CNY) + "TestIsFiatCurrency cannot match currency, %s.", CNY) } if LINO.IsFiatCurrency() { t.Errorf( - "Test Failed. TestIsFiatCurrency cannot match currency, %s.", LINO, + "TestIsFiatCurrency cannot match currency, %s.", LINO, ) } } func TestIsCryptocurrency(t *testing.T) { if !BTC.IsCryptocurrency() { - t.Errorf("Test Failed. TestIsFiatCurrency cannot match currency, %s.", + t.Errorf("TestIsFiatCurrency cannot match currency, %s.", BTC) } if !LTC.IsCryptocurrency() { - t.Errorf("Test Failed. TestIsFiatCurrency cannot match currency, %s.", + t.Errorf("TestIsFiatCurrency cannot match currency, %s.", LTC) } if AUD.IsCryptocurrency() { - t.Errorf("Test Failed. TestIsFiatCurrency cannot match currency, %s.", + t.Errorf("TestIsFiatCurrency cannot match currency, %s.", AUD) } } @@ -419,7 +493,7 @@ func TestItemString(t *testing.T) { } if newItem.String() != expected { - t.Errorf("Test Failed - Item String() error expected %s but received %s", + t.Errorf("Item String() error expected %s but received %s", expected, &newItem) } diff --git a/currency/code_types.go b/currency/code_types.go new file mode 100644 index 00000000..d0aa6b12 --- /dev/null +++ b/currency/code_types.go @@ -0,0 +1,1655 @@ +package currency + +import ( + "sync" + "time" +) + +// Bitmasks const for currency rolls +const ( + Unset Role = 0 + Fiat Role = 1 << (iota - 1) + Cryptocurrency + Token + Contract + + UnsetRollString = "roleUnset" + FiatCurrencyString = "fiatCurrency" + CryptocurrencyString = "cryptocurrency" + TokenString = "token" + ContractString = "contract" +) + +// Role defines a bitmask for the full currency rolls either; fiat, +// cryptocurrency, token, or contract +type Role uint8 + +// BaseCodes defines a basket of bare currency codes +type BaseCodes struct { + Items []*Item + LastMainUpdate time.Time + mtx sync.Mutex +} + +// Code defines an ISO 4217 fiat currency or unofficial cryptocurrency code +// string +type Code struct { + Item *Item + UpperCase bool +} + +// Item defines a sub type containing the main attributes of a designated +// currency code pointer +type Item struct { + ID int `json:"id"` + FullName string `json:"fullName"` + Symbol string `json:"symbol"` + Role Role `json:"role"` + AssocChain string `json:"associatedBlockchain"` + AssocExchange []string `json:"associatedExchanges"` +} + +// Const declarations for individual currencies/tokens/fiat +// An ever growing list. Cares not for equivalence, just is +var ( + BTC = NewCode("BTC") + LTC = NewCode("LTC") + ETH = NewCode("ETH") + XRP = NewCode("XRP") + BCH = NewCode("BCH") + EOS = NewCode("EOS") + XLM = NewCode("XLM") + USDT = NewCode("USDT") + ADA = NewCode("ADA") + XMR = NewCode("XMR") + TRX = NewCode("TRX") + MIOTA = NewCode("MIOTA") + DASH = NewCode("DASH") + BNB = NewCode("BNB") + NEO = NewCode("NEO") + ETC = NewCode("ETC") + XEM = NewCode("XEM") + XTZ = NewCode("XTZ") + VET = NewCode("VET") + DOGE = NewCode("DOGE") + ZEC = NewCode("ZEC") + OMG = NewCode("OMG") + BTG = NewCode("BTG") + MKR = NewCode("MKR") + BCN = NewCode("BCN") + ONT = NewCode("ONT") + ZRX = NewCode("ZRX") + LSK = NewCode("LSK") + DCR = NewCode("DCR") + QTUM = NewCode("QTUM") + BCD = NewCode("BCD") + BTS = NewCode("BTS") + NANO = NewCode("NANO") + ZIL = NewCode("ZIL") + SC = NewCode("SC") + DGB = NewCode("DGB") + ICX = NewCode("ICX") + STEEM = NewCode("STEEM") + AE = NewCode("AE") + XVG = NewCode("XVG") + WAVES = NewCode("WAVES") + NPXS = NewCode("NPXS") + ETN = NewCode("ETN") + BTM = NewCode("BTM") + BAT = NewCode("BAT") + ETP = NewCode("ETP") + HOT = NewCode("HOT") + STRAT = NewCode("STRAT") // nolint: misspell + GNT = NewCode("GNT") + REP = NewCode("REP") + SNT = NewCode("SNT") + PPT = NewCode("PPT") + KMD = NewCode("KMD") + TUSD = NewCode("TUSD") + CNX = NewCode("CNX") + LINK = NewCode("LINK") + WTC = NewCode("WTC") + ARDR = NewCode("ARDR") + WAN = NewCode("WAN") + MITH = NewCode("MITH") + RDD = NewCode("RDD") + IOST = NewCode("IOST") + IOT = NewCode("IOT") + KCS = NewCode("KCS") + MAID = NewCode("MAID") + XET = NewCode("XET") + MOAC = NewCode("MOAC") + HC = NewCode("HC") + AION = NewCode("AION") + AOA = NewCode("AOA") + HT = NewCode("HT") + ELF = NewCode("ELF") + LRC = NewCode("LRC") + BNT = NewCode("BNT") + CMT = NewCode("CMT") + DGD = NewCode("DGD") + DCN = NewCode("DCN") + FUN = NewCode("FUN") + GXS = NewCode("GXS") + DROP = NewCode("DROP") + MANA = NewCode("MANA") + PAY = NewCode("PAY") + MCO = NewCode("MCO") + THETA = NewCode("THETA") + NXT = NewCode("NXT") + NOAH = NewCode("NOAH") + LOOM = NewCode("LOOM") + POWR = NewCode("POWR") + WAX = NewCode("WAX") + ELA = NewCode("ELA") + PIVX = NewCode("PIVX") + XIN = NewCode("XIN") + DAI = NewCode("DAI") + BTCP = NewCode("BTCP") + NEXO = NewCode("NEXO") + XBT = NewCode("XBT") + SAN = NewCode("SAN") + GAS = NewCode("GAS") + BCC = NewCode("BCC") + HCC = NewCode("HCC") + OAX = NewCode("OAX") + DNT = NewCode("DNT") + ICN = NewCode("ICN") + LLT = NewCode("LLT") + YOYO = NewCode("YOYO") + SNGLS = NewCode("SNGLS") + BQX = NewCode("BQX") + KNC = NewCode("KNC") + SNM = NewCode("SNM") + CTR = NewCode("CTR") + SALT = NewCode("SALT") + MDA = NewCode("MDA") + IOTA = NewCode("IOTA") + SUB = NewCode("SUB") + MTL = NewCode("MTL") + MTH = NewCode("MTH") + ENG = NewCode("ENG") + AST = NewCode("AST") + CLN = NewCode("CLN") + EDG = NewCode("EDG") + FIRST = NewCode("1ST") + GOLOS = NewCode("GOLOS") + ANT = NewCode("ANT") + GBG = NewCode("GBG") + HMQ = NewCode("HMQ") + INCNT = NewCode("INCNT") + ACE = NewCode("ACE") + ACT = NewCode("ACT") + AAC = NewCode("AAC") + AIDOC = NewCode("AIDOC") + SOC = NewCode("SOC") + ATL = NewCode("ATL") + AVT = NewCode("AVT") + BKX = NewCode("BKX") + BEC = NewCode("BEC") + VEE = NewCode("VEE") + PTOY = NewCode("PTOY") + CAG = NewCode("CAG") + CIC = NewCode("CIC") + CBT = NewCode("CBT") + CAN = NewCode("CAN") + DAT = NewCode("DAT") + DNA = NewCode("DNA") + INT = NewCode("INT") + IPC = NewCode("IPC") + ILA = NewCode("ILA") + LIGHT = NewCode("LIGHT") + MAG = NewCode("MAG") + AMM = NewCode("AMM") + MOF = NewCode("MOF") + MGC = NewCode("MGC") + OF = NewCode("OF") + LA = NewCode("LA") + LEV = NewCode("LEV") + NGC = NewCode("NGC") + OKB = NewCode("OKB") + MOT = NewCode("MOT") + PRA = NewCode("PRA") + R = NewCode("R") + SSC = NewCode("SSC") + SHOW = NewCode("SHOW") + SPF = NewCode("SPF") + SNC = NewCode("SNC") + SWFTC = NewCode("SWFTC") + TRA = NewCode("TRA") + TOPC = NewCode("TOPC") + TRIO = NewCode("TRIO") + QVT = NewCode("QVT") + UCT = NewCode("UCT") + UKG = NewCode("UKG") + UTK = NewCode("UTK") + VIU = NewCode("VIU") + WFEE = NewCode("WFEE") + WRC = NewCode("WRC") + UGC = NewCode("UGC") + YEE = NewCode("YEE") + YOYOW = NewCode("YOYOW") + ZIP = NewCode("ZIP") + READ = NewCode("READ") + RCT = NewCode("RCT") + REF = NewCode("REF") + XUC = NewCode("XUC") + FAIR = NewCode("FAIR") + GSC = NewCode("GSC") + HMC = NewCode("HMC") + PLU = NewCode("PLU") + PRO = NewCode("PRO") + QRL = NewCode("QRL") + REN = NewCode("REN") + ROUND = NewCode("ROUND") + SRN = NewCode("SRN") + XID = NewCode("XID") + SBD = NewCode("SBD") + TAAS = NewCode("TAAS") + TKN = NewCode("TKN") + VEN = NewCode("VEN") + VSL = NewCode("VSL") + TRST = NewCode("TRST") + XXX = NewCode("XXX") + IND = NewCode("IND") + LDC = NewCode("LDC") + GUP = NewCode("GUP") + MGO = NewCode("MGO") + MYST = NewCode("MYST") + NEU = NewCode("NEU") + NET = NewCode("NET") + BMC = NewCode("BMC") + BCAP = NewCode("BCAP") + TIME = NewCode("TIME") + CFI = NewCode("CFI") + EVX = NewCode("EVX") + REQ = NewCode("REQ") + VIB = NewCode("VIB") + ARK = NewCode("ARK") + MOD = NewCode("MOD") + ENJ = NewCode("ENJ") + STORJ = NewCode("STORJ") + RCN = NewCode("RCN") + NULS = NewCode("NULS") + RDN = NewCode("RDN") + DLT = NewCode("DLT") + AMB = NewCode("AMB") + BCPT = NewCode("BCPT") + ARN = NewCode("ARN") + GVT = NewCode("GVT") + CDT = NewCode("CDT") + POE = NewCode("POE") + QSP = NewCode("QSP") + XZC = NewCode("XZC") + TNT = NewCode("TNT") + FUEL = NewCode("FUEL") + ADX = NewCode("ADX") + CND = NewCode("CND") + LEND = NewCode("LEND") + WABI = NewCode("WABI") + SBTC = NewCode("SBTC") + BCX = NewCode("BCX") + TNB = NewCode("TNB") + GTO = NewCode("GTO") + OST = NewCode("OST") + CVC = NewCode("CVC") + DATA = NewCode("DATA") + ETF = NewCode("ETF") + BRD = NewCode("BRD") + NEBL = NewCode("NEBL") + VIBE = NewCode("VIBE") + LUN = NewCode("LUN") + CHAT = NewCode("CHAT") + RLC = NewCode("RLC") + INS = NewCode("INS") + VIA = NewCode("VIA") + BLZ = NewCode("BLZ") + SYS = NewCode("SYS") + NCASH = NewCode("NCASH") + POA = NewCode("POA") + STORM = NewCode("STORM") + WPR = NewCode("WPR") + QLC = NewCode("QLC") + GRS = NewCode("GRS") + CLOAK = NewCode("CLOAK") + ZEN = NewCode("ZEN") + SKY = NewCode("SKY") + IOTX = NewCode("IOTX") + QKC = NewCode("QKC") + AGI = NewCode("AGI") + NXS = NewCode("NXS") + EON = NewCode("EON") + KEY = NewCode("KEY") + NAS = NewCode("NAS") + ADD = NewCode("ADD") + MEETONE = NewCode("MEETONE") + ATD = NewCode("ATD") + MFT = NewCode("MFT") + EOP = NewCode("EOP") + DENT = NewCode("DENT") + IQ = NewCode("IQ") + DOCK = NewCode("DOCK") + POLY = NewCode("POLY") + VTHO = NewCode("VTHO") + ONG = NewCode("ONG") + PHX = NewCode("PHX") + GO = NewCode("GO") + PAX = NewCode("PAX") + EDO = NewCode("EDO") + WINGS = NewCode("WINGS") + NAV = NewCode("NAV") + TRIG = NewCode("TRIG") + APPC = NewCode("APPC") + KRW = NewCode("KRW") + HSR = NewCode("HSR") + ETHOS = NewCode("ETHOS") + CTXC = NewCode("CTXC") + ITC = NewCode("ITC") + TRUE = NewCode("TRUE") + ABT = NewCode("ABT") + RNT = NewCode("RNT") + PLY = NewCode("PLY") + PST = NewCode("PST") + KICK = NewCode("KICK") + BTCZ = NewCode("BTCZ") + DXT = NewCode("DXT") + STQ = NewCode("STQ") + INK = NewCode("INK") + HBZ = NewCode("HBZ") + USDT_ETH = NewCode("USDT_ETH") // nolint: golint,stylecheck + QTUM_ETH = NewCode("QTUM_ETH") // nolint: golint + BTM_ETH = NewCode("BTM_ETH") // nolint: golint + FIL = NewCode("FIL") + STX = NewCode("STX") + BOT = NewCode("BOT") + VERI = NewCode("VERI") + ZSC = NewCode("ZSC") + QBT = NewCode("QBT") + MED = NewCode("MED") + QASH = NewCode("QASH") + MDS = NewCode("MDS") + GOD = NewCode("GOD") + SMT = NewCode("SMT") + BTF = NewCode("BTF") + NAS_ETH = NewCode("NAS_ETH") // nolint: golint + TSL = NewCode("TSL") + BIFI = NewCode("BIFI") + BNTY = NewCode("BNTY") + DRGN = NewCode("DRGN") + GTC = NewCode("GTC") + MDT = NewCode("MDT") + QUN = NewCode("QUN") + GNX = NewCode("GNX") + DDD = NewCode("DDD") + BTO = NewCode("BTO") + TIO = NewCode("TIO") + OCN = NewCode("OCN") + RUFF = NewCode("RUFF") + TNC = NewCode("TNC") + SNET = NewCode("SNET") + COFI = NewCode("COFI") + ZPT = NewCode("ZPT") + JNT = NewCode("JNT") + MTN = NewCode("MTN") + GEM = NewCode("GEM") + DADI = NewCode("DADI") + RFR = NewCode("RFR") + MOBI = NewCode("MOBI") + LEDU = NewCode("LEDU") + DBC = NewCode("DBC") + MKR_OLD = NewCode("MKR_OLD") // nolint: golint + DPY = NewCode("DPY") + BCDN = NewCode("BCDN") + EOSDAC = NewCode("EOSDAC") // nolint: golint + TIPS = NewCode("TIPS") + XMC = NewCode("XMC") + PPS = NewCode("PPS") + BOE = NewCode("BOE") + MEDX = NewCode("MEDX") + SMT_ETH = NewCode("SMT_ETH") // nolint: golint + CS = NewCode("CS") + MAN = NewCode("MAN") + REM = NewCode("REM") + LYM = NewCode("LYM") + INSTAR = NewCode("INSTAR") // nolint: golint + BFT = NewCode("BFT") + IHT = NewCode("IHT") + SENC = NewCode("SENC") + TOMO = NewCode("TOMO") + ELEC = NewCode("ELEC") + SHIP = NewCode("SHIP") + TFD = NewCode("TFD") + HAV = NewCode("HAV") + HUR = NewCode("HUR") + LST = NewCode("LST") + LINO = NewCode("LINO") + SWTH = NewCode("SWTH") + NKN = NewCode("NKN") + SOUL = NewCode("SOUL") + GALA_NEO = NewCode("GALA_NEO") // nolint: golint + LRN = NewCode("LRN") + GSE = NewCode("GSE") + RATING = NewCode("RATING") + HSC = NewCode("HSC") + HIT = NewCode("HIT") + DX = NewCode("DX") + BXC = NewCode("BXC") + GARD = NewCode("GARD") + FTI = NewCode("FTI") + SOP = NewCode("SOP") + LEMO = NewCode("LEMO") + RED = NewCode("RED") + LBA = NewCode("LBA") + KAN = NewCode("KAN") + OPEN = NewCode("OPEN") + SKM = NewCode("SKM") + NBAI = NewCode("NBAI") + UPP = NewCode("UPP") + ATMI = NewCode("ATMI") + TMT = NewCode("TMT") + BBK = NewCode("BBK") + EDR = NewCode("EDR") + MET = NewCode("MET") + TCT = NewCode("TCT") + EXC = NewCode("EXC") + CNC = NewCode("CNC") + TIX = NewCode("TIX") + XTC = NewCode("XTC") + BU = NewCode("BU") + GNO = NewCode("GNO") + MLN = NewCode("MLN") + XBC = NewCode("XBC") + BTCD = NewCode("BTCD") + BURST = NewCode("BURST") + CLAM = NewCode("CLAM") + XCP = NewCode("XCP") + EMC2 = NewCode("EMC2") + EXP = NewCode("EXP") + FCT = NewCode("FCT") + GAME = NewCode("GAME") + GRC = NewCode("GRC") + HUC = NewCode("HUC") + LBC = NewCode("LBC") + NMC = NewCode("NMC") + NEOS = NewCode("NEOS") + OMNI = NewCode("OMNI") + PASC = NewCode("PASC") + PPC = NewCode("PPC") + DSH = NewCode("DSH") + GML = NewCode("GML") + GSY = NewCode("GSY") + POT = NewCode("POT") + XPM = NewCode("XPM") + AMP = NewCode("AMP") + VRC = NewCode("VRC") + VTC = NewCode("VTC") + ZERO07 = NewCode("007") + BIT16 = NewCode("BIT16") + TWO015 = NewCode("2015") + TWO56 = NewCode("256") + TWOBACCO = NewCode("2BACCO") + TWOGIVE = NewCode("2GIVE") + THIRTY2BIT = NewCode("32BIT") + THREE65 = NewCode("365") + FOUR04 = NewCode("404") + SEVEN00 = NewCode("700") + EIGHTBIT = NewCode("8BIT") + ACLR = NewCode("ACLR") + ACES = NewCode("ACES") + ACPR = NewCode("ACPR") + ACID = NewCode("ACID") + ACOIN = NewCode("ACOIN") + ACRN = NewCode("ACRN") + ADAM = NewCode("ADAM") + ADT = NewCode("ADT") + AIB = NewCode("AIB") + ADZ = NewCode("ADZ") + AECC = NewCode("AECC") + AM = NewCode("AM") + AGRI = NewCode("AGRI") + AGT = NewCode("AGT") + AIR = NewCode("AIR") + ALEX = NewCode("ALEX") + AUM = NewCode("AUM") + ALIEN = NewCode("ALIEN") + ALIS = NewCode("ALIS") + ALL = NewCode("ALL") + ASAFE = NewCode("ASAFE") + AMBER = NewCode("AMBER") + AMS = NewCode("AMS") + ANAL = NewCode("ANAL") + ACP = NewCode("ACP") + ANI = NewCode("ANI") + ANTI = NewCode("ANTI") + ALTC = NewCode("ALTC") + APT = NewCode("APT") + ARCO = NewCode("ARCO") + ALC = NewCode("ALC") + ARB = NewCode("ARB") + ARCT = NewCode("ARCT") + ARCX = NewCode("ARCX") + ARGUS = NewCode("ARGUS") + ARH = NewCode("ARH") + ARM = NewCode("ARM") + ARNA = NewCode("ARNA") + ARPA = NewCode("ARPA") + ARTA = NewCode("ARTA") + ABY = NewCode("ABY") + ARTC = NewCode("ARTC") + AL = NewCode("AL") + ASN = NewCode("ASN") + ADCN = NewCode("ADCN") + ATB = NewCode("ATB") + ATM = NewCode("ATM") + ATMCHA = NewCode("ATMCHA") + ATOM = NewCode("ATOM") + ADC = NewCode("ADC") + ARE = NewCode("ARE") + AUR = NewCode("AUR") + AV = NewCode("AV") + AXIOM = NewCode("AXIOM") + B2B = NewCode("B2B") + B2 = NewCode("B2") + B3 = NewCode("B3") + BAB = NewCode("BAB") + BAN = NewCode("BAN") + BamitCoin = NewCode("BamitCoin") + NANAS = NewCode("NANAS") + BBCC = NewCode("BBCC") + BTA = NewCode("BTA") + BSTK = NewCode("BSTK") + BATL = NewCode("BATL") + BBH = NewCode("BBH") + BITB = NewCode("BITB") + BRDD = NewCode("BRDD") + XBTS = NewCode("XBTS") + BVC = NewCode("BVC") + CHATX = NewCode("CHATX") + BEEP = NewCode("BEEP") + BEEZ = NewCode("BEEZ") + BENJI = NewCode("BENJI") + BERN = NewCode("BERN") + PROFIT = NewCode("PROFIT") + BEST = NewCode("BEST") + BGF = NewCode("BGF") + BIGUP = NewCode("BIGUP") + BLRY = NewCode("BLRY") + BILL = NewCode("BILL") + BIOB = NewCode("BIOB") + BIO = NewCode("BIO") + BIOS = NewCode("BIOS") + BPTN = NewCode("BPTN") + BTCA = NewCode("BTCA") + BA = NewCode("BA") + BAC = NewCode("BAC") + BBT = NewCode("BBT") + BOSS = NewCode("BOSS") + BRONZ = NewCode("BRONZ") + CAT = NewCode("CAT") + BTD = NewCode("BTD") + XBTC21 = NewCode("XBTC21") + BCA = NewCode("BCA") + BCP = NewCode("BCP") + BTDOLL = NewCode("BTDOLL") + LIZA = NewCode("LIZA") + BTCRED = NewCode("BTCRED") + BTCS = NewCode("BTCS") + BTU = NewCode("BTU") + BUM = NewCode("BUM") + LITE = NewCode("LITE") + BCM = NewCode("BCM") + BCS = NewCode("BCS") + BTCU = NewCode("BTCU") + BM = NewCode("BM") + BTCRY = NewCode("BTCRY") + BTCR = NewCode("BTCR") + HIRE = NewCode("HIRE") + STU = NewCode("STU") + BITOK = NewCode("BITOK") + BITON = NewCode("BITON") + BPC = NewCode("BPC") + BPOK = NewCode("BPOK") + BTP = NewCode("BTP") + BITCNY = NewCode("bitCNY") + RNTB = NewCode("RNTB") + BSH = NewCode("BSH") + XBS = NewCode("XBS") + BITS = NewCode("BITS") + BST = NewCode("BST") + BXT = NewCode("BXT") + VEG = NewCode("VEG") + VOLT = NewCode("VOLT") + BTV = NewCode("BTV") + BITZ = NewCode("BITZ") + BTZ = NewCode("BTZ") + BHC = NewCode("BHC") + BDC = NewCode("BDC") + JACK = NewCode("JACK") + BS = NewCode("BS") + BSTAR = NewCode("BSTAR") + BLAZR = NewCode("BLAZR") + BOD = NewCode("BOD") + BLUE = NewCode("BLUE") + BLU = NewCode("BLU") + BLUS = NewCode("BLUS") + BMT = NewCode("BMT") + BOLI = NewCode("BOLI") + BOMB = NewCode("BOMB") + BON = NewCode("BON") + BOOM = NewCode("BOOM") + BOSON = NewCode("BOSON") + BSC = NewCode("BSC") + BRH = NewCode("BRH") + BRAIN = NewCode("BRAIN") + BRE = NewCode("BRE") + BTCM = NewCode("BTCM") + BTCO = NewCode("BTCO") + TALK = NewCode("TALK") + BUB = NewCode("BUB") + BUY = NewCode("BUY") + BUZZ = NewCode("BUZZ") + BTH = NewCode("BTH") + C0C0 = NewCode("C0C0") + CAB = NewCode("CAB") + CF = NewCode("CF") + CLO = NewCode("CLO") + CAM = NewCode("CAM") + CD = NewCode("CD") + CANN = NewCode("CANN") + CNNC = NewCode("CNNC") + CPC = NewCode("CPC") + CST = NewCode("CST") + CAPT = NewCode("CAPT") + CARBON = NewCode("CARBON") + CME = NewCode("CME") + CTK = NewCode("CTK") + CBD = NewCode("CBD") + CCC = NewCode("CCC") + CNT = NewCode("CNT") + XCE = NewCode("XCE") + CHRG = NewCode("CHRG") + CHEMX = NewCode("CHEMX") + CHESS = NewCode("CHESS") + CKS = NewCode("CKS") + CHILL = NewCode("CHILL") + CHIP = NewCode("CHIP") + CHOOF = NewCode("CHOOF") + CRX = NewCode("CRX") + CIN = NewCode("CIN") + POLL = NewCode("POLL") + CLICK = NewCode("CLICK") + CLINT = NewCode("CLINT") + CLUB = NewCode("CLUB") + CLUD = NewCode("CLUD") + COX = NewCode("COX") + COXST = NewCode("COXST") + CFC = NewCode("CFC") + CTIC2 = NewCode("CTIC2") + COIN = NewCode("COIN") + BTTF = NewCode("BTTF") + C2 = NewCode("C2") + CAID = NewCode("CAID") + CL = NewCode("CL") + CTIC = NewCode("CTIC") + CXT = NewCode("CXT") + CHP = NewCode("CHP") + CV2 = NewCode("CV2") + COC = NewCode("COC") + COMP = NewCode("COMP") + CMS = NewCode("CMS") + CONX = NewCode("CONX") + CCX = NewCode("CCX") + CLR = NewCode("CLR") + CORAL = NewCode("CORAL") + CORG = NewCode("CORG") + CSMIC = NewCode("CSMIC") + CMC = NewCode("CMC") + COV = NewCode("COV") + COVX = NewCode("COVX") + CRAB = NewCode("CRAB") + CRAFT = NewCode("CRAFT") + CRNK = NewCode("CRNK") + CRAVE = NewCode("CRAVE") + CRM = NewCode("CRM") + XCRE = NewCode("XCRE") + CREDIT = NewCode("CREDIT") + CREVA = NewCode("CREVA") + CRIME = NewCode("CRIME") + CROC = NewCode("CROC") + CRC = NewCode("CRC") + CRW = NewCode("CRW") + CRY = NewCode("CRY") + CBX = NewCode("CBX") + TKTX = NewCode("TKTX") + CB = NewCode("CB") + CIRC = NewCode("CIRC") + CCB = NewCode("CCB") + CDO = NewCode("CDO") + CG = NewCode("CG") + CJ = NewCode("CJ") + CJC = NewCode("CJC") + CYT = NewCode("CYT") + CRPS = NewCode("CRPS") + PING = NewCode("PING") + CWXT = NewCode("CWXT") + CCT = NewCode("CCT") + CTL = NewCode("CTL") + CURVES = NewCode("CURVES") + CC = NewCode("CC") + CYC = NewCode("CYC") + CYG = NewCode("CYG") + CYP = NewCode("CYP") + FUNK = NewCode("FUNK") + CZECO = NewCode("CZECO") + DALC = NewCode("DALC") + DLISK = NewCode("DLISK") + MOOND = NewCode("MOOND") + DB = NewCode("DB") + DCC = NewCode("DCC") + DCYP = NewCode("DCYP") + DETH = NewCode("DETH") + DKC = NewCode("DKC") + DISK = NewCode("DISK") + DRKT = NewCode("DRKT") + DTT = NewCode("DTT") + DASHS = NewCode("DASHS") + DBTC = NewCode("DBTC") + DCT = NewCode("DCT") + DBET = NewCode("DBET") + DEC = NewCode("DEC") + DECR = NewCode("DECR") + DEA = NewCode("DEA") + DPAY = NewCode("DPAY") + DCRE = NewCode("DCRE") + DC = NewCode("DC") + DES = NewCode("DES") + DEM = NewCode("DEM") + DXC = NewCode("DXC") + DCK = NewCode("DCK") + CUBE = NewCode("CUBE") + DGMS = NewCode("DGMS") + DBG = NewCode("DBG") + DGCS = NewCode("DGCS") + DBLK = NewCode("DBLK") + DIME = NewCode("DIME") + DIRT = NewCode("DIRT") + DVD = NewCode("DVD") + DMT = NewCode("DMT") + NOTE = NewCode("NOTE") + DGORE = NewCode("DGORE") + DLC = NewCode("DLC") + DRT = NewCode("DRT") + DOTA = NewCode("DOTA") + DOX = NewCode("DOX") + DRA = NewCode("DRA") + DFT = NewCode("DFT") + XDB = NewCode("XDB") + DRM = NewCode("DRM") + DRZ = NewCode("DRZ") + DRACO = NewCode("DRACO") + DBIC = NewCode("DBIC") + DUB = NewCode("DUB") + GUM = NewCode("GUM") + DUR = NewCode("DUR") + DUST = NewCode("DUST") + DUX = NewCode("DUX") + DXO = NewCode("DXO") + ECN = NewCode("ECN") + EDR2 = NewCode("EDR2") + EA = NewCode("EA") + EAGS = NewCode("EAGS") + EMT = NewCode("EMT") + EBONUS = NewCode("EBONUS") + ECCHI = NewCode("ECCHI") + EKO = NewCode("EKO") + ECLI = NewCode("ECLI") + ECOB = NewCode("ECOB") + ECO = NewCode("ECO") + EDIT = NewCode("EDIT") + EDRC = NewCode("EDRC") + EDC = NewCode("EDC") + EGAME = NewCode("EGAME") + EGG = NewCode("EGG") + EGO = NewCode("EGO") + ELC = NewCode("ELC") + ELCO = NewCode("ELCO") + ECA = NewCode("ECA") + EPC = NewCode("EPC") + ELE = NewCode("ELE") + ONE337 = NewCode("1337") + EMB = NewCode("EMB") + EMC = NewCode("EMC") + EPY = NewCode("EPY") + EMPC = NewCode("EMPC") + EMP = NewCode("EMP") + ENE = NewCode("ENE") + EET = NewCode("EET") + XNG = NewCode("XNG") + EGMA = NewCode("EGMA") + ENTER = NewCode("ENTER") + ETRUST = NewCode("ETRUST") + EQL = NewCode("EQL") + EQM = NewCode("EQM") + EQT = NewCode("EQT") + ERR = NewCode("ERR") + ESC = NewCode("ESC") + ESP = NewCode("ESP") + ENT = NewCode("ENT") + ETCO = NewCode("ETCO") + DOGETH = NewCode("DOGETH") + ECASH = NewCode("ECASH") + ELITE = NewCode("ELITE") + ETHS = NewCode("ETHS") + ETL = NewCode("ETL") + ETZ = NewCode("ETZ") + EUC = NewCode("EUC") + EURC = NewCode("EURC") + EUROPE = NewCode("EUROPE") + EVA = NewCode("EVA") + EGC = NewCode("EGC") + EOC = NewCode("EOC") + EVIL = NewCode("EVIL") + EVO = NewCode("EVO") + EXB = NewCode("EXB") + EXIT = NewCode("EXIT") + XT = NewCode("XT") + F16 = NewCode("F16") + FADE = NewCode("FADE") + FAZZ = NewCode("FAZZ") + FX = NewCode("FX") + FIDEL = NewCode("FIDEL") + FIDGT = NewCode("FIDGT") + FIND = NewCode("FIND") + FPC = NewCode("FPC") + FIRE = NewCode("FIRE") + FFC = NewCode("FFC") + FRST = NewCode("FRST") + FIST = NewCode("FIST") + FIT = NewCode("FIT") + FLX = NewCode("FLX") + FLVR = NewCode("FLVR") + FLY = NewCode("FLY") + FONZ = NewCode("FONZ") + XFCX = NewCode("XFCX") + FOREX = NewCode("FOREX") + FRN = NewCode("FRN") + FRK = NewCode("FRK") + FRWC = NewCode("FRWC") + FGZ = NewCode("FGZ") + FRE = NewCode("FRE") + FRDC = NewCode("FRDC") + FJC = NewCode("FJC") + FURY = NewCode("FURY") + FSN = NewCode("FSN") + FCASH = NewCode("FCASH") + FTO = NewCode("FTO") + FUZZ = NewCode("FUZZ") + GAKH = NewCode("GAKH") + GBT = NewCode("GBT") + UNITS = NewCode("UNITS") + FOUR20G = NewCode("420G") + GENIUS = NewCode("GENIUS") + GEN = NewCode("GEN") + GEO = NewCode("GEO") + GER = NewCode("GER") + GSR = NewCode("GSR") + SPKTR = NewCode("SPKTR") + GIFT = NewCode("GIFT") + WTT = NewCode("WTT") + GHS = NewCode("GHS") + GIG = NewCode("GIG") + GOT = NewCode("GOT") + XGTC = NewCode("XGTC") + GIZ = NewCode("GIZ") + GLO = NewCode("GLO") + GCR = NewCode("GCR") + BSTY = NewCode("BSTY") + GLC = NewCode("GLC") + GSX = NewCode("GSX") + GOAT = NewCode("GOAT") + GB = NewCode("GB") + GFL = NewCode("GFL") + MNTP = NewCode("MNTP") + GP = NewCode("GP") + GLUCK = NewCode("GLUCK") + GOON = NewCode("GOON") + GTFO = NewCode("GTFO") + GOTX = NewCode("GOTX") + GPU = NewCode("GPU") + GRF = NewCode("GRF") + GRAM = NewCode("GRAM") + GRAV = NewCode("GRAV") + GBIT = NewCode("GBIT") + GREED = NewCode("GREED") + GE = NewCode("GE") + GREENF = NewCode("GREENF") + GRE = NewCode("GRE") + GREXIT = NewCode("GREXIT") + GMCX = NewCode("GMCX") + GROW = NewCode("GROW") + GSM = NewCode("GSM") + GT = NewCode("GT") + NLG = NewCode("NLG") + HKN = NewCode("HKN") + HAC = NewCode("HAC") + HALLO = NewCode("HALLO") + HAMS = NewCode("HAMS") + HPC = NewCode("HPC") + HAWK = NewCode("HAWK") + HAZE = NewCode("HAZE") + HZT = NewCode("HZT") + HDG = NewCode("HDG") + HEDG = NewCode("HEDG") + HEEL = NewCode("HEEL") + HMP = NewCode("HMP") + PLAY = NewCode("PLAY") + HXX = NewCode("HXX") + XHI = NewCode("XHI") + HVCO = NewCode("HVCO") + HTC = NewCode("HTC") + MINH = NewCode("MINH") + HODL = NewCode("HODL") + HON = NewCode("HON") + HOPE = NewCode("HOPE") + HQX = NewCode("HQX") + HSP = NewCode("HSP") + HTML5 = NewCode("HTML5") + HYPERX = NewCode("HYPERX") + HPS = NewCode("HPS") + IOC = NewCode("IOC") + IBANK = NewCode("IBANK") + IBITS = NewCode("IBITS") + ICASH = NewCode("ICASH") + ICOB = NewCode("ICOB") + ICON = NewCode("ICON") + IETH = NewCode("IETH") + ILM = NewCode("ILM") + IMPS = NewCode("IMPS") + NKA = NewCode("NKA") + INCP = NewCode("INCP") + IN = NewCode("IN") + INC = NewCode("INC") + IMS = NewCode("IMS") + IFLT = NewCode("IFLT") + INFX = NewCode("INFX") + INGT = NewCode("INGT") + INPAY = NewCode("INPAY") + INSANE = NewCode("INSANE") + INXT = NewCode("INXT") + IFT = NewCode("IFT") + INV = NewCode("INV") + IVZ = NewCode("IVZ") + ILT = NewCode("ILT") + IONX = NewCode("IONX") + ISL = NewCode("ISL") + ITI = NewCode("ITI") + ING = NewCode("ING") + IEC = NewCode("IEC") + IW = NewCode("IW") + IXC = NewCode("IXC") + IXT = NewCode("IXT") + JPC = NewCode("JPC") + JANE = NewCode("JANE") + JWL = NewCode("JWL") + JIF = NewCode("JIF") + JOBS = NewCode("JOBS") + JOCKER = NewCode("JOCKER") + JW = NewCode("JW") + JOK = NewCode("JOK") + XJO = NewCode("XJO") + KGB = NewCode("KGB") + KARMC = NewCode("KARMC") + KARMA = NewCode("KARMA") + KASHH = NewCode("KASHH") + KAT = NewCode("KAT") + KC = NewCode("KC") + KIDS = NewCode("KIDS") + KIN = NewCode("KIN") + KISS = NewCode("KISS") + KOBO = NewCode("KOBO") + TP1 = NewCode("TP1") + KRAK = NewCode("KRAK") + KGC = NewCode("KGC") + KTK = NewCode("KTK") + KR = NewCode("KR") + KUBO = NewCode("KUBO") + KURT = NewCode("KURT") + KUSH = NewCode("KUSH") + LANA = NewCode("LANA") + LTH = NewCode("LTH") + LAZ = NewCode("LAZ") + LEA = NewCode("LEA") + LEAF = NewCode("LEAF") + LENIN = NewCode("LENIN") + LEPEN = NewCode("LEPEN") + LIR = NewCode("LIR") + LVG = NewCode("LVG") + LGBTQ = NewCode("LGBTQ") + LHC = NewCode("LHC") + EXT = NewCode("EXT") + LBTC = NewCode("LBTC") + LSD = NewCode("LSD") + LIMX = NewCode("LIMX") + LTD = NewCode("LTD") + LINDA = NewCode("LINDA") + LKC = NewCode("LKC") + LBTCX = NewCode("LBTCX") + LCC = NewCode("LCC") + LTCU = NewCode("LTCU") + LTCR = NewCode("LTCR") + LDOGE = NewCode("LDOGE") + LTS = NewCode("LTS") + LIV = NewCode("LIV") + LIZI = NewCode("LIZI") + LOC = NewCode("LOC") + LOCX = NewCode("LOCX") + LOOK = NewCode("LOOK") + LOOT = NewCode("LOOT") + XLTCG = NewCode("XLTCG") + BASH = NewCode("BASH") + LUCKY = NewCode("LUCKY") + L7S = NewCode("L7S") + LDM = NewCode("LDM") + LUMI = NewCode("LUMI") + LUNA = NewCode("LUNA") + LC = NewCode("LC") + LUX = NewCode("LUX") + MCRN = NewCode("MCRN") + XMG = NewCode("XMG") + MMXIV = NewCode("MMXIV") + MAT = NewCode("MAT") + MAO = NewCode("MAO") + MAPC = NewCode("MAPC") + MRB = NewCode("MRB") + MXT = NewCode("MXT") + MARV = NewCode("MARV") + MARX = NewCode("MARX") + MCAR = NewCode("MCAR") + MM = NewCode("MM") + MVC = NewCode("MVC") + MAVRO = NewCode("MAVRO") + MAX = NewCode("MAX") + MAZE = NewCode("MAZE") + MBIT = NewCode("MBIT") + MCOIN = NewCode("MCOIN") + MPRO = NewCode("MPRO") + XMS = NewCode("XMS") + MLITE = NewCode("MLITE") + MLNC = NewCode("MLNC") + MENTAL = NewCode("MENTAL") + MERGEC = NewCode("MERGEC") + MTLMC3 = NewCode("MTLMC3") + METAL = NewCode("METAL") + MUU = NewCode("MUU") + MILO = NewCode("MILO") + MND = NewCode("MND") + XMINE = NewCode("XMINE") + MNM = NewCode("MNM") + XNM = NewCode("XNM") + MIRO = NewCode("MIRO") + MIS = NewCode("MIS") + MMXVI = NewCode("MMXVI") + MOIN = NewCode("MOIN") + MOJO = NewCode("MOJO") + TAB = NewCode("TAB") + MONETA = NewCode("MONETA") + MUE = NewCode("MUE") + MONEY = NewCode("MONEY") + MRP = NewCode("MRP") + MOTO = NewCode("MOTO") + MULTI = NewCode("MULTI") + MST = NewCode("MST") + MVR = NewCode("MVR") + MYSTIC = NewCode("MYSTIC") + WISH = NewCode("WISH") + NKT = NewCode("NKT") + NAT = NewCode("NAT") + ENAU = NewCode("ENAU") + NEBU = NewCode("NEBU") + NEF = NewCode("NEF") + NBIT = NewCode("NBIT") + NETKO = NewCode("NETKO") + NTM = NewCode("NTM") + NETC = NewCode("NETC") + NRC = NewCode("NRC") + NTK = NewCode("NTK") + NTRN = NewCode("NTRN") + NEVA = NewCode("NEVA") + NIC = NewCode("NIC") + NKC = NewCode("NKC") + NYC = NewCode("NYC") + NZC = NewCode("NZC") + NICE = NewCode("NICE") + NDOGE = NewCode("NDOGE") + XTR = NewCode("XTR") + N2O = NewCode("N2O") + NIXON = NewCode("NIXON") + NOC = NewCode("NOC") + NODC = NewCode("NODC") + NODES = NewCode("NODES") + NODX = NewCode("NODX") + NLC = NewCode("NLC") + NLC2 = NewCode("NLC2") + NOO = NewCode("NOO") + NVC = NewCode("NVC") + NPC = NewCode("NPC") + NUBIS = NewCode("NUBIS") + NUKE = NewCode("NUKE") + N7 = NewCode("N7") + NUM = NewCode("NUM") + NMR = NewCode("NMR") + NXE = NewCode("NXE") + OBS = NewCode("OBS") + OCEAN = NewCode("OCEAN") + OCOW = NewCode("OCOW") + EIGHT88 = NewCode("888") + OCC = NewCode("OCC") + OK = NewCode("OK") + ODNT = NewCode("ODNT") + FLAV = NewCode("FLAV") + OLIT = NewCode("OLIT") + OLYMP = NewCode("OLYMP") + OMA = NewCode("OMA") + OMC = NewCode("OMC") + ONEK = NewCode("ONEK") + ONX = NewCode("ONX") + XPO = NewCode("XPO") + OPAL = NewCode("OPAL") + OTN = NewCode("OTN") + OP = NewCode("OP") + OPES = NewCode("OPES") + OPTION = NewCode("OPTION") + ORLY = NewCode("ORLY") + OS76 = NewCode("OS76") + OZC = NewCode("OZC") + P7C = NewCode("P7C") + PAC = NewCode("PAC") + PAK = NewCode("PAK") + PAL = NewCode("PAL") + PND = NewCode("PND") + PINKX = NewCode("PINKX") + POPPY = NewCode("POPPY") + DUO = NewCode("DUO") + PARA = NewCode("PARA") + PKB = NewCode("PKB") + GENE = NewCode("GENE") + PARTY = NewCode("PARTY") + PYN = NewCode("PYN") + XPY = NewCode("XPY") + CON = NewCode("CON") + PAYP = NewCode("PAYP") + GUESS = NewCode("GUESS") + PEN = NewCode("PEN") + PTA = NewCode("PTA") + PEO = NewCode("PEO") + PSB = NewCode("PSB") + XPD = NewCode("XPD") + PXL = NewCode("PXL") + PHR = NewCode("PHR") + PIE = NewCode("PIE") + PIO = NewCode("PIO") + PIPR = NewCode("PIPR") + SKULL = NewCode("SKULL") + PLANET = NewCode("PLANET") + PNC = NewCode("PNC") + XPTX = NewCode("XPTX") + PLNC = NewCode("PLNC") + XPS = NewCode("XPS") + POKE = NewCode("POKE") + PLBT = NewCode("PLBT") + POM = NewCode("POM") + PONZ2 = NewCode("PONZ2") + PONZI = NewCode("PONZI") + XSP = NewCode("XSP") + XPC = NewCode("XPC") + PEX = NewCode("PEX") + TRON = NewCode("TRON") + POST = NewCode("POST") + POSW = NewCode("POSW") + PWR = NewCode("PWR") + POWER = NewCode("POWER") + PRE = NewCode("PRE") + PRS = NewCode("PRS") + PXI = NewCode("PXI") + PEXT = NewCode("PEXT") + PRIMU = NewCode("PRIMU") + PRX = NewCode("PRX") + PRM = NewCode("PRM") + PRIX = NewCode("PRIX") + XPRO = NewCode("XPRO") + PCM = NewCode("PCM") + PROC = NewCode("PROC") + NANOX = NewCode("NANOX") + VRP = NewCode("VRP") + PTY = NewCode("PTY") + PSI = NewCode("PSI") + PSY = NewCode("PSY") + PULSE = NewCode("PULSE") + PUPA = NewCode("PUPA") + PURE = NewCode("PURE") + VIDZ = NewCode("VIDZ") + PUTIN = NewCode("PUTIN") + PX = NewCode("PX") + QTM = NewCode("QTM") + QTZ = NewCode("QTZ") + QBC = NewCode("QBC") + XQN = NewCode("XQN") + RBBT = NewCode("RBBT") + RAC = NewCode("RAC") + RADI = NewCode("RADI") + RAD = NewCode("RAD") + RAI = NewCode("RAI") + XRA = NewCode("XRA") + RATIO = NewCode("RATIO") + REA = NewCode("REA") + RCX = NewCode("RCX") + REE = NewCode("REE") + REC = NewCode("REC") + RMS = NewCode("RMS") + RBIT = NewCode("RBIT") + RNC = NewCode("RNC") + REV = NewCode("REV") + RH = NewCode("RH") + XRL = NewCode("XRL") + RICE = NewCode("RICE") + RICHX = NewCode("RICHX") + RID = NewCode("RID") + RIDE = NewCode("RIDE") + RBT = NewCode("RBT") + RING = NewCode("RING") + RIO = NewCode("RIO") + RISE = NewCode("RISE") + ROCKET = NewCode("ROCKET") + RPC = NewCode("RPC") + ROS = NewCode("ROS") + ROYAL = NewCode("ROYAL") + RSGP = NewCode("RSGP") + RBIES = NewCode("RBIES") + RUBIT = NewCode("RUBIT") + RBY = NewCode("RBY") + RUC = NewCode("RUC") + RUPX = NewCode("RUPX") + RUP = NewCode("RUP") + RUST = NewCode("RUST") + SFE = NewCode("SFE") + SLS = NewCode("SLS") + SMSR = NewCode("SMSR") + RONIN = NewCode("RONIN") + STV = NewCode("STV") + HIFUN = NewCode("HIFUN") + MAD = NewCode("MAD") + SANDG = NewCode("SANDG") + STO = NewCode("STO") + SCAN = NewCode("SCAN") + SCITW = NewCode("SCITW") + SCRPT = NewCode("SCRPT") + SCRT = NewCode("SCRT") + SED = NewCode("SED") + SEEDS = NewCode("SEEDS") + B2X = NewCode("B2X") + SEL = NewCode("SEL") + SLFI = NewCode("SLFI") + SMBR = NewCode("SMBR") + SEN = NewCode("SEN") + SENT = NewCode("SENT") + SRNT = NewCode("SRNT") + SEV = NewCode("SEV") + SP = NewCode("SP") + SXC = NewCode("SXC") + GELD = NewCode("GELD") + SHDW = NewCode("SHDW") + SDC = NewCode("SDC") + SAK = NewCode("SAK") + SHRP = NewCode("SHRP") + SHELL = NewCode("SHELL") + SH = NewCode("SH") + SHORTY = NewCode("SHORTY") + SHREK = NewCode("SHREK") + SHRM = NewCode("SHRM") + SIB = NewCode("SIB") + SIGT = NewCode("SIGT") + SLCO = NewCode("SLCO") + SIGU = NewCode("SIGU") + SIX = NewCode("SIX") + SJW = NewCode("SJW") + SKB = NewCode("SKB") + SW = NewCode("SW") + SLEEP = NewCode("SLEEP") + SLING = NewCode("SLING") + SMART = NewCode("SMART") + SMC = NewCode("SMC") + SMF = NewCode("SMF") + SOCC = NewCode("SOCC") + SCL = NewCode("SCL") + SDAO = NewCode("SDAO") + SOLAR = NewCode("SOLAR") + SOLO = NewCode("SOLO") + SCT = NewCode("SCT") + SONG = NewCode("SONG") + ALTCOM = NewCode("ALTCOM") + SPHTX = NewCode("SPHTX") + SPC = NewCode("SPC") + SPACE = NewCode("SPACE") + SBT = NewCode("SBT") + SPEC = NewCode("SPEC") + SPX = NewCode("SPX") + SCS = NewCode("SCS") + SPORT = NewCode("SPORT") + SPT = NewCode("SPT") + SPR = NewCode("SPR") + SPEX = NewCode("SPEX") + SQL = NewCode("SQL") + SBIT = NewCode("SBIT") + STHR = NewCode("STHR") + STALIN = NewCode("STALIN") + STAR = NewCode("STAR") + STA = NewCode("STA") + START = NewCode("START") + STP = NewCode("STP") + PNK = NewCode("PNK") + STEPS = NewCode("STEPS") + STK = NewCode("STK") + STONK = NewCode("STONK") + STS = NewCode("STS") + STRP = NewCode("STRP") + STY = NewCode("STY") + XMT = NewCode("XMT") + SSTC = NewCode("SSTC") + SUPER = NewCode("SUPER") + SRND = NewCode("SRND") + STRB = NewCode("STRB") + M1 = NewCode("M1") + SPM = NewCode("SPM") + BUCKS = NewCode("BUCKS") + TOKEN = NewCode("TOKEN") + SWT = NewCode("SWT") + SWEET = NewCode("SWEET") + SWING = NewCode("SWING") + CHSB = NewCode("CHSB") + SIC = NewCode("SIC") + SDP = NewCode("SDP") + XSY = NewCode("XSY") + SYNX = NewCode("SYNX") + SNRG = NewCode("SNRG") + TAG = NewCode("TAG") + TAGR = NewCode("TAGR") + TAJ = NewCode("TAJ") + TAK = NewCode("TAK") + TAKE = NewCode("TAKE") + TAM = NewCode("TAM") + XTO = NewCode("XTO") + TAP = NewCode("TAP") + TLE = NewCode("TLE") + TSE = NewCode("TSE") + TLEX = NewCode("TLEX") + TAXI = NewCode("TAXI") + TCN = NewCode("TCN") + TDFB = NewCode("TDFB") + TEAM = NewCode("TEAM") + TECH = NewCode("TECH") + TEC = NewCode("TEC") + TEK = NewCode("TEK") + TB = NewCode("TB") + TLX = NewCode("TLX") + TELL = NewCode("TELL") + TENNET = NewCode("TENNET") + TES = NewCode("TES") + TGS = NewCode("TGS") + XVE = NewCode("XVE") + TCR = NewCode("TCR") + GCC = NewCode("GCC") + MAY = NewCode("MAY") + THOM = NewCode("THOM") + TIA = NewCode("TIA") + TIDE = NewCode("TIDE") + TIE = NewCode("TIE") + TIT = NewCode("TIT") + TTC = NewCode("TTC") + TODAY = NewCode("TODAY") + TBX = NewCode("TBX") + TDS = NewCode("TDS") + TLOSH = NewCode("TLOSH") + TOKC = NewCode("TOKC") + TMRW = NewCode("TMRW") + TOOL = NewCode("TOOL") + TCX = NewCode("TCX") + TOT = NewCode("TOT") + TX = NewCode("TX") + TRANSF = NewCode("TRANSF") + TRAP = NewCode("TRAP") + TBCX = NewCode("TBCX") + TRICK = NewCode("TRICK") + TPG = NewCode("TPG") + TFL = NewCode("TFL") + TRUMP = NewCode("TRUMP") + TNG = NewCode("TNG") + TUR = NewCode("TUR") + TWERK = NewCode("TWERK") + TWIST = NewCode("TWIST") + TWO = NewCode("TWO") + UCASH = NewCode("UCASH") + UAE = NewCode("UAE") + XBU = NewCode("XBU") + UBQ = NewCode("UBQ") + U = NewCode("U") + UDOWN = NewCode("UDOWN") + GAIN = NewCode("GAIN") + USC = NewCode("USC") + UMC = NewCode("UMC") + UNF = NewCode("UNF") + UNIFY = NewCode("UNIFY") + USDE = NewCode("USDE") + UBTC = NewCode("UBTC") + UIS = NewCode("UIS") + UNIT = NewCode("UNIT") + UNI = NewCode("UNI") + UXC = NewCode("UXC") + URC = NewCode("URC") + XUP = NewCode("XUP") + UFR = NewCode("UFR") + URO = NewCode("URO") + UTLE = NewCode("UTLE") + VAL = NewCode("VAL") + VPRC = NewCode("VPRC") + VAPOR = NewCode("VAPOR") + VCOIN = NewCode("VCOIN") + VEC = NewCode("VEC") + VEC2 = NewCode("VEC2") + VLT = NewCode("VLT") + VENE = NewCode("VENE") + VNTX = NewCode("VNTX") + VTN = NewCode("VTN") + CRED = NewCode("CRED") + VERS = NewCode("VERS") + VTX = NewCode("VTX") + VTY = NewCode("VTY") + VIP = NewCode("VIP") + VISIO = NewCode("VISIO") + VK = NewCode("VK") + VOL = NewCode("VOL") + VOYA = NewCode("VOYA") + VPN = NewCode("VPN") + XVS = NewCode("XVS") + VTL = NewCode("VTL") + VULC = NewCode("VULC") + VVI = NewCode("VVI") + WGR = NewCode("WGR") + WAM = NewCode("WAM") + WARP = NewCode("WARP") + WASH = NewCode("WASH") + WGO = NewCode("WGO") + WAY = NewCode("WAY") + WCASH = NewCode("WCASH") + WEALTH = NewCode("WEALTH") + WEEK = NewCode("WEEK") + WHO = NewCode("WHO") + WIC = NewCode("WIC") + WBB = NewCode("WBB") + WINE = NewCode("WINE") + WINK = NewCode("WINK") + WISC = NewCode("WISC") + WITCH = NewCode("WITCH") + WMC = NewCode("WMC") + WOMEN = NewCode("WOMEN") + WOK = NewCode("WOK") + WRT = NewCode("WRT") + XCO = NewCode("XCO") + X2 = NewCode("X2") + XNX = NewCode("XNX") + XAU = NewCode("XAU") + XAV = NewCode("XAV") + XDE2 = NewCode("XDE2") + XDE = NewCode("XDE") + XIOS = NewCode("XIOS") + XOC = NewCode("XOC") + XSSX = NewCode("XSSX") + XBY = NewCode("XBY") + YAC = NewCode("YAC") + YMC = NewCode("YMC") + YAY = NewCode("YAY") + YBC = NewCode("YBC") + YES = NewCode("YES") + YOB2X = NewCode("YOB2X") + YOVI = NewCode("YOVI") + ZYD = NewCode("ZYD") + ZECD = NewCode("ZECD") + ZEIT = NewCode("ZEIT") + ZENI = NewCode("ZENI") + ZET2 = NewCode("ZET2") + ZET = NewCode("ZET") + ZMC = NewCode("ZMC") + ZIRK = NewCode("ZIRK") + ZLQ = NewCode("ZLQ") + ZNE = NewCode("ZNE") + ZONTO = NewCode("ZONTO") + ZOOM = NewCode("ZOOM") + ZRC = NewCode("ZRC") + ZUR = NewCode("ZUR") + ZB = NewCode("ZB") + QC = NewCode("QC") + HLC = NewCode("HLC") + SAFE = NewCode("SAFE") + BTN = NewCode("BTN") + CDC = NewCode("CDC") + DDM = NewCode("DDM") + HOTC = NewCode("HOTC") + BDS = NewCode("BDS") + AAA = NewCode("AAA") + XWC = NewCode("XWC") + PDX = NewCode("PDX") + SLT = NewCode("SLT") + HPY = NewCode("HPY") + XXBT = NewCode("XXBT") // BTC, but XXBT instead + XDG = NewCode("XDG") // DOGE + HKD = NewCode("HKD") // Hong Kong Dollar + AUD = NewCode("AUD") // Australian Dollar + USD = NewCode("USD") // United States Dollar + ZUSD = NewCode("ZUSD") // United States Dollar, but with a Z in front of it + EUR = NewCode("EUR") // Euro + ZEUR = NewCode("ZEUR") // Euro, but with a Z in front of it + CAD = NewCode("CAD") // Canadaian Dollar + ZCAD = NewCode("ZCAD") // Canadaian Dollar, but with a Z in front of it + SGD = NewCode("SGD") // Singapore Dollar + RUB = NewCode("RUB") // RUssian ruBle + RUR = NewCode("RUR") // RUssian Ruble + PLN = NewCode("PLN") // Polish zÅ‚oty + TRY = NewCode("TRY") // Turkish lira + UAH = NewCode("UAH") // Ukrainian hryvnia + JPY = NewCode("JPY") // Japanese yen + ZJPY = NewCode("ZJPY") // Japanese yen, but with a Z in front of it + LCH = NewCode("LCH") + MYR = NewCode("MYR") + AFN = NewCode("AFN") + ARS = NewCode("ARS") + AWG = NewCode("AWG") + AZN = NewCode("AZN") + BSD = NewCode("BSD") + BBD = NewCode("BBD") + BYN = NewCode("BYN") + BZD = NewCode("BZD") + BMD = NewCode("BMD") + BOB = NewCode("BOB") + BAM = NewCode("BAM") + BWP = NewCode("BWP") + BGN = NewCode("BGN") + BRL = NewCode("BRL") + BND = NewCode("BND") + KHR = NewCode("KHR") + KYD = NewCode("KYD") + CLP = NewCode("CLP") + CNY = NewCode("CNY") + COP = NewCode("COP") + HRK = NewCode("HRK") + CUP = NewCode("CUP") + CZK = NewCode("CZK") + DKK = NewCode("DKK") + DOP = NewCode("DOP") + XCD = NewCode("XCD") + EGP = NewCode("EGP") + SVC = NewCode("SVC") + FKP = NewCode("FKP") + FJD = NewCode("FJD") + GIP = NewCode("GIP") + GTQ = NewCode("GTQ") + GGP = NewCode("GGP") + GYD = NewCode("GYD") + HNL = NewCode("HNL") + HUF = NewCode("HUF") + ISK = NewCode("ISK") + INR = NewCode("INR") + IDR = NewCode("IDR") + IRR = NewCode("IRR") + IMP = NewCode("IMP") + ILS = NewCode("ILS") + JMD = NewCode("JMD") + JEP = NewCode("JEP") + KZT = NewCode("KZT") + KPW = NewCode("KPW") + KGS = NewCode("KGS") + LAK = NewCode("LAK") + LBP = NewCode("LBP") + LRD = NewCode("LRD") + MKD = NewCode("MKD") + MUR = NewCode("MUR") + MXN = NewCode("MXN") + MNT = NewCode("MNT") + MZN = NewCode("MZN") + NAD = NewCode("NAD") + NPR = NewCode("NPR") + ANG = NewCode("ANG") + NZD = NewCode("NZD") + NIO = NewCode("NIO") + NGN = NewCode("NGN") + NOK = NewCode("NOK") + OMR = NewCode("OMR") + PKR = NewCode("PKR") + PAB = NewCode("PAB") + PYG = NewCode("PYG") + PHP = NewCode("PHP") + QAR = NewCode("QAR") + RON = NewCode("RON") + SHP = NewCode("SHP") + SAR = NewCode("SAR") + RSD = NewCode("RSD") + SCR = NewCode("SCR") + SOS = NewCode("SOS") + ZAR = NewCode("ZAR") + LKR = NewCode("LKR") + SEK = NewCode("SEK") + CHF = NewCode("CHF") + SRD = NewCode("SRD") + SYP = NewCode("SYP") + TWD = NewCode("TWD") + THB = NewCode("THB") + TTD = NewCode("TTD") + TVD = NewCode("TVD") + GBP = NewCode("GBP") + UYU = NewCode("UYU") + UZS = NewCode("UZS") + VEF = NewCode("VEF") + VND = NewCode("VND") + YER = NewCode("YER") + ZWD = NewCode("ZWD") + XETH = NewCode("XETH") + FX_BTC = NewCode("FX_BTC") // nolint: golint +) diff --git a/currency/coinmarketcap/coinmarketcap.go b/currency/coinmarketcap/coinmarketcap.go index b676f4ed..5e562989 100644 --- a/currency/coinmarketcap/coinmarketcap.go +++ b/currency/coinmarketcap/coinmarketcap.go @@ -18,53 +18,6 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/request" ) -// Coinmarketcap account plan bitmasks, url and enpoint consts -const ( - Basic uint8 = 1 << iota - Hobbyist - Startup - Standard - Professional - Enterprise - - baseURL = "https://pro-api.coinmarketcap.com" - sandboxURL = "https://sandbox-api.coinmarketcap.com" - version = "/v1/" - - endpointCryptocurrencyInfo = "cryptocurrency/info" - endpointCryptocurrencyMap = "cryptocurrency/map" - endpointCryptocurrencyHistoricalListings = "cryptocurrency/listings/historical" - endpointCryptocurrencyLatestListings = "cryptocurrency/listings/latest" - endpointCryptocurrencyMarketPairs = "cryptocurrency/market-pairs/latest" - endpointOHLCVHistorical = "cryptocurrency/ohlcv/historical" - endpointOHLCVLatest = "cryptocurrency/ohlcv/latest" - endpointGetMarketQuotesHistorical = "cryptocurrency/quotes/historical" - endpointGetMarketQuotesLatest = "cryptocurrency/quotes/latest" - endpointExchangeInfo = "exchange/info" - endpointExchangeMap = "exchange/map" - endpointExchangeMarketPairsLatest = "exchange/market-pairs/latest" - endpointExchangeMarketQuoteHistorical = "exchange/quotes/historical" - endpointExchangeMarketQuoteLatest = "exchange/quotes/latest" - endpointGlobalQuoteHistorical = "global-metrics/quotes/historical" - endpointGlobalQuoteLatest = "global-metrics/quotes/latest" - endpointPriceConversion = "tools/price-conversion" - - authrate = 0 - defaultTimeOut = time.Second * 15 -) - -// Coinmarketcap is the overarching type across this package -type Coinmarketcap struct { - Verbose bool - Enabled bool - Name string - APIkey string - APIUrl string - APIVersion string - Plan uint8 - Requester *request.Requester -} - // SetDefaults sets default values for the exchange func (c *Coinmarketcap) SetDefaults() { c.Name = "CoinMarketCap" diff --git a/currency/coinmarketcap/coinmarketcap_test.go b/currency/coinmarketcap/coinmarketcap_test.go index 580fa909..e81f107f 100644 --- a/currency/coinmarketcap/coinmarketcap_test.go +++ b/currency/coinmarketcap/coinmarketcap_test.go @@ -58,32 +58,32 @@ func TestCheckAccountPlan(t *testing.T) { if areAPICredtionalsSet(Basic) { err := c.CheckAccountPlan(Enterprise) if err == nil { - t.Error("Test Failed - CheckAccountPlan() error cannot be nil") + t.Error("CheckAccountPlan() error cannot be nil") } err = c.CheckAccountPlan(Professional) if err == nil { - t.Error("Test Failed - CheckAccountPlan() error cannot be nil") + t.Error("CheckAccountPlan() error cannot be nil") } err = c.CheckAccountPlan(Standard) if err == nil { - t.Error("Test Failed - CheckAccountPlan() error cannot be nil") + t.Error("CheckAccountPlan() error cannot be nil") } err = c.CheckAccountPlan(Hobbyist) if err == nil { - t.Error("Test Failed - CheckAccountPlan() error cannot be nil") + t.Error("CheckAccountPlan() error cannot be nil") } err = c.CheckAccountPlan(Startup) if err == nil { - t.Error("Test Failed - CheckAccountPlan() error cannot be nil") + t.Error("CheckAccountPlan() error cannot be nil") } err = c.CheckAccountPlan(Basic) if err != nil { - t.Error("Test Failed - CheckAccountPlan() error", err) + t.Error("CheckAccountPlan() error", err) } } } @@ -94,11 +94,11 @@ func TestGetCryptocurrencyInfo(t *testing.T) { _, err := c.GetCryptocurrencyInfo(1) if areAPICredtionalsSet(Basic) { if err != nil { - t.Error("Test Failed - GetCryptocurrencyInfo() error", err) + t.Error("GetCryptocurrencyInfo() error", err) } } else { if err == nil { - t.Error("Test Failed - GetCryptocurrencyInfo() error cannot be nil") + t.Error("GetCryptocurrencyInfo() error cannot be nil") } } } @@ -109,11 +109,11 @@ func TestGetCryptocurrencyIDMap(t *testing.T) { _, err := c.GetCryptocurrencyIDMap() if areAPICredtionalsSet(Basic) { if err != nil { - t.Error("Test Failed - GetCryptocurrencyIDMap() error", err) + t.Error("GetCryptocurrencyIDMap() error", err) } } else { if err == nil { - t.Error("Test Failed - GetCryptocurrencyIDMap() error cannot be nil") + t.Error("GetCryptocurrencyIDMap() error cannot be nil") } } } @@ -123,7 +123,7 @@ func TestGetCryptocurrencyHistoricalListings(t *testing.T) { TestSetup(t) _, err := c.GetCryptocurrencyHistoricalListings() if err == nil { - t.Error("Test Failed - GetCryptocurrencyHistoricalListings() error cannot be nil") + t.Error("GetCryptocurrencyHistoricalListings() error cannot be nil") } } @@ -133,11 +133,11 @@ func TestGetCryptocurrencyLatestListing(t *testing.T) { _, err := c.GetCryptocurrencyLatestListing(0, 0) if areAPICredtionalsSet(Basic) { if err != nil { - t.Error("Test Failed - GetCryptocurrencyLatestListing() error", err) + t.Error("GetCryptocurrencyLatestListing() error", err) } } else { if err == nil { - t.Error("Test Failed - GetCryptocurrencyLatestListing() error cannot be nil") + t.Error("GetCryptocurrencyLatestListing() error cannot be nil") } } } @@ -148,12 +148,12 @@ func TestGetCryptocurrencyLatestMarketPairs(t *testing.T) { _, err := c.GetCryptocurrencyLatestMarketPairs(1, 0, 0) if areAPICredtionalsSet(Standard) { if err != nil { - t.Error("Test Failed - GetCryptocurrencyLatestMarketPairs() error", + t.Error("GetCryptocurrencyLatestMarketPairs() error", err) } } else { if err == nil { - t.Error("Test Failed - GetCryptocurrencyLatestMarketPairs() error cannot be nil") + t.Error("GetCryptocurrencyLatestMarketPairs() error cannot be nil") } } } @@ -164,12 +164,12 @@ func TestGetCryptocurrencyOHLCHistorical(t *testing.T) { _, err := c.GetCryptocurrencyOHLCHistorical(1, time.Now(), time.Now()) if areAPICredtionalsSet(Standard) { if err != nil { - t.Error("Test Failed - GetCryptocurrencyOHLCHistorical() error", + t.Error("GetCryptocurrencyOHLCHistorical() error", err) } } else { if err == nil { - t.Error("Test Failed - GetCryptocurrencyOHLCHistorical() error cannot be nil") + t.Error("GetCryptocurrencyOHLCHistorical() error cannot be nil") } } } @@ -180,12 +180,12 @@ func TestGetCryptocurrencyOHLCLatest(t *testing.T) { _, err := c.GetCryptocurrencyOHLCLatest(1) if areAPICredtionalsSet(Startup) { if err != nil { - t.Error("Test Failed - GetCryptocurrencyOHLCLatest() error", + t.Error("GetCryptocurrencyOHLCLatest() error", err) } } else { if err == nil { - t.Error("Test Failed - GetCryptocurrencyOHLCLatest() error cannot be nil") + t.Error("GetCryptocurrencyOHLCLatest() error cannot be nil") } } } @@ -196,12 +196,12 @@ func TestGetCryptocurrencyLatestQuotes(t *testing.T) { _, err := c.GetCryptocurrencyLatestQuotes(1) if areAPICredtionalsSet(Basic) { if err != nil { - t.Error("Test Failed - GetCryptocurrencyLatestQuotes() error", + t.Error("GetCryptocurrencyLatestQuotes() error", err) } } else { if err == nil { - t.Error("Test Failed - GetCryptocurrencyLatestQuotes() error cannot be nil") + t.Error("GetCryptocurrencyLatestQuotes() error cannot be nil") } } } @@ -212,12 +212,12 @@ func TestGetCryptocurrencyHistoricalQuotes(t *testing.T) { _, err := c.GetCryptocurrencyHistoricalQuotes(1, time.Now(), time.Now()) if areAPICredtionalsSet(Standard) { if err != nil { - t.Error("Test Failed - GetCryptocurrencyHistoricalQuotes() error", + t.Error("GetCryptocurrencyHistoricalQuotes() error", err) } } else { if err == nil { - t.Error("Test Failed - GetCryptocurrencyHistoricalQuotes() error cannot be nil") + t.Error("GetCryptocurrencyHistoricalQuotes() error cannot be nil") } } } @@ -228,12 +228,12 @@ func TestGetExchangeInfo(t *testing.T) { _, err := c.GetExchangeInfo(1) if areAPICredtionalsSet(Startup) { if err != nil { - t.Error("Test Failed - GetExchangeInfo() error", + t.Error("GetExchangeInfo() error", err) } } else { if err == nil { - t.Error("Test Failed - GetExchangeInfo() error cannot be nil") + t.Error("GetExchangeInfo() error cannot be nil") } } } @@ -244,12 +244,12 @@ func TestGetExchangeMap(t *testing.T) { _, err := c.GetExchangeMap(0, 0) if areAPICredtionalsSet(Startup) { if err != nil { - t.Error("Test Failed - GetExchangeMap() error", + t.Error("GetExchangeMap() error", err) } } else { if err == nil { - t.Error("Test Failed - GetExchangeMap() error cannot be nil") + t.Error("GetExchangeMap() error cannot be nil") } } } @@ -260,7 +260,7 @@ func TestGetExchangeHistoricalListings(t *testing.T) { _, err := c.GetExchangeHistoricalListings() if err == nil { // TODO: update this once the feature above is implemented - t.Error("Test Failed - GetExchangeHistoricalListings() error cannot be nil") + t.Error("GetExchangeHistoricalListings() error cannot be nil") } } @@ -270,7 +270,7 @@ func TestGetExchangeLatestListings(t *testing.T) { _, err := c.GetExchangeLatestListings() if err == nil { // TODO: update this once the feature above is implemented - t.Error("Test Failed - GetExchangeHistoricalListings() error cannot be nil") + t.Error("GetExchangeHistoricalListings() error cannot be nil") } } @@ -280,12 +280,12 @@ func TestGetExchangeLatestMarketPairs(t *testing.T) { _, err := c.GetExchangeLatestMarketPairs(1, 0, 0) if areAPICredtionalsSet(Standard) { if err != nil { - t.Error("Test Failed - GetExchangeLatestMarketPairs() error", + t.Error("GetExchangeLatestMarketPairs() error", err) } } else { if err == nil { - t.Error("Test Failed - GetExchangeLatestMarketPairs() error cannot be nil") + t.Error("GetExchangeLatestMarketPairs() error cannot be nil") } } } @@ -296,12 +296,12 @@ func TestGetExchangeLatestQuotes(t *testing.T) { _, err := c.GetExchangeLatestQuotes(1) if areAPICredtionalsSet(Standard) { if err != nil { - t.Error("Test Failed - GetExchangeLatestQuotes() error", + t.Error("GetExchangeLatestQuotes() error", err) } } else { if err == nil { - t.Error("Test Failed - GetExchangeLatestQuotes() error cannot be nil") + t.Error("GetExchangeLatestQuotes() error cannot be nil") } } } @@ -312,12 +312,12 @@ func TestGetExchangeHistoricalQuotes(t *testing.T) { _, err := c.GetExchangeHistoricalQuotes(1, time.Now(), time.Now()) if areAPICredtionalsSet(Standard) { if err != nil { - t.Error("Test Failed - GetExchangeHistoricalQuotes() error", + t.Error("GetExchangeHistoricalQuotes() error", err) } } else { if err == nil { - t.Error("Test Failed - GetExchangeHistoricalQuotes() error cannot be nil") + t.Error("GetExchangeHistoricalQuotes() error cannot be nil") } } } @@ -328,12 +328,12 @@ func TestGetGlobalMeticLatestQuotes(t *testing.T) { _, err := c.GetGlobalMeticLatestQuotes() if areAPICredtionalsSet(Basic) { if err != nil { - t.Error("Test Failed - GetGlobalMeticLatestQuotes() error", + t.Error("GetGlobalMeticLatestQuotes() error", err) } } else { if err == nil { - t.Error("Test Failed - GetGlobalMeticLatestQuotes() error cannot be nil") + t.Error("GetGlobalMeticLatestQuotes() error cannot be nil") } } } @@ -344,12 +344,12 @@ func TestGetGlobalMeticHistoricalQuotes(t *testing.T) { _, err := c.GetGlobalMeticHistoricalQuotes(time.Now(), time.Now()) if areAPICredtionalsSet(Standard) { if err != nil { - t.Error("Test Failed - GetGlobalMeticHistoricalQuotes() error", + t.Error("GetGlobalMeticHistoricalQuotes() error", err) } } else { if err == nil { - t.Error("Test Failed - GetGlobalMeticHistoricalQuotes() error cannot be nil") + t.Error("GetGlobalMeticHistoricalQuotes() error cannot be nil") } } } @@ -360,12 +360,12 @@ func TestGetPriceConversion(t *testing.T) { _, err := c.GetPriceConversion(0, 1, time.Now()) if areAPICredtionalsSet(Hobbyist) { if err != nil { - t.Error("Test Failed - GetPriceConversion() error", + t.Error("GetPriceConversion() error", err) } } else { if err == nil { - t.Error("Test Failed - GetPriceConversion() error cannot be nil") + t.Error("GetPriceConversion() error cannot be nil") } } } @@ -375,38 +375,38 @@ func TestSetAccountPlan(t *testing.T) { for _, plan := range accPlans { err := c.SetAccountPlan(plan) if err != nil { - t.Error("Test Failed - SetAccountPlan() error", err) + t.Error("SetAccountPlan() error", err) } switch plan { case "basic": if c.Plan != Basic { - t.Error("Test Failed - SetAccountPlan() error basic plan not set correctly") + t.Error("SetAccountPlan() error basic plan not set correctly") } case "startup": if c.Plan != Startup { - t.Error("Test Failed - SetAccountPlan() error startup plan not set correctly") + t.Error("SetAccountPlan() error startup plan not set correctly") } case "hobbyist": if c.Plan != Hobbyist { - t.Error("Test Failed - SetAccountPlan() error hobbyist plan not set correctly") + t.Error("SetAccountPlan() error hobbyist plan not set correctly") } case "standard": if c.Plan != Standard { - t.Error("Test Failed - SetAccountPlan() error standard plan not set correctly") + t.Error("SetAccountPlan() error standard plan not set correctly") } case "professional": if c.Plan != Professional { - t.Error("Test Failed - SetAccountPlan() error professional plan not set correctly") + t.Error("SetAccountPlan() error professional plan not set correctly") } case "enterprise": if c.Plan != Enterprise { - t.Error("Test Failed - SetAccountPlan() error enterprise plan not set correctly") + t.Error("SetAccountPlan() error enterprise plan not set correctly") } } } if err := c.SetAccountPlan("bra"); err == nil { - t.Error("Test Failed - SetAccountPlan() error cannot be nil") + t.Error("SetAccountPlan() error cannot be nil") } } diff --git a/currency/coinmarketcap/coinmarketcap_types.go b/currency/coinmarketcap/coinmarketcap_types.go index 95890a9f..7481165e 100644 --- a/currency/coinmarketcap/coinmarketcap_types.go +++ b/currency/coinmarketcap/coinmarketcap_types.go @@ -1,6 +1,57 @@ package coinmarketcap -import "time" +import ( + "time" + + "github.com/thrasher-corp/gocryptotrader/exchanges/request" +) + +// Coinmarketcap account plan bitmasks, url and enpoint consts +const ( + Basic uint8 = 1 << iota + Hobbyist + Startup + Standard + Professional + Enterprise + + baseURL = "https://pro-api.coinmarketcap.com" + sandboxURL = "https://sandbox-api.coinmarketcap.com" + version = "/v1/" + + endpointCryptocurrencyInfo = "cryptocurrency/info" + endpointCryptocurrencyMap = "cryptocurrency/map" + endpointCryptocurrencyHistoricalListings = "cryptocurrency/listings/historical" + endpointCryptocurrencyLatestListings = "cryptocurrency/listings/latest" + endpointCryptocurrencyMarketPairs = "cryptocurrency/market-pairs/latest" + endpointOHLCVHistorical = "cryptocurrency/ohlcv/historical" + endpointOHLCVLatest = "cryptocurrency/ohlcv/latest" + endpointGetMarketQuotesHistorical = "cryptocurrency/quotes/historical" + endpointGetMarketQuotesLatest = "cryptocurrency/quotes/latest" + endpointExchangeInfo = "exchange/info" + endpointExchangeMap = "exchange/map" + endpointExchangeMarketPairsLatest = "exchange/market-pairs/latest" + endpointExchangeMarketQuoteHistorical = "exchange/quotes/historical" + endpointExchangeMarketQuoteLatest = "exchange/quotes/latest" + endpointGlobalQuoteHistorical = "global-metrics/quotes/historical" + endpointGlobalQuoteLatest = "global-metrics/quotes/latest" + endpointPriceConversion = "tools/price-conversion" + + authrate = 0 + defaultTimeOut = time.Second * 15 +) + +// Coinmarketcap is the overarching type across this package +type Coinmarketcap struct { + Verbose bool + Enabled bool + Name string + APIkey string + APIUrl string + APIVersion string + Plan uint8 + Requester *request.Requester +} // Settings defines the current settings from configuration file type Settings struct { diff --git a/currency/conversion.go b/currency/conversion.go index cb04532c..5032e244 100644 --- a/currency/conversion.go +++ b/currency/conversion.go @@ -254,11 +254,6 @@ func (c *ConversionRates) GetFullRates() Conversions { // Conversions define a list of conversion data type Conversions []Conversion -// Slice exposes the underlying Conversion slice type -func (c Conversions) Slice() []Conversion { - return c -} - // NewConversionFromString splits a string from a foreign exchange provider func NewConversionFromString(p string) (Conversion, error) { return NewConversionFromStrings(p[:3], p[3:]) @@ -302,7 +297,7 @@ func (c Conversion) String() string { return c.From.String() + c.To.String() } -// GetRate returns system rate if availabled +// GetRate returns system rate if available func (c Conversion) GetRate() (float64, error) { c.mtx.Lock() defer c.mtx.Unlock() diff --git a/currency/conversion_test.go b/currency/conversion_test.go index 22774a0a..83b859af 100644 --- a/currency/conversion_test.go +++ b/currency/conversion_test.go @@ -1,6 +1,7 @@ package currency import ( + "fmt" "strings" "testing" ) @@ -9,10 +10,10 @@ func TestNewConversionFromString(t *testing.T) { expected := "AUDUSD" conv, err := NewConversionFromString(expected) if err != nil { - t.Error("Test Failed - NewConversionFromString() error", err) + t.Error(err) } if conv.String() != expected { - t.Errorf("Test Failed - NewConversion() error expected %s but received %s", + t.Errorf("NewConversion() error expected %s but received %s", expected, conv) } @@ -20,10 +21,10 @@ func TestNewConversionFromString(t *testing.T) { newexpected := strings.ToLower(expected) conv, err = NewConversionFromString(newexpected) if err != nil { - t.Error("Test Failed - NewConversionFromString() error", err) + t.Error(err) } if conv.String() != newexpected { - t.Errorf("Test Failed - NewConversion() error expected %s but received %s", + t.Errorf("NewConversion() error expected %s but received %s", newexpected, conv) } @@ -36,11 +37,11 @@ func TestNewConversionFromStrings(t *testing.T) { conv, err := NewConversionFromStrings(from, to) if err != nil { - t.Error("Test Failed - NewConversionFromString() error", err) + t.Error(err) } if conv.String() != expected { - t.Errorf("Test Failed - NewConversion() error expected %s but received %s", + t.Errorf("NewConversion() error expected %s but received %s", expected, conv) } @@ -53,11 +54,11 @@ func TestNewConversion(t *testing.T) { conv, err := NewConversion(from, to) if err != nil { - t.Error("Test Failed - NewConversionFromCode() error", err) + t.Error(err) } if conv.String() != expected { - t.Errorf("Test Failed - NewConversion() error expected %s but received %s", + t.Errorf("NewConversion() error expected %s but received %s", expected, conv) } @@ -69,18 +70,18 @@ func TestConversionIsInvalid(t *testing.T) { conv, err := NewConversion(from, to) if err != nil { - t.Fatal("Test Failed - NewConversion() error", err) + t.Fatal(err) } if conv.IsInvalid() { - t.Errorf("Test Failed - IsInvalid() error expected false but received %v", + t.Errorf("IsInvalid() error expected false but received %v", conv.IsInvalid()) } to = AUD conv, err = NewConversion(from, to) if err == nil { - t.Fatal("Test Failed - NewConversion() error", err) + t.Error("Expected error") } } @@ -90,18 +91,18 @@ func TestConversionIsFiatPair(t *testing.T) { conv, err := NewConversion(from, to) if err != nil { - t.Fatal("Test Failed - NewConversion() error", err) + t.Fatal(err) } if !conv.IsFiat() { - t.Errorf("Test Failed - IsFiatPair() error expected true but received %v", + t.Errorf("IsFiatPair() error expected true but received %v", conv.IsFiat()) } to = LTC conv, err = NewConversion(from, to) if err == nil { - t.Fatal("Test Failed - NewConversion() error", err) + t.Error("Expected error") } } @@ -109,7 +110,7 @@ func TestConversionsRatesSystem(t *testing.T) { var SuperDuperConversionSystem ConversionRates if SuperDuperConversionSystem.HasData() { - t.Fatalf("Test Failed - HasData() error expected false but received %v", + t.Fatalf("HasData() error expected false but received %v", SuperDuperConversionSystem.HasData()) } @@ -141,16 +142,16 @@ func TestConversionsRatesSystem(t *testing.T) { err := SuperDuperConversionSystem.Update(testmap) if err != nil { - t.Fatal("Test Failed - Update() error", err) + t.Fatal(err) } err = SuperDuperConversionSystem.Update(nil) if err == nil { - t.Fatal("Test Failed - Update() error cannot be nil") + t.Fatal("Update() error cannot be nil") } if !SuperDuperConversionSystem.HasData() { - t.Fatalf("Test Failed - HasData() error expected true but received %v", + t.Fatalf("HasData() error expected true but received %v", SuperDuperConversionSystem.HasData()) } @@ -161,7 +162,7 @@ func TestConversionsRatesSystem(t *testing.T) { r := *p * 1000 expectedRate := 1396.9317581 if r != expectedRate { - t.Errorf("Test Failed - Convert() error expected %.13f but received %.13f", + t.Errorf("Convert() error expected %.13f but received %.13f", expectedRate, r) } @@ -169,8 +170,78 @@ func TestConversionsRatesSystem(t *testing.T) { inverseR := *pi * expectedRate expectedInverseRate := float64(1000) if inverseR != expectedInverseRate { - t.Errorf("Test Failed - Convert() error expected %.13f but received %.13f", + t.Errorf("Convert() error expected %.13f but received %.13f", expectedInverseRate, inverseR) } } + +func TestGetRate(t *testing.T) { + from := NewCode("AUD") + to := NewCode("USD") + + c, err := NewConversion(from, to) + if err != nil { + t.Error(err) + } + rate, err := c.GetRate() + if err != nil { + t.Error(err) + } + if rate == 0 { + t.Error("Rate not set") + } + inv, err := c.GetInversionRate() + if err != nil { + t.Error(err) + } + if inv == 0 { + t.Error("Inverted rate not set") + } + conv, err := c.Convert(1) + if err != nil { + t.Error(err) + } + if rate != conv { + t.Errorf("Incorrect rate %v %v", rate, conv) + } + invConv, err := c.ConvertInverse(1) + if err != nil { + t.Error(err) + } + if inv != invConv { + t.Errorf("Incorrect rate %v %v", conv, invConv) + } + + var convs ConversionRates + var convRate float64 + _, err = convs.GetRate(BTC, USDT) + if err == nil { + t.Errorf("Expected %s", fmt.Errorf("rate not found for from %s to %s conversion", + BTC, + USD)) + } + convRate, err = convs.GetRate(USDT, USD) + if err != nil { + t.Error(err) + } + if convRate != 1 { + t.Errorf("Expected rate to be 1") + } + + convRate, err = convs.GetRate(RUR, RUB) + if err != nil { + t.Error(err) + } + if convRate != 1 { + t.Errorf("Expected rate to be 1") + } + + convRate, err = convs.GetRate(RUB, RUR) + if err != nil { + t.Error(err) + } + if convRate != 1 { + t.Errorf("Expected rate to be 1") + } +} diff --git a/currency/currencies.go b/currency/currencies.go index 86a6c6ff..7c3b5338 100644 --- a/currency/currencies.go +++ b/currency/currencies.go @@ -88,11 +88,6 @@ func (c Currencies) Match(other Currencies) bool { return true } -// Slice exposes the underlying type -func (c Currencies) Slice() []Code { - return c -} - // HasData checks to see if Currencies type has actual currencies func (c Currencies) HasData() bool { return len(c) != 0 diff --git a/currency/currencies_test.go b/currency/currencies_test.go index 981f97d5..6805ebf1 100644 --- a/currency/currencies_test.go +++ b/currency/currencies_test.go @@ -11,21 +11,21 @@ func TestCurrenciesUnmarshalJSON(t *testing.T) { expected := "btc,usd,ltc,bro,things" encoded, err := common.JSONEncode(expected) if err != nil { - t.Fatal("Test Failed - Currencies UnmarshalJSON() error", err) + t.Fatal("Currencies UnmarshalJSON() error", err) } err = common.JSONDecode(encoded, &unmarshalHere) if err != nil { - t.Fatal("Test Failed - Currencies UnmarshalJSON() error", err) + t.Fatal("Currencies UnmarshalJSON() error", err) } err = common.JSONDecode(encoded, &unmarshalHere) if err != nil { - t.Fatal("Test Failed - Currencies UnmarshalJSON() error", err) + t.Fatal("Currencies UnmarshalJSON() error", err) } if unmarshalHere.Join() != expected { - t.Errorf("Test Failed - Currencies UnmarshalJSON() error expected %s but received %s", + t.Errorf("Currencies UnmarshalJSON() error expected %s but received %s", expected, unmarshalHere.Join()) } } @@ -39,12 +39,12 @@ func TestCurrenciesMarshalJSON(t *testing.T) { encoded, err := common.JSONEncode(quickStruct) if err != nil { - t.Fatal("Test Failed - Currencies MarshalJSON() error", err) + t.Fatal("Currencies MarshalJSON() error", err) } expected := `{"amazingCurrencies":"btc,usd,ltc,bro,things"}` if string(encoded) != expected { - t.Errorf("Test Failed - Currencies MarshalJSON() error expected %s but received %s", + t.Errorf("Currencies MarshalJSON() error expected %s but received %s", expected, string(encoded)) } } diff --git a/currency/currency_test.go b/currency/currency_test.go index f6e3dae7..73568ba5 100644 --- a/currency/currency_test.go +++ b/currency/currency_test.go @@ -7,12 +7,12 @@ import ( func TestGetDefaultExchangeRates(t *testing.T) { rates, err := GetDefaultExchangeRates() if err != nil { - t.Error("Test failed - GetDefaultExchangeRates() err", err) + t.Error("GetDefaultExchangeRates() err", err) } for _, val := range rates { if !val.IsFiat() { - t.Errorf("Test failed - GetDefaultExchangeRates() %s is not fiat pair", + t.Errorf("GetDefaultExchangeRates() %s is not fiat pair", val) } } @@ -21,12 +21,12 @@ func TestGetDefaultExchangeRates(t *testing.T) { func TestGetExchangeRates(t *testing.T) { rates, err := GetExchangeRates() if err != nil { - t.Error("Test failed - GetExchangeRates() err", err) + t.Error("GetExchangeRates() err", err) } for _, val := range rates { if !val.IsFiat() { - t.Errorf("Test failed - GetExchangeRates() %s is not fiat pair", + t.Errorf("GetExchangeRates() %s is not fiat pair", val) } } @@ -35,23 +35,23 @@ func TestGetExchangeRates(t *testing.T) { func TestUpdateBaseCurrency(t *testing.T) { err := UpdateBaseCurrency(AUD) if err != nil { - t.Error("Test failed - UpdateBaseCurrency() err", err) + t.Error("UpdateBaseCurrency() err", err) } err = UpdateBaseCurrency(LTC) if err == nil { - t.Error("Test failed - UpdateBaseCurrency() cannot be nil") + t.Error("UpdateBaseCurrency() error cannot be nil") } if GetBaseCurrency() != AUD { - t.Errorf("Test failed - GetBaseCurrency() expected %s but received %s", + t.Errorf("GetBaseCurrency() expected %s but received %s", AUD, GetBaseCurrency()) } } func TestGetDefaultBaseCurrency(t *testing.T) { if GetDefaultBaseCurrency() != USD { - t.Errorf("Test failed - GetDefaultBaseCurrency() expected %s but received %s", + t.Errorf("GetDefaultBaseCurrency() expected %s but received %s", USD, GetDefaultBaseCurrency()) } } @@ -59,7 +59,7 @@ func TestGetDefaultBaseCurrency(t *testing.T) { func TestGetDefaulCryptoCurrencies(t *testing.T) { expected := Currencies{BTC, LTC, ETH, DOGE, DASH, XRP, XMR} if !GetDefaultCryptocurrencies().Match(expected) { - t.Errorf("Test failed - GetDefaultCryptocurrencies() expected %s but received %s", + t.Errorf("GetDefaultCryptocurrencies() expected %s but received %s", expected, GetDefaultCryptocurrencies()) } } @@ -67,7 +67,7 @@ func TestGetDefaulCryptoCurrencies(t *testing.T) { func TestGetDefaultFiatCurrencies(t *testing.T) { expected := Currencies{USD, AUD, EUR, CNY} if !GetDefaultFiatCurrencies().Match(expected) { - t.Errorf("Test failed - GetDefaultFiatCurrencies() expected %s but received %s", + t.Errorf("GetDefaultFiatCurrencies() expected %s but received %s", expected, GetDefaultFiatCurrencies()) } } @@ -77,14 +77,14 @@ func TestUpdateCurrencies(t *testing.T) { UpdateCurrencies(fiat, false) rFiat := GetFiatCurrencies() if !rFiat.Contains(HKN) || !rFiat.Contains(JPY) { - t.Error("Test failed - UpdateCurrencies() currencies did not update") + t.Error("UpdateCurrencies() currencies did not update") } crypto := Currencies{ZAR, ZCAD, B2} UpdateCurrencies(crypto, true) rCrypto := GetCryptocurrencies() if !rCrypto.Contains(ZAR) || !rCrypto.Contains(ZCAD) || !rCrypto.Contains(B2) { - t.Error("Test failed - UpdateCurrencies() currencies did not update") + t.Error("UpdateCurrencies() currencies did not update") } } @@ -100,7 +100,7 @@ func TestConvertCurrency(t *testing.T) { } if r != 100 { - t.Errorf("Test Failed - ConvertCurrency error, incorrect rate return %2.f but received %2.f", + t.Errorf("ConvertCurrency error, incorrect rate return %2.f but received %2.f", 100.00, r) } diff --git a/currency/forexprovider/base/base.go b/currency/forexprovider/base/base.go index 6d8e3347..ff037934 100644 --- a/currency/forexprovider/base/base.go +++ b/currency/forexprovider/base/base.go @@ -4,6 +4,21 @@ import ( "time" ) +// GetName returns name of provider +func (b *Base) GetName() string { + return b.Name +} + +// IsEnabled returns true if enabled +func (b *Base) IsEnabled() bool { + return b.Enabled +} + +// IsPrimaryProvider returns true if primary provider +func (b *Base) IsPrimaryProvider() bool { + return b.PrimaryProvider +} + // DefaultTimeOut is the default timeout for foreign exchange providers const DefaultTimeOut = time.Second * 15 @@ -22,18 +37,3 @@ type Settings struct { type Base struct { Settings `json:"settings"` } - -// GetName returns name of provider -func (b *Base) GetName() string { - return b.Name -} - -// IsEnabled returns true if enabled -func (b *Base) IsEnabled() bool { - return b.Enabled -} - -// IsPrimaryProvider returns true if primary provider -func (b *Base) IsPrimaryProvider() bool { - return b.PrimaryProvider -} diff --git a/currency/forexprovider/currencyconverterapi/currencyconverterapi.go b/currency/forexprovider/currencyconverterapi/currencyconverterapi.go index df867e21..47e21e11 100644 --- a/currency/forexprovider/currencyconverterapi/currencyconverterapi.go +++ b/currency/forexprovider/currencyconverterapi/currencyconverterapi.go @@ -14,29 +14,6 @@ import ( log "github.com/thrasher-corp/gocryptotrader/logger" ) -// const declarations consist of endpoints -const ( - APIEndpointURL = "https://currencyconverterapi.com/api/" - APIEndpointFreeURL = "https://free.currencyconverterapi.com/api/" - APIEndpointVersion = "v5" - - APIEndpointConvert = "convert" - APIEndpointCurrencies = "currencies" - APIEndpointCountries = "countries" - APIEndpointUsage = "usage" - - defaultAPIKey = "Key" - - authRate = 0 - unAuthRate = 0 -) - -// CurrencyConverter stores the struct for the CurrencyConverter API -type CurrencyConverter struct { - base.Base - Requester *request.Requester -} - // Setup sets appropriate values for CurrencyLayer func (c *CurrencyConverter) Setup(config base.Settings) error { c.Name = config.Name diff --git a/currency/forexprovider/currencyconverterapi/currencyconverterapi_test.go b/currency/forexprovider/currencyconverterapi/currencyconverterapi_test.go index a15491c7..b322ef07 100644 --- a/currency/forexprovider/currencyconverterapi/currencyconverterapi_test.go +++ b/currency/forexprovider/currencyconverterapi/currencyconverterapi_test.go @@ -65,7 +65,7 @@ func TestConvertMany(t *testing.T) { currencies = []string{"USD_AUD", "USD_EUR", "USD_GBP"} _, err = c.ConvertMany(currencies) if err == nil { - t.Fatal("non error on supplying 3 or more currencies using the free API") + t.Fatal("Expected error from on supplying 3 or more currencies using the free API") } } diff --git a/currency/forexprovider/currencyconverterapi/currencyconverterapi_types.go b/currency/forexprovider/currencyconverterapi/currencyconverterapi_types.go index 6c310176..f44f2053 100644 --- a/currency/forexprovider/currencyconverterapi/currencyconverterapi_types.go +++ b/currency/forexprovider/currencyconverterapi/currencyconverterapi_types.go @@ -1,5 +1,33 @@ package currencyconverter +import ( + "github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base" + "github.com/thrasher-corp/gocryptotrader/exchanges/request" +) + +// const declarations consist of endpoints +const ( + APIEndpointURL = "https://currencyconverterapi.com/api/" + APIEndpointFreeURL = "https://free.currencyconverterapi.com/api/" + APIEndpointVersion = "v5" + + APIEndpointConvert = "convert" + APIEndpointCurrencies = "currencies" + APIEndpointCountries = "countries" + APIEndpointUsage = "usage" + + defaultAPIKey = "Key" + + authRate = 0 + unAuthRate = 0 +) + +// CurrencyConverter stores the struct for the CurrencyConverter API +type CurrencyConverter struct { + base.Base + Requester *request.Requester +} + // Error stores the error message type Error struct { Status int `json:"status"` diff --git a/currency/forexprovider/currencylayer/currencylayer.go b/currency/forexprovider/currencylayer/currencylayer.go index e79f5469..59c85a31 100644 --- a/currency/forexprovider/currencylayer/currencylayer.go +++ b/currency/forexprovider/currencylayer/currencylayer.go @@ -26,34 +26,6 @@ import ( log "github.com/thrasher-corp/gocryptotrader/logger" ) -// const declarations consist of endpoints and APIKey privileges -const ( - AccountFree = iota - AccountBasic - AccountPro - AccountEnterprise - - APIEndpointURL = "http://apilayer.net/api/" - APIEndpointURLSSL = "https://apilayer.net/api/" - APIEndpointList = "list" - APIEndpointLive = "live" - APIEndpointHistorical = "historical" - APIEndpointConversion = "convert" - APIEndpointTimeframe = "timeframe" - APIEndpointChange = "change" - - authRate = 0 - unAuthRate = 0 -) - -// CurrencyLayer is a foreign exchange rate provider at -// https://currencylayer.com NOTE default base currency is USD when using a free -// account. Has automatic upgrade to a SSL connection. -type CurrencyLayer struct { - base.Base - Requester *request.Requester -} - // Setup sets appropriate values for CurrencyLayer func (c *CurrencyLayer) Setup(config base.Settings) error { if config.APIKeyLvl < 0 || config.APIKeyLvl > 3 { diff --git a/currency/forexprovider/currencylayer/currencylayer_test.go b/currency/forexprovider/currencylayer/currencylayer_test.go index 3c6186f0..1105a306 100644 --- a/currency/forexprovider/currencylayer/currencylayer_test.go +++ b/currency/forexprovider/currencylayer/currencylayer_test.go @@ -48,7 +48,7 @@ func areAPIKeysSet() bool { func TestGetRates(t *testing.T) { err := setup() if err != nil { - t.Skip("Test Failed - CurrencyLayer GetRates error", err) + t.Skip("CurrencyLayer GetRates error", err) } _, err = c.GetRates("USD", "AUD") if areAPIKeysSet() && err != nil { @@ -61,7 +61,7 @@ func TestGetRates(t *testing.T) { func TestGetSupportedCurrencies(t *testing.T) { err := setup() if err != nil { - t.Fatal("Test Failed - CurrencyLayer GetSupportedCurrencies error", err) + t.Fatal("CurrencyLayer GetSupportedCurrencies error", err) } _, err = c.GetSupportedCurrencies() if areAPIKeysSet() && err != nil { @@ -74,7 +74,7 @@ func TestGetSupportedCurrencies(t *testing.T) { func TestGetliveData(t *testing.T) { err := setup() if err != nil { - t.Fatal("Test Failed - CurrencyLayer GetliveData error", err) + t.Fatal("CurrencyLayer GetliveData error", err) } _, err = c.GetliveData("AUD", "USD") if areAPIKeysSet() && err != nil { @@ -87,7 +87,7 @@ func TestGetliveData(t *testing.T) { func TestGetHistoricalData(t *testing.T) { err := setup() if err != nil { - t.Fatal("Test Failed - CurrencyLayer GetHistoricalData error", err) + t.Fatal("CurrencyLayer GetHistoricalData error", err) } _, err = c.GetHistoricalData("2016-12-15", []string{"AUD"}, "USD") if areAPIKeysSet() && err != nil { @@ -100,7 +100,7 @@ func TestGetHistoricalData(t *testing.T) { func TestConvert(t *testing.T) { err := setup() if err != nil { - t.Fatal("Test Failed - CurrencyLayer Convert error", err) + t.Fatal("CurrencyLayer Convert error", err) } _, err = c.Convert("USD", "AUD", "", 1) if areAPIKeysSet() && err != nil && c.APIKeyLvl >= AccountBasic { @@ -113,7 +113,7 @@ func TestConvert(t *testing.T) { func TestQueryTimeFrame(t *testing.T) { err := setup() if err != nil { - t.Fatal("Test Failed - CurrencyLayer QueryTimeFrame error", err) + t.Fatal("CurrencyLayer QueryTimeFrame error", err) } _, err = c.QueryTimeFrame("2010-12-0", "2010-12-5", "USD", []string{"AUD"}) if areAPIKeysSet() && err != nil && c.APIKeyLvl >= AccountPro { @@ -126,7 +126,7 @@ func TestQueryTimeFrame(t *testing.T) { func TestQueryCurrencyChange(t *testing.T) { err := setup() if err != nil { - t.Fatal("Test Failed - CurrencyLayer QueryCurrencyChange() error", err) + t.Fatal("CurrencyLayer QueryCurrencyChange() error", err) } _, err = c.QueryCurrencyChange("2010-12-0", "2010-12-5", "USD", []string{"AUD"}) if areAPIKeysSet() && err != nil && c.APIKeyLvl == AccountEnterprise { diff --git a/currency/forexprovider/currencylayer/currencylayer_types.go b/currency/forexprovider/currencylayer/currencylayer_types.go index 3d8fbd86..16753123 100644 --- a/currency/forexprovider/currencylayer/currencylayer_types.go +++ b/currency/forexprovider/currencylayer/currencylayer_types.go @@ -1,5 +1,38 @@ package currencylayer +import ( + "github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base" + "github.com/thrasher-corp/gocryptotrader/exchanges/request" +) + +// const declarations consist of endpoints and APIKey privileges +const ( + AccountFree = iota + AccountBasic + AccountPro + AccountEnterprise + + APIEndpointURL = "http://apilayer.net/api/" + APIEndpointURLSSL = "https://apilayer.net/api/" + APIEndpointList = "list" + APIEndpointLive = "live" + APIEndpointHistorical = "historical" + APIEndpointConversion = "convert" + APIEndpointTimeframe = "timeframe" + APIEndpointChange = "change" + + authRate = 0 + unAuthRate = 0 +) + +// CurrencyLayer is a foreign exchange rate provider at +// https://currencylayer.com NOTE default base currency is USD when using a free +// account. Has automatic upgrade to a SSL connection. +type CurrencyLayer struct { + base.Base + Requester *request.Requester +} + // Error Defines the response error if an error occurred type Error struct { Code int `json:"code"` diff --git a/currency/forexprovider/exchangeratesapi.io/exchangeratesapi.go b/currency/forexprovider/exchangeratesapi.io/exchangeratesapi.go index 85724a55..6c7b2815 100644 --- a/currency/forexprovider/exchangeratesapi.io/exchangeratesapi.go +++ b/currency/forexprovider/exchangeratesapi.io/exchangeratesapi.go @@ -14,24 +14,6 @@ import ( log "github.com/thrasher-corp/gocryptotrader/logger" ) -const ( - exchangeRatesAPI = "https://api.exchangeratesapi.io" - exchangeRatesLatest = "latest" - exchangeRatesHistory = "history" - exchangeRatesSupportedCurrencies = "EUR,CHF,USD,BRL,ISK,PHP,KRW,BGN,MXN," + - "RON,CAD,SGD,NZD,THB,HKD,JPY,NOK,HRK,ILS,GBP,DKK,HUF,MYR,RUB,TRY,IDR," + - "ZAR,INR,AUD,CZK,SEK,CNY,PLN" - - authRate = 0 - unAuthRate = 0 -) - -// ExchangeRates stores the struct for the ExchangeRatesAPI API -type ExchangeRates struct { - base.Base - Requester *request.Requester -} - // Setup sets appropriate values for CurrencyLayer func (e *ExchangeRates) Setup(config base.Settings) error { e.Name = config.Name diff --git a/currency/forexprovider/exchangeratesapi.io/exchangeratesapi_types.go b/currency/forexprovider/exchangeratesapi.io/exchangeratesapi_types.go index b8c3e3f6..3c589f15 100644 --- a/currency/forexprovider/exchangeratesapi.io/exchangeratesapi_types.go +++ b/currency/forexprovider/exchangeratesapi.io/exchangeratesapi_types.go @@ -1,5 +1,28 @@ package exchangerates +import ( + "github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base" + "github.com/thrasher-corp/gocryptotrader/exchanges/request" +) + +const ( + exchangeRatesAPI = "https://api.exchangeratesapi.io" + exchangeRatesLatest = "latest" + exchangeRatesHistory = "history" + exchangeRatesSupportedCurrencies = "EUR,CHF,USD,BRL,ISK,PHP,KRW,BGN,MXN," + + "RON,CAD,SGD,NZD,THB,HKD,JPY,NOK,HRK,ILS,GBP,DKK,HUF,MYR,RUB,TRY,IDR," + + "ZAR,INR,AUD,CZK,SEK,CNY,PLN" + + authRate = 0 + unAuthRate = 0 +) + +// ExchangeRates stores the struct for the ExchangeRatesAPI API +type ExchangeRates struct { + base.Base + Requester *request.Requester +} + // Rates holds the latest forex rates info type Rates struct { Base string `json:"base"` diff --git a/currency/forexprovider/fixer.io/fixer.go b/currency/forexprovider/fixer.io/fixer.go index 5f6f9201..9816b9df 100644 --- a/currency/forexprovider/fixer.io/fixer.go +++ b/currency/forexprovider/fixer.io/fixer.go @@ -22,32 +22,6 @@ import ( log "github.com/thrasher-corp/gocryptotrader/logger" ) -const ( - fixerAPIFree = iota - fixerAPIBasic - fixerAPIProfessional - fixerAPIProfessionalPlus - fixerAPIEnterprise - - fixerAPI = "http://data.fixer.io/api/" - fixerAPISSL = "https://data.fixer.io/api/" - fixerAPILatest = "latest" - fixerAPIConvert = "convert" - fixerAPITimeSeries = "timeseries" - fixerAPIFluctuation = "fluctuation" - fixerSupportedCurrencies = "symbols" - - authRate = 0 - unAuthRate = 0 -) - -// Fixer is a foreign exchange rate provider at https://fixer.io/ -// NOTE DEFAULT BASE CURRENCY IS EUR upgrade to basic to change -type Fixer struct { - base.Base - Requester *request.Requester -} - // Setup sets appropriate values for fixer object func (f *Fixer) Setup(config base.Settings) error { if config.APIKeyLvl < 0 || config.APIKeyLvl > 4 { diff --git a/currency/forexprovider/fixer.io/fixer_test.go b/currency/forexprovider/fixer.io/fixer_test.go index c85f7314..45752552 100644 --- a/currency/forexprovider/fixer.io/fixer_test.go +++ b/currency/forexprovider/fixer.io/fixer_test.go @@ -22,7 +22,7 @@ func setup(t *testing.T) { if !isSetup { err := f.Setup(base.Settings{}) if err != nil { - t.Fatal("Test Failed - Setup error", err) + t.Fatal("Setup error", err) } isSetup = true } @@ -32,7 +32,7 @@ func TestGetRates(t *testing.T) { setup(t) _, err := f.GetRates("EUR", "AUD") if err == nil { - t.Error("test failed - fixer GetRates() error", err) + t.Error("fixer GetRates() Expected error") } } @@ -40,7 +40,7 @@ func TestGetLatestRates(t *testing.T) { setup(t) _, err := f.GetLatestRates("EUR", "AUD") if err == nil { - t.Error("test failed - fixer GetLatestRates() error", err) + t.Error("fixer GetLatestRates() Expected error") } } @@ -48,7 +48,7 @@ func TestGetHistoricalRates(t *testing.T) { setup(t) _, err := f.GetHistoricalRates("2013-12-24", "EUR", []string{"AUD,KRW"}) if err == nil { - t.Error("test failed - fixer GetHistoricalRates() error", err) + t.Error("fixer GetHistoricalRates() Expected error") } } @@ -56,7 +56,7 @@ func TestConvertCurrency(t *testing.T) { setup(t) _, err := f.ConvertCurrency("AUD", "EUR", "", 1337) if err == nil { - t.Error("test failed - fixer ConvertCurrency() error", err) + t.Error("fixer ConvertCurrency() Expected error") } } @@ -64,7 +64,7 @@ func TestGetTimeSeriesData(t *testing.T) { setup(t) _, err := f.GetTimeSeriesData("2013-12-24", "2013-12-25", "EUR", []string{"AUD,KRW"}) if err == nil { - t.Error("test failed - fixer GetTimeSeriesData() error", err) + t.Error("fixer GetTimeSeriesData() Expected error") } } @@ -72,6 +72,6 @@ func TestGetFluctuationData(t *testing.T) { setup(t) _, err := f.GetFluctuationData("2013-12-24", "2013-12-25", "EUR", []string{"AUD,KRW"}) if err == nil { - t.Error("test failed - fixer GetFluctuationData() error", err) + t.Error("fixer GetFluctuationData() Expected error") } } diff --git a/currency/forexprovider/fixer.io/fixer_types.go b/currency/forexprovider/fixer.io/fixer_types.go index 8238b16d..116750bb 100644 --- a/currency/forexprovider/fixer.io/fixer_types.go +++ b/currency/forexprovider/fixer.io/fixer_types.go @@ -1,5 +1,36 @@ package fixer +import ( + "github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base" + "github.com/thrasher-corp/gocryptotrader/exchanges/request" +) + +const ( + fixerAPIFree = iota + fixerAPIBasic + fixerAPIProfessional + fixerAPIProfessionalPlus + fixerAPIEnterprise + + fixerAPI = "http://data.fixer.io/api/" + fixerAPISSL = "https://data.fixer.io/api/" + fixerAPILatest = "latest" + fixerAPIConvert = "convert" + fixerAPITimeSeries = "timeseries" + fixerAPIFluctuation = "fluctuation" + fixerSupportedCurrencies = "symbols" + + authRate = 0 + unAuthRate = 0 +) + +// Fixer is a foreign exchange rate provider at https://fixer.io/ +// NOTE DEFAULT BASE CURRENCY IS EUR upgrade to basic to change +type Fixer struct { + base.Base + Requester *request.Requester +} + // Rates contains the data fields for the currencies you have requested. type Rates struct { Success bool `json:"success"` diff --git a/currency/forexprovider/forexprovider.go b/currency/forexprovider/forexprovider.go index 8b11152f..ab415bbc 100644 --- a/currency/forexprovider/forexprovider.go +++ b/currency/forexprovider/forexprovider.go @@ -13,13 +13,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/currency/forexprovider/openexchangerates" ) -// ForexProviders is a foreign exchange handler type -type ForexProviders struct { - base.FXHandler -} - -// GetAvailableForexProviders returns a list of supported forex providers -func GetAvailableForexProviders() []string { +// GetSupportedForexProviders returns a list of supported forex providers +func GetSupportedForexProviders() []string { return []string{"CurrencyConverter", "CurrencyLayer", "ExchangeRates", @@ -135,3 +130,8 @@ func StartFXService(fxProviders []base.Settings) (*ForexProviders, error) { return handler, nil } + +// ForexProviders is a foreign exchange handler type +type ForexProviders struct { + base.FXHandler +} diff --git a/currency/forexprovider/openexchangerates/openexchangerates.go b/currency/forexprovider/openexchangerates/openexchangerates.go index 4a02eb78..27ef1aac 100644 --- a/currency/forexprovider/openexchangerates/openexchangerates.go +++ b/currency/forexprovider/openexchangerates/openexchangerates.go @@ -23,45 +23,6 @@ import ( log "github.com/thrasher-corp/gocryptotrader/logger" ) -// These consts contain endpoint information -const ( - APIDeveloperAccess = iota - APIEnterpriseAccess - APIUnlimitedAccess - - APIURL = "https://openexchangerates.org/api/" - APIEndpointLatest = "latest.json" - APIEndpointHistorical = "historical/%s.json" - APIEndpointCurrencies = "currencies.json" - APIEndpointTimeSeries = "time-series.json" - APIEndpointConvert = "convert/%s/%s/%s" - APIEndpointOHLC = "ohlc.json" - APIEndpointUsage = "usage.json" - - oxrSupportedCurrencies = "AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD," + - "BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTC,BTN,BWP,BYN,BYR,BZD,CAD,CDF," + - "CHF,CLF,CLP,CNH,CNY,COP,CRC,CUC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EEK,EGP," + - "ERN,ETB,EUR,FJD,FKP,GBP,GEL,GGP,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HRK," + - "HTG,HUF,IDR,ILS,IMP,INR,IQD,IRR,ISK,JEP,JMD,JOD,JPY,KES,KGS,KHR,KMF," + - "KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT," + - "MOP,MRO,MRU,MTL,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR," + - "PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK," + - "SGD,SHP,SLL,SOS,SRD,SSP,STD,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY," + - "TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VEF,VND,VUV,WST,XAF,XAG,XAU,XCD,XDR," + - "XOF,XPD,XPF,XPT,YER,ZAR,ZMK,ZMW" - - authRate = 0 - unAuthRate = 0 -) - -// OXR is a foreign exchange rate provider at https://openexchangerates.org/ -// this is the overarching type across this package -// DOCs : https://docs.openexchangerates.org/docs -type OXR struct { - base.Base - Requester *request.Requester -} - // Setup sets values for the OXR object func (o *OXR) Setup(config base.Settings) error { if config.APIKeyLvl < 0 || config.APIKeyLvl > 2 { diff --git a/currency/forexprovider/openexchangerates/openexchangerates_test.go b/currency/forexprovider/openexchangerates/openexchangerates_test.go index 69093c33..184c9c88 100644 --- a/currency/forexprovider/openexchangerates/openexchangerates_test.go +++ b/currency/forexprovider/openexchangerates/openexchangerates_test.go @@ -31,7 +31,7 @@ func TestGetRates(t *testing.T) { } _, err := o.GetRates("USD", "AUD") if err == nil { - t.Error("test failed - GetRates() error", err) + t.Error("GetRates() Expected error") } } @@ -41,7 +41,7 @@ func TestGetLatest(t *testing.T) { } _, err := o.GetLatest("USD", "AUD", false, false) if err == nil { - t.Error("test failed - GetLatest() error", err) + t.Error("GetLatest() Expected error") } } @@ -51,7 +51,7 @@ func TestGetHistoricalRates(t *testing.T) { } _, err := o.GetHistoricalRates("2017-12-01", "USD", []string{"CNH", "AUD", "ANG"}, false, false) if err == nil { - t.Error("test failed - GetRates() error", err) + t.Error("GetRates() Expected error") } } @@ -61,7 +61,7 @@ func TestGetCurrencies(t *testing.T) { } _, err := o.GetCurrencies(true, true, true) if err != nil { - t.Error("test failed - GetCurrencies() error", err) + t.Error("GetCurrencies() error", err) } } @@ -71,7 +71,7 @@ func TestGetTimeSeries(t *testing.T) { } _, err := o.GetTimeSeries("USD", "2017-12-01", "2017-12-02", []string{"CNH", "AUD", "ANG"}, false, false) if err == nil { - t.Error("test failed - GetTimeSeries() error", err) + t.Error("GetTimeSeries() Expected error") } } @@ -81,7 +81,7 @@ func TestConvertCurrency(t *testing.T) { } _, err := o.ConvertCurrency(1337, "USD", "AUD") if err == nil { - t.Error("test failed - ConvertCurrency() error", err) + t.Error("ConvertCurrency() Expected error") } } @@ -91,7 +91,7 @@ func TestGetOHLC(t *testing.T) { } _, err := o.GetOHLC("2017-07-17T08:30:00Z", "1m", "USD", []string{"AUD"}, false) if err == nil { - t.Error("test failed - GetOHLC() error", err) + t.Error("GetOHLC() Expected error") } } @@ -101,6 +101,6 @@ func TestGetUsageStats(t *testing.T) { } _, err := o.GetUsageStats(false) if err == nil { - t.Error("test failed - GetUsageStats() error", err) + t.Error("GetUsageStats() Expected error") } } diff --git a/currency/forexprovider/openexchangerates/openexchangerates_types.go b/currency/forexprovider/openexchangerates/openexchangerates_types.go index 8c2d6e18..438fd0a4 100644 --- a/currency/forexprovider/openexchangerates/openexchangerates_types.go +++ b/currency/forexprovider/openexchangerates/openexchangerates_types.go @@ -1,5 +1,49 @@ package openexchangerates +import ( + "github.com/thrasher-corp/gocryptotrader/currency/forexprovider/base" + "github.com/thrasher-corp/gocryptotrader/exchanges/request" +) + +// These consts contain endpoint information +const ( + APIDeveloperAccess = iota + APIEnterpriseAccess + APIUnlimitedAccess + + APIURL = "https://openexchangerates.org/api/" + APIEndpointLatest = "latest.json" + APIEndpointHistorical = "historical/%s.json" + APIEndpointCurrencies = "currencies.json" + APIEndpointTimeSeries = "time-series.json" + APIEndpointConvert = "convert/%s/%s/%s" + APIEndpointOHLC = "ohlc.json" + APIEndpointUsage = "usage.json" + + oxrSupportedCurrencies = "AED,AFN,ALL,AMD,ANG,AOA,ARS,AUD,AWG,AZN,BAM,BBD," + + "BDT,BGN,BHD,BIF,BMD,BND,BOB,BRL,BSD,BTC,BTN,BWP,BYN,BYR,BZD,CAD,CDF," + + "CHF,CLF,CLP,CNH,CNY,COP,CRC,CUC,CUP,CVE,CZK,DJF,DKK,DOP,DZD,EEK,EGP," + + "ERN,ETB,EUR,FJD,FKP,GBP,GEL,GGP,GHS,GIP,GMD,GNF,GTQ,GYD,HKD,HNL,HRK," + + "HTG,HUF,IDR,ILS,IMP,INR,IQD,IRR,ISK,JEP,JMD,JOD,JPY,KES,KGS,KHR,KMF," + + "KPW,KRW,KWD,KYD,KZT,LAK,LBP,LKR,LRD,LSL,LYD,MAD,MDL,MGA,MKD,MMK,MNT," + + "MOP,MRO,MRU,MTL,MUR,MVR,MWK,MXN,MYR,MZN,NAD,NGN,NIO,NOK,NPR,NZD,OMR," + + "PAB,PEN,PGK,PHP,PKR,PLN,PYG,QAR,RON,RSD,RUB,RWF,SAR,SBD,SCR,SDG,SEK," + + "SGD,SHP,SLL,SOS,SRD,SSP,STD,STN,SVC,SYP,SZL,THB,TJS,TMT,TND,TOP,TRY," + + "TTD,TWD,TZS,UAH,UGX,USD,UYU,UZS,VEF,VND,VUV,WST,XAF,XAG,XAU,XCD,XDR," + + "XOF,XPD,XPF,XPT,YER,ZAR,ZMK,ZMW" + + authRate = 0 + unAuthRate = 0 +) + +// OXR is a foreign exchange rate provider at https://openexchangerates.org/ +// this is the overarching type across this package +// DOCs : https://docs.openexchangerates.org/docs +type OXR struct { + base.Base + Requester *request.Requester +} + // Latest holds latest rate data type Latest struct { Disclaimer string `json:"disclaimer"` diff --git a/currency/manager_test.go b/currency/manager_test.go index 67a58490..80f32075 100644 --- a/currency/manager_test.go +++ b/currency/manager_test.go @@ -29,11 +29,11 @@ func TestGetAssetTypes(t *testing.T) { a := p.GetAssetTypes() if len(a) == 0 { - t.Errorf("Test failed. GetAssetTypes shouldn't be nil") + t.Errorf("GetAssetTypes shouldn't be nil") } if !a.Contains(asset.Spot) { - t.Errorf("Test failed. AssetTypeSpot should be in the assets list") + t.Errorf("AssetTypeSpot should be in the assets list") } } @@ -41,11 +41,11 @@ func TestGet(t *testing.T) { initTest() if p.Get(asset.Spot) == nil { - t.Error("Test failed. Spot assets shouldn't be nil") + t.Error("Spot assets shouldn't be nil") } if p.Get(asset.Futures) != nil { - t.Error("Test Failed. Futures should be nil") + t.Error("Futures should be nil") } } @@ -65,7 +65,7 @@ func TestStore(t *testing.T) { ) if p.Get(asset.Futures) == nil { - t.Error("Test failed. Futures assets shouldn't be nil") + t.Error("Futures assets shouldn't be nil") } } @@ -80,12 +80,12 @@ func TestDelete(t *testing.T) { ) p.Delete(asset.UpsideProfitContract) if p.Get(asset.Spot) == nil { - t.Error("Test failed. AssetTypeSpot should exist") + t.Error("AssetTypeSpot should exist") } p.Delete(asset.Spot) if p.Get(asset.Spot) != nil { - t.Error("Test failed. Delete should have deleted AssetTypeSpot") + t.Error("Delete should have deleted AssetTypeSpot") } } diff --git a/currency/pair.go b/currency/pair.go index e83ee8e2..e3c6fcdd 100644 --- a/currency/pair.go +++ b/currency/pair.go @@ -87,13 +87,6 @@ func NewPairFromFormattedPairs(currencyPair string, pairs Pairs, pairFmt PairFor return NewPairFromString(currencyPair) } -// Pair holds currency pair information -type Pair struct { - Delimiter string `json:"delimiter"` - Base Code `json:"base"` - Quote Code `json:"quote"` -} - // String returns a currency pair string func (p Pair) String() string { return p.Base.String() + p.Delimiter + p.Quote.String() @@ -203,3 +196,10 @@ func (p Pair) IsEmpty() bool { func (p Pair) ContainsCurrency(c Code) bool { return p.Base.Item == c.Item || p.Quote.Item == c.Item } + +// Pair holds currency pair information +type Pair struct { + Delimiter string `json:"delimiter"` + Base Code `json:"base"` + Quote Code `json:"quote"` +} diff --git a/currency/pair_test.go b/currency/pair_test.go index 07e9f789..87b7c5ff 100644 --- a/currency/pair_test.go +++ b/currency/pair_test.go @@ -17,7 +17,7 @@ func TestLower(t *testing.T) { actual := pair.Lower() expected := NewPairFromString(defaultPair).Lower() if actual != expected { - t.Errorf("Test failed. Lower(): %s was not equal to expected value: %s", + t.Errorf("Lower(): %s was not equal to expected value: %s", actual, expected) } } @@ -28,7 +28,7 @@ func TestUpper(t *testing.T) { actual := pair.Upper() expected := NewPairFromString(defaultPair) if actual != expected { - t.Errorf("Test failed. Upper(): %s was not equal to expected value: %s", + t.Errorf("Upper(): %s was not equal to expected value: %s", actual, expected) } } @@ -39,21 +39,21 @@ func TestPairUnmarshalJSON(t *testing.T) { encoded, err := common.JSONEncode(configPair) if err != nil { - t.Fatal("Test Failed - Pair UnmarshalJSON() error", err) + t.Fatal("Pair UnmarshalJSON() error", err) } err = common.JSONDecode(encoded, &unmarshalHere) if err != nil { - t.Fatal("Test Failed - Pair UnmarshalJSON() error", err) + t.Fatal("Pair UnmarshalJSON() error", err) } err = common.JSONDecode(encoded, &unmarshalHere) if err != nil { - t.Fatal("Test Failed - Pair UnmarshalJSON() error", err) + t.Fatal("Pair UnmarshalJSON() error", err) } if !unmarshalHere.Equal(configPair) { - t.Errorf("Test Failed - Pairs UnmarshalJSON() error expected %s but received %s", + t.Errorf("Pairs UnmarshalJSON() error expected %s but received %s", configPair, unmarshalHere) } } @@ -67,43 +67,43 @@ func TestPairMarshalJSON(t *testing.T) { encoded, err := common.JSONEncode(quickstruct) if err != nil { - t.Fatal("Test Failed - Pair MarshalJSON() error", err) + t.Fatal("Pair MarshalJSON() error", err) } expected := `{"superPair":"BTC-USD"}` if string(encoded) != expected { - t.Errorf("Test Failed - Pair MarshalJSON() error expected %s but received %s", + t.Errorf("Pair MarshalJSON() error expected %s but received %s", expected, string(encoded)) } } func TestIsCryptoPair(t *testing.T) { if !NewPair(BTC, LTC).IsCryptoPair() { - t.Error("Test Failed. TestIsCryptoPair. Expected true result") + t.Error("TestIsCryptoPair. Expected true result") } if NewPair(BTC, USD).IsCryptoPair() { - t.Error("Test Failed. TestIsCryptoPair. Expected false result") + t.Error("TestIsCryptoPair. Expected false result") } } func TestIsCryptoFiatPair(t *testing.T) { if !NewPair(BTC, USD).IsCryptoFiatPair() { - t.Error("Test Failed. TestIsCryptoPair. Expected true result") + t.Error("TestIsCryptoPair. Expected true result") } if NewPair(BTC, LTC).IsCryptoFiatPair() { - t.Error("Test Failed. TestIsCryptoPair. Expected false result") + t.Error("TestIsCryptoPair. Expected false result") } } func TestIsFiatPair(t *testing.T) { if !NewPair(AUD, USD).IsFiatPair() { - t.Error("Test Failed. TestIsFiatPair. Expected true result") + t.Error("TestIsFiatPair. Expected true result") } if NewPair(BTC, AUD).IsFiatPair() { - t.Error("Test Failed. TestIsFiatPair. Expected false result") + t.Error("TestIsFiatPair. Expected false result") } } @@ -113,7 +113,7 @@ func TestString(t *testing.T) { actual := defaultPair expected := pair.String() if actual != expected { - t.Errorf("Test failed. String(): %s was not equal to expected value: %s", + t.Errorf("String(): %s was not equal to expected value: %s", actual, expected) } } @@ -125,7 +125,7 @@ func TestFirstCurrency(t *testing.T) { expected := BTC if actual != expected { t.Errorf( - "Test failed. GetFirstCurrency(): %s was not equal to expected value: %s", + "GetFirstCurrency(): %s was not equal to expected value: %s", actual, expected, ) } @@ -138,7 +138,7 @@ func TestSecondCurrency(t *testing.T) { expected := USD if actual != expected { t.Errorf( - "Test failed. GetSecondCurrency(): %s was not equal to expected value: %s", + "GetSecondCurrency(): %s was not equal to expected value: %s", actual, expected, ) } @@ -151,7 +151,7 @@ func TestPair(t *testing.T) { expected := defaultPair if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -164,7 +164,7 @@ func TestDisplay(t *testing.T) { expected := defaultPairWDelimiter if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -173,7 +173,7 @@ func TestDisplay(t *testing.T) { expected = "btcusd" if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -182,7 +182,7 @@ func TestDisplay(t *testing.T) { expected = "BTC~USD" if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -196,7 +196,7 @@ func TestEquall(t *testing.T) { expected := true if actual != expected { t.Errorf( - "Test failed. Equal(): %v was not equal to expected value: %v", + "Equal(): %v was not equal to expected value: %v", actual, expected, ) } @@ -206,7 +206,7 @@ func TestEquall(t *testing.T) { expected = false if actual != expected { t.Errorf( - "Test failed. Equal(): %v was not equal to expected value: %v", + "Equal(): %v was not equal to expected value: %v", actual, expected, ) } @@ -216,7 +216,7 @@ func TestEquall(t *testing.T) { expected = false if actual != expected { t.Errorf( - "Test failed. Equal(): %v was not equal to expected value: %v", + "Equal(): %v was not equal to expected value: %v", actual, expected, ) } @@ -230,7 +230,7 @@ func TestEqualIncludeReciprocal(t *testing.T) { expected := true if actual != expected { t.Errorf( - "Test failed. Equal(): %v was not equal to expected value: %v", + "Equal(): %v was not equal to expected value: %v", actual, expected, ) } @@ -240,7 +240,7 @@ func TestEqualIncludeReciprocal(t *testing.T) { expected = false if actual != expected { t.Errorf( - "Test failed. Equal(): %v was not equal to expected value: %v", + "Equal(): %v was not equal to expected value: %v", actual, expected, ) } @@ -250,7 +250,7 @@ func TestEqualIncludeReciprocal(t *testing.T) { expected = true if actual != expected { t.Errorf( - "Test failed. Equal(): %v was not equal to expected value: %v", + "Equal(): %v was not equal to expected value: %v", actual, expected, ) } @@ -263,7 +263,7 @@ func TestSwap(t *testing.T) { expected := "USDBTC" if actual != expected { t.Errorf( - "Test failed. TestSwap: %s was not equal to expected value: %s", + "TestSwap: %s was not equal to expected value: %s", actual, expected, ) } @@ -273,12 +273,12 @@ func TestEmpty(t *testing.T) { t.Parallel() pair := NewPair(BTC, USD) if pair.IsEmpty() { - t.Error("Test failed. Empty() returned true when the pair was initialised") + t.Error("Empty() returned true when the pair was initialised") } p := NewPair(NewCode(""), NewCode("")) if !p.IsEmpty() { - t.Error("Test failed. Empty() returned true when the pair wasn't initialised") + t.Error("Empty() returned true when the pair wasn't initialised") } } @@ -289,7 +289,7 @@ func TestNewPair(t *testing.T) { expected := defaultPair if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -302,7 +302,7 @@ func TestNewPairWithDelimiter(t *testing.T) { expected := "BTC-test-USD" if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -312,7 +312,7 @@ func TestNewPairWithDelimiter(t *testing.T) { expected = defaultPair if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -325,7 +325,7 @@ func TestNewPairDelimiter(t *testing.T) { expected := defaultPairWDelimiter if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -334,7 +334,7 @@ func TestNewPairDelimiter(t *testing.T) { expected = "-" if actual != expected { t.Errorf( - "Test failed. Delmiter: %s was not equal to expected value: %s", + "Delmiter: %s was not equal to expected value: %s", actual, expected, ) } @@ -349,7 +349,7 @@ func TestNewPairFromIndex(t *testing.T) { pair, err := NewPairFromIndex(currency, index) if err != nil { - t.Error("test failed - NewPairFromIndex() error", err) + t.Error("NewPairFromIndex() error", err) } pair.Delimiter = "-" @@ -358,7 +358,7 @@ func TestNewPairFromIndex(t *testing.T) { expected := defaultPairWDelimiter if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -367,7 +367,7 @@ func TestNewPairFromIndex(t *testing.T) { pair, err = NewPairFromIndex(currency, index) if err != nil { - t.Error("test failed - NewPairFromIndex() error", err) + t.Error("NewPairFromIndex() error", err) } pair.Delimiter = "-" @@ -376,7 +376,7 @@ func TestNewPairFromIndex(t *testing.T) { expected = "DOGE-BTC" if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -390,7 +390,7 @@ func TestNewPairFromString(t *testing.T) { expected := defaultPairWDelimiter if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -401,7 +401,7 @@ func TestNewPairFromString(t *testing.T) { expected = defaultPair if actual != expected { t.Errorf( - "Test failed. Pair(): %s was not equal to expected value: %s", + "Pair(): %s was not equal to expected value: %s", actual, expected, ) } @@ -416,18 +416,18 @@ func TestNewPairFromFormattedPairs(t *testing.T) { p := NewPairFromFormattedPairs("BTCUSDT", pairs, PairFormat{Uppercase: true}) if p.String() != "BTC-USDT" { - t.Error("Test failed. TestNewPairFromFormattedPairs: Expected currency was not found") + t.Error("TestNewPairFromFormattedPairs: Expected currency was not found") } p = NewPairFromFormattedPairs("btcusdt", pairs, PairFormat{Uppercase: false}) if p.String() != "BTC-USDT" { - t.Error("Test failed. TestNewPairFromFormattedPairs: Expected currency was not found") + t.Error("TestNewPairFromFormattedPairs: Expected currency was not found") } // Now a wrong one, will default to NewPairFromString p = NewPairFromFormattedPairs("ethusdt", pairs, PairFormat{}) if p.String() != "ethusdt" && p.Base.String() != "eth" { - t.Error("Test failed. TestNewPairFromFormattedPairs: Expected currency was not found") + t.Error("TestNewPairFromFormattedPairs: Expected currency was not found") } } @@ -435,48 +435,48 @@ func TestContainsCurrency(t *testing.T) { p := NewPair(BTC, USD) if !p.ContainsCurrency(BTC) { - t.Error("Test failed. TestContainsCurrency: Expected currency was not found") + t.Error("TestContainsCurrency: Expected currency was not found") } if p.ContainsCurrency(ETH) { - t.Error("Test failed. TestContainsCurrency: Non-existent currency was found") + t.Error("TestContainsCurrency: Non-existent currency was found") } } func TestFormatPairs(t *testing.T) { newP, err := FormatPairs([]string{""}, "-", "") if err != nil { - t.Error("Test Failed - FormatPairs() error", err) + t.Error("FormatPairs() error", err) } if len(newP) > 0 { - t.Error("Test failed. TestFormatPairs: Empty string returned a valid pair") + t.Error("TestFormatPairs: Empty string returned a valid pair") } newP, err = FormatPairs([]string{defaultPairWDelimiter}, "-", "") if err != nil { - t.Error("Test Failed - FormatPairs() error", err) + t.Error("FormatPairs() error", err) } if newP[0].String() != defaultPairWDelimiter { - t.Error("Test failed. TestFormatPairs: Expected pair was not found") + t.Error("TestFormatPairs: Expected pair was not found") } newP, err = FormatPairs([]string{defaultPair}, "", "BTC") if err != nil { - t.Error("Test Failed - FormatPairs() error", err) + t.Error("FormatPairs() error", err) } if newP[0].String() != defaultPair { - t.Error("Test failed. TestFormatPairs: Expected pair was not found") + t.Error("TestFormatPairs: Expected pair was not found") } newP, err = FormatPairs([]string{"ETHUSD"}, "", "") if err != nil { - t.Error("Test Failed - FormatPairs() error", err) + t.Error("FormatPairs() error", err) } if newP[0].String() != "ETHUSD" { - t.Error("Test failed. TestFormatPairs: Expected pair was not found") + t.Error("TestFormatPairs: Expected pair was not found") } } @@ -492,12 +492,12 @@ func TestCopyPairFormat(t *testing.T) { result := CopyPairFormat(testPair, pairs, false) if result.String() != defaultPairWDelimiter { - t.Error("Test failed. TestCopyPairFormat: Expected pair was not found") + t.Error("TestCopyPairFormat: Expected pair was not found") } result = CopyPairFormat(NewPair(ETH, USD), pairs, true) if result.String() != "" { - t.Error("Test failed. TestCopyPairFormat: Unexpected non empty pair returned") + t.Error("TestCopyPairFormat: Unexpected non empty pair returned") } } @@ -507,26 +507,26 @@ func TestFindPairDifferences(t *testing.T) { // Test new pair update newPairs, removedPairs := pairList.FindDifferences(NewPairsFromStrings([]string{"DASH-USD"})) if len(newPairs) != 1 && len(removedPairs) != 3 { - t.Error("Test failed. TestFindPairDifferences: Unexpected values") + t.Error("TestFindPairDifferences: Unexpected values") } // Test that we don't allow empty strings for new pairs newPairs, removedPairs = pairList.FindDifferences(NewPairsFromStrings([]string{""})) if len(newPairs) != 0 && len(removedPairs) != 3 { - t.Error("Test failed. TestFindPairDifferences: Unexpected values") + t.Error("TestFindPairDifferences: Unexpected values") } // Test that we don't allow empty strings for new pairs newPairs, removedPairs = NewPairsFromStrings([]string{""}).FindDifferences(pairList) if len(newPairs) != 3 && len(removedPairs) != 0 { - t.Error("Test failed. TestFindPairDifferences: Unexpected values") + t.Error("TestFindPairDifferences: Unexpected values") } // Test that the supplied pair lists are the same, so // no newPairs or removedPairs newPairs, removedPairs = pairList.FindDifferences(pairList) if len(newPairs) != 0 && len(removedPairs) != 0 { - t.Error("Test failed. TestFindPairDifferences: Unexpected values") + t.Error("TestFindPairDifferences: Unexpected values") } } @@ -538,7 +538,7 @@ func TestPairsToStringArray(t *testing.T) { actual := pairs.Strings() if actual[0] != expected[0] { - t.Error("Test failed. TestPairsToStringArray: Unexpected values") + t.Error("TestPairsToStringArray: Unexpected values") } } @@ -547,7 +547,7 @@ func TestRandomPairFromPairs(t *testing.T) { var emptyPairs Pairs result := emptyPairs.GetRandomPair() if !result.IsEmpty() { - t.Error("Test failed. TestRandomPairFromPairs: Unexpected values") + t.Error("TestRandomPairFromPairs: Unexpected values") } // Test that a populated pairs array returns a non-empty currency pair @@ -556,7 +556,7 @@ func TestRandomPairFromPairs(t *testing.T) { result = pairs.GetRandomPair() if result.IsEmpty() { - t.Error("Test failed. TestRandomPairFromPairs: Unexpected values") + t.Error("TestRandomPairFromPairs: Unexpected values") } // Test that a populated pairs array over a number of attempts returns ALL @@ -574,7 +574,7 @@ func TestRandomPairFromPairs(t *testing.T) { for x := range pairs { _, ok := expectedResults[pairs[x].String()] if !ok { - t.Error("Test failed. TestRandomPairFromPairs: Unexpected values") + t.Error("TestRandomPairFromPairs: Unexpected values") } } } @@ -582,6 +582,6 @@ func TestRandomPairFromPairs(t *testing.T) { func TestIsInvalid(t *testing.T) { p := NewPair(LTC, LTC) if !p.IsInvalid() { - t.Error("Test Failed - IsInvalid() error expect true but received false") + t.Error("IsInvalid() error expect true but received false") } } diff --git a/currency/pairs.go b/currency/pairs.go index 06cdedd1..a6855e87 100644 --- a/currency/pairs.go +++ b/currency/pairs.go @@ -22,9 +22,6 @@ func NewPairsFromStrings(pairs []string) Pairs { return ps } -// Pairs defines a list of pairs -type Pairs []Pair - // Strings returns a slice of strings referring to each currency pair func (p Pairs) Strings() []string { var list []string @@ -186,3 +183,6 @@ func (p Pairs) GetRandomPair() Pair { return p[rand.Intn(pairsLen)] } + +// Pairs defines a list of pairs +type Pairs []Pair diff --git a/currency/pairs_test.go b/currency/pairs_test.go index e8d7e1e5..bd52814d 100644 --- a/currency/pairs_test.go +++ b/currency/pairs_test.go @@ -11,7 +11,7 @@ func TestPairsUpper(t *testing.T) { expected := "BTC_USD,BTC_AUD,BTC_LTC" if pairs.Upper().Join() != expected { - t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", + t.Errorf("Pairs Join() error expected %s but received %s", expected, pairs.Join()) } } @@ -22,7 +22,7 @@ func TestPairsString(t *testing.T) { for i, p := range pairs { if p.String() != expected[i] { - t.Errorf("Test Failed - Pairs String() error expected %s but received %s", + t.Errorf("Pairs String() error expected %s but received %s", expected, p.String()) } } @@ -33,7 +33,7 @@ func TestPairsJoin(t *testing.T) { expected := "btc_usd,btc_aud,btc_ltc" if pairs.Join() != expected { - t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", + t.Errorf("Pairs Join() error expected %s but received %s", expected, pairs.Join()) } } @@ -43,25 +43,25 @@ func TestPairsFormat(t *testing.T) { expected := "BTC-USD,BTC-AUD,BTC-LTC" if pairs.Format("-", "", true).Join() != expected { - t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", + t.Errorf("Pairs Join() error expected %s but received %s", expected, pairs.Format("-", "", true).Join()) } expected = "btc:usd,btc:aud,btc:ltc" if pairs.Format(":", "", false).Join() != expected { - t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", + t.Errorf("Pairs Join() error expected %s but received %s", expected, pairs.Format(":", "", false).Join()) } if pairs.Format(":", "KRW", false).Join() != "" { - t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", + t.Errorf("Pairs Join() error expected %s but received %s", expected, pairs.Format(":", "KRW", true).Join()) } pairs = NewPairsFromStrings([]string{"DASHKRW", "BTCKRW"}) expected = "dash-krw,btc-krw" if pairs.Format("-", "KRW", false).Join() != expected { - t.Errorf("Test Failed - Pairs Join() error expected %s but received %s", + t.Errorf("Pairs Join() error expected %s but received %s", expected, pairs.Format("-", "KRW", false).Join()) } } @@ -72,21 +72,21 @@ func TestPairsUnmarshalJSON(t *testing.T) { encoded, err := common.JSONEncode(configPairs) if err != nil { - t.Fatal("Test Failed - Pairs UnmarshalJSON() error", err) + t.Fatal("Pairs UnmarshalJSON() error", err) } err = common.JSONDecode(encoded, &unmarshalHere) if err != nil { - t.Fatal("Test Failed - Pairs UnmarshalJSON() error", err) + t.Fatal("Pairs UnmarshalJSON() error", err) } err = common.JSONDecode(encoded, &unmarshalHere) if err != nil { - t.Fatal("Test Failed - Pairs UnmarshalJSON() error", err) + t.Fatal("Pairs UnmarshalJSON() error", err) } if unmarshalHere.Join() != configPairs { - t.Errorf("Test Failed - Pairs UnmarshalJSON() error expected %s but received %s", + t.Errorf("Pairs UnmarshalJSON() error expected %s but received %s", configPairs, unmarshalHere.Join()) } } @@ -100,12 +100,12 @@ func TestPairsMarshalJSON(t *testing.T) { encoded, err := common.JSONEncode(quickstruct) if err != nil { - t.Fatal("Test Failed - Pairs MarshalJSON() error", err) + t.Fatal("Pairs MarshalJSON() error", err) } expected := `{"soManyPairs":"btc_usd,btc_aud,btc_ltc"}` if string(encoded) != expected { - t.Errorf("Test Failed - Pairs MarshalJSON() error expected %s but received %s", + t.Errorf("Pairs MarshalJSON() error expected %s but received %s", expected, string(encoded)) } } @@ -119,7 +119,7 @@ func TestRemovePairsByFilter(t *testing.T) { pairs = pairs.RemovePairsByFilter(USDT) if pairs.Contains(NewPair(LTC, USDT), true) { - t.Error("Test failed. TestRemovePairsByFilter unexpected result") + t.Error("TestRemovePairsByFilter unexpected result") } } @@ -133,7 +133,7 @@ func TestRemove(t *testing.T) { p := NewPair(BTC, USD) pairs = pairs.Remove(p) if pairs.Contains(p, true) || len(pairs) != 2 { - t.Error("Test failed. TestRemove unexpected result") + t.Error("TestRemove unexpected result") } } @@ -148,13 +148,13 @@ func TestAdd(t *testing.T) { p := NewPair(BTC, USDT) pairs = pairs.Add(p) if !pairs.Contains(p, true) || len(pairs) != 4 { - t.Error("Test failed. TestAdd unexpected result") + t.Error("TestAdd unexpected result") } // Now test adding a pair which already exists pairs = pairs.Add(p) if len(pairs) != 4 { - t.Error("Test failed. TestAdd unexpected result") + t.Error("TestAdd unexpected result") } } @@ -165,10 +165,10 @@ func TestContains(t *testing.T) { } if !pairs.Contains(NewPair(BTC, USD), true) { - t.Errorf("Test failed. TestContains: Expected pair was not found") + t.Errorf("TestContains: Expected pair was not found") } if pairs.Contains(NewPair(ETH, USD), false) { - t.Errorf("Test failed. TestContains: Non-existent pair was found") + t.Errorf("TestContains: Non-existent pair was found") } } diff --git a/currency/storage.go b/currency/storage.go index a74947ab..f3c9f636 100644 --- a/currency/storage.go +++ b/currency/storage.go @@ -6,7 +6,6 @@ import ( "fmt" "io/ioutil" "path/filepath" - "sync" "time" "github.com/thrasher-corp/gocryptotrader/common" @@ -16,75 +15,10 @@ import ( log "github.com/thrasher-corp/gocryptotrader/logger" ) -// CurrencyFileUpdateDelay defines the rate at which the currency.json file is -// updated -const ( - DefaultCurrencyFileDelay = 168 * time.Hour - DefaultForeignExchangeDelay = 1 * time.Minute - DefaultStorageFile = "currency.json" -) - func init() { storage.SetDefaults() } -// storage is an overarching type that keeps track of and updates currency, -// currency exchange rates and pairs -var storage Storage - -// Storage contains the loaded storage currencies supported on available crypto -// or fiat marketplaces -// NOTE: All internal currencies are upper case -type Storage struct { - // FiatCurrencies defines the running fiat currencies in the currency - // storage - fiatCurrencies Currencies - - // Cryptocurrencies defines the running cryptocurrencies in the currency - // storage - cryptocurrencies Currencies - - // CurrencyCodes is a full basket of currencies either crypto, fiat, ico or - // contract being tracked by the currency storage system - currencyCodes BaseCodes - - // Main converting currency - baseCurrency Code - - // FXRates defines a protected conversion rate map - fxRates ConversionRates - - // DefaultBaseCurrency is the base currency used for conversion - defaultBaseCurrency Code - - // DefaultFiatCurrencies has the default minimum of FIAT values - defaultFiatCurrencies Currencies - - // DefaultCryptoCurrencies has the default minimum of crytpocurrency values - defaultCryptoCurrencies Currencies - - // FiatExchangeMarkets defines an interface to access FX data for fiat - // currency rates - fiatExchangeMarkets *forexprovider.ForexProviders - - // CurrencyAnalysis defines a full market analysis suite to receieve and - // define different fiat currencies, cryptocurrencies and markets - currencyAnalysis *coinmarketcap.Coinmarketcap - - // Path defines the main folder to dump and find currency JSON - path string - - // Update delay variables - currencyFileUpdateDelay time.Duration - foreignExchangeUpdateDelay time.Duration - - mtx sync.Mutex - wg sync.WaitGroup - shutdownC chan struct{} - updaterRunning bool - Verbose bool -} - // SetDefaults sets storage defaults for basic package functionality func (s *Storage) SetDefaults() { s.defaultBaseCurrency = USD diff --git a/currency/storage_test.go b/currency/storage_test.go index 2ed70a61..b9e562bf 100644 --- a/currency/storage_test.go +++ b/currency/storage_test.go @@ -8,7 +8,7 @@ func TestRunUpdater(t *testing.T) { emptyMainConfig := MainConfiguration{} err := newStorage.RunUpdater(BotOverrides{}, &emptyMainConfig, "", false) if err == nil { - t.Fatal("Test Failed storage RunUpdater() error cannot be nil") + t.Fatal("storage RunUpdater() error cannot be nil") } mainConfig := MainConfiguration{ @@ -18,11 +18,11 @@ func TestRunUpdater(t *testing.T) { err = newStorage.RunUpdater(BotOverrides{}, &mainConfig, "", false) if err == nil { - t.Fatal("Test Failed storage RunUpdater() error cannot be nil") + t.Fatal("storage RunUpdater() error cannot be nil") } err = newStorage.RunUpdater(BotOverrides{}, &mainConfig, "/bla", false) if err != nil { - t.Fatal("Test Failed storage RunUpdater() error", err) + t.Fatal("storage RunUpdater() error", err) } } diff --git a/currency/storage_types.go b/currency/storage_types.go new file mode 100644 index 00000000..032be5db --- /dev/null +++ b/currency/storage_types.go @@ -0,0 +1,62 @@ +package currency + +import ( + "sync" + "time" + + "github.com/thrasher-corp/gocryptotrader/currency/coinmarketcap" + "github.com/thrasher-corp/gocryptotrader/currency/forexprovider" +) + +// CurrencyFileUpdateDelay defines the rate at which the currency.json file is +// updated +const ( + DefaultCurrencyFileDelay = 168 * time.Hour + DefaultForeignExchangeDelay = 1 * time.Minute + DefaultStorageFile = "currency.json" +) + +// storage is an overarching type that keeps track of and updates currency, +// currency exchange rates and pairs +var storage Storage + +// Storage contains the loaded storage currencies supported on available crypto +// or fiat marketplaces +// NOTE: All internal currencies are upper case +type Storage struct { + // FiatCurrencies defines the running fiat currencies in the currency + // storage + fiatCurrencies Currencies + // Cryptocurrencies defines the running cryptocurrencies in the currency + // storage + cryptocurrencies Currencies + // CurrencyCodes is a full basket of currencies either crypto, fiat, ico or + // contract being tracked by the currency storage system + currencyCodes BaseCodes + // Main converting currency + baseCurrency Code + // FXRates defines a protected conversion rate map + fxRates ConversionRates + // DefaultBaseCurrency is the base currency used for conversion + defaultBaseCurrency Code + // DefaultFiatCurrencies has the default minimum of FIAT values + defaultFiatCurrencies Currencies + // DefaultCryptoCurrencies has the default minimum of crytpocurrency values + defaultCryptoCurrencies Currencies + // FiatExchangeMarkets defines an interface to access FX data for fiat + // currency rates + fiatExchangeMarkets *forexprovider.ForexProviders + // CurrencyAnalysis defines a full market analysis suite to receieve and + // define different fiat currencies, cryptocurrencies and markets + currencyAnalysis *coinmarketcap.Coinmarketcap + // Path defines the main folder to dump and find currency JSON + path string + // Update delay variables + currencyFileUpdateDelay time.Duration + foreignExchangeUpdateDelay time.Duration + mtx sync.Mutex + wg sync.WaitGroup + shutdownC chan struct{} + updaterRunning bool + Verbose bool +} diff --git a/currency/symbol.go b/currency/symbol.go index 28f8221e..e677384a 100644 --- a/currency/symbol.go +++ b/currency/symbol.go @@ -2,6 +2,15 @@ package currency import "errors" +// GetSymbolByCurrencyName returns a currency symbol +func GetSymbolByCurrencyName(currency Code) (string, error) { + result, ok := symbols[currency.Item] + if !ok { + return "", errors.New("currency symbol not found") + } + return result, nil +} + // symbols map holds the currency name and symbol mappings var symbols = map[*Item]string{ ALL.Item: "Lek", @@ -116,12 +125,3 @@ var symbols = map[*Item]string{ YER.Item: "ï·¼", ZWD.Item: "Z$", } - -// GetSymbolByCurrencyName returns a currency symbol -func GetSymbolByCurrencyName(currency Code) (string, error) { - result, ok := symbols[currency.Item] - if !ok { - return "", errors.New("currency symbol not found") - } - return result, nil -} diff --git a/currency/symbol_test.go b/currency/symbol_test.go index 2fe3ae6a..4c496f21 100644 --- a/currency/symbol_test.go +++ b/currency/symbol_test.go @@ -6,16 +6,16 @@ func TestGetSymbolByCurrencyName(t *testing.T) { expected := "â‚©" actual, err := GetSymbolByCurrencyName(KPW) if err != nil { - t.Errorf("Test failed. TestGetSymbolByCurrencyName error: %s", err) + t.Errorf("TestGetSymbolByCurrencyName error: %s", err) } if actual != expected { - t.Errorf("Test failed. TestGetSymbolByCurrencyName differing values") + t.Errorf("TestGetSymbolByCurrencyName differing values") } _, err = GetSymbolByCurrencyName(Code{}) if err == nil { - t.Errorf("Test failed. TestGetSymbolByCurrencyNam returned nil on non-existent currency") + t.Errorf("TestGetSymbolByCurrencyNam returned nil on non-existent currency") } } diff --git a/currency/translation.go b/currency/translation.go index 3a0632b3..c2db7430 100644 --- a/currency/translation.go +++ b/currency/translation.go @@ -1,5 +1,15 @@ package currency +// GetTranslation returns similar strings for a particular currency if not found +// returns the code back +func GetTranslation(currency Code) (Code, bool) { + val, ok := translations[currency] + if !ok { + return currency, ok + } + return val, ok +} + var translations = map[Code]Code{ BTC: XBT, ETH: XETH, @@ -10,13 +20,3 @@ var translations = map[Code]Code{ XDG: DOGE, USDT: USD, } - -// GetTranslation returns similar strings for a particular currency if not found -// returns the code back -func GetTranslation(currency Code) (Code, bool) { - val, ok := translations[currency] - if !ok { - return currency, ok - } - return val, ok -} diff --git a/dispatch/dispatch_test.go b/dispatch/dispatch_test.go index e526e3e2..cdbf1aaa 100644 --- a/dispatch/dispatch_test.go +++ b/dispatch/dispatch_test.go @@ -116,9 +116,9 @@ func TestDispatcher(t *testing.T) { t.Error("error cannot be nil") } - id, errrrrrrrr := dispatcher.getNewID() - if errrrrrrrr != nil { - t.Error(errrrrrrrr) + id, err := dispatcher.getNewID() + if err != nil { + t.Error(err) } err = dispatcher.publish(id, &payload) @@ -159,18 +159,18 @@ func TestDispatcher(t *testing.T) { randomChan := make(chan interface{}) err = dispatcher.unsubscribe(someID, randomChan) if err == nil { - t.Error(err) + t.Error("Expected error") } err = dispatcher.unsubscribe(id, randomChan) if err == nil { - t.Error(err) + t.Error("Expected error") } close(randomChan) err = dispatcher.unsubscribe(id, randomChan) if err == nil { - t.Error(err) + t.Error("Expected error") } } diff --git a/engine/exchange_test.go b/engine/exchange_test.go index 7dff0a20..b7713b82 100644 --- a/engine/exchange_test.go +++ b/engine/exchange_test.go @@ -16,7 +16,7 @@ func SetupTest(t *testing.T) { Bot.Config = &config.Cfg err := Bot.Config.LoadConfig("", true) if err != nil { - t.Fatalf("Test failed. SetupTest: Failed to load config: %s", err) + t.Fatalf("SetupTest: Failed to load config: %s", err) } testSetup = true } @@ -26,7 +26,7 @@ func SetupTest(t *testing.T) { } err := LoadExchange("Bitfinex", false, nil) if err != nil { - t.Errorf("Test failed. SetupTest: Failed to load exchange: %s", err) + t.Errorf("SetupTest: Failed to load exchange: %s", err) } } @@ -37,7 +37,7 @@ func CleanupTest(t *testing.T) { err := UnloadExchange("Bitfinex") if err != nil { - t.Fatalf("Test failed. CleanupTest: Failed to unload exchange: %s", + t.Fatalf("CleanupTest: Failed to unload exchange: %s", err) } } @@ -46,11 +46,11 @@ func TestCheckExchangeExists(t *testing.T) { SetupTest(t) if !CheckExchangeExists("Bitfinex") { - t.Errorf("Test failed. TestGetExchangeExists: Unable to find exchange") + t.Errorf("TestGetExchangeExists: Unable to find exchange") } if CheckExchangeExists("Asdsad") { - t.Errorf("Test failed. TestGetExchangeExists: Non-existent exchange found") + t.Errorf("TestGetExchangeExists: Non-existent exchange found") } CleanupTest(t) @@ -61,26 +61,26 @@ func TestGetExchangeByName(t *testing.T) { exch := GetExchangeByName("Bitfinex") if exch == nil { - t.Errorf("Test failed. TestGetExchangeByName: Failed to get exchange") + t.Errorf("TestGetExchangeByName: Failed to get exchange") } if !exch.IsEnabled() { - t.Errorf("Test failed. TestGetExchangeByName: Unexpected result") + t.Errorf("TestGetExchangeByName: Unexpected result") } exch.SetEnabled(false) bfx := GetExchangeByName("Bitfinex") if bfx.IsEnabled() { - t.Errorf("Test failed. TestGetExchangeByName: Unexpected result") + t.Errorf("TestGetExchangeByName: Unexpected result") } if exch.GetName() != "Bitfinex" { - t.Errorf("Test failed. TestGetExchangeByName: Unexpected result") + t.Errorf("TestGetExchangeByName: Unexpected result") } exch = GetExchangeByName("Asdasd") if exch != nil { - t.Errorf("Test failed. TestGetExchangeByName: Non-existent exchange found") + t.Errorf("TestGetExchangeByName: Non-existent exchange found") } CleanupTest(t) @@ -91,13 +91,13 @@ func TestReloadExchange(t *testing.T) { err := ReloadExchange("asdf") if err != ErrExchangeNotFound { - t.Errorf("Test failed. TestReloadExchange: Incorrect result: %s", + t.Errorf("TestReloadExchange: Incorrect result: %s", err) } err = ReloadExchange("Bitfinex") if err != nil { - t.Errorf("Test failed. TestReloadExchange: Incorrect result: %s", + t.Errorf("TestReloadExchange: Incorrect result: %s", err) } @@ -105,7 +105,7 @@ func TestReloadExchange(t *testing.T) { err = ReloadExchange("asdf") if err != ErrNoExchangesLoaded { - t.Errorf("Test failed. TestReloadExchange: Incorrect result: %s", + t.Errorf("TestReloadExchange: Incorrect result: %s", err) } } @@ -115,19 +115,19 @@ func TestUnloadExchange(t *testing.T) { err := UnloadExchange("asdf") if err != ErrExchangeNotFound { - t.Errorf("Test failed. TestUnloadExchange: Incorrect result: %s", + t.Errorf("TestUnloadExchange: Incorrect result: %s", err) } err = UnloadExchange("Bitfinex") if err != nil { - t.Errorf("Test failed. TestUnloadExchange: Failed to get exchange. %s", + t.Errorf("TestUnloadExchange: Failed to get exchange. %s", err) } err = UnloadExchange("asdf") if err != ErrNoExchangesLoaded { - t.Errorf("Test failed. TestUnloadExchange: Incorrect result: %s", + t.Errorf("TestUnloadExchange: Incorrect result: %s", err) } diff --git a/engine/helpers_test.go b/engine/helpers_test.go index 085db1f5..8bf23ab3 100644 --- a/engine/helpers_test.go +++ b/engine/helpers_test.go @@ -31,7 +31,7 @@ func SetupTestHelpers(t *testing.T) { Bot.Config = &config.Cfg err := Bot.Config.LoadConfig("../testdata/configtest.json", true) if err != nil { - t.Fatalf("Test failed. SetupTest: Failed to load config: %s", err) + t.Fatalf("SetupTest: Failed to load config: %s", err) } testSetup = true } @@ -428,7 +428,7 @@ func TestGetSpecificTicker(t *testing.T) { &ticker.Price{Pair: p, Last: 1000}, asset.Spot) if err != nil { - t.Fatal("Test failed. ProcessTicker error", err) + t.Fatal("ProcessTicker error", err) } tick, err := GetSpecificTicker(currency.NewPairFromStrings("BTC", "USD"), "Bitstamp", @@ -587,6 +587,6 @@ func TestGetCryptocurrenciesByExchange(t *testing.T) { _, err := GetCryptocurrenciesByExchange("Bitfinex", false, false, asset.Spot) if err != nil { - t.Fatalf("Test failed. Err %s", err) + t.Fatalf("Err %s", err) } } diff --git a/engine/restful_server_test.go b/engine/restful_server_test.go index 5729dec8..631ecbe2 100644 --- a/engine/restful_server_test.go +++ b/engine/restful_server_test.go @@ -15,7 +15,7 @@ func loadConfig(t *testing.T) *config.Config { cfg := config.GetConfig() err := cfg.LoadConfig("", true) if err != nil { - t.Error("Test failed. GetCurrencyConfig LoadConfig error", err) + t.Error("GetCurrencyConfig LoadConfig error", err) } return cfg } @@ -25,7 +25,7 @@ func makeHTTPGetRequest(t *testing.T, response interface{}) *http.Response { err := RESTfulJSONResponse(w, response) if err != nil { - t.Error("Test failed. Failed to make response.", err) + t.Error("Failed to make response.", err) } return w.Result() } @@ -37,17 +37,17 @@ func TestConfigAllJsonResponse(t *testing.T) { body, err := ioutil.ReadAll(resp.Body) resp.Body.Close() if err != nil { - t.Error("Test failed. Body not readable", err) + t.Error("Body not readable", err) } var responseConfig config.Config jsonErr := json.Unmarshal(body, &responseConfig) if jsonErr != nil { - t.Error("Test failed. Response not parseable as json", err) + t.Error("Response not parseable as json", err) } if reflect.DeepEqual(responseConfig, cfg) { - t.Error("Test failed. Json not equal to config") + t.Error("Json not equal to config") } } @@ -62,7 +62,7 @@ func TestInvalidHostRequest(t *testing.T) { newRouter(true).ServeHTTP(resp, req) if status := resp.Code; status != http.StatusNotFound { - t.Errorf("Test failed. Response returned wrong status code expected %v got %v", http.StatusNotFound, status) + t.Errorf("Response returned wrong status code expected %v got %v", http.StatusNotFound, status) } } @@ -77,6 +77,6 @@ func TestValidHostRequest(t *testing.T) { newRouter(true).ServeHTTP(resp, req) if status := resp.Code; status != http.StatusOK { - t.Errorf("Test failed. Response returned wrong status code expected %v got %v", http.StatusOK, status) + t.Errorf("Response returned wrong status code expected %v got %v", http.StatusOK, status) } } diff --git a/engine/syncer_test.go b/engine/syncer_test.go index ed1bed2d..8546e21e 100644 --- a/engine/syncer_test.go +++ b/engine/syncer_test.go @@ -16,7 +16,7 @@ func TestNewCurrencyPairSyncer(t *testing.T) { Bot.Config = &config.Cfg err := Bot.Config.LoadConfig("", true) if err != nil { - t.Fatalf("Test failed. TestNewExchangeSyncer: Failed to load config: %s", err) + t.Fatalf("TestNewExchangeSyncer: Failed to load config: %s", err) } Bot.Settings.DisableExchangeAutoPairUpdates = true diff --git a/exchanges/alphapoint/alphapoint_test.go b/exchanges/alphapoint/alphapoint_test.go index 303a6e9b..f76b1630 100644 --- a/exchanges/alphapoint/alphapoint_test.go +++ b/exchanges/alphapoint/alphapoint_test.go @@ -21,10 +21,10 @@ func TestSetDefaults(t *testing.T) { SetDefaults.SetDefaults() if SetDefaults.API.Endpoints.URL != "https://sim3.alphapoint.com:8400" { - t.Error("Test Failed - SetDefaults: String Incorrect -", SetDefaults.API.Endpoints.URL) + t.Error("SetDefaults: String Incorrect -", SetDefaults.API.Endpoints.URL) } if SetDefaults.API.Endpoints.WebsocketURL != "wss://sim3.alphapoint.com:8401/v1/GetTicker/" { - t.Error("Test Failed - SetDefaults: String Incorrect -", SetDefaults.API.Endpoints.WebsocketURL) + t.Error("SetDefaults: String Incorrect -", SetDefaults.API.Endpoints.WebsocketURL) } } @@ -50,12 +50,12 @@ func TestGetTicker(t *testing.T) { if onlineTest { ticker, err = alpha.GetTicker("BTCUSD") if err != nil { - t.Fatal("Test Failed - Alphapoint GetTicker init error: ", err) + t.Fatal("Alphapoint GetTicker init error: ", err) } _, err = alpha.GetTicker("wigwham") if err == nil { - t.Error("Test Failed - Alphapoint GetTicker error") + t.Error("Alphapoint GetTicker Expected error") } } else { mockResp := []byte( @@ -64,16 +64,16 @@ func TestGetTicker(t *testing.T) { err = common.JSONDecode(mockResp, &ticker) if err != nil { - t.Fatal("Test Failed - Alphapoint GetTicker unmarshalling error: ", err) + t.Fatal("Alphapoint GetTicker unmarshalling error: ", err) } if ticker.Last != 249.76 { - t.Error("Test failed - Alphapoint GetTicker expected last = 249.76") + t.Error("Alphapoint GetTicker expected last = 249.76") } } if ticker.Last < 0 { - t.Error("Test failed - Alphapoint GetTicker last < 0") + t.Error("Alphapoint GetTicker last < 0") } } @@ -87,12 +87,12 @@ func TestGetTrades(t *testing.T) { if onlineTest { trades, err = alpha.GetTrades("BTCUSD", 0, 10) if err != nil { - t.Fatalf("Test Failed - Init error: %s", err) + t.Fatalf("Init error: %s", err) } _, err = alpha.GetTrades("wigwham", 0, 10) if err == nil { - t.Fatal("Test Failed - GetTrades error") + t.Fatal("GetTrades Expected error") } } else { mockResp := []byte( @@ -101,20 +101,20 @@ func TestGetTrades(t *testing.T) { err = common.JSONDecode(mockResp, &trades) if err != nil { - t.Fatal("Test Failed - GetTrades unmarshalling error: ", err) + t.Fatal("GetTrades unmarshalling error: ", err) } } if !trades.IsAccepted { - t.Error("Test Failed - GetTrades IsAccepted failed") + t.Error("GetTrades IsAccepted failed") } if trades.Count <= 0 { - t.Error("Test failed - GetTrades trades count is <= 0") + t.Error("GetTrades trades count is <= 0") } if trades.Instrument != "BTCUSD" { - t.Error("Test failed - GetTrades instrument is != BTCUSD") + t.Error("GetTrades instrument is != BTCUSD") } } @@ -128,11 +128,11 @@ func TestGetTradesByDate(t *testing.T) { if onlineTest { trades, err = alpha.GetTradesByDate("BTCUSD", 1414799400, 1414800000) if err != nil { - t.Errorf("Test Failed - Init error: %s", err) + t.Errorf("Init error: %s", err) } _, err = alpha.GetTradesByDate("wigwham", 1414799400, 1414800000) if err == nil { - t.Error("Test Failed - GetTradesByDate error") + t.Error("GetTradesByDate Expected error") } } else { mockResp := []byte( @@ -141,27 +141,27 @@ func TestGetTradesByDate(t *testing.T) { err = common.JSONDecode(mockResp, &trades) if err != nil { - t.Fatal("Test Failed - GetTradesByDate unmarshalling error: ", err) + t.Fatal("GetTradesByDate unmarshalling error: ", err) } } if trades.DateTimeUTC < 0 { - t.Error("Test Failed - Alphapoint trades.Count value is negative") + t.Error("Alphapoint trades.Count value is negative") } if trades.EndDate < 0 { - t.Error("Test Failed - Alphapoint trades.DateTimeUTC value is negative") + t.Error("Alphapoint trades.DateTimeUTC value is negative") } if trades.Instrument != "BTCUSD" { - t.Error("Test Failed - Alphapoint trades.Instrument value is incorrect") + t.Error("Alphapoint trades.Instrument value is incorrect") } if !trades.IsAccepted { - t.Error("Test Failed - Alphapoint trades.IsAccepted value is true") + t.Error("Alphapoint trades.IsAccepted value is true") } if len(trades.RejectReason) > 0 { - t.Error("Test Failed - Alphapoint trades.IsAccepted value has been returned") + t.Error("Alphapoint trades.IsAccepted value has been returned") } if trades.StartDate < 0 { - t.Error("Test Failed - Alphapoint trades.StartIndex value is negative") + t.Error("Alphapoint trades.StartIndex value is negative") } } @@ -175,12 +175,12 @@ func TestGetOrderbook(t *testing.T) { if onlineTest { orderBook, err = alpha.GetOrderbook("BTCUSD") if err != nil { - t.Errorf("Test Failed - Init error: %s", err) + t.Errorf("Init error: %s", err) } _, err = alpha.GetOrderbook("wigwham") if err == nil { - t.Error("Test Failed - GetOrderbook() error") + t.Error("GetOrderbook() Expected error") } } else { mockResp := []byte( @@ -189,24 +189,24 @@ func TestGetOrderbook(t *testing.T) { err = common.JSONDecode(mockResp, &orderBook) if err != nil { - t.Fatal("Test Failed - TestGetOrderbook unmarshalling error: ", err) + t.Fatal("TestGetOrderbook unmarshalling error: ", err) } if orderBook.Bids[0].Quantity != 725 { - t.Error("Test Failed - TestGetOrderbook Bids[0].Quantity != 725") + t.Error("TestGetOrderbook Bids[0].Quantity != 725") } } if !orderBook.IsAccepted { - t.Error("Test Failed - Alphapoint orderBook.IsAccepted value is negative") + t.Error("Alphapoint orderBook.IsAccepted value is negative") } if len(orderBook.Asks) == 0 { - t.Error("Test Failed - Alphapoint orderBook.Asks has len 0") + t.Error("Alphapoint orderBook.Asks has len 0") } if len(orderBook.Bids) == 0 { - t.Error("Test Failed - Alphapoint orderBook.Bids has len 0") + t.Error("Alphapoint orderBook.Bids has len 0") } } @@ -220,7 +220,7 @@ func TestGetProductPairs(t *testing.T) { if onlineTest { products, err = alpha.GetProductPairs() if err != nil { - t.Errorf("Test Failed - Init error: %s", err) + t.Errorf("Init error: %s", err) } } else { mockResp := []byte( @@ -229,24 +229,24 @@ func TestGetProductPairs(t *testing.T) { err = common.JSONDecode(mockResp, &products) if err != nil { - t.Fatal("Test Failed - TestGetProductPairs unmarshalling error: ", err) + t.Fatal("TestGetProductPairs unmarshalling error: ", err) } if products.ProductPairs[0].Name != "LTCUSD" { - t.Error("Test Failed - Alphapoint ProductPairs 0 != LTCUSD") + t.Error("Alphapoint ProductPairs 0 != LTCUSD") } if products.ProductPairs[1].Product1Label != "BTC" { - t.Error("Test Failed - Alphapoint ProductPairs 1 != BTC") + t.Error("Alphapoint ProductPairs 1 != BTC") } } if !products.IsAccepted { - t.Error("Test Failed - Alphapoint ProductPairs.IsAccepted value is negative") + t.Error("Alphapoint ProductPairs.IsAccepted value is negative") } if len(products.ProductPairs) == 0 { - t.Error("Test Failed - Alphapoint ProductPairs len is 0") + t.Error("Alphapoint ProductPairs len is 0") } } @@ -260,7 +260,7 @@ func TestGetProducts(t *testing.T) { if onlineTest { products, err = alpha.GetProducts() if err != nil { - t.Errorf("Test Failed - Init error: %s", err) + t.Errorf("Init error: %s", err) } } else { mockResp := []byte( @@ -269,24 +269,24 @@ func TestGetProducts(t *testing.T) { err = common.JSONDecode(mockResp, &products) if err != nil { - t.Fatal("Test Failed - TestGetProducts unmarshalling error: ", err) + t.Fatal("TestGetProducts unmarshalling error: ", err) } if products.Products[0].Name != "USD" { - t.Error("Test Failed - Alphapoint Products 0 != USD") + t.Error("Alphapoint Products 0 != USD") } if products.Products[1].ProductCode != 1 { - t.Error("Test Failed - Alphapoint Products 1 product code != 1") + t.Error("Alphapoint Products 1 product code != 1") } } if !products.IsAccepted { - t.Error("Test Failed - Alphapoint Products.IsAccepted value is negative") + t.Error("Alphapoint Products.IsAccepted value is negative") } if len(products.Products) == 0 { - t.Error("Test Failed - Alphapoint Products len is 0") + t.Error("Alphapoint Products len is 0") } } @@ -301,15 +301,15 @@ func TestCreateAccount(t *testing.T) { err := a.CreateAccount("test", "account", "something@something.com", "0292383745", "lolcat123") if err != nil { - t.Errorf("Test Failed - Init error: %s", err) + t.Errorf("Init error: %s", err) } err = a.CreateAccount("test", "account", "something@something.com", "0292383745", "bla") if err == nil { - t.Errorf("Test Failed - CreateAccount() error") + t.Errorf("CreateAccount() Expected error") } err = a.CreateAccount("", "", "", "", "lolcat123") if err == nil { - t.Errorf("Test Failed - CreateAccount() error") + t.Errorf("CreateAccount() Expected error") } } @@ -324,7 +324,7 @@ func TestGetUserInfo(t *testing.T) { _, err := a.GetUserInfo() if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -339,7 +339,7 @@ func TestSetUserInfo(t *testing.T) { _, err := a.SetUserInfo("bla", "bla", "1", "meh", true, true) if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -354,7 +354,7 @@ func TestGetAccountInfo(t *testing.T) { _, err := a.GetAccountInfo() if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -369,7 +369,7 @@ func TestGetAccountTrades(t *testing.T) { _, err := a.GetAccountTrades("", 1, 2) if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -384,7 +384,7 @@ func TestGetDepositAddresses(t *testing.T) { _, err := a.GetDepositAddresses() if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -399,7 +399,7 @@ func TestWithdrawCoins(t *testing.T) { err := a.WithdrawCoins("", "", "", 0.01) if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -414,7 +414,7 @@ func TestCreateOrder(t *testing.T) { _, err := a.CreateOrder("", "", exchange.LimitOrderType.ToString(), 0.01, 0) if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -429,7 +429,7 @@ func TestModifyExistingOrder(t *testing.T) { _, err := a.ModifyExistingOrder("", 1, 1) if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -444,7 +444,7 @@ func TestCancelAllExistingOrders(t *testing.T) { err := a.CancelAllExistingOrders("") if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -459,7 +459,7 @@ func TestGetOrders(t *testing.T) { _, err := a.GetOrders() if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -474,7 +474,7 @@ func TestGetOrderFee(t *testing.T) { _, err := a.GetOrderFee("", "", 1, 1) if err == nil { - t.Error("Test Failed - GetUserInfo() error") + t.Error("GetUserInfo() Expected error") } } @@ -626,7 +626,7 @@ func TestModifyOrder(t *testing.T) { _, err := a.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } diff --git a/exchanges/alphapoint/alphapoint_wrapper.go b/exchanges/alphapoint/alphapoint_wrapper.go index 38bccd13..e92a2ad8 100644 --- a/exchanges/alphapoint/alphapoint_wrapper.go +++ b/exchanges/alphapoint/alphapoint_wrapper.go @@ -12,6 +12,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -40,12 +41,24 @@ func (a *Alphapoint) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AccountInfo: true, + RESTCapabilities: protocol.Features{ + AccountInfo: true, + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + GetOrders: true, + CancelOrder: true, + CancelOrders: true, + SubmitOrder: true, + ModifyOrder: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, }, - WebsocketCapabilities: exchange.ProtocolFeatures{ - TickerFetching: true, + WebsocketCapabilities: protocol.Features{ + AccountInfo: true, }, WithdrawPermissions: exchange.WithdrawCryptoWith2FA | diff --git a/exchanges/anx/anx_live_test.go b/exchanges/anx/anx_live_test.go index 4b0c6b07..f1d0d3cf 100644 --- a/exchanges/anx/anx_live_test.go +++ b/exchanges/anx/anx_live_test.go @@ -19,11 +19,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatalf("Test Failed - ANX Setup() load config error: %s", err) + log.Fatalf("ANX Setup() load config error: %s", err) } anxConfig, err := cfg.GetExchangeConfig("ANX") if err != nil { - log.Fatalf("Test Failed - ANX Setup() init error: %s", err) + log.Fatalf("ANX Setup() init error: %s", err) } anxConfig.API.AuthenticatedSupport = true anxConfig.API.Credentials.Key = apiKey @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { a.SetDefaults() err = a.Setup(anxConfig) if err != nil { - log.Fatal("Test Failed - ANX setup error", err) + log.Fatal("ANX setup error", err) } log.Printf(sharedtestvalues.LiveTesting, a.GetName(), a.API.Endpoints.URL) os.Exit(m.Run()) diff --git a/exchanges/anx/anx_mock_test.go b/exchanges/anx/anx_mock_test.go index 9ebc8768..f4b426b8 100644 --- a/exchanges/anx/anx_mock_test.go +++ b/exchanges/anx/anx_mock_test.go @@ -22,11 +22,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - ANX load config error", err) + log.Fatal("ANX load config error", err) } anxConfig, err := cfg.GetExchangeConfig("ANX") if err != nil { - log.Fatal("Test Failed - Mock server error", err) + log.Fatal("Mock server error", err) } a.SkipAuthCheck = true anxConfig.API.AuthenticatedSupport = true @@ -35,12 +35,12 @@ func TestMain(m *testing.M) { a.SetDefaults() err = a.Setup(anxConfig) if err != nil { - log.Fatal("Test Failed - ANX setup error", err) + log.Fatal("ANX setup error", err) } serverDetails, newClient, err := mock.NewVCRServer(mockFile) if err != nil { - log.Fatalf("Test Failed - Mock server error %s", err) + log.Fatalf("Mock server error %s", err) } a.HTTPClient = newClient diff --git a/exchanges/anx/anx_test.go b/exchanges/anx/anx_test.go index 85519f1d..16aa053c 100644 --- a/exchanges/anx/anx_test.go +++ b/exchanges/anx/anx_test.go @@ -22,7 +22,7 @@ func TestGetCurrencies(t *testing.T) { t.Parallel() _, err := a.GetCurrencies() if err != nil { - t.Fatalf("Test failed. TestGetCurrencies failed. Err: %s", err) + t.Fatalf("TestGetCurrencies failed. Err: %s", err) } } @@ -30,7 +30,7 @@ func TestGetTradablePairs(t *testing.T) { t.Parallel() _, err := a.FetchTradablePairs(asset.Spot) if err != nil { - t.Fatalf("Test failed. TestGetTradablePairs failed. Err: %s", err) + t.Fatalf("TestGetTradablePairs failed. Err: %s", err) } } @@ -38,10 +38,10 @@ func TestGetTicker(t *testing.T) { t.Parallel() ticker, err := a.GetTicker("BTCUSD") if err != nil { - t.Errorf("Test Failed - ANX GetTicker() error: %s", err) + t.Errorf("ANX GetTicker() error: %s", err) } if ticker.Result != "success" { - t.Error("Test Failed - ANX GetTicker() unsuccessful") + t.Error("ANX GetTicker() unsuccessful") } } @@ -49,10 +49,10 @@ func TestGetDepth(t *testing.T) { t.Parallel() depth, err := a.GetDepth("BTCUSD") if err != nil { - t.Errorf("Test Failed - ANX GetDepth() error: %s", err) + t.Errorf("ANX GetDepth() error: %s", err) } if depth.Result != "success" { - t.Error("Test Failed - ANX GetDepth() unsuccessful") + t.Error("ANX GetDepth() unsuccessful") } } @@ -60,13 +60,13 @@ func TestGetAPIKey(t *testing.T) { t.Parallel() apiKey, apiSecret, err := a.GetAPIKey("userName", "passWord", "", "1337") if err == nil { - t.Error("Test Failed - ANX GetAPIKey() Incorrect") + t.Error("ANX GetAPIKey() Expected error") } if apiKey != "" { - t.Error("Test Failed - ANX GetAPIKey() Incorrect") + t.Error("ANX GetAPIKey() Expected error") } if apiSecret != "" { - t.Error("Test Failed - ANX GetAPIKey() Incorrect") + t.Error("ANX GetAPIKey() Expected error") } } @@ -103,7 +103,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := a.GetFee(feeBuilder); resp != float64(0.02) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) } // CryptocurrencyTradeFee High quantity @@ -111,7 +111,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := a.GetFee(feeBuilder); resp != float64(20000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(20000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(20000), resp) t.Error(err) } @@ -119,7 +119,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := a.GetFee(feeBuilder); resp != float64(0.01) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.01), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.01), resp) t.Error(err) } @@ -127,7 +127,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := a.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -135,7 +135,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := a.GetFee(feeBuilder); resp != float64(0.002) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -143,7 +143,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := a.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -152,7 +152,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.HKD if resp, err := a.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -161,7 +161,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.HKD if resp, err := a.GetFee(feeBuilder); resp != float64(250.01) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(250.01), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(250.01), resp) t.Error(err) } } @@ -208,7 +208,7 @@ func TestGetOrderHistory(t *testing.T) { case !areTestAPIKeysSet() && err == nil && !mockTests: t.Error("Expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - GetBalance() error", err) + t.Error("GetBalance() error", err) } } @@ -307,11 +307,11 @@ func TestGetAccountInfo(t *testing.T) { _, err := a.GetAccountInfo() switch { case areTestAPIKeysSet() && err != nil && !mockTests: - t.Error("test failed - GetAccountInfo() error:", err) + t.Error("GetAccountInfo() error:", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("test failed - GetAccountInfo() error") + t.Error("GetAccountInfo() error") case mockTests && err != nil: - t.Error("test failed - GetAccountInfo() error:", err) + t.Error("GetAccountInfo() error:", err) } } @@ -319,7 +319,7 @@ func TestModifyOrder(t *testing.T) { t.Parallel() _, err := a.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -373,9 +373,9 @@ func TestGetDepositAddress(t *testing.T) { t.Parallel() _, err := a.GetDepositAddress(currency.BTC, "") if areTestAPIKeysSet() && err != nil && !mockTests { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } else if !areTestAPIKeysSet() && err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } diff --git a/exchanges/anx/anx_wrapper.go b/exchanges/anx/anx_wrapper.go index 6dcaab39..9735e61a 100644 --- a/exchanges/anx/anx_wrapper.go +++ b/exchanges/anx/anx_wrapper.go @@ -13,6 +13,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -80,9 +81,24 @@ func (a *ANX) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: false, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: false, + RESTCapabilities: protocol.Features{ + TickerFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + TradeFee: true, + FiatWithdrawalFee: true, + CryptoWithdrawalFee: true, }, WithdrawPermissions: exchange.WithdrawCryptoWithEmail | exchange.AutoWithdrawCryptoWithSetup | diff --git a/exchanges/asset/asset_test.go b/exchanges/asset/asset_test.go index 475058c5..e1db02ba 100644 --- a/exchanges/asset/asset_test.go +++ b/exchanges/asset/asset_test.go @@ -9,7 +9,7 @@ import ( func TestString(t *testing.T) { a := Spot if a.String() != "spot" { - t.Fatal("Test failed - TestString returned an unexpected result") + t.Fatal("TestString returned an unexpected result") } } @@ -18,7 +18,7 @@ func TestToStringArray(t *testing.T) { result := a.Strings() for x := range a { if !common.StringDataCompare(result, a[x].String()) { - t.Fatal("Test failed - TestToStringArray returned an unexpected result") + t.Fatal("TestToStringArray returned an unexpected result") } } } @@ -26,60 +26,60 @@ func TestToStringArray(t *testing.T) { func TestContains(t *testing.T) { a := Items{Spot, Futures} if a.Contains("meow") { - t.Fatal("Test failed - TestContains returned an unexpected result") + t.Fatal("TestContains returned an unexpected result") } if !a.Contains(Spot) { - t.Fatal("Test failed - TestContains returned an unexpected result") + t.Fatal("TestContains returned an unexpected result") } if a.Contains(Binary) { - t.Fatal("Test failed - TestContains returned an unexpected result") + t.Fatal("TestContains returned an unexpected result") } if !a.Contains("SpOt") { - t.Error("Test failed - TestContains returned an unexpected result") + t.Error("TestContains returned an unexpected result") } } func TestJoinToString(t *testing.T) { a := Items{Spot, Futures} if a.JoinToString(",") != "spot,futures" { - t.Fatal("Test failed - TestJoinToString returned an unexpected result") + t.Fatal("TestJoinToString returned an unexpected result") } } func TestIsValid(t *testing.T) { if IsValid("rawr") { - t.Fatal("Test failed - TestIsValid returned an unexpected result") + t.Fatal("TestIsValid returned an unexpected result") } if !IsValid(Spot) { - t.Fatal("Test failed - TestIsValid returned an unexpected result") + t.Fatal("TestIsValid returned an unexpected result") } } func TestNew(t *testing.T) { a := New("Spota") if a != nil { - t.Fatal("Test failed - TestNew returned an unexpected result") + t.Fatal("TestNew returned an unexpected result") } a = New("SpOt") if a == nil { - t.Fatal("Test failed - TestNew returned an unexpected result") + t.Fatal("TestNew returned an unexpected result") } a = New("spot,futures") if a.JoinToString(",") != "spot,futures" { - t.Fatal("Test failed - TestNew returned an unexpected result") + t.Fatal("TestNew returned an unexpected result") } if a := New("Spot_rawr"); a != nil { - t.Fatal("Test failed - TestNew returned an unexpected result") + t.Fatal("TestNew returned an unexpected result") } if a := New("Spot,Rawr"); a != nil { - t.Fatal("Test failed - TestNew returned an unexpected result") + t.Fatal("TestNew returned an unexpected result") } } diff --git a/exchanges/binance/binance_live_test.go b/exchanges/binance/binance_live_test.go index 2f4a6f7e..f0dce783 100644 --- a/exchanges/binance/binance_live_test.go +++ b/exchanges/binance/binance_live_test.go @@ -19,11 +19,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Binance load config error", err) + log.Fatal("Binance load config error", err) } binanceConfig, err := cfg.GetExchangeConfig("Binance") if err != nil { - log.Fatal("Test Failed - Binance Setup() init error", err) + log.Fatal("Binance Setup() init error", err) } binanceConfig.API.AuthenticatedSupport = true binanceConfig.API.Credentials.Key = apiKey @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { b.SetDefaults() err = b.Setup(binanceConfig) if err != nil { - log.Fatal("Test Failed - Binance setup error", err) + log.Fatal("Binance setup error", err) } log.Printf(sharedtestvalues.LiveTesting, b.GetName(), b.API.Endpoints.URL) os.Exit(m.Run()) diff --git a/exchanges/binance/binance_mock_test.go b/exchanges/binance/binance_mock_test.go index b19ecab8..dccf08fd 100644 --- a/exchanges/binance/binance_mock_test.go +++ b/exchanges/binance/binance_mock_test.go @@ -22,11 +22,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Binance load config error", err) + log.Fatal("Binance load config error", err) } binanceConfig, err := cfg.GetExchangeConfig("Binance") if err != nil { - log.Fatal("Test Failed - Binance Setup() init error", err) + log.Fatal("Binance Setup() init error", err) } b.SkipAuthCheck = true binanceConfig.API.AuthenticatedSupport = true @@ -35,12 +35,12 @@ func TestMain(m *testing.M) { b.SetDefaults() err = b.Setup(binanceConfig) if err != nil { - log.Fatal("Test Failed - Binance setup error", err) + log.Fatal("Binance setup error", err) } serverDetails, newClient, err := mock.NewVCRServer(mockfile) if err != nil { - log.Fatalf("Test Failed - Mock server error %s", err) + log.Fatalf("Mock server error %s", err) } b.HTTPClient = newClient diff --git a/exchanges/binance/binance_test.go b/exchanges/binance/binance_test.go index 9e815e2a..f0426906 100644 --- a/exchanges/binance/binance_test.go +++ b/exchanges/binance/binance_test.go @@ -36,7 +36,7 @@ func TestFetchTradablePairs(t *testing.T) { _, err := b.FetchTradablePairs(asset.Spot) if err != nil { - t.Error("Test Failed - Binance FetchTradablePairs(asset asets.AssetType) error", err) + t.Error("Binance FetchTradablePairs(asset asets.AssetType) error", err) } } @@ -49,7 +49,7 @@ func TestGetOrderBook(t *testing.T) { }) if err != nil { - t.Error("Test Failed - Binance GetOrderBook() error", err) + t.Error("Binance GetOrderBook() error", err) } } @@ -62,7 +62,7 @@ func TestGetRecentTrades(t *testing.T) { }) if err != nil { - t.Error("Test Failed - Binance GetRecentTrades() error", err) + t.Error("Binance GetRecentTrades() error", err) } } @@ -71,10 +71,10 @@ func TestGetHistoricalTrades(t *testing.T) { _, err := b.GetHistoricalTrades("BTCUSDT", 5, 0) if !mockTests && err == nil { - t.Error("Test Failed - Binance GetHistoricalTrades() expecting error") + t.Error("Binance GetHistoricalTrades() expecting error") } if mockTests && err == nil { - t.Error("Test Failed - Binance GetHistoricalTrades() error", err) + t.Error("Binance GetHistoricalTrades() error", err) } } @@ -83,7 +83,7 @@ func TestGetAggregatedTrades(t *testing.T) { _, err := b.GetAggregatedTrades("BTCUSDT", 5) if err != nil { - t.Error("Test Failed - Binance GetAggregatedTrades() error", err) + t.Error("Binance GetAggregatedTrades() error", err) } } @@ -96,7 +96,7 @@ func TestGetSpotKline(t *testing.T) { Limit: 24, }) if err != nil { - t.Error("Test Failed - Binance GetSpotKline() error", err) + t.Error("Binance GetSpotKline() error", err) } } @@ -105,7 +105,7 @@ func TestGetAveragePrice(t *testing.T) { _, err := b.GetAveragePrice("BTCUSDT") if err != nil { - t.Error("Test Failed - Binance GetAveragePrice() error", err) + t.Error("Binance GetAveragePrice() error", err) } } @@ -114,7 +114,7 @@ func TestGetPriceChangeStats(t *testing.T) { _, err := b.GetPriceChangeStats("BTCUSDT") if err != nil { - t.Error("Test Failed - Binance GetPriceChangeStats() error", err) + t.Error("Binance GetPriceChangeStats() error", err) } } @@ -123,7 +123,7 @@ func TestGetTickers(t *testing.T) { _, err := b.GetTickers() if err != nil { - t.Error("Test Failed - Binance TestGetTickers error", err) + t.Error("Binance TestGetTickers error", err) } } @@ -132,7 +132,7 @@ func TestGetLatestSpotPrice(t *testing.T) { _, err := b.GetLatestSpotPrice("BTCUSDT") if err != nil { - t.Error("Test Failed - Binance GetLatestSpotPrice() error", err) + t.Error("Binance GetLatestSpotPrice() error", err) } } @@ -141,7 +141,7 @@ func TestGetBestPrice(t *testing.T) { _, err := b.GetBestPrice("BTCUSDT") if err != nil { - t.Error("Test Failed - Binance GetBestPrice() error", err) + t.Error("Binance GetBestPrice() error", err) } } @@ -151,11 +151,11 @@ func TestQueryOrder(t *testing.T) { _, err := b.QueryOrder("BTCUSDT", "", 1337) switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - QueryOrder() error", err) + t.Error("QueryOrder() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - QueryOrder() expecting an error when no keys are set") + t.Error("QueryOrder() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock QueryOrder() error", err) + t.Error("Mock QueryOrder() error", err) } } @@ -165,11 +165,11 @@ func TestOpenOrders(t *testing.T) { _, err := b.OpenOrders("BTCUSDT") switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - OpenOrders() error", err) + t.Error("OpenOrders() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - OpenOrders() expecting an error when no keys are set") + t.Error("OpenOrders() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock OpenOrders() error", err) + t.Error("Mock OpenOrders() error", err) } } @@ -179,11 +179,11 @@ func TestAllOrders(t *testing.T) { _, err := b.AllOrders("BTCUSDT", "", "") switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - AllOrders() error", err) + t.Error("AllOrders() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - AllOrders() expecting an error when no keys are set") + t.Error("AllOrders() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock AllOrders() error", err) + t.Error("Mock AllOrders() error", err) } } @@ -213,7 +213,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := b.GetFee(feeBuilder); resp != float64(0.1) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) } // CryptocurrencyTradeFee High quantity @@ -221,7 +221,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := b.GetFee(feeBuilder); resp != float64(100000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(100000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(100000), resp) t.Error(err) } @@ -229,7 +229,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := b.GetFee(feeBuilder); resp != float64(0.1) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.1), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.1), resp) t.Error(err) } @@ -237,7 +237,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -247,7 +247,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Error(err) } @@ -255,7 +255,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -264,7 +264,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -273,7 +273,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -307,11 +307,11 @@ func TestGetActiveOrders(t *testing.T) { _, err = b.GetActiveOrders(&getOrdersRequest) switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - GetActiveOrders() error", err) + t.Error("GetActiveOrders() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - GetActiveOrders() expecting an error when no keys are set") + t.Error("GetActiveOrders() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock GetActiveOrders() error", err) + t.Error("Mock GetActiveOrders() error", err) } } @@ -334,11 +334,11 @@ func TestGetOrderHistory(t *testing.T) { _, err = b.GetOrderHistory(&getOrdersRequest) switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - GetOrderHistory() error", err) + t.Error("GetOrderHistory() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - GetOrderHistory() expecting an error when no keys are set") + t.Error("GetOrderHistory() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock GetOrderHistory() error", err) + t.Error("Mock GetOrderHistory() error", err) } } @@ -368,11 +368,11 @@ func TestSubmitOrder(t *testing.T) { _, err := b.SubmitOrder(orderSubmission) switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - SubmitOrder() error", err) + t.Error("SubmitOrder() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - SubmitOrder() expecting an error when no keys are set") + t.Error("SubmitOrder() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock SubmitOrder() error", err) + t.Error("Mock SubmitOrder() error", err) } } @@ -393,11 +393,11 @@ func TestCancelExchangeOrder(t *testing.T) { err := b.CancelOrder(orderCancellation) switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - CancelExchangeOrder() error", err) + t.Error("CancelExchangeOrder() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - CancelExchangeOrder() expecting an error when no keys are set") + t.Error("CancelExchangeOrder() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock CancelExchangeOrder() error", err) + t.Error("Mock CancelExchangeOrder() error", err) } } @@ -418,11 +418,11 @@ func TestCancelAllExchangeOrders(t *testing.T) { _, err := b.CancelAllOrders(orderCancellation) switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - CancelAllExchangeOrders() error", err) + t.Error("CancelAllExchangeOrders() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - CancelAllExchangeOrders() expecting an error when no keys are set") + t.Error("CancelAllExchangeOrders() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock CancelAllExchangeOrders() error", err) + t.Error("Mock CancelAllExchangeOrders() error", err) } } @@ -432,11 +432,11 @@ func TestGetAccountInfo(t *testing.T) { _, err := b.GetAccountInfo() switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - GetAccountInfo() expecting an error when no keys are set") + t.Error("GetAccountInfo() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock GetAccountInfo() error", err) + t.Error("Mock GetAccountInfo() error", err) } } @@ -445,7 +445,7 @@ func TestModifyOrder(t *testing.T) { _, err := b.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error cannot be nil") + t.Error("ModifyOrder() error cannot be nil") } } @@ -468,11 +468,11 @@ func TestWithdraw(t *testing.T) { _, err := b.WithdrawCryptocurrencyFunds(&withdrawCryptoRequest) switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - Withdraw() error", err) + t.Error("Withdraw() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - Withdraw() expecting an error when no keys are set") + t.Error("Withdraw() expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock Withdraw() error", err) + t.Error("Mock Withdraw() error", err) } } @@ -502,10 +502,10 @@ func TestGetDepositAddress(t *testing.T) { _, err := b.GetDepositAddress(currency.BTC, "") switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") case mockTests && err != nil: - t.Error("Test Failed - Mock GetDepositAddress() error", err) + t.Error("Mock GetDepositAddress() error", err) } } diff --git a/exchanges/binance/binance_wrapper.go b/exchanges/binance/binance_wrapper.go index 442dcfb8..47d6ecd5 100644 --- a/exchanges/binance/binance_wrapper.go +++ b/exchanges/binance/binance_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -71,9 +72,32 @@ func (b *Binance) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + TradeFetching: true, + UserTradeHistory: true, + TradeFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TradeFetching: true, + TickerFetching: true, + KlineFetching: true, + OrderbookFetching: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.NoFiatWithdrawals, @@ -92,10 +116,6 @@ func (b *Binance) SetDefaults() { b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.Websocket = wshandler.New() b.API.Endpoints.WebsocketURL = binanceDefaultWebsocketURL - b.Websocket.Functionality = wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketTickerSupported | - wshandler.WebsocketKlineSupported | - wshandler.WebsocketOrderbookSupported b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -123,6 +143,7 @@ func (b *Binance) Setup(exch *config.ExchangeConfig) error { ExchangeName: exch.Name, RunningURL: exch.API.Endpoints.WebsocketURL, Connector: b.WsConnect, + Features: &b.Features.Supports.WebsocketCapabilities, }) if err != nil { diff --git a/exchanges/bitfinex/bitfinex_test.go b/exchanges/bitfinex/bitfinex_test.go index 2b48981b..2119f97f 100644 --- a/exchanges/bitfinex/bitfinex_test.go +++ b/exchanges/bitfinex/bitfinex_test.go @@ -30,21 +30,21 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Bitfinex load config error", err) + t.Fatal("Bitfinex load config error", err) } bfxConfig, err := cfg.GetExchangeConfig("Bitfinex") if err != nil { - t.Error("Test Failed - Bitfinex Setup() init error") + t.Error("Bitfinex Setup() init error") } err = b.Setup(bfxConfig) if err != nil { - t.Fatal("Test Failed - Bitfinex setup error", err) + t.Fatal("Bitfinex setup error", err) } b.API.Credentials.Key = apiKey b.API.Credentials.Secret = apiSecret if !b.Enabled || b.API.AuthenticatedSupport || b.Verbose || b.Websocket.IsEnabled() || len(b.BaseCurrencies) < 1 { - t.Error("Test Failed - Bitfinex Setup values not set correctly") + t.Error("Bitfinex Setup values not set correctly") } b.API.AuthenticatedSupport = true @@ -98,7 +98,7 @@ func TestGetTicker(t *testing.T) { _, err = b.GetTicker("wigwham") if err == nil { - t.Error("Test Failed - GetTicker() error") + t.Error("GetTicker() Expected error") } } @@ -132,7 +132,7 @@ func TestGetStats(t *testing.T) { _, err = b.GetStats("wigwham") if err == nil { - t.Error("Test Failed - GetStats() error") + t.Error("GetStats() Expected error") } } @@ -144,7 +144,7 @@ func TestGetFundingBook(t *testing.T) { } _, err = b.GetFundingBook("wigwham") if err == nil { - t.Error("Testing Failed - GetFundingBook() error") + t.Error("Testing Failed - GetFundingBook() Expected error") } } @@ -271,7 +271,7 @@ func TestGetAccountInfo(t *testing.T) { _, err := b.GetAccountInfo() if err != nil { - t.Error("Test Failed - GetAccountInfo error", err) + t.Error("GetAccountInfo error", err) } } @@ -283,7 +283,7 @@ func TestGetAccountFees(t *testing.T) { _, err := b.GetAccountFees() if err == nil { - t.Error("Test Failed - GetAccountFees error") + t.Error("GetAccountFees Expected error") } } @@ -295,7 +295,7 @@ func TestGetAccountSummary(t *testing.T) { _, err := b.GetAccountSummary() if err == nil { - t.Error("Test Failed - GetAccountSummary() error:") + t.Error("GetAccountSummary() Expected error") } } @@ -307,7 +307,7 @@ func TestNewDeposit(t *testing.T) { _, err := b.NewDeposit("blabla", "testwallet", 1) if err == nil { - t.Error("Test Failed - NewDeposit() error:", err) + t.Error("NewDeposit() Expected error") } } @@ -319,7 +319,7 @@ func TestGetKeyPermissions(t *testing.T) { _, err := b.GetKeyPermissions() if err == nil { - t.Error("Test Failed - GetKeyPermissions() error:") + t.Error("GetKeyPermissions() Expected error") } } @@ -331,7 +331,7 @@ func TestGetMarginInfo(t *testing.T) { _, err := b.GetMarginInfo() if err == nil { - t.Error("Test Failed - GetMarginInfo() error") + t.Error("GetMarginInfo() Expected error") } } @@ -343,7 +343,7 @@ func TestGetAccountBalance(t *testing.T) { _, err := b.GetAccountBalance() if err == nil { - t.Error("Test Failed - GetAccountBalance() error") + t.Error("GetAccountBalance() Expected error") } } @@ -355,7 +355,7 @@ func TestWalletTransfer(t *testing.T) { _, err := b.WalletTransfer(0.01, "bla", "bla", "bla") if err == nil { - t.Error("Test Failed - WalletTransfer() error") + t.Error("WalletTransfer() Expected error") } } @@ -368,7 +368,7 @@ func TestNewOrder(t *testing.T) { _, err := b.NewOrder("BTCUSD", 1, 2, true, exchange.LimitOrderType.ToLower().ToString(), false) if err == nil { - t.Error("Test Failed - NewOrder() error") + t.Error("NewOrder() Expected error") } } @@ -391,7 +391,7 @@ func TestNewOrderMulti(t *testing.T) { _, err := b.NewOrderMulti(newOrder) if err == nil { - t.Error("Test Failed - NewOrderMulti() error") + t.Error("NewOrderMulti() Expected error") } } @@ -403,7 +403,7 @@ func TestCancelOrder(t *testing.T) { _, err := b.CancelExistingOrder(1337) if err == nil { - t.Error("Test Failed - CancelExistingOrder() error") + t.Error("CancelExistingOrder() Expected error") } } @@ -415,7 +415,7 @@ func TestCancelMultipleOrders(t *testing.T) { _, err := b.CancelMultipleOrders([]int64{1337, 1336}) if err == nil { - t.Error("Test Failed - CancelMultipleOrders() error") + t.Error("CancelMultipleOrders() Expected error") } } @@ -427,7 +427,7 @@ func TestCancelAllOrders(t *testing.T) { _, err := b.CancelAllExistingOrders() if err == nil { - t.Error("Test Failed - CancelAllExistingOrders() error") + t.Error("CancelAllExistingOrders() Expected error") } } @@ -440,7 +440,7 @@ func TestReplaceOrder(t *testing.T) { _, err := b.ReplaceOrder(1337, "BTCUSD", 1, 1, true, exchange.LimitOrderType.ToLower().ToString(), false) if err == nil { - t.Error("Test Failed - ReplaceOrder() error") + t.Error("ReplaceOrder() Expected error") } } @@ -452,7 +452,7 @@ func TestGetOrderStatus(t *testing.T) { _, err := b.GetOrderStatus(1337) if err == nil { - t.Error("Test Failed - GetOrderStatus() error") + t.Error("GetOrderStatus() Expected error") } } @@ -464,7 +464,7 @@ func TestGetOpenOrders(t *testing.T) { _, err := b.GetOpenOrders() if err == nil { - t.Error("Test Failed - GetOpenOrders() error") + t.Error("GetOpenOrders() Expectederror") } } @@ -476,7 +476,7 @@ func TestGetActivePositions(t *testing.T) { _, err := b.GetActivePositions() if err == nil { - t.Error("Test Failed - GetActivePositions() error") + t.Error("GetActivePositions() Expected error") } } @@ -488,7 +488,7 @@ func TestClaimPosition(t *testing.T) { _, err := b.ClaimPosition(1337) if err == nil { - t.Error("Test Failed - ClaimPosition() error") + t.Error("ClaimPosition() Expected error") } } @@ -500,7 +500,7 @@ func TestGetBalanceHistory(t *testing.T) { _, err := b.GetBalanceHistory("USD", time.Time{}, time.Time{}, 1, "deposit") if err == nil { - t.Error("Test Failed - GetBalanceHistory() error") + t.Error("GetBalanceHistory() Expected error") } } @@ -512,7 +512,7 @@ func TestGetMovementHistory(t *testing.T) { _, err := b.GetMovementHistory("USD", "bitcoin", time.Time{}, time.Time{}, 1) if err == nil { - t.Error("Test Failed - GetMovementHistory() error") + t.Error("GetMovementHistory() Expected error") } } @@ -524,7 +524,7 @@ func TestGetTradeHistory(t *testing.T) { _, err := b.GetTradeHistory("BTCUSD", time.Time{}, time.Time{}, 1, 0) if err == nil { - t.Error("Test Failed - GetTradeHistory() error") + t.Error("GetTradeHistory() Expected error") } } @@ -536,7 +536,7 @@ func TestNewOffer(t *testing.T) { _, err := b.NewOffer("BTC", 1, 1, 1, "loan") if err == nil { - t.Error("Test Failed - NewOffer() error") + t.Error("NewOffer() Expected error") } } @@ -548,7 +548,7 @@ func TestCancelOffer(t *testing.T) { _, err := b.CancelOffer(1337) if err == nil { - t.Error("Test Failed - CancelOffer() error") + t.Error("CancelOffer() Expected error") } } @@ -560,7 +560,7 @@ func TestGetOfferStatus(t *testing.T) { _, err := b.GetOfferStatus(1337) if err == nil { - t.Error("Test Failed - NewOffer() error") + t.Error("NewOffer() Expected error") } } @@ -572,7 +572,7 @@ func TestGetActiveCredits(t *testing.T) { _, err := b.GetActiveCredits() if err == nil { - t.Error("Test Failed - GetActiveCredits() error", err) + t.Error("GetActiveCredits() Expected error") } } @@ -584,7 +584,7 @@ func TestGetActiveOffers(t *testing.T) { _, err := b.GetActiveOffers() if err == nil { - t.Error("Test Failed - GetActiveOffers() error", err) + t.Error("GetActiveOffers() Expected error") } } @@ -596,7 +596,7 @@ func TestGetActiveMarginFunding(t *testing.T) { _, err := b.GetActiveMarginFunding() if err == nil { - t.Error("Test Failed - GetActiveMarginFunding() error", err) + t.Error("GetActiveMarginFunding() Expected error") } } @@ -608,7 +608,7 @@ func TestGetUnusedMarginFunds(t *testing.T) { _, err := b.GetUnusedMarginFunds() if err == nil { - t.Error("Test Failed - GetUnusedMarginFunds() error", err) + t.Error("GetUnusedMarginFunds() Expected error") } } @@ -620,7 +620,7 @@ func TestGetMarginTotalTakenFunds(t *testing.T) { _, err := b.GetMarginTotalTakenFunds() if err == nil { - t.Error("Test Failed - GetMarginTotalTakenFunds() error", err) + t.Error("GetMarginTotalTakenFunds() Expected error") } } @@ -632,7 +632,7 @@ func TestCloseMarginFunding(t *testing.T) { _, err := b.CloseMarginFunding(1337) if err == nil { - t.Error("Test Failed - CloseMarginFunding() error") + t.Error("CloseMarginFunding() Expected error") } } @@ -669,7 +669,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := b.GetFee(feeBuilder); resp != float64(0.002) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) } // CryptocurrencyTradeFee High quantity @@ -677,7 +677,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := b.GetFee(feeBuilder); resp != float64(2000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2000), resp) t.Error(err) } @@ -685,7 +685,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) } @@ -693,7 +693,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -701,7 +701,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != float64(0.0004) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0004), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0004), resp) t.Error(err) } } @@ -710,7 +710,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -719,7 +719,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) } @@ -728,7 +728,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) } } @@ -869,7 +869,7 @@ func TestCancelAllExchangeOrdera(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := b.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -978,12 +978,12 @@ func TestGetDepositAddress(t *testing.T) { if areTestAPIKeysSet() { _, err := b.GetDepositAddress(currency.BTC, "deposit") if err != nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } else { _, err := b.GetDepositAddress(currency.BTC, "deposit") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } } diff --git a/exchanges/bitfinex/bitfinex_wrapper.go b/exchanges/bitfinex/bitfinex_wrapper.go index 1a8229ed..cb79bd66 100644 --- a/exchanges/bitfinex/bitfinex_wrapper.go +++ b/exchanges/bitfinex/bitfinex_wrapper.go @@ -15,6 +15,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -70,9 +71,39 @@ func (b *Bitfinex) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + FiatWithdraw: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + SubmitOrders: true, + ModifyOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + TradeFetching: true, + UserTradeHistory: true, + TradeFee: true, + FiatDepositFee: true, + FiatWithdrawalFee: true, + CryptoDepositFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | exchange.AutoWithdrawFiatWithAPIPermission, @@ -91,12 +122,6 @@ func (b *Bitfinex) SetDefaults() { b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.API.Endpoints.WebsocketURL = bitfinexWebsocket b.Websocket = wshandler.New() - b.Websocket.Functionality = wshandler.WebsocketTickerSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -126,6 +151,7 @@ func (b *Bitfinex) Setup(exch *config.ExchangeConfig) error { Connector: b.WsConnect, Subscriber: b.Subscribe, UnSubscriber: b.Unsubscribe, + Features: &b.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/bitflyer/bitflyer_test.go b/exchanges/bitflyer/bitflyer_test.go index 0bfe7848..83690b9c 100644 --- a/exchanges/bitflyer/bitflyer_test.go +++ b/exchanges/bitflyer/bitflyer_test.go @@ -28,11 +28,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Bitflyer load config error", err) + t.Fatal("Bitflyer load config error", err) } bitflyerConfig, err := cfg.GetExchangeConfig("Bitflyer") if err != nil { - t.Error("Test Failed - bitflyer Setup() init error") + t.Error("bitflyer Setup() init error") } bitflyerConfig.API.AuthenticatedSupport = true @@ -41,7 +41,7 @@ func TestSetup(t *testing.T) { err = b.Setup(bitflyerConfig) if err != nil { - t.Fatal("Test Failed - Bitflyer setup error", err) + t.Fatal("Bitflyer setup error", err) } } @@ -49,7 +49,7 @@ func TestGetLatestBlockCA(t *testing.T) { t.Parallel() _, err := b.GetLatestBlockCA() if err != nil { - t.Error("test failed - Bitflyer - GetLatestBlockCA() error:", err) + t.Error("Bitflyer - GetLatestBlockCA() error:", err) } } @@ -57,7 +57,7 @@ func TestGetBlockCA(t *testing.T) { t.Parallel() _, err := b.GetBlockCA("000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f") if err != nil { - t.Error("test failed - Bitflyer - GetBlockCA() error:", err) + t.Error("Bitflyer - GetBlockCA() error:", err) } } @@ -65,7 +65,7 @@ func TestGetBlockbyHeightCA(t *testing.T) { t.Parallel() _, err := b.GetBlockbyHeightCA(0) if err != nil { - t.Error("test failed - Bitflyer - GetBlockbyHeightCA() error:", err) + t.Error("Bitflyer - GetBlockbyHeightCA() error:", err) } } @@ -73,7 +73,7 @@ func TestGetTransactionByHashCA(t *testing.T) { t.Parallel() _, err := b.GetTransactionByHashCA("0562d1f063cd4127053d838b165630445af5e480ceb24e1fd9ecea52903cb772") if err != nil { - t.Error("test failed - Bitflyer - GetTransactionByHashCA() error:", err) + t.Error("Bitflyer - GetTransactionByHashCA() error:", err) } } @@ -81,7 +81,7 @@ func TestGetAddressInfoCA(t *testing.T) { t.Parallel() v, err := b.GetAddressInfoCA("1F5zVDgNjorJ51oGebSvNCrSAHpwGkUdDB") if err != nil { - t.Error("test failed - Bitflyer - GetAddressInfoCA() error:", err) + t.Error("Bitflyer - GetAddressInfoCA() error:", err) } if v.UnconfirmedBalance == 0 || v.ConfirmedBalance == 0 { log.Warn(log.ExchangeSys, "Donation wallet is empty :( - please consider donating") @@ -92,7 +92,7 @@ func TestGetMarkets(t *testing.T) { t.Parallel() _, err := b.GetMarkets() if err != nil { - t.Error("test failed - Bitflyer - GetMarkets() error:", err) + t.Error("Bitflyer - GetMarkets() error:", err) } } @@ -100,7 +100,7 @@ func TestGetOrderBook(t *testing.T) { t.Parallel() _, err := b.GetOrderBook("BTC_JPY") if err != nil { - t.Error("test failed - Bitflyer - GetOrderBook() error:", err) + t.Error("Bitflyer - GetOrderBook() error:", err) } } @@ -108,7 +108,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := b.GetTicker("BTC_JPY") if err != nil { - t.Error("test failed - Bitflyer - GetTicker() error:", err) + t.Error("Bitflyer - GetTicker() error:", err) } } @@ -116,7 +116,7 @@ func TestGetExecutionHistory(t *testing.T) { t.Parallel() _, err := b.GetExecutionHistory("BTC_JPY") if err != nil { - t.Error("test failed - Bitflyer - GetExecutionHistory() error:", err) + t.Error("Bitflyer - GetExecutionHistory() error:", err) } } @@ -124,7 +124,7 @@ func TestGetExchangeStatus(t *testing.T) { t.Parallel() _, err := b.GetExchangeStatus() if err != nil { - t.Error("test failed - Bitflyer - GetExchangeStatus() error:", err) + t.Error("Bitflyer - GetExchangeStatus() error:", err) } } @@ -133,7 +133,7 @@ func TestCheckFXString(t *testing.T) { p := currency.NewPairDelimiter("FXBTC_JPY", "_") p = b.CheckFXString(p) if p.Base.String() != "FX_BTC" { - t.Error("test failed - Bitflyer - CheckFXString() error") + t.Error("Bitflyer - CheckFXString() error") } } @@ -151,7 +151,7 @@ func TestFetchTicker(t *testing.T) { _, err := b.FetchTicker(p, asset.Spot) if err != nil { - t.Error("test failed - Bitflyer - FetchTicker() error", err) + t.Error("Bitflyer - FetchTicker() error", err) } } @@ -190,7 +190,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) } // CryptocurrencyTradeFee High quantity @@ -198,7 +198,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -206,7 +206,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := b.GetFee(feeBuilder); resp != float64(0.1) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.1), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.1), resp) t.Error(err) } @@ -214,7 +214,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -222,7 +222,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -231,7 +231,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -240,7 +240,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.JPY if resp, err := b.GetFee(feeBuilder); resp != float64(324) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(324), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(324), resp) t.Error(err) } @@ -249,7 +249,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.JPY if resp, err := b.GetFee(feeBuilder); resp != float64(540) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(540), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(540), resp) t.Error(err) } } @@ -397,7 +397,7 @@ func TestWithdraw(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := b.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } diff --git a/exchanges/bitflyer/bitflyer_wrapper.go b/exchanges/bitflyer/bitflyer_wrapper.go index 0ca12330..145fab0f 100644 --- a/exchanges/bitflyer/bitflyer_wrapper.go +++ b/exchanges/bitflyer/bitflyer_wrapper.go @@ -11,6 +11,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -68,9 +69,13 @@ func (b *Bitflyer) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: false, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: false, + RESTCapabilities: protocol.Features{ + TickerFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + TradeFee: true, + FiatDepositFee: true, + FiatWithdrawalFee: true, }, WithdrawPermissions: exchange.WithdrawCryptoViaWebsiteOnly | exchange.AutoWithdrawFiat, diff --git a/exchanges/bithumb/bithumb_test.go b/exchanges/bithumb/bithumb_test.go index fefef92d..7ec45d63 100644 --- a/exchanges/bithumb/bithumb_test.go +++ b/exchanges/bithumb/bithumb_test.go @@ -26,11 +26,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Bithumb load config error", err) + t.Fatal("Bithumb load config error", err) } bitConfig, err := cfg.GetExchangeConfig("Bithumb") if err != nil { - t.Error("Test Failed - Bithumb Setup() init error") + t.Error("Bithumb Setup() init error") } bitConfig.API.AuthenticatedSupport = true @@ -39,7 +39,7 @@ func TestSetup(t *testing.T) { err = b.Setup(bitConfig) if err != nil { - t.Fatal("Test Failed - Bithumb setup error", err) + t.Fatal("Bithumb setup error", err) } } @@ -47,7 +47,7 @@ func TestGetTradablePairs(t *testing.T) { t.Parallel() _, err := b.GetTradablePairs() if err != nil { - t.Error("test failed - Bithumb GetTradablePairs() error", err) + t.Error("Bithumb GetTradablePairs() error", err) } } @@ -55,7 +55,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := b.GetTicker("btc") if err != nil { - t.Error("test failed - Bithumb GetTicker() error", err) + t.Error("Bithumb GetTicker() error", err) } } @@ -63,7 +63,7 @@ func TestGetAllTickers(t *testing.T) { t.Parallel() _, err := b.GetAllTickers() if err != nil { - t.Error("test failed - Bithumb GetAllTickers() error", err) + t.Error("Bithumb GetAllTickers() error", err) } } @@ -71,7 +71,7 @@ func TestGetOrderBook(t *testing.T) { t.Parallel() _, err := b.GetOrderBook("btc") if err != nil { - t.Error("test failed - Bithumb GetOrderBook() error", err) + t.Error("Bithumb GetOrderBook() error", err) } } @@ -79,7 +79,7 @@ func TestGetTransactionHistory(t *testing.T) { t.Parallel() _, err := b.GetTransactionHistory("btc") if err != nil { - t.Error("test failed - Bithumb GetTransactionHistory() error", err) + t.Error("Bithumb GetTransactionHistory() error", err) } } @@ -91,7 +91,7 @@ func TestGetAccountBalance(t *testing.T) { _, err := b.GetAccountBalance("BTC") if err == nil { - t.Error("test failed - Bithumb GetAccountBalance() error", err) + t.Error("Bithumb GetAccountBalance() Expected error") } } @@ -103,7 +103,7 @@ func TestGetWalletAddress(t *testing.T) { t.Parallel() _, err := b.GetWalletAddress("") if err == nil { - t.Error("test failed - Bithumb GetWalletAddress() error", err) + t.Error("Bithumb GetWalletAddress() Expected error") } } @@ -111,7 +111,7 @@ func TestGetLastTransaction(t *testing.T) { t.Parallel() _, err := b.GetLastTransaction() if err == nil { - t.Error("test failed - Bithumb GetLastTransaction() error", err) + t.Error("Bithumb GetLastTransaction() Expected error") } } @@ -119,7 +119,7 @@ func TestGetOrders(t *testing.T) { t.Parallel() _, err := b.GetOrders("1337", "bid", "100", "", "BTC") if err == nil { - t.Error("test failed - Bithumb GetOrders() error", err) + t.Error("Bithumb GetOrders() Expected error") } } @@ -127,7 +127,7 @@ func TestGetUserTransactions(t *testing.T) { t.Parallel() _, err := b.GetUserTransactions() if err == nil { - t.Error("test failed - Bithumb GetUserTransactions() error", err) + t.Error("Bithumb GetUserTransactions() Expected error") } } @@ -135,7 +135,7 @@ func TestPlaceTrade(t *testing.T) { t.Parallel() _, err := b.PlaceTrade("btc", "bid", 0, 0) if err == nil { - t.Error("test failed - Bithumb PlaceTrade() error", err) + t.Error("Bithumb PlaceTrade() Expected error") } } @@ -143,7 +143,7 @@ func TestGetOrderDetails(t *testing.T) { t.Parallel() _, err := b.GetOrderDetails("1337", "bid", "btc") if err == nil { - t.Error("test failed - Bithumb GetOrderDetails() error", err) + t.Error("Bithumb GetOrderDetails() Expected error") } } @@ -151,7 +151,7 @@ func TestCancelTrade(t *testing.T) { t.Parallel() _, err := b.CancelTrade("", "", "") if err == nil { - t.Error("test failed - Bithumb CancelTrade() error", err) + t.Error("Bithumb CancelTrade() Expected error") } } @@ -159,7 +159,7 @@ func TestWithdrawCrypto(t *testing.T) { t.Parallel() _, err := b.WithdrawCrypto("LQxiDhKU7idKiWQhx4ALKYkBx8xKEQVxJR", "", "ltc", 0) if err == nil { - t.Error("test failed - Bithumb WithdrawCrypto() error", err) + t.Error("Bithumb WithdrawCrypto() Expected error") } } @@ -170,7 +170,7 @@ func TestRequestKRWDepositDetails(t *testing.T) { } _, err := b.RequestKRWDepositDetails() if err == nil { - t.Error("test failed - Bithumb RequestKRWDepositDetails() error", err) + t.Error("Bithumb RequestKRWDepositDetails() Expected error") } } @@ -178,7 +178,7 @@ func TestRequestKRWWithdraw(t *testing.T) { t.Parallel() _, err := b.RequestKRWWithdraw("102_bank", "1337", 1000) if err == nil { - t.Error("test failed - Bithumb RequestKRWWithdraw() error", err) + t.Error("Bithumb RequestKRWWithdraw() Expected error") } } @@ -186,7 +186,7 @@ func TestMarketBuyOrder(t *testing.T) { t.Parallel() _, err := b.MarketBuyOrder("btc", 0) if err == nil { - t.Error("test failed - Bithumb MarketBuyOrder() error", err) + t.Error("Bithumb MarketBuyOrder() Expected error") } } @@ -194,7 +194,7 @@ func TestMarketSellOrder(t *testing.T) { t.Parallel() _, err := b.MarketSellOrder("btc", 0) if err == nil { - t.Error("test failed - Bithumb MarketSellOrder() error", err) + t.Error("Bithumb MarketSellOrder() Expected error") } } @@ -230,7 +230,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) } // CryptocurrencyTradeFee High quantity @@ -238,7 +238,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := b.GetFee(feeBuilder); resp != float64(2500) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2500), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2500), resp) t.Error(err) } @@ -246,7 +246,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) t.Error(err) } @@ -254,7 +254,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -262,7 +262,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) } @@ -270,7 +270,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -279,7 +279,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -288,7 +288,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -432,12 +432,12 @@ func TestGetAccountInfo(t *testing.T) { if apiKey != "" || apiSecret != "" { _, err := b.GetAccountInfo() if err != nil { - t.Error("test failed - Bithumb GetAccountInfo() error", err) + t.Error("Bithumb GetAccountInfo() error", err) } } else { _, err := b.GetAccountInfo() if err == nil { - t.Error("test failed - Bithumb GetAccountInfo() error") + t.Error("Bithumb GetAccountInfo() Expected error") } } } @@ -450,7 +450,7 @@ func TestModifyOrder(t *testing.T) { OrderSide: exchange.SellOrderSide, CurrencyPair: curr}) if err == nil { - t.Error("Test Failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -534,12 +534,12 @@ func TestGetDepositAddress(t *testing.T) { if apiKey != "" && apiSecret != "" { _, err := b.GetDepositAddress(currency.BTC, "") if err != nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } else { _, err := b.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } } diff --git a/exchanges/bithumb/bithumb_wrapper.go b/exchanges/bithumb/bithumb_wrapper.go index 7871622a..7a577543 100644 --- a/exchanges/bithumb/bithumb_wrapper.go +++ b/exchanges/bithumb/bithumb_wrapper.go @@ -15,6 +15,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -70,9 +71,27 @@ func (b *Bithumb) SetDefaults() { b.Features = exchange.Features{ Supports: exchange.FeaturesSupported{ REST: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + CryptoWithdrawal: true, + FiatDeposit: true, + FiatWithdraw: true, + GetOrder: true, + CancelOrder: true, + SubmitOrder: true, + ModifyOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + TradeFee: true, + FiatWithdrawalFee: true, + CryptoDepositFee: true, + CryptoWithdrawalFee: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.AutoWithdrawFiat, diff --git a/exchanges/bitmex/bitmex_test.go b/exchanges/bitmex/bitmex_test.go index ae0b726f..36a93e78 100644 --- a/exchanges/bitmex/bitmex_test.go +++ b/exchanges/bitmex/bitmex_test.go @@ -32,11 +32,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Bitmex load config error", err) + t.Fatal("Bitmex load config error", err) } bitmexConfig, err := cfg.GetExchangeConfig("Bitmex") if err != nil { - t.Error("Test Failed - Bitmex Setup() init error") + t.Error("Bitmex Setup() init error") } bitmexConfig.API.AuthenticatedSupport = true @@ -46,7 +46,7 @@ func TestSetup(t *testing.T) { err = b.Setup(bitmexConfig) if err != nil { - t.Fatal("Test Failed - Bitmex setup error", err) + t.Fatal("Bitmex setup error", err) } } @@ -59,42 +59,42 @@ func TestStart(t *testing.T) { func TestGetUrgentAnnouncement(t *testing.T) { _, err := b.GetUrgentAnnouncement() if err == nil { - t.Error("test failed - GetUrgentAnnouncement() error", err) + t.Error("GetUrgentAnnouncement() Expected error") } } func TestGetAPIKeys(t *testing.T) { _, err := b.GetAPIKeys() if err == nil { - t.Error("test failed - GetAPIKeys() error", err) + t.Error("GetAPIKeys() Expected error") } } func TestRemoveAPIKey(t *testing.T) { _, err := b.RemoveAPIKey(APIKeyParams{APIKeyID: "1337"}) if err == nil { - t.Error("test failed - RemoveAPIKey() error", err) + t.Error("RemoveAPIKey() Expected error") } } func TestDisableAPIKey(t *testing.T) { _, err := b.DisableAPIKey(APIKeyParams{APIKeyID: "1337"}) if err == nil { - t.Error("test failed - DisableAPIKey() error", err) + t.Error("DisableAPIKey() Expected error") } } func TestEnableAPIKey(t *testing.T) { _, err := b.EnableAPIKey(APIKeyParams{APIKeyID: "1337"}) if err == nil { - t.Error("test failed - EnableAPIKey() error", err) + t.Error("EnableAPIKey() Expected error") } } func TestGetTrollboxMessages(t *testing.T) { _, err := b.GetTrollboxMessages(ChatGetParams{Count: 5}) if err != nil { - t.Error("test failed - GetTrollboxMessages() error", err) + t.Error("GetTrollboxMessages() error", err) } } @@ -103,126 +103,126 @@ func TestSendTrollboxMessage(t *testing.T) { ChannelID: 1337, Message: "Hello,World!"}) if err == nil { - t.Error("test failed - SendTrollboxMessage() error", err) + t.Error("SendTrollboxMessage() Expected error") } } func TestGetTrollboxChannels(t *testing.T) { _, err := b.GetTrollboxChannels() if err != nil { - t.Error("test failed - GetTrollboxChannels() error", err) + t.Error("GetTrollboxChannels() error", err) } } func TestGetTrollboxConnectedUsers(t *testing.T) { _, err := b.GetTrollboxConnectedUsers() if err == nil { - t.Error("test failed - GetTrollboxConnectedUsers() error", err) + t.Error("GetTrollboxConnectedUsers() Expected error") } } func TestGetAccountExecutions(t *testing.T) { _, err := b.GetAccountExecutions(&GenericRequestParams{}) if err == nil { - t.Error("test failed - GetAccountExecutions() error", err) + t.Error("GetAccountExecutions() Expected error") } } func TestGetAccountExecutionTradeHistory(t *testing.T) { _, err := b.GetAccountExecutionTradeHistory(&GenericRequestParams{}) if err == nil { - t.Error("test failed - GetAccountExecutionTradeHistory() error", err) + t.Error("GetAccountExecutionTradeHistory() Expected error") } } func TestGetFundingHistory(t *testing.T) { _, err := b.GetFundingHistory() if err == nil { - t.Error("test failed - GetFundingHistory() error", err) + t.Error("GetFundingHistory() Expected error") } } func TestGetInstruments(t *testing.T) { _, err := b.GetInstruments(&GenericRequestParams{}) if err != nil { - t.Error("test failed - GetInstruments() error", err) + t.Error("GetInstruments() error", err) } } func TestGetActiveInstruments(t *testing.T) { _, err := b.GetActiveInstruments(&GenericRequestParams{}) if err != nil { - t.Error("test failed - GetActiveInstruments() error", err) + t.Error("GetActiveInstruments() error", err) } } func TestGetActiveAndIndexInstruments(t *testing.T) { _, err := b.GetActiveAndIndexInstruments() if err != nil { - t.Error("test failed - GetActiveAndIndexInstruments() error", err) + t.Error("GetActiveAndIndexInstruments() error", err) } } func TestGetActiveIntervals(t *testing.T) { _, err := b.GetActiveIntervals() if err == nil { - t.Error("test failed - GetActiveIntervals() error", err) + t.Error("GetActiveIntervals() Expected error") } } func TestGetCompositeIndex(t *testing.T) { _, err := b.GetCompositeIndex(&GenericRequestParams{}) if err == nil { - t.Error("test failed - GetCompositeIndex() error", err) + t.Error("GetCompositeIndex() Expected error") } } func TestGetIndices(t *testing.T) { _, err := b.GetIndices() if err != nil { - t.Error("test failed - GetIndices() error", err) + t.Error("GetIndices() error", err) } } func TestGetInsuranceFundHistory(t *testing.T) { _, err := b.GetInsuranceFundHistory(&GenericRequestParams{}) if err != nil { - t.Error("test failed - GetInsuranceFundHistory() error", err) + t.Error("GetInsuranceFundHistory() error", err) } } func TestGetLeaderboard(t *testing.T) { _, err := b.GetLeaderboard(LeaderboardGetParams{}) if err != nil { - t.Error("test failed - GetLeaderboard() error", err) + t.Error("GetLeaderboard() error", err) } } func TestGetAliasOnLeaderboard(t *testing.T) { _, err := b.GetAliasOnLeaderboard() if err == nil { - t.Error("test failed - GetAliasOnLeaderboard() error", err) + t.Error("GetAliasOnLeaderboard() Expected error") } } func TestGetLiquidationOrders(t *testing.T) { _, err := b.GetLiquidationOrders(&GenericRequestParams{}) if err != nil { - t.Error("test failed - GetLiquidationOrders() error", err) + t.Error("GetLiquidationOrders() error", err) } } func TestGetCurrentNotifications(t *testing.T) { _, err := b.GetCurrentNotifications() if err == nil { - t.Error("test failed - GetCurrentNotifications() error", err) + t.Error("GetCurrentNotifications() Expected error") } } func TestAmendOrder(t *testing.T) { _, err := b.AmendOrder(&OrderAmendParams{}) if err == nil { - t.Error("test failed - AmendOrder() error", err) + t.Error("AmendOrder() Expected error") } } @@ -232,126 +232,126 @@ func TestCreateOrder(t *testing.T) { ClOrdID: "mm_bitmex_1a/oemUeQ4CAJZgP3fjHsA", OrderQty: 98}) if err == nil { - t.Error("test failed - CreateOrder() error", err) + t.Error("CreateOrder() Expected error") } } func TestCancelOrders(t *testing.T) { _, err := b.CancelOrders(&OrderCancelParams{}) if err == nil { - t.Error("test failed - CancelOrders() error", err) + t.Error("CancelOrders() Expected error") } } func TestCancelAllOrders(t *testing.T) { _, err := b.CancelAllExistingOrders(OrderCancelAllParams{}) if err == nil { - t.Error("test failed - CancelAllOrders(orderCancellation *exchange.OrderCancellation) (exchange.CancelAllOrdersResponse, error)", err) + t.Error("CancelAllOrders(orderCancellation *exchange.OrderCancellation) (exchange.CancelAllOrdersResponse, error)", err) } } func TestAmendBulkOrders(t *testing.T) { _, err := b.AmendBulkOrders(OrderAmendBulkParams{}) if err == nil { - t.Error("test failed - AmendBulkOrders() error", err) + t.Error("AmendBulkOrders() Expected error") } } func TestCreateBulkOrders(t *testing.T) { _, err := b.CreateBulkOrders(OrderNewBulkParams{}) if err == nil { - t.Error("test failed - CreateBulkOrders() error", err) + t.Error("CreateBulkOrders() Expected error") } } func TestCancelAllOrdersAfterTime(t *testing.T) { _, err := b.CancelAllOrdersAfterTime(OrderCancelAllAfterParams{}) if err == nil { - t.Error("test failed - CancelAllOrdersAfterTime() error", err) + t.Error("CancelAllOrdersAfterTime() Expected error") } } func TestClosePosition(t *testing.T) { _, err := b.ClosePosition(OrderClosePositionParams{}) if err == nil { - t.Error("test failed - ClosePosition() error", err) + t.Error("ClosePosition() Expected error") } } func TestGetOrderbook(t *testing.T) { _, err := b.GetOrderbook(OrderBookGetL2Params{Symbol: "XBT"}) if err != nil { - t.Error("test failed - GetOrderbook() error", err) + t.Error("GetOrderbook() error", err) } } func TestGetPositions(t *testing.T) { _, err := b.GetPositions(PositionGetParams{}) if err == nil { - t.Error("test failed - GetPositions() error", err) + t.Error("GetPositions() Expected error") } } func TestIsolatePosition(t *testing.T) { _, err := b.IsolatePosition(PositionIsolateMarginParams{Symbol: "XBT"}) if err == nil { - t.Error("test failed - IsolatePosition() error", err) + t.Error("IsolatePosition() Expected error") } } func TestLeveragePosition(t *testing.T) { _, err := b.LeveragePosition(PositionUpdateLeverageParams{}) if err == nil { - t.Error("test failed - LeveragePosition() error", err) + t.Error("LeveragePosition() Expected error") } } func TestUpdateRiskLimit(t *testing.T) { _, err := b.UpdateRiskLimit(PositionUpdateRiskLimitParams{}) if err == nil { - t.Error("test failed - UpdateRiskLimit() error", err) + t.Error("UpdateRiskLimit() Expected error") } } func TestTransferMargin(t *testing.T) { _, err := b.TransferMargin(PositionTransferIsolatedMarginParams{}) if err == nil { - t.Error("test failed - TransferMargin() error", err) + t.Error("TransferMargin() Expected error") } } func TestGetQuotesByBuckets(t *testing.T) { _, err := b.GetQuotesByBuckets(&QuoteGetBucketedParams{}) if err == nil { - t.Error("test failed - GetQuotesByBuckets() error", err) + t.Error("GetQuotesByBuckets() Expected error") } } func TestGetSettlementHistory(t *testing.T) { _, err := b.GetSettlementHistory(&GenericRequestParams{}) if err != nil { - t.Error("test failed - GetSettlementHistory() error", err) + t.Error("GetSettlementHistory() error", err) } } func TestGetStats(t *testing.T) { _, err := b.GetStats() if err != nil { - t.Error("test failed - GetStats() error", err) + t.Error("GetStats() error", err) } } func TestGetStatsHistorical(t *testing.T) { _, err := b.GetStatsHistorical() if err != nil { - t.Error("test failed - GetStatsHistorical() error", err) + t.Error("GetStatsHistorical() error", err) } } func TestGetStatSummary(t *testing.T) { _, err := b.GetStatSummary() if err != nil { - t.Error("test failed - GetStatSummary() error", err) + t.Error("GetStatSummary() error", err) } } @@ -361,14 +361,14 @@ func TestGetTrade(t *testing.T) { StartTime: time.Now().Format(time.RFC3339), Reverse: true}) if err != nil { - t.Error("test failed - GetTrade() error", err) + t.Error("GetTrade() error", err) } } func TestGetPreviousTrades(t *testing.T) { _, err := b.GetPreviousTrades(&TradeGetBucketedParams{}) if err == nil { - t.Error("test failed - GetPreviousTrades() error", err) + t.Error("GetPreviousTrades() Expected error") } } @@ -404,7 +404,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := b.GetFee(feeBuilder); resp != float64(0.00075) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.00075), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.00075), resp) } // CryptocurrencyTradeFee High quantity @@ -412,7 +412,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := b.GetFee(feeBuilder); resp != float64(750) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(750), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(750), resp) t.Error(err) } @@ -420,7 +420,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Error(err) } @@ -428,7 +428,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -436,7 +436,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -444,7 +444,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -453,7 +453,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -462,7 +462,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -607,12 +607,12 @@ func TestGetAccountInfo(t *testing.T) { if apiKey != "" || apiSecret != "" { _, err := b.GetAccountInfo() if err != nil { - t.Error("Test Failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() error", err) } } else { _, err := b.GetAccountInfo() if err == nil { - t.Error("Test Failed - GetAccountInfo() error") + t.Error("GetAccountInfo() error") } } } @@ -620,7 +620,7 @@ func TestGetAccountInfo(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := b.ModifyOrder(&exchange.ModifyOrder{OrderID: "1337"}) if err == nil { - t.Error("Test Failed - ModifyOrder() error") + t.Error("ModifyOrder() error") } } @@ -685,12 +685,12 @@ func TestGetDepositAddress(t *testing.T) { if areTestAPIKeysSet() { _, err := b.GetDepositAddress(currency.BTC, "") if err != nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } else { _, err := b.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } } diff --git a/exchanges/bitmex/bitmex_wrapper.go b/exchanges/bitmex/bitmex_wrapper.go index 68e0a016..d91adaa2 100644 --- a/exchanges/bitmex/bitmex_wrapper.go +++ b/exchanges/bitmex/bitmex_wrapper.go @@ -13,6 +13,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -90,9 +91,36 @@ func (b *Bitmex) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + SubmitOrders: true, + ModifyOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TradeFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, + AccountInfo: true, + DeadMansSwitch: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | exchange.WithdrawCryptoWithEmail | @@ -113,13 +141,6 @@ func (b *Bitmex) SetDefaults() { b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.API.Endpoints.WebsocketURL = bitmexWSURL b.Websocket = wshandler.New() - b.Websocket.Functionality = wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketAccountDataSupported | - wshandler.WebsocketDeadMansSwitchSupported b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -149,6 +170,7 @@ func (b *Bitmex) Setup(exch *config.ExchangeConfig) error { Connector: b.WsConnect, Subscriber: b.Subscribe, UnSubscriber: b.Unsubscribe, + Features: &b.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/bitstamp/bitstamp_live_test.go b/exchanges/bitstamp/bitstamp_live_test.go index 0e3c8091..7fe346d1 100644 --- a/exchanges/bitstamp/bitstamp_live_test.go +++ b/exchanges/bitstamp/bitstamp_live_test.go @@ -19,11 +19,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Bitstamp load config error", err) + log.Fatal("Bitstamp load config error", err) } bitstampConfig, err := cfg.GetExchangeConfig("Bitstamp") if err != nil { - log.Fatal("Test Failed - Bitstamp Setup() init error", err) + log.Fatal("Bitstamp Setup() init error", err) } bitstampConfig.API.AuthenticatedSupport = true bitstampConfig.API.Credentials.Key = apiKey @@ -32,7 +32,7 @@ func TestMain(m *testing.M) { b.SetDefaults() err = b.Setup(bitstampConfig) if err != nil { - log.Fatal("Test Failed - Bitstamp setup error", err) + log.Fatal("Bitstamp setup error", err) } log.Printf(sharedtestvalues.LiveTesting, b.GetName(), b.API.Endpoints.URL) os.Exit(m.Run()) diff --git a/exchanges/bitstamp/bitstamp_mock_test.go b/exchanges/bitstamp/bitstamp_mock_test.go index 74d23cc5..d8b46e59 100644 --- a/exchanges/bitstamp/bitstamp_mock_test.go +++ b/exchanges/bitstamp/bitstamp_mock_test.go @@ -22,11 +22,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Bitstamp load config error", err) + log.Fatal("Bitstamp load config error", err) } bitstampConfig, err := cfg.GetExchangeConfig("Bitstamp") if err != nil { - log.Fatal("Test Failed - Bitstamp Setup() init error", err) + log.Fatal("Bitstamp Setup() init error", err) } b.SkipAuthCheck = true bitstampConfig.API.AuthenticatedSupport = true @@ -36,12 +36,12 @@ func TestMain(m *testing.M) { b.SetDefaults() err = b.Setup(bitstampConfig) if err != nil { - log.Fatal("Test Failed - Bitstamp setup error", err) + log.Fatal("Bitstamp setup error", err) } serverDetails, newClient, err := mock.NewVCRServer(mockfile) if err != nil { - log.Fatalf("Test Failed - Mock server error %s", err) + log.Fatalf("Mock server error %s", err) } b.HTTPClient = newClient diff --git a/exchanges/bitstamp/bitstamp_test.go b/exchanges/bitstamp/bitstamp_test.go index 43bee320..1ddbfaaa 100644 --- a/exchanges/bitstamp/bitstamp_test.go +++ b/exchanges/bitstamp/bitstamp_test.go @@ -60,7 +60,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) } @@ -70,7 +70,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -80,7 +80,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -90,7 +90,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || (areTestAPIKeysSet() && err != nil) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -100,7 +100,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -110,7 +110,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -121,7 +121,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(7.5) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(7.5), resp) t.Error(err) @@ -132,7 +132,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(15) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(15), resp) t.Error(err) @@ -147,18 +147,18 @@ func TestCalculateTradingFee(t *testing.T) { newBalance.BTCEURFee = 0 if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 0, 0, newBalance); resp != 0 { - t.Error("Test Failed - GetFee() error") + t.Error("GetFee() error") } if resp := b.CalculateTradingFee(currency.BTC, currency.USD, 2, 2, newBalance); resp != float64(4) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(4), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(4), resp) } if resp := b.CalculateTradingFee(currency.BTC, currency.EUR, 2, 2, newBalance); resp != float64(0) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) } dummy1, dummy2 := currency.NewCode(""), currency.NewCode("") if resp := b.CalculateTradingFee(dummy1, dummy2, 0, 0, newBalance); resp != 0 { - t.Error("Test Failed - GetFee() error") + t.Error("GetFee() error") } } @@ -167,7 +167,7 @@ func TestGetTicker(t *testing.T) { _, err := b.GetTicker(currency.BTC.String()+currency.USD.String(), false) if err != nil { - t.Error("Test Failed - GetTicker() error", err) + t.Error("GetTicker() error", err) } } @@ -176,7 +176,7 @@ func TestGetOrderbook(t *testing.T) { _, err := b.GetOrderbook(currency.BTC.String() + currency.USD.String()) if err != nil { - t.Error("Test Failed - GetOrderbook() error", err) + t.Error("GetOrderbook() error", err) } } @@ -185,7 +185,7 @@ func TestGetTradingPairs(t *testing.T) { _, err := b.GetTradingPairs() if err != nil { - t.Error("Test Failed - GetTradingPairs() error", err) + t.Error("GetTradingPairs() error", err) } } @@ -197,7 +197,7 @@ func TestGetTransactions(t *testing.T) { _, err := b.GetTransactions(currency.BTC.String()+currency.USD.String(), value) if err != nil { - t.Error("Test Failed - GetTransactions() error", err) + t.Error("GetTransactions() error", err) } } @@ -206,7 +206,7 @@ func TestGetEURUSDConversionRate(t *testing.T) { _, err := b.GetEURUSDConversionRate() if err != nil { - t.Error("Test Failed - GetEURUSDConversionRate() error", err) + t.Error("GetEURUSDConversionRate() error", err) } } @@ -216,11 +216,11 @@ func TestGetBalance(t *testing.T) { _, err := b.GetBalance() switch { case areTestAPIKeysSet() && err != nil && !mockTests: - t.Error("Test Failed - GetBalance() error", err) + t.Error("GetBalance() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: t.Error("Expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - GetBalance() error", err) + t.Error("GetBalance() error", err) } } @@ -230,11 +230,11 @@ func TestGetUserTransactions(t *testing.T) { _, err := b.GetUserTransactions("btcusd") switch { case areTestAPIKeysSet() && err != nil && !mockTests: - t.Error("Test Failed - GetUserTransactions() error", err) + t.Error("GetUserTransactions() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: t.Error("Expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - GetUserTransactions() error", err) + t.Error("GetUserTransactions() error", err) } } @@ -244,11 +244,11 @@ func TestGetOpenOrders(t *testing.T) { _, err := b.GetOpenOrders("btcusd") switch { case areTestAPIKeysSet() && err != nil && !mockTests: - t.Error("Test Failed - GetOpenOrders() error", err) + t.Error("GetOpenOrders() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: t.Error("Expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - GetOpenOrders() error", err) + t.Error("GetOpenOrders() error", err) } } @@ -258,7 +258,7 @@ func TestGetOrderStatus(t *testing.T) { _, err := b.GetOrderStatus(1337) switch { case areTestAPIKeysSet() && err != nil && !mockTests: - t.Error("Test Failed - GetOrderStatus() error", err) + t.Error("GetOrderStatus() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: t.Error("Expecting an error when no keys are set") case mockTests && err == nil: @@ -272,11 +272,11 @@ func TestGetWithdrawalRequests(t *testing.T) { _, err := b.GetWithdrawalRequests(0) switch { case areTestAPIKeysSet() && err != nil && !mockTests: - t.Error("Test Failed - GetWithdrawalRequests() error", err) + t.Error("GetWithdrawalRequests() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: t.Error("Expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - GetWithdrawalRequests() error", err) + t.Error("GetWithdrawalRequests() error", err) } } @@ -286,11 +286,11 @@ func TestGetUnconfirmedBitcoinDeposits(t *testing.T) { _, err := b.GetUnconfirmedBitcoinDeposits() switch { case areTestAPIKeysSet() && err != nil && !mockTests: - t.Error("Test Failed - GetUnconfirmedBitcoinDeposits() error", err) + t.Error("GetUnconfirmedBitcoinDeposits() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: t.Error("Expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - GetUnconfirmedBitcoinDeposits() error", err) + t.Error("GetUnconfirmedBitcoinDeposits() error", err) } } @@ -303,7 +303,7 @@ func TestTransferAccountBalance(t *testing.T) { err := b.TransferAccountBalance(0.01, "btc", "testAccount", true) if !mockTests && err != nil { - t.Error("Test Failed - TransferAccountBalance() error", err) + t.Error("TransferAccountBalance() error", err) } if mockTests && err == nil { t.Error("Expecting an error until a QA pass can be completed") @@ -456,7 +456,7 @@ func TestModifyOrder(t *testing.T) { _, err := b.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -575,10 +575,10 @@ func TestGetDepositAddress(t *testing.T) { _, err := b.GetDepositAddress(currency.BTC, "") switch { case areTestAPIKeysSet() && customerID != "" && err != nil && !mockTests: - t.Error("Test Failed - GetDepositAddress error", err) + t.Error("GetDepositAddress error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - GetDepositAddress error cannot be nil") + t.Error("GetDepositAddress error cannot be nil") case mockTests && err != nil: - t.Error("Test Failed - GetDepositAddress error", err) + t.Error("GetDepositAddress error", err) } } diff --git a/exchanges/bitstamp/bitstamp_wrapper.go b/exchanges/bitstamp/bitstamp_wrapper.go index 5f8cdc9f..48fe98a4 100644 --- a/exchanges/bitstamp/bitstamp_wrapper.go +++ b/exchanges/bitstamp/bitstamp_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,8 +70,33 @@ func (b *Bitstamp) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, + RESTCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + FiatDeposit: true, + FiatWithdraw: true, + TradeFee: true, + FiatDepositFee: true, + FiatWithdrawalFee: true, + CryptoDepositFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TradeFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.AutoWithdrawFiat, @@ -89,10 +115,6 @@ func (b *Bitstamp) SetDefaults() { b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.API.Endpoints.WebsocketURL = bitstampWSURL b.Websocket = wshandler.New() - b.Websocket.Functionality = wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -122,6 +144,7 @@ func (b *Bitstamp) Setup(exch *config.ExchangeConfig) error { Connector: b.WsConnect, Subscriber: b.Subscribe, UnSubscriber: b.Unsubscribe, + Features: &b.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/bittrex/bittrex_test.go b/exchanges/bittrex/bittrex_test.go index 7ba5e57c..6b82573a 100644 --- a/exchanges/bittrex/bittrex_test.go +++ b/exchanges/bittrex/bittrex_test.go @@ -21,7 +21,7 @@ var b Bittrex func TestSetDefaults(t *testing.T) { b.SetDefaults() if b.GetName() != "Bittrex" { - t.Error("Test Failed - Bittrex - SetDefaults() error") + t.Error("Bittrex - SetDefaults() error") } } @@ -29,11 +29,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Bittrex load config error", err) + t.Fatal("Bittrex load config error", err) } bConfig, err := cfg.GetExchangeConfig("Bittrex") if err != nil { - t.Error("Test Failed - Bittrex Setup() init error") + t.Error("Bittrex Setup() init error") } bConfig.API.Credentials.Key = apiKey bConfig.API.Credentials.Secret = apiSecret @@ -41,12 +41,12 @@ func TestSetup(t *testing.T) { err = b.Setup(bConfig) if err != nil { - t.Fatal("Test Failed - Bittrex setup error", err) + t.Fatal("Bittrex setup error", err) } if !b.IsEnabled() || !b.API.AuthenticatedSupport || b.Verbose || len(b.BaseCurrencies) < 1 { - t.Error("Test Failed - Bittrex Setup values not set correctly") + t.Error("Bittrex Setup values not set correctly") } } @@ -54,7 +54,7 @@ func TestGetMarkets(t *testing.T) { t.Parallel() _, err := b.GetMarkets() if err != nil { - t.Errorf("Test Failed - Bittrex - GetMarkets() error: %s", err) + t.Errorf("Bittrex - GetMarkets() error: %s", err) } } @@ -62,7 +62,7 @@ func TestGetCurrencies(t *testing.T) { t.Parallel() _, err := b.GetCurrencies() if err != nil { - t.Errorf("Test Failed - Bittrex - GetCurrencies() error: %s", err) + t.Errorf("Bittrex - GetCurrencies() error: %s", err) } } @@ -72,7 +72,7 @@ func TestGetTicker(t *testing.T) { _, err := b.GetTicker(btc) if err != nil { - t.Errorf("Test Failed - Bittrex - GetTicker() error: %s", err) + t.Errorf("Bittrex - GetTicker() error: %s", err) } } @@ -80,7 +80,7 @@ func TestGetMarketSummaries(t *testing.T) { t.Parallel() _, err := b.GetMarketSummaries() if err != nil { - t.Errorf("Test Failed - Bittrex - GetMarketSummaries() error: %s", err) + t.Errorf("Bittrex - GetMarketSummaries() error: %s", err) } } @@ -90,7 +90,7 @@ func TestGetMarketSummary(t *testing.T) { _, err := b.GetMarketSummary(pairOne) if err != nil { - t.Errorf("Test Failed - Bittrex - GetMarketSummary() error: %s", err) + t.Errorf("Bittrex - GetMarketSummary() error: %s", err) } } @@ -99,7 +99,7 @@ func TestGetOrderbook(t *testing.T) { _, err := b.GetOrderbook("btc-ltc") if err != nil { - t.Errorf("Test Failed - Bittrex - GetOrderbook() error: %s", err) + t.Errorf("Bittrex - GetOrderbook() error: %s", err) } } @@ -108,7 +108,7 @@ func TestGetMarketHistory(t *testing.T) { _, err := b.GetMarketHistory("btc-ltc") if err != nil { - t.Errorf("Test Failed - Bittrex - GetMarketHistory() error: %s", err) + t.Errorf("Bittrex - GetMarketHistory() error: %s", err) } } @@ -117,7 +117,7 @@ func TestPlaceBuyLimit(t *testing.T) { _, err := b.PlaceBuyLimit("btc-ltc", 1, 1) if err == nil { - t.Error("Test Failed - Bittrex - PlaceBuyLimit() error") + t.Error("Bittrex - PlaceBuyLimit() Expected error") } } @@ -126,7 +126,7 @@ func TestPlaceSellLimit(t *testing.T) { _, err := b.PlaceSellLimit("btc-ltc", 1, 1) if err == nil { - t.Error("Test Failed - Bittrex - PlaceSellLimit() error") + t.Error("Bittrex - PlaceSellLimit() Expected error") } } @@ -135,11 +135,11 @@ func TestGetOpenOrders(t *testing.T) { _, err := b.GetOpenOrders("") if err == nil { - t.Error("Test Failed - Bittrex - GetOrder() error") + t.Error("Bittrex - GetOrder() Expected error") } _, err = b.GetOpenOrders("btc-ltc") if err == nil { - t.Error("Test Failed - Bittrex - GetOrder() error") + t.Error("Bittrex - GetOrder() Expected error") } } @@ -148,7 +148,7 @@ func TestCancelExistingOrder(t *testing.T) { _, err := b.CancelExistingOrder("blaaaaaaa") if err == nil { - t.Error("Test Failed - Bittrex - CancelExistingOrder() error") + t.Error("Bittrex - CancelExistingOrder() Expected error") } } @@ -157,7 +157,7 @@ func TestGetAccountBalances(t *testing.T) { _, err := b.GetAccountBalances() if err == nil { - t.Error("Test Failed - Bittrex - GetAccountBalances() error") + t.Error("Bittrex - GetAccountBalances() Expected error") } } @@ -166,7 +166,7 @@ func TestGetAccountBalanceByCurrency(t *testing.T) { _, err := b.GetAccountBalanceByCurrency("btc") if err == nil { - t.Error("Test Failed - Bittrex - GetAccountBalanceByCurrency() error") + t.Error("Bittrex - GetAccountBalanceByCurrency() Expected error") } } @@ -175,11 +175,11 @@ func TestGetOrder(t *testing.T) { _, err := b.GetOrder("0cb4c4e4-bdc7-4e13-8c13-430e587d2cc1") if err == nil { - t.Error("Test Failed - Bittrex - GetOrder() error") + t.Error("Bittrex - GetOrder() Expected error") } _, err = b.GetOrder("") if err == nil { - t.Error("Test Failed - Bittrex - GetOrder() error") + t.Error("Bittrex - GetOrder() Expected error") } } @@ -188,11 +188,11 @@ func TestGetOrderHistoryForCurrency(t *testing.T) { _, err := b.GetOrderHistoryForCurrency("") if err == nil { - t.Error("Test Failed - Bittrex - GetOrderHistory() error") + t.Error("Bittrex - GetOrderHistory() Expected error") } _, err = b.GetOrderHistoryForCurrency("btc-ltc") if err == nil { - t.Error("Test Failed - Bittrex - GetOrderHistory() error") + t.Error("Bittrex - GetOrderHistory() Expected error") } } @@ -201,11 +201,11 @@ func TestGetwithdrawalHistory(t *testing.T) { _, err := b.GetWithdrawalHistory("") if err == nil { - t.Error("Test Failed - Bittrex - GetWithdrawalHistory() error") + t.Error("Bittrex - GetWithdrawalHistory() Expected error") } _, err = b.GetWithdrawalHistory("btc-ltc") if err == nil { - t.Error("Test Failed - Bittrex - GetWithdrawalHistory() error") + t.Error("Bittrex - GetWithdrawalHistory() Expected error") } } @@ -214,11 +214,11 @@ func TestGetDepositHistory(t *testing.T) { _, err := b.GetDepositHistory("") if err == nil { - t.Error("Test Failed - Bittrex - GetDepositHistory() error") + t.Error("Bittrex - GetDepositHistory() Expected error") } _, err = b.GetDepositHistory("btc-ltc") if err == nil { - t.Error("Test Failed - Bittrex - GetDepositHistory() error") + t.Error("Bittrex - GetDepositHistory() Expected error") } } @@ -255,7 +255,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) } // CryptocurrencyTradeFee High quantity @@ -263,7 +263,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := b.GetFee(feeBuilder); resp != float64(2500) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2500), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2500), resp) t.Error(err) } @@ -271,7 +271,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := b.GetFee(feeBuilder); resp != float64(0.0025) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) t.Error(err) } @@ -279,7 +279,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -287,7 +287,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Error(err) } @@ -295,7 +295,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -304,7 +304,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -313,7 +313,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.HKD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -459,7 +459,7 @@ func TestCancelAllExchangeOrders(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := b.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -524,12 +524,12 @@ func TestGetDepositAddress(t *testing.T) { if areTestAPIKeysSet() { _, err := b.GetDepositAddress(currency.BTC, "") if err != nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } else { _, err := b.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } } diff --git a/exchanges/bittrex/bittrex_wrapper.go b/exchanges/bittrex/bittrex_wrapper.go index 6985f74f..3cb3d48b 100644 --- a/exchanges/bittrex/bittrex_wrapper.go +++ b/exchanges/bittrex/bittrex_wrapper.go @@ -13,6 +13,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,9 +70,23 @@ func (b *Bittrex) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: false, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + GetOrders: true, + CancelOrder: true, + SubmitOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoWithdrawalFee: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | exchange.NoFiatWithdrawals, diff --git a/exchanges/btcmarkets/btcmarkets.go b/exchanges/btcmarkets/btcmarkets.go index 3105c5b0..ff6ac360 100644 --- a/exchanges/btcmarkets/btcmarkets.go +++ b/exchanges/btcmarkets/btcmarkets.go @@ -12,6 +12,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/common/crypto" "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" + "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" log "github.com/thrasher-corp/gocryptotrader/logger" ) @@ -46,6 +47,7 @@ const ( // BTCMarkets is the overarching type across the BTCMarkets package type BTCMarkets struct { exchange.Base + WebsocketConn *wshandler.WebsocketConnection } // GetMarkets returns the BTCMarkets instruments diff --git a/exchanges/btcmarkets/btcmarkets_test.go b/exchanges/btcmarkets/btcmarkets_test.go index 29d34315..24384ef1 100644 --- a/exchanges/btcmarkets/btcmarkets_test.go +++ b/exchanges/btcmarkets/btcmarkets_test.go @@ -27,11 +27,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - BTC Markets load config error", err) + t.Fatal("BTC Markets load config error", err) } bConfig, err := cfg.GetExchangeConfig("BTC Markets") if err != nil { - t.Error("Test Failed - BTC Markets Setup() init error") + t.Error("BTC Markets Setup() init error") } bConfig.API.Credentials.Key = apiKey bConfig.API.Credentials.Secret = apiSecret @@ -39,7 +39,7 @@ func TestSetup(t *testing.T) { err = b.Setup(bConfig) if err != nil { - t.Fatal("Test Failed - BTC Markets setup error", err) + t.Fatal("BTC Markets setup error", err) } } @@ -47,7 +47,7 @@ func TestGetMarkets(t *testing.T) { t.Parallel() _, err := b.GetMarkets() if err != nil { - t.Error("Test failed - GetMarkets() error", err) + t.Error("GetMarkets() error", err) } } @@ -55,7 +55,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := b.GetTicker("BTC", "AUD") if err != nil { - t.Error("Test failed - GetTicker() error", err) + t.Error("GetTicker() error", err) } } @@ -63,7 +63,7 @@ func TestGetOrderbook(t *testing.T) { t.Parallel() _, err := b.GetOrderbook("BTC", "AUD") if err != nil { - t.Error("Test failed - GetOrderbook() error", err) + t.Error("GetOrderbook() error", err) } } @@ -71,14 +71,14 @@ func TestGetTrades(t *testing.T) { t.Parallel() _, err := b.GetTrades("BTC", "AUD", nil) if err != nil { - t.Error("Test failed - GetTrades() error", err) + t.Error("GetTrades() error", err) } val := url.Values{} val.Set("since", "0") _, err = b.GetTrades("BTC", "AUD", val) if err != nil { - t.Error("Test failed - GetTrades() error", err) + t.Error("GetTrades() error", err) } } @@ -87,7 +87,7 @@ func TestNewOrder(t *testing.T) { _, err := b.NewOrder("AUD", "BTC", 0, 0, "Bid", exchange.LimitOrderType.ToLower().ToString(), "testTest") if err == nil { - t.Error("Test failed - NewOrder() error", err) + t.Error("NewOrder() Expected error") } } @@ -95,7 +95,7 @@ func TestCancelExistingOrder(t *testing.T) { t.Parallel() _, err := b.CancelExistingOrder([]int64{1337}) if err == nil { - t.Error("Test failed - CancelExistingOrder() error", err) + t.Error("CancelExistingOrder() Expected error") } } @@ -103,11 +103,11 @@ func TestGetOrders(t *testing.T) { t.Parallel() _, err := b.GetOrders("AUD", "BTC", 10, 0, false) if err == nil { - t.Error("Test failed - GetOrders() error", err) + t.Error("GetOrders() Expected error") } _, err = b.GetOrders("AUD", "BTC", 10, 0, true) if err == nil { - t.Error("Test failed - GetOrders() error", err) + t.Error("GetOrders() Expected error") } } @@ -115,7 +115,7 @@ func TestGetOrderDetail(t *testing.T) { t.Parallel() _, err := b.GetOrderDetail([]int64{1337}) if err == nil { - t.Error("Test failed - GetOrderDetail() error", err) + t.Error("GetOrderDetail() Expected error") } } @@ -123,7 +123,7 @@ func TestGetAccountBalance(t *testing.T) { t.Parallel() _, err := b.GetAccountBalance() if err == nil { - t.Error("Test failed - GetAccountBalance() error", err) + t.Error("GetAccountBalance() Expected error") } } @@ -131,7 +131,7 @@ func TestWithdrawCrypto(t *testing.T) { t.Parallel() _, err := b.WithdrawCrypto(0, "BTC", "LOLOLOL") if err == nil { - t.Error("Test failed - WithdrawCrypto() error", err) + t.Error("WithdrawCrypto() Expected error") } } @@ -139,21 +139,21 @@ func TestWithdrawAUD(t *testing.T) { t.Parallel() _, err := b.WithdrawAUD("BLA", "1337", "blawest", "1336", 10000000) if err == nil { - t.Error("Test failed - WithdrawAUD() error", err) + t.Error("WithdrawAUD() Expected error") } } func TestGetAccountInfo(t *testing.T) { _, err := b.GetAccountInfo() if err == nil { - t.Error("Test failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() Expected error") } } func TestGetFundingHistory(t *testing.T) { _, err := b.GetFundingHistory() if err == nil { - t.Error("Test failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() Expected error") } } @@ -161,14 +161,14 @@ func TestCancelOrder(t *testing.T) { _, err := b.CancelExistingOrder([]int64{1337}) if err == nil { - t.Error("Test failed - CancelgOrder() error", err) + t.Error("CancelgOrder() Expected error") } } func TestGetOrderInfo(t *testing.T) { _, err := b.GetOrderInfo("1337") if err == nil { - t.Error("Test failed - GetOrderInfo() error", err) + t.Error("GetOrderInfo() Expected error") } } @@ -208,14 +208,14 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Quote = currency.USD if resp, err := b.GetFee(feeBuilder); resp != float64(0.00849999) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.00849999), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.00849999), resp) } // CryptocurrencyTradeFee Basic feeBuilder = setFeeBuilder() if resp, err := b.GetFee(feeBuilder); resp != float64(0.0022) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0022), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0022), resp) } // CryptocurrencyTradeFee High quantity @@ -223,7 +223,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := b.GetFee(feeBuilder); resp != float64(2200) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(22000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(22000), resp) t.Error(err) } @@ -231,7 +231,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := b.GetFee(feeBuilder); resp != float64(0.0022) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0022), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0022), resp) t.Error(err) } @@ -239,7 +239,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -248,7 +248,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) } @@ -256,7 +256,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -265,7 +265,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.AUD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -274,7 +274,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.AUD if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -418,7 +418,7 @@ func TestCancelAllExchangeOrders(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := b.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -500,6 +500,6 @@ func TestWithdrawInternationalBank(t *testing.T) { func TestGetDepositAddress(t *testing.T) { _, err := b.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } diff --git a/exchanges/btcmarkets/btcmarkets_types.go b/exchanges/btcmarkets/btcmarkets_types.go index 4f23cfe4..33e61d78 100644 --- a/exchanges/btcmarkets/btcmarkets_types.go +++ b/exchanges/btcmarkets/btcmarkets_types.go @@ -1,6 +1,10 @@ package btcmarkets -import "github.com/thrasher-corp/gocryptotrader/currency" +import ( + "time" + + "github.com/thrasher-corp/gocryptotrader/currency" +) // Response is the genralized response type type Response struct { @@ -143,3 +147,54 @@ var WithdrawalFees = map[currency.Code]float64{ currency.OMG: 0.15, currency.POWR: 5, } + +// WsSubscribe message sent via ws to subscribe +type WsSubscribe struct { + MarketIDs []string `json:"marketIds,omitempty"` + Channels []string `json:"channels"` + MessageType string `json:"messageType"` +} + +// WsMessageType message sent via ws to determine type +type WsMessageType struct { + MessageType string `json:"messageType"` +} + +// WsTick message received for ticker data +type WsTick struct { + Currency string `json:"marketId"` + Timestamp time.Time `json:"timestamp"` + Bid float64 `json:"bestBid,string"` + Ask float64 `json:"bestAsk,string"` + Last float64 `json:"lastPrice,string"` + Volume float64 `json:"volume24h,string"` + Price24h float64 `json:"price24h,string"` + Low24h float64 `json:"low24h,string"` + High24 float64 `json:"high24h,string"` + MessageType string `json:"messageType"` +} + +// WsTrade message received for trade data +type WsTrade struct { + Currency string `json:"marketId"` + Timestamp time.Time `json:"timestamp"` + TradeID int64 `json:"tradeId"` + Price float64 `json:"price,string"` + Volume float64 `json:"volume,string"` + MessageType string `json:"messageType"` +} + +// WsOrderbook message received for orderbook data +type WsOrderbook struct { + Currency string `json:"marketId"` + Timestamp time.Time `json:"timestamp"` + Bids [][]string `json:"bids"` + Asks [][]string `json:"asks"` + MessageType string `json:"messageType"` +} + +type WsError struct { + MessageType string `json:"messageType"` + Code int64 `json:"code"` + Message string `json:"message"` +} diff --git a/exchanges/btcmarkets/btcmarkets_websocket.go b/exchanges/btcmarkets/btcmarkets_websocket.go new file mode 100644 index 00000000..840a25c3 --- /dev/null +++ b/exchanges/btcmarkets/btcmarkets_websocket.go @@ -0,0 +1,207 @@ +package btcmarkets + +import ( + "errors" + "fmt" + "net/http" + "strconv" + + "github.com/gorilla/websocket" + "github.com/thrasher-corp/gocryptotrader/common" + "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchanges/asset" + "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" + log "github.com/thrasher-corp/gocryptotrader/logger" +) + +const ( + btcMarketsWSURL = "wss://socket.btcmarkets.net/v2" +) + +// WsConnect connects to a websocket feed +func (b *BTCMarkets) WsConnect() error { + if !b.Websocket.IsEnabled() || !b.IsEnabled() { + return errors.New(wshandler.WebsocketNotEnabled) + } + var dialer websocket.Dialer + err := b.WebsocketConn.Dial(&dialer, http.Header{}) + if err != nil { + return err + } + if b.Verbose { + log.Debugf(log.ExchangeSys, "%s Connected to Websocket.\n", b.GetName()) + } + + b.generateDefaultSubscriptions() + go b.WsHandleData() + + return nil +} + +// WsHandleData handles websocket data from WsReadData +func (b *BTCMarkets) WsHandleData() { + b.Websocket.Wg.Add(1) + defer func() { + b.Websocket.Wg.Done() + }() + + for { + select { + case <-b.Websocket.ShutdownC: + return + default: + resp, err := b.WebsocketConn.ReadMessage() + if err != nil { + b.Websocket.ReadMessageErrors <- err + return + } + b.Websocket.TrafficAlert <- struct{}{} + var wsResponse WsMessageType + err = common.JSONDecode(resp.Raw, &wsResponse) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + switch wsResponse.MessageType { + case "heartbeat": + if b.Verbose { + log.Debugf(log.ExchangeSys, "%v - Websocket heartbeat received %s", b.GetName(), resp.Raw) + } + case "orderbook": + var ob WsOrderbook + err := common.JSONDecode(resp.Raw, &ob) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + + p := currency.NewPairFromString(ob.Currency) + var bids, asks []orderbook.Item + for x := range ob.Bids { + var price, amount float64 + price, err = strconv.ParseFloat(ob.Bids[x][0], 64) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + amount, err = strconv.ParseFloat(ob.Bids[x][1], 64) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + bids = append(bids, orderbook.Item{ + Amount: amount, + Price: price, + }) + } + for x := range ob.Asks { + var price, amount float64 + price, err = strconv.ParseFloat(ob.Asks[x][0], 64) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + amount, err = strconv.ParseFloat(ob.Asks[x][1], 64) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + asks = append(asks, orderbook.Item{ + Amount: amount, + Price: price, + }) + } + err = b.Websocket.Orderbook.LoadSnapshot(&orderbook.Base{ + Pair: p, + Bids: bids, + Asks: asks, + LastUpdated: ob.Timestamp, + AssetType: asset.Spot, + ExchangeName: b.Name, + }) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + b.Websocket.DataHandler <- wshandler.WebsocketOrderbookUpdate{ + Pair: p, + Asset: asset.Spot, + Exchange: b.GetName(), + } + case "trade": + var trade WsTrade + err := common.JSONDecode(resp.Raw, &trade) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + p := currency.NewPairFromString(trade.Currency) + b.Websocket.DataHandler <- wshandler.TradeData{ + Timestamp: trade.Timestamp, + CurrencyPair: p, + AssetType: asset.Spot, + Exchange: b.GetName(), + Price: trade.Price, + Amount: trade.Volume, + } + case "tick": + var tick WsTick + err := common.JSONDecode(resp.Raw, &tick) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + + p := currency.NewPairFromString(tick.Currency) + b.Websocket.DataHandler <- wshandler.TickerData{ + Exchange: b.GetName(), + Volume: tick.Volume, + High: tick.High24, + Low: tick.Low24h, + Bid: tick.Bid, + Ask: tick.Ask, + Last: tick.Last, + Timestamp: tick.Timestamp, + AssetType: asset.Spot, + Pair: p, + } + case "error": + var wsErr WsError + err := common.JSONDecode(resp.Raw, &wsErr) + if err != nil { + b.Websocket.DataHandler <- err + continue + } + b.Websocket.DataHandler <- fmt.Errorf("%v websocket error. Code: %v Message: %v", b.Name, wsErr.Code, wsErr.Message) + default: + b.Websocket.DataHandler <- fmt.Errorf("%v Unhandled websocket message %s", b.Name, resp.Raw) + } + } + } +} + +func (b *BTCMarkets) generateDefaultSubscriptions() { + var channels = []string{"tick", "trade", "orderbook"} + enabledCurrencies := b.GetEnabledPairs(asset.Spot) + var subscriptions []wshandler.WebsocketChannelSubscription + for i := range channels { + for j := range enabledCurrencies { + subscriptions = append(subscriptions, wshandler.WebsocketChannelSubscription{ + Channel: channels[i], + Currency: enabledCurrencies[j], + }) + } + } + b.Websocket.SubscribeToChannels(subscriptions) +} + +// Subscribe sends a websocket message to receive data from the channel +func (b *BTCMarkets) Subscribe(channelToSubscribe wshandler.WebsocketChannelSubscription) error { + req := WsSubscribe{ + MarketIDs: []string{channelToSubscribe.Currency.String()}, + Channels: []string{channelToSubscribe.Channel}, + MessageType: "subscribe", + } + return b.WebsocketConn.SendMessage(req) +} diff --git a/exchanges/btcmarkets/btcmarkets_wrapper.go b/exchanges/btcmarkets/btcmarkets_wrapper.go index b8d0b116..98164cb7 100644 --- a/exchanges/btcmarkets/btcmarkets_wrapper.go +++ b/exchanges/btcmarkets/btcmarkets_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -71,10 +72,31 @@ func (b *BTCMarkets) SetDefaults() { b.Features = exchange.Features{ Supports: exchange.FeaturesSupported{ REST: true, - Websocket: false, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: false, + Websocket: true, + RESTCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + SubmitOrder: true, + UserTradeHistory: true, + CryptoWithdrawal: true, + FiatWithdraw: true, + TradeFee: true, + FiatWithdrawalFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AccountInfo: true, + Subscribe: true, + AuthenticatedEndpoints: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.AutoWithdrawFiat, @@ -88,6 +110,12 @@ func (b *BTCMarkets) SetDefaults() { request.NewRateLimit(time.Second*10, btcmarketsAuthLimit), request.NewRateLimit(time.Second*10, btcmarketsUnauthLimit), common.NewHTTPClientWithTimeout(exchange.DefaultHTTPTimeout)) + + b.API.Endpoints.WebsocketURL = btcMarketsWSURL + b.Websocket = wshandler.New() + b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit + b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout + b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit } // Setup takes in an exchange configuration and sets all parameters @@ -97,7 +125,38 @@ func (b *BTCMarkets) Setup(exch *config.ExchangeConfig) error { return nil } - return b.SetupDefaults(exch) + err := b.SetupDefaults(exch) + if err != nil { + return err + } + + err = b.Websocket.Setup( + &wshandler.WebsocketSetup{ + Enabled: exch.Features.Enabled.Websocket, + Verbose: exch.Verbose, + AuthenticatedWebsocketAPISupport: exch.API.AuthenticatedWebsocketSupport, + WebsocketTimeout: exch.WebsocketTrafficTimeout, + DefaultURL: btcMarketsWSURL, + ExchangeName: exch.Name, + RunningURL: exch.API.Endpoints.WebsocketURL, + Connector: b.WsConnect, + Subscriber: b.Subscribe, + Features: &b.Features.Supports.WebsocketCapabilities, + }) + if err != nil { + return err + } + + b.WebsocketConn = &wshandler.WebsocketConnection{ + ExchangeName: b.Name, + URL: b.Websocket.GetWebsocketURL(), + ProxyURL: b.Websocket.GetProxyAddress(), + Verbose: b.Verbose, + ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, + ResponseMaxLimit: exch.WebsocketResponseMaxLimit, + } + + return nil } // Start starts the BTC Markets go routine @@ -440,7 +499,7 @@ func (b *BTCMarkets) WithdrawFiatFundsToInternationalBank(withdrawRequest *excha // GetWebsocket returns a pointer to the exchange websocket func (b *BTCMarkets) GetWebsocket() (*wshandler.Websocket, error) { - return nil, common.ErrNotYetImplemented + return b.Websocket, nil } // GetFeeByType returns an estimate of fee based on type of transaction diff --git a/exchanges/btse/btse_test.go b/exchanges/btse/btse_test.go index c394ccd5..bc90899d 100644 --- a/exchanges/btse/btse_test.go +++ b/exchanges/btse/btse_test.go @@ -27,11 +27,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - BTSE load config error", err) + log.Fatal("BTSE load config error", err) } btseConfig, err := cfg.GetExchangeConfig("BTSE") if err != nil { - t.Error("Test Failed - BTSE Setup() init error") + t.Error("BTSE Setup() init error") } btseConfig.API.AuthenticatedSupport = true @@ -40,7 +40,7 @@ func TestSetup(t *testing.T) { err = b.Setup(btseConfig) if err != nil { - t.Fatal("Test Failed - BTSE setup error", err) + t.Fatal("BTSE setup error", err) } } @@ -48,7 +48,7 @@ func TestGetMarkets(t *testing.T) { b.SetDefaults() _, err := b.GetMarkets() if err != nil { - t.Fatalf("Test failed. Err: %s", err) + t.Fatalf("Err: %s", err) } } @@ -56,7 +56,7 @@ func TestGetTrades(t *testing.T) { b.SetDefaults() _, err := b.GetTrades("BTC-USD") if err != nil { - t.Fatalf("Test failed. Err: %s", err) + t.Fatalf("Err: %s", err) } } @@ -64,7 +64,7 @@ func TestGetTicker(t *testing.T) { b.SetDefaults() _, err := b.GetTicker("BTC-USD") if err != nil { - t.Fatalf("Test failed. Err: %s", err) + t.Fatalf("Err: %s", err) } } @@ -72,7 +72,7 @@ func TestGetOrderbook(t *testing.T) { b.SetDefaults() _, err := b.GetOrderbook("BTC-USD", 0, 0, 0) if err != nil { - t.Fatalf("Test failed. Err: %s", err) + t.Fatalf("Err: %s", err) } } @@ -80,7 +80,7 @@ func TestGetMarketStatistics(t *testing.T) { b.SetDefaults() _, err := b.GetMarketStatistics("BTC-USD") if err != nil { - t.Fatalf("Test failed. Err: %s", err) + t.Fatalf("Err: %s", err) } } @@ -88,7 +88,7 @@ func TestGetServerTime(t *testing.T) { b.SetDefaults() _, err := b.GetServerTime() if err != nil { - t.Fatalf("Test failed. Err: %s", err) + t.Fatalf("Err: %s", err) } } @@ -142,7 +142,7 @@ func TestGetOrderHistory(t *testing.T) { _, err := b.GetOrderHistory(&getOrdersRequest) if err != common.ErrFunctionNotSupported { - t.Fatal("Test failed. Expected different result") + t.Fatal("Expected different result") } } @@ -188,49 +188,49 @@ func TestGetFee(t *testing.T) { } if resp, err := b.GetFee(feeBuilder); resp != 0.00050 || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", 0.00050, resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", 0.00050, resp) t.Error(err) } feeBuilder.IsMaker = false if resp, err := b.GetFee(feeBuilder); resp != 0.0015 || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", 0.0015, resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", 0.0015, resp) t.Error(err) } feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != 0.0005 || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", 0.0005, resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", 0.0005, resp) t.Error(err) } feeBuilder.Pair.Base = currency.USDT if resp, err := b.GetFee(feeBuilder); resp != float64(5) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(5), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(5), resp) t.Error(err) } feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := b.GetFee(feeBuilder); resp != float64(3) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(3), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(3), resp) t.Error(err) } feeBuilder.Amount = 1000000 if resp, err := b.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee if resp, err := b.GetFee(feeBuilder); resp != float64(1000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(1000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(1000), resp) t.Error(err) } feeBuilder.Amount = 1000 if resp, err := b.GetFee(feeBuilder); resp != float64(25) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(25), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(25), resp) t.Error(err) } } @@ -239,7 +239,7 @@ func TestParseOrderTime(t *testing.T) { expected := int64(1534794360) actual := parseOrderTime("2018-08-20 19:20:46").Unix() if expected != actual { - t.Errorf("Test Failed. TestParseOrderTime expected: %d, got %d", expected, actual) + t.Errorf("TestParseOrderTime expected: %d, got %d", expected, actual) } } diff --git a/exchanges/btse/btse_wrapper.go b/exchanges/btse/btse_wrapper.go index 3cec4218..49e83964 100644 --- a/exchanges/btse/btse_wrapper.go +++ b/exchanges/btse/btse_wrapper.go @@ -13,6 +13,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,8 +70,28 @@ func (b *BTSE) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, + RESTCapabilities: protocol.Features{ + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + TradeFee: true, + FiatDepositFee: true, + FiatWithdrawalFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, }, WithdrawPermissions: exchange.NoAPIWithdrawalMethods, }, @@ -87,10 +108,6 @@ func (b *BTSE) SetDefaults() { b.API.Endpoints.URLDefault = btseAPIURL b.API.Endpoints.URL = b.API.Endpoints.URLDefault b.Websocket = wshandler.New() - b.Websocket.Functionality = wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketTickerSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported b.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit b.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout b.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -121,6 +138,7 @@ func (b *BTSE) Setup(exch *config.ExchangeConfig) error { Connector: b.WsConnect, Subscriber: b.Subscribe, UnSubscriber: b.Unsubscribe, + Features: &b.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/coinbasepro/coinbasepro_test.go b/exchanges/coinbasepro/coinbasepro_test.go index 1b851383..017f7d33 100644 --- a/exchanges/coinbasepro/coinbasepro_test.go +++ b/exchanges/coinbasepro/coinbasepro_test.go @@ -32,11 +32,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - coinbasepro load config error", err) + t.Fatal("coinbasepro load config error", err) } gdxConfig, err := cfg.GetExchangeConfig("CoinbasePro") if err != nil { - t.Error("Test Failed - coinbasepro Setup() init error") + t.Error("coinbasepro Setup() init error") } gdxConfig.API.Credentials.Key = apiKey gdxConfig.API.Credentials.Secret = apiSecret @@ -45,56 +45,56 @@ func TestSetup(t *testing.T) { gdxConfig.API.AuthenticatedWebsocketSupport = true err = c.Setup(gdxConfig) if err != nil { - t.Fatal("Test Failed - CoinbasePro setup error", err) + t.Fatal("CoinbasePro setup error", err) } } func TestGetProducts(t *testing.T) { _, err := c.GetProducts() if err != nil { - t.Errorf("Test failed - Coinbase, GetProducts() Error: %s", err) + t.Errorf("Coinbase, GetProducts() Error: %s", err) } } func TestGetTicker(t *testing.T) { _, err := c.GetTicker("BTC-USD") if err != nil { - t.Error("Test failed - GetTicker() error", err) + t.Error("GetTicker() error", err) } } func TestGetTrades(t *testing.T) { _, err := c.GetTrades("BTC-USD") if err != nil { - t.Error("Test failed - GetTrades() error", err) + t.Error("GetTrades() error", err) } } func TestGetHistoricRates(t *testing.T) { _, err := c.GetHistoricRates("BTC-USD", 0, 0, 0) if err != nil { - t.Error("Test failed - GetHistoricRates() error", err) + t.Error("GetHistoricRates() error", err) } } func TestGetStats(t *testing.T) { _, err := c.GetStats("BTC-USD") if err != nil { - t.Error("Test failed - GetStats() error", err) + t.Error("GetStats() error", err) } } func TestGetCurrencies(t *testing.T) { _, err := c.GetCurrencies() if err != nil { - t.Error("Test failed - GetCurrencies() error", err) + t.Error("GetCurrencies() error", err) } } func TestGetServerTime(t *testing.T) { _, err := c.GetServerTime() if err != nil { - t.Error("Test failed - GetServerTime() error", err) + t.Error("GetServerTime() error", err) } } @@ -104,7 +104,7 @@ func TestAuthRequests(t *testing.T) { } _, err := c.GetAccounts() if err != nil { - t.Error("Test failed - GetAccounts() error", err) + t.Error("GetAccounts() error", err) } accountResponse, err := c.GetAccount("13371337-1337-1337-1337-133713371337") if accountResponse.ID != "" { @@ -173,11 +173,11 @@ func TestAuthRequests(t *testing.T) { } _, err = c.GetPayMethods() if err != nil { - t.Error("Test failed - GetPayMethods() error", err) + t.Error("GetPayMethods() error", err) } _, err = c.GetCoinbaseAccounts() if err != nil { - t.Error("Test failed - GetCoinbaseAccounts() error", err) + t.Error("GetCoinbaseAccounts() error", err) } } @@ -215,7 +215,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := c.GetFee(feeBuilder); resp != float64(0.003) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) } // CryptocurrencyTradeFee High quantity @@ -223,7 +223,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := c.GetFee(feeBuilder); resp != float64(3000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(3000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(3000), resp) t.Error(err) } @@ -231,7 +231,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.01), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.01), resp) t.Error(err) } @@ -239,7 +239,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -248,7 +248,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -256,7 +256,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -265,7 +265,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.EUR if resp, err := c.GetFee(feeBuilder); resp != float64(0.15) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -274,7 +274,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := c.GetFee(feeBuilder); resp != float64(25) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -290,7 +290,7 @@ func TestCalculateTradingFee(t *testing.T) { } if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.003) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) } // lowercase @@ -302,7 +302,7 @@ func TestCalculateTradingFee(t *testing.T) { } if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.003) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) } // mixedCase @@ -314,7 +314,7 @@ func TestCalculateTradingFee(t *testing.T) { } if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.003) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.003), resp) } // medium volume @@ -326,7 +326,7 @@ func TestCalculateTradingFee(t *testing.T) { } if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.002) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) } // high volume @@ -338,7 +338,7 @@ func TestCalculateTradingFee(t *testing.T) { } if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0.001) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) } // no match @@ -350,7 +350,7 @@ func TestCalculateTradingFee(t *testing.T) { } if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, false); resp != float64(0) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) } // taker @@ -362,7 +362,7 @@ func TestCalculateTradingFee(t *testing.T) { } if resp := c.calculateTradingFee(volume, currency.BTC, currency.USD, "_", 1, 1, true); resp != float64(0) { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) } } @@ -510,7 +510,7 @@ func TestCancelAllExchangeOrders(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := c.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -592,7 +592,7 @@ func TestWithdrawInternationalBank(t *testing.T) { func TestGetDepositAddress(t *testing.T) { _, err := c.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } diff --git a/exchanges/coinbasepro/coinbasepro_wrapper.go b/exchanges/coinbasepro/coinbasepro_wrapper.go index 3079db1d..f81c78ee 100644 --- a/exchanges/coinbasepro/coinbasepro_wrapper.go +++ b/exchanges/coinbasepro/coinbasepro_wrapper.go @@ -13,6 +13,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -71,9 +72,36 @@ func (c *CoinbasePro) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: false, + RESTCapabilities: protocol.Features{ + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + FiatDeposit: true, + FiatWithdraw: true, + TradeFee: true, + FiatDepositFee: true, + FiatWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, + MessageSequenceNumbers: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | exchange.AutoWithdrawFiatWithAPIPermission, @@ -92,12 +120,6 @@ func (c *CoinbasePro) SetDefaults() { c.API.Endpoints.URL = c.API.Endpoints.URLDefault c.API.Endpoints.WebsocketURL = coinbaseproWebsocketURL c.Websocket = wshandler.New() - c.Websocket.Functionality = wshandler.WebsocketTickerSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketSequenceNumberSupported c.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit c.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout c.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -127,6 +149,7 @@ func (c *CoinbasePro) Setup(exch *config.ExchangeConfig) error { Connector: c.WsConnect, Subscriber: c.Subscribe, UnSubscriber: c.Unsubscribe, + Features: &c.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/coinut/coinut_test.go b/exchanges/coinut/coinut_test.go index 35ed6da6..1fb1bcee 100644 --- a/exchanges/coinut/coinut_test.go +++ b/exchanges/coinut/coinut_test.go @@ -31,11 +31,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Coinut load config error", err) + t.Fatal("Coinut load config error", err) } bConfig, err := cfg.GetExchangeConfig("COINUT") if err != nil { - t.Error("Test Failed - Coinut Setup() init error") + t.Error("Coinut Setup() init error") } bConfig.API.AuthenticatedSupport = true bConfig.API.AuthenticatedWebsocketSupport = true @@ -44,12 +44,12 @@ func TestSetup(t *testing.T) { bConfig.Verbose = true err = c.Setup(bConfig) if err != nil { - t.Fatal("Test Failed - Coinut setup error", err) + t.Fatal("Coinut setup error", err) } if !c.IsEnabled() || !c.Verbose || c.Websocket.IsEnabled() || len(c.BaseCurrencies) < 1 { - t.Error("Test Failed - Coinut Setup values not set correctly") + t.Error("Coinut Setup values not set correctly") } } @@ -88,7 +88,7 @@ func setupWSTestAuth(t *testing.T) { func TestGetInstruments(t *testing.T) { _, err := c.GetInstruments() if err != nil { - t.Error("Test failed - GetInstruments() error", err) + t.Error("GetInstruments() error", err) } } @@ -138,7 +138,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := c.GetFee(feeBuilder); resp != float64(0.001) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0010), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0010), resp) } // CryptocurrencyTradeFee High quantity @@ -146,7 +146,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := c.GetFee(feeBuilder); resp != float64(1000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(1000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(1000), resp) t.Error(err) } @@ -154,7 +154,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -162,7 +162,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -170,7 +170,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -178,7 +178,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -187,7 +187,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.EUR if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -196,7 +196,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.USD if resp, err := c.GetFee(feeBuilder); resp != float64(10) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(10), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(10), resp) t.Error(err) } @@ -205,7 +205,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.SGD if resp, err := c.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -214,7 +214,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := c.GetFee(feeBuilder); resp != float64(10) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(10), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(10), resp) t.Error(err) } @@ -223,7 +223,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.CAD if resp, err := c.GetFee(feeBuilder); resp != float64(2) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2), resp) t.Error(err) } @@ -232,7 +232,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.SGD if resp, err := c.GetFee(feeBuilder); resp != float64(10) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(10), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(10), resp) t.Error(err) } @@ -241,7 +241,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.CAD if resp, err := c.GetFee(feeBuilder); resp != float64(2) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2), resp) t.Error(err) } } @@ -384,12 +384,12 @@ func TestGetAccountInfo(t *testing.T) { if apiKey != "" || clientID != "" { _, err := c.GetAccountInfo() if err != nil { - t.Error("Test Failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() error", err) } } else { _, err := c.GetAccountInfo() if err == nil { - t.Error("Test Failed - GetAccountInfo() error") + t.Error("GetAccountInfo() Expected error") } } } @@ -397,7 +397,7 @@ func TestGetAccountInfo(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := c.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -456,7 +456,7 @@ func TestWithdrawInternationalBank(t *testing.T) { func TestGetDepositAddress(t *testing.T) { _, err := c.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() function unsupported cannot be nil") + t.Error("GetDepositAddress() function unsupported cannot be nil") } } diff --git a/exchanges/coinut/coinut_wrapper.go b/exchanges/coinut/coinut_wrapper.go index 08cc097c..687833c7 100644 --- a/exchanges/coinut/coinut_wrapper.go +++ b/exchanges/coinut/coinut_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,9 +70,33 @@ func (c *COINUT) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: false, + RESTCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + SubmitOrders: true, + UserTradeHistory: true, + TradeFee: true, + FiatDepositFee: true, + FiatWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + OrderbookFetching: true, + TradeFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, + SubmitOrder: true, + SubmitOrders: true, + CancelOrder: true, + MessageCorrelation: true, }, WithdrawPermissions: exchange.WithdrawCryptoViaWebsiteOnly | exchange.WithdrawFiatViaWebsiteOnly, @@ -90,15 +115,6 @@ func (c *COINUT) SetDefaults() { c.API.Endpoints.URL = c.API.Endpoints.URLDefault c.API.Endpoints.WebsocketURL = coinutWebsocketURL c.Websocket = wshandler.New() - c.Websocket.Functionality = wshandler.WebsocketTickerSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketSubmitOrderSupported | - wshandler.WebsocketCancelOrderSupported | - wshandler.WebsocketMessageCorrelationSupported c.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit c.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout c.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -128,6 +144,7 @@ func (c *COINUT) Setup(exch *config.ExchangeConfig) error { Connector: c.WsConnect, Subscriber: c.Subscribe, UnSubscriber: c.Unsubscribe, + Features: &c.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/exchange.go b/exchanges/exchange.go index f218aa4a..a5376011 100644 --- a/exchanges/exchange.go +++ b/exchanges/exchange.go @@ -12,6 +12,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" log "github.com/thrasher-corp/gocryptotrader/logger" ) @@ -101,7 +102,7 @@ func (e *Base) SetFeatureDefaults() { Supports: config.FeaturesSupportedConfig{ Websocket: e.Features.Supports.Websocket, REST: e.Features.Supports.REST, - RESTCapabilities: config.ProtocolFeaturesConfig{ + RESTCapabilities: protocol.Features{ AutoPairUpdates: e.Features.Supports.RESTCapabilities.AutoPairUpdates, }, }, diff --git a/exchanges/exchange_test.go b/exchanges/exchange_test.go index 7a10eab4..3d5beb28 100644 --- a/exchanges/exchange_test.go +++ b/exchanges/exchange_test.go @@ -10,6 +10,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" ) @@ -27,7 +28,7 @@ func TestSupportsRESTTickerBatchUpdates(t *testing.T) { Features: Features{ Supports: FeaturesSupported{ REST: true, - RESTCapabilities: ProtocolFeatures{ + RESTCapabilities: protocol.Features{ TickerBatching: true, }, }, @@ -35,7 +36,7 @@ func TestSupportsRESTTickerBatchUpdates(t *testing.T) { } if !b.SupportsRESTTickerBatchUpdates() { - t.Fatal("Test failed. TestSupportsRESTTickerBatchUpdates returned false") + t.Fatal("TestSupportsRESTTickerBatchUpdates returned false") } } @@ -46,7 +47,7 @@ func TestHTTPClient(t *testing.T) { r.SetHTTPClientTimeout(time.Second * 5) if r.GetHTTPClient().Timeout != time.Second*5 { - t.Fatalf("Test failed. TestHTTPClient unexpected value") + t.Fatalf("TestHTTPClient unexpected value") } r.Requester = nil @@ -55,12 +56,12 @@ func TestHTTPClient(t *testing.T) { r.SetHTTPClient(newClient) if r.GetHTTPClient().Timeout != time.Second*10 { - t.Fatalf("Test failed. TestHTTPClient unexpected value") + t.Fatalf("TestHTTPClient unexpected value") } r.Requester = nil if r.GetHTTPClient() == nil { - t.Fatalf("Test failed. TestHTTPClient unexpected value") + t.Fatalf("TestHTTPClient unexpected value") } b := Base{Name: "RAWR"} @@ -71,7 +72,7 @@ func TestHTTPClient(t *testing.T) { b.SetHTTPClientTimeout(time.Second * 5) if b.GetHTTPClient().Timeout != time.Second*5 { - t.Fatalf("Test failed. TestHTTPClient unexpected value") + t.Fatalf("TestHTTPClient unexpected value") } newClient = new(http.Client) @@ -79,7 +80,7 @@ func TestHTTPClient(t *testing.T) { b.SetHTTPClient(newClient) if b.GetHTTPClient().Timeout != time.Second*10 { - t.Fatalf("Test failed. TestHTTPClient unexpected value") + t.Fatalf("TestHTTPClient unexpected value") } b.SetHTTPClientUserAgent("epicUserAgent") @@ -103,16 +104,16 @@ func TestSetClientProxyAddress(t *testing.T) { newBase.Websocket = wshandler.New() err := newBase.SetClientProxyAddress(":invalid") if err == nil { - t.Error("Test failed. SetClientProxyAddress parsed invalid URL") + t.Error("SetClientProxyAddress parsed invalid URL") } if newBase.Websocket.GetProxyAddress() != "" { - t.Error("Test failed. SetClientProxyAddress error", err) + t.Error("SetClientProxyAddress error", err) } err = newBase.SetClientProxyAddress("www.valid.com") if err != nil { - t.Error("Test failed. SetClientProxyAddress error", err) + t.Error("SetClientProxyAddress error", err) } // calling this again will cause the ws check to fail @@ -122,7 +123,7 @@ func TestSetClientProxyAddress(t *testing.T) { } if newBase.Websocket.GetProxyAddress() != "www.valid.com" { - t.Error("Test failed. SetClientProxyAddress error", err) + t.Error("SetClientProxyAddress error", err) } } @@ -137,7 +138,7 @@ func TestSetFeatureDefaults(t *testing.T) { Features: Features{ Supports: FeaturesSupported{ REST: true, - RESTCapabilities: ProtocolFeatures{ + RESTCapabilities: protocol.Features{ TickerBatching: true, }, Websocket: true, @@ -233,22 +234,22 @@ func TestSetHTTPRateLimiter(t *testing.T) { func TestSetAutoPairDefaults(t *testing.T) { cfg := config.GetConfig() - err := cfg.LoadConfig(config.ConfigTestFile, true) + err := cfg.LoadConfig(config.TestFile, true) if err != nil { - t.Fatalf("Test failed. TestSetAutoPairDefaults failed to load config file. Error: %s", err) + t.Fatalf("TestSetAutoPairDefaults failed to load config file. Error: %s", err) } exch, err := cfg.GetExchangeConfig("Bitstamp") if err != nil { - t.Fatalf("Test failed. TestSetAutoPairDefaults load config failed. Error %s", err) + t.Fatalf("TestSetAutoPairDefaults load config failed. Error %s", err) } if !exch.Features.Supports.RESTCapabilities.AutoPairUpdates { - t.Fatalf("Test failed. TestSetAutoPairDefaults Incorrect value") + t.Fatalf("TestSetAutoPairDefaults Incorrect value") } if exch.CurrencyPairs.LastUpdated != 0 { - t.Fatalf("Test failed. TestSetAutoPairDefaults Incorrect value") + t.Fatalf("TestSetAutoPairDefaults Incorrect value") } exch.Features.Supports.RESTCapabilities.AutoPairUpdates = false @@ -256,11 +257,11 @@ func TestSetAutoPairDefaults(t *testing.T) { exch, err = cfg.GetExchangeConfig("Bitstamp") if err != nil { - t.Fatalf("Test failed. TestSetAutoPairDefaults load config failed. Error %s", err) + t.Fatalf("TestSetAutoPairDefaults load config failed. Error %s", err) } if exch.Features.Supports.RESTCapabilities.AutoPairUpdates { - t.Fatal("Test failed. TestSetAutoPairDefaults Incorrect value") + t.Fatal("TestSetAutoPairDefaults Incorrect value") } } @@ -289,7 +290,7 @@ func TestGetLastPairsUpdateTime(t *testing.T) { b.CurrencyPairs.LastUpdated = testTime if b.GetLastPairsUpdateTime() != testTime { - t.Fatal("Test failed. TestGetLastPairsUpdateTim Incorrect value") + t.Fatal("TestGetLastPairsUpdateTim Incorrect value") } } @@ -339,13 +340,13 @@ func TestGetAssetTypes(t *testing.T) { aT := testExchange.GetAssetTypes() if len(aT) != 3 { - t.Error("Test failed. TestGetAssetTypes failed") + t.Error("TestGetAssetTypes failed") } } func TestGetClientBankAccounts(t *testing.T) { cfg := config.GetConfig() - err := cfg.LoadConfig(config.ConfigTestFile, true) + err := cfg.LoadConfig(config.TestFile, true) if err != nil { t.Fatal(err) } @@ -363,13 +364,13 @@ func TestGetClientBankAccounts(t *testing.T) { r, err = b.GetClientBankAccounts("MEOW", "USD") if err == nil { - t.Error("an error should of been thrown for a non-existent exchange") + t.Error("an error should have been thrown for a non-existent exchange") } } func TestGetExchangeBankAccounts(t *testing.T) { cfg := config.GetConfig() - err := cfg.LoadConfig(config.ConfigTestFile, true) + err := cfg.LoadConfig(config.TestFile, true) if err != nil { t.Fatal(err) } @@ -387,7 +388,7 @@ func TestGetExchangeBankAccounts(t *testing.T) { _, err = b.GetExchangeBankAccounts("MEOW", "USD") if err == nil { - t.Error("an error should of been thrown for a non-existent exchange") + t.Error("an error should have been thrown for a non-existent exchange") } } @@ -451,17 +452,17 @@ func TestGetAuthenticatedAPISupport(t *testing.T) { } if !base.GetAuthenticatedAPISupport(RestAuthentication) { - t.Fatal("Test failed. Expected RestAuthentication to return true") + t.Fatal("Expected RestAuthentication to return true") } if base.GetAuthenticatedAPISupport(WebsocketAuthentication) { - t.Fatal("Test failed. Expected WebsocketAuthentication to return false") + t.Fatal("Expected WebsocketAuthentication to return false") } base.API.AuthenticatedWebsocketSupport = true if !base.GetAuthenticatedAPISupport(WebsocketAuthentication) { - t.Fatal("Test failed. Expected WebsocketAuthentication to return true") + t.Fatal("Expected WebsocketAuthentication to return true") } if base.GetAuthenticatedAPISupport(2) { - t.Fatal("Test failed. Expected default case of 'false' to be returned") + t.Fatal("Expected default case of 'false' to be returned") } } @@ -474,7 +475,7 @@ func TestGetName(t *testing.T) { name := b.GetName() if name != "TESTNAME" { - t.Error("Test Failed - Exchange GetName() returned incorrect name") + t.Error("Exchange GetName() returned incorrect name") } } @@ -563,21 +564,21 @@ func TestGetEnabledPairs(t *testing.T) { c := b.GetEnabledPairs(assetType) if c[0].String() != defaultTestCurrencyPair { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } format.Delimiter = "~" b.CurrencyPairs.RequestFormat = &format c = b.GetEnabledPairs(assetType) if c[0].String() != "BTC~USD" { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } format.Delimiter = "" b.CurrencyPairs.ConfigFormat = &format c = b.GetEnabledPairs(assetType) if c[0].String() != "BTCUSD" { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } b.CurrencyPairs.StorePairs(asset.Spot, @@ -586,7 +587,7 @@ func TestGetEnabledPairs(t *testing.T) { b.CurrencyPairs.ConfigFormat = &format c = b.GetEnabledPairs(assetType) if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } b.CurrencyPairs.StorePairs(asset.Spot, @@ -595,7 +596,7 @@ func TestGetEnabledPairs(t *testing.T) { b.CurrencyPairs.ConfigFormat.Delimiter = "_" c = b.GetEnabledPairs(assetType) if c[0].Base != currency.BTC && c[0].Quote != currency.USD { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } b.CurrencyPairs.StorePairs(asset.Spot, @@ -605,7 +606,7 @@ func TestGetEnabledPairs(t *testing.T) { b.CurrencyPairs.ConfigFormat.Index = currency.BTC.String() c = b.GetEnabledPairs(assetType) if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } b.CurrencyPairs.StorePairs(asset.Spot, @@ -613,7 +614,7 @@ func TestGetEnabledPairs(t *testing.T) { b.CurrencyPairs.ConfigFormat.Index = "" c = b.GetEnabledPairs(assetType) if c[0].Base != currency.BTC && c[0].Quote != currency.USD { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } } @@ -639,21 +640,21 @@ func TestGetAvailablePairs(t *testing.T) { c := b.GetAvailablePairs(assetType) if c[0].String() != defaultTestCurrencyPair { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } format.Delimiter = "~" b.CurrencyPairs.RequestFormat = &format c = b.GetAvailablePairs(assetType) if c[0].String() != "BTC~USD" { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } format.Delimiter = "" b.CurrencyPairs.ConfigFormat = &format c = b.GetAvailablePairs(assetType) if c[0].String() != "BTCUSD" { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } b.CurrencyPairs.StorePairs(asset.Spot, @@ -662,7 +663,7 @@ func TestGetAvailablePairs(t *testing.T) { b.CurrencyPairs.ConfigFormat = &format c = b.GetAvailablePairs(assetType) if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } b.CurrencyPairs.StorePairs(asset.Spot, @@ -671,7 +672,7 @@ func TestGetAvailablePairs(t *testing.T) { b.CurrencyPairs.ConfigFormat.Delimiter = "_" c = b.GetAvailablePairs(assetType) if c[0].Base != currency.BTC && c[0].Quote != currency.USD { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } b.CurrencyPairs.StorePairs(asset.Spot, @@ -681,7 +682,7 @@ func TestGetAvailablePairs(t *testing.T) { b.CurrencyPairs.ConfigFormat.Index = currency.BTC.String() c = b.GetAvailablePairs(assetType) if c[0].Base != currency.BTC && c[0].Quote != currency.DOGE { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } b.CurrencyPairs.StorePairs(asset.Spot, @@ -689,7 +690,7 @@ func TestGetAvailablePairs(t *testing.T) { b.CurrencyPairs.ConfigFormat.Index = "" c = b.GetAvailablePairs(assetType) if c[0].Base != currency.BTC && c[0].Quote != currency.USD { - t.Error("Test Failed - Exchange GetAvailablePairs() incorrect string") + t.Error("Exchange GetAvailablePairs() incorrect string") } } @@ -717,15 +718,15 @@ func TestSupportsPair(t *testing.T) { assetType := asset.Spot if !b.SupportsPair(currency.NewPair(currency.BTC, currency.USD), true, assetType) { - t.Error("Test Failed - Exchange SupportsPair() incorrect value") + t.Error("Exchange SupportsPair() incorrect value") } if !b.SupportsPair(currency.NewPair(currency.ETH, currency.USD), false, assetType) { - t.Error("Test Failed - Exchange SupportsPair() incorrect value") + t.Error("Exchange SupportsPair() incorrect value") } if b.SupportsPair(currency.NewPairFromStrings("ASD", "ASDF"), true, assetType) { - t.Error("Test Failed - Exchange SupportsPair() incorrect value") + t.Error("Exchange SupportsPair() incorrect value") } } @@ -756,11 +757,11 @@ func TestFormatExchangeCurrencies(t *testing.T) { actual, err := e.FormatExchangeCurrencies(pairs, asset.Spot) if err != nil { - t.Errorf("Test failed - Exchange TestFormatExchangeCurrencies error %s", err) + t.Errorf("Exchange TestFormatExchangeCurrencies error %s", err) } expected := "btc~usd^ltc~btc" if actual != expected { - t.Errorf("Test failed - Exchange TestFormatExchangeCurrencies %s != %s", + t.Errorf("Exchange TestFormatExchangeCurrencies %s != %s", actual, expected) } @@ -785,7 +786,7 @@ func TestFormatExchangeCurrency(t *testing.T) { actual := b.FormatExchangeCurrency(p, asset.Spot) if actual.String() != expected { - t.Errorf("Test failed - Exchange TestFormatExchangeCurrency %s != %s", + t.Errorf("Exchange TestFormatExchangeCurrency %s != %s", actual, expected) } } @@ -800,7 +801,7 @@ func TestSetEnabled(t *testing.T) { SetEnabled.SetEnabled(true) if !SetEnabled.Enabled { - t.Error("Test Failed - Exchange SetEnabled(true) did not set boolean") + t.Error("Exchange SetEnabled(true) did not set boolean") } } @@ -813,7 +814,7 @@ func TestIsEnabled(t *testing.T) { } if IsEnabled.IsEnabled() { - t.Error("Test Failed - Exchange IsEnabled() did not return correct boolean") + t.Error("Exchange IsEnabled() did not return correct boolean") } } @@ -1048,14 +1049,14 @@ func TestSetPairs(t *testing.T) { func TestUpdatePairs(t *testing.T) { cfg := config.GetConfig() - err := cfg.LoadConfig(config.ConfigTestFile, true) + err := cfg.LoadConfig(config.TestFile, true) if err != nil { - t.Fatal("Test failed. TestUpdatePairs failed to load config") + t.Fatal("TestUpdatePairs failed to load config") } anxCfg, err := cfg.GetExchangeConfig(defaultTestExchange) if err != nil { - t.Fatal("Test failed. TestUpdatePairs failed to load config") + t.Fatal("TestUpdatePairs failed to load config") } UAC := Base{Name: defaultTestExchange} @@ -1063,20 +1064,20 @@ func TestUpdatePairs(t *testing.T) { exchangeProducts := currency.NewPairsFromStrings([]string{"ltc", "btc", "usd", "aud", ""}) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, true, false) if err != nil { - t.Errorf("Test Failed - TestUpdatePairs error: %s", err) + t.Errorf("TestUpdatePairs error: %s", err) } // Test updating the same new products, diff should be 0 err = UAC.UpdatePairs(exchangeProducts, asset.Spot, true, false) if err != nil { - t.Errorf("Test Failed - TestUpdatePairs error: %s", err) + t.Errorf("TestUpdatePairs error: %s", err) } // Test force updating to only one product exchangeProducts = currency.NewPairsFromStrings([]string{"btc"}) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, true, true) if err != nil { - t.Errorf("Test Failed - TestUpdatePairs error: %s", err) + t.Errorf("TestUpdatePairs error: %s", err) } // Test updating exchange products @@ -1084,34 +1085,34 @@ func TestUpdatePairs(t *testing.T) { UAC.Name = defaultTestExchange err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false) if err != nil { - t.Errorf("Test Failed - Exchange UpdatePairs() error: %s", err) + t.Errorf("Exchange UpdatePairs() error: %s", err) } // Test updating the same new products, diff should be 0 err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false) if err != nil { - t.Errorf("Test Failed - Exchange UpdatePairs() error: %s", err) + t.Errorf("Exchange UpdatePairs() error: %s", err) } // Test force updating to only one product exchangeProducts = currency.NewPairsFromStrings([]string{"btc"}) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, true) if err != nil { - t.Errorf("Test Failed - Forced Exchange UpdatePairs() error: %s", err) + t.Errorf("Forced Exchange UpdatePairs() error: %s", err) } // Test update currency pairs with btc excluded exchangeProducts = currency.NewPairsFromStrings([]string{"ltc", "eth"}) err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false) if err != nil { - t.Errorf("Test Failed - Forced Exchange UpdatePairs() error: %s", err) + t.Errorf("Forced Exchange UpdatePairs() error: %s", err) } // Test that empty exchange products should return an error exchangeProducts = nil err = UAC.UpdatePairs(exchangeProducts, asset.Spot, false, false) if err == nil { - t.Errorf("Test failed - empty available pairs should return an error") + t.Errorf("empty available pairs should return an error") } // Test empty pair @@ -1122,7 +1123,7 @@ func TestUpdatePairs(t *testing.T) { } err = UAC.UpdatePairs(pairs, asset.Spot, true, true) if err != nil { - t.Errorf("Test Failed - Forced Exchange UpdatePairs() error: %s", err) + t.Errorf("Forced Exchange UpdatePairs() error: %s", err) } UAC.CurrencyPairs.UseGlobalFormat = true UAC.CurrencyPairs.ConfigFormat = ¤cy.PairFormat{ @@ -1146,7 +1147,7 @@ func TestSetAPIURL(t *testing.T) { err := tester.SetAPIURL() if err == nil { - t.Error("test failed - setting zero value config") + t.Error("setting zero value config") } tester.Config.API.Endpoints.URL = testURL @@ -1157,23 +1158,23 @@ func TestSetAPIURL(t *testing.T) { err = tester.SetAPIURL() if err != nil { - t.Error("test failed", err) + t.Error(err) } if tester.GetAPIURL() != testURL { - t.Error("test failed - incorrect return URL") + t.Error("incorrect return URL") } if tester.GetSecondaryAPIURL() != testURLSecondary { - t.Error("test failed - incorrect return URL") + t.Error("incorrect return URL") } if tester.GetAPIURLDefault() != testURLDefault { - t.Error("test failed - incorrect return URL") + t.Error("incorrect return URL") } if tester.GetAPIURLSecondaryDefault() != testURLSecondaryDefault { - t.Error("test failed - incorrect return URL") + t.Error("incorrect return URL") } } @@ -1318,11 +1319,11 @@ func TestOrderSides(t *testing.T) { var os = BuyOrderSide if os.ToString() != "BUY" { - t.Errorf("test failed - unexpected string %s", os.ToString()) + t.Errorf("unexpected string %s", os.ToString()) } if os.ToLower() != "buy" { - t.Errorf("test failed - unexpected string %s", os.ToString()) + t.Errorf("unexpected string %s", os.ToString()) } } @@ -1332,11 +1333,11 @@ func TestOrderTypes(t *testing.T) { var ot OrderType = "Mo'Money" if ot.ToString() != "Mo'Money" { - t.Errorf("test failed - unexpected string %s", ot.ToString()) + t.Errorf("unexpected string %s", ot.ToString()) } if ot.ToLower() != "mo'money" { - t.Errorf("test failed - unexpected string %s", ot.ToString()) + t.Errorf("unexpected string %s", ot.ToString()) } } @@ -1491,12 +1492,12 @@ func TestSortOrdersByPrice(t *testing.T) { SortOrdersByPrice(&orders, false) if orders[0].Price != 0 { - t.Errorf("Test failed. Expected: '%v', received: '%v'", 0, orders[0].Price) + t.Errorf("Expected: '%v', received: '%v'", 0, orders[0].Price) } SortOrdersByPrice(&orders, true) if orders[0].Price != 100 { - t.Errorf("Test failed. Expected: '%v', received: '%v'", 100, orders[0].Price) + t.Errorf("Expected: '%v', received: '%v'", 100, orders[0].Price) } } @@ -1515,14 +1516,14 @@ func TestSortOrdersByDate(t *testing.T) { SortOrdersByDate(&orders, false) if orders[0].OrderDate.Unix() != time.Unix(0, 0).Unix() { - t.Errorf("Test failed. Expected: '%v', received: '%v'", + t.Errorf("Expected: '%v', received: '%v'", time.Unix(0, 0).Unix(), orders[0].OrderDate.Unix()) } SortOrdersByDate(&orders, true) if orders[0].OrderDate.Unix() != time.Unix(2, 0).Unix() { - t.Errorf("Test failed. Expected: '%v', received: '%v'", + t.Errorf("Expected: '%v', received: '%v'", time.Unix(2, 0).Unix(), orders[0].OrderDate.Unix()) } @@ -1557,14 +1558,14 @@ func TestSortOrdersByCurrency(t *testing.T) { SortOrdersByCurrency(&orders, false) if orders[0].CurrencyPair.String() != currency.BTC.String()+"-"+currency.RUB.String() { - t.Errorf("Test failed. Expected: '%v', received: '%v'", + t.Errorf("Expected: '%v', received: '%v'", currency.BTC.String()+"-"+currency.RUB.String(), orders[0].CurrencyPair.String()) } SortOrdersByCurrency(&orders, true) if orders[0].CurrencyPair.String() != currency.LTC.String()+"-"+currency.EUR.String() { - t.Errorf("Test failed. Expected: '%v', received: '%v'", + t.Errorf("Expected: '%v', received: '%v'", currency.LTC.String()+"-"+currency.EUR.String(), orders[0].CurrencyPair.String()) } @@ -1587,14 +1588,14 @@ func TestSortOrdersByOrderSide(t *testing.T) { SortOrdersBySide(&orders, false) if !strings.EqualFold(orders[0].OrderSide.ToString(), BuyOrderSide.ToString()) { - t.Errorf("Test failed. Expected: '%v', received: '%v'", + t.Errorf("Expected: '%v', received: '%v'", BuyOrderSide, orders[0].OrderSide) } SortOrdersBySide(&orders, true) if !strings.EqualFold(orders[0].OrderSide.ToString(), SellOrderSide.ToString()) { - t.Errorf("Test failed. Expected: '%v', received: '%v'", + t.Errorf("Expected: '%v', received: '%v'", SellOrderSide, orders[0].OrderSide) } @@ -1617,12 +1618,12 @@ func TestSortOrdersByOrderType(t *testing.T) { SortOrdersByType(&orders, false) if !strings.EqualFold(orders[0].OrderType.ToString(), ImmediateOrCancelOrderType.ToString()) { - t.Errorf("Test failed. Expected: '%v', received: '%v'", ImmediateOrCancelOrderType, orders[0].OrderType) + t.Errorf("Expected: '%v', received: '%v'", ImmediateOrCancelOrderType, orders[0].OrderType) } SortOrdersByType(&orders, true) if !strings.EqualFold(orders[0].OrderType.ToString(), TrailingStopOrderType.ToString()) { - t.Errorf("Test failed. Expected: '%v', received: '%v'", TrailingStopOrderType, orders[0].OrderType) + t.Errorf("Expected: '%v', received: '%v'", TrailingStopOrderType, orders[0].OrderType) } } diff --git a/exchanges/exchange_types.go b/exchanges/exchange_types.go index 8e9ec272..344e8e6c 100644 --- a/exchanges/exchange_types.go +++ b/exchanges/exchange_types.go @@ -5,6 +5,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/config" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" ) @@ -228,41 +229,12 @@ type FeaturesEnabled struct { AutoPairUpdates bool } -// ProtocolFeatures holds all variables for the exchanges supported features -// for a protocol (e.g REST or Websocket) -type ProtocolFeatures struct { - TickerBatching bool - TickerFetching bool - OrderbookFetching bool - AutoPairUpdates bool - AccountInfo bool - CryptoDeposit bool - CryptoWithdrawal uint32 - FiatWithdraw bool - GetOrder bool - GetOrders bool - CancelOrders bool - CancelOrder bool - SubmitOrder bool - SubmitOrders bool - ModifyOrder bool - DepositHistory bool - WithdrawalHistory bool - TradeHistory bool - UserTradeHistory bool - TradeFee bool - FiatDepositFee bool - FiatWithdrawalFee bool - CryptoDepositFee bool - CryptoWithdrawalFee bool -} - // FeaturesSupported stores the exchanges supported features type FeaturesSupported struct { REST bool - RESTCapabilities ProtocolFeatures + RESTCapabilities protocol.Features Websocket bool - WebsocketCapabilities ProtocolFeatures + WebsocketCapabilities protocol.Features WithdrawPermissions uint32 } diff --git a/exchanges/exmo/exmo_test.go b/exchanges/exmo/exmo_test.go index 3288c50b..d78d0822 100644 --- a/exchanges/exmo/exmo_test.go +++ b/exchanges/exmo/exmo_test.go @@ -28,16 +28,16 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Exmo load config error", err) + log.Fatal("Exmo load config error", err) } exmoConf, err := cfg.GetExchangeConfig("EXMO") if err != nil { - t.Error("Test Failed - Exmo Setup() init error") + t.Error("Exmo Setup() init error") } err = e.Setup(exmoConf) if err != nil { - t.Fatal("Test Failed - Exmo setup error", err) + t.Fatal("Exmo setup error", err) } e.API.AuthenticatedSupport = true @@ -49,7 +49,7 @@ func TestGetTrades(t *testing.T) { t.Parallel() _, err := e.GetTrades("BTC_USD") if err != nil { - t.Errorf("Test failed. Err: %s", err) + t.Errorf("Err: %s", err) } } @@ -57,7 +57,7 @@ func TestGetOrderbook(t *testing.T) { t.Parallel() _, err := e.GetOrderbook("BTC_USD") if err != nil { - t.Errorf("Test failed. Err: %s", err) + t.Errorf("Err: %s", err) } } @@ -65,7 +65,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := e.GetTicker() if err != nil { - t.Errorf("Test failed. Err: %s", err) + t.Errorf("Err: %s", err) } } @@ -73,7 +73,7 @@ func TestGetPairSettings(t *testing.T) { t.Parallel() _, err := e.GetPairSettings() if err != nil { - t.Errorf("Test failed. Err: %s", err) + t.Errorf("Err: %s", err) } } @@ -81,7 +81,7 @@ func TestGetCurrency(t *testing.T) { t.Parallel() _, err := e.GetCurrency() if err != nil { - t.Errorf("Test failed. Err: %s", err) + t.Errorf("Err: %s", err) } } @@ -93,7 +93,7 @@ func TestGetUserInfo(t *testing.T) { TestSetup(t) _, err := e.GetUserInfo() if err != nil { - t.Errorf("Test failed. Err: %s", err) + t.Errorf("Err: %s", err) } } @@ -105,7 +105,7 @@ func TestGetRequiredAmount(t *testing.T) { TestSetup(t) _, err := e.GetRequiredAmount("BTC_USD", 100) if err != nil { - t.Errorf("Test failed. Err: %s", err) + t.Errorf("Err: %s", err) } } @@ -145,7 +145,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := e.GetFee(feeBuilder); resp != float64(0.002) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) } // CryptocurrencyTradeFee High quantity @@ -153,7 +153,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := e.GetFee(feeBuilder); resp != float64(2000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2000), resp) t.Error(err) } @@ -161,7 +161,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := e.GetFee(feeBuilder); resp != float64(0.002) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) t.Error(err) } @@ -169,7 +169,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := e.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -177,7 +177,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := e.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Error(err) } @@ -186,7 +186,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := e.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -194,7 +194,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := e.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -203,7 +203,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.RUB if resp, err := e.GetFee(feeBuilder); resp != float64(1600) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(1600), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(1600), resp) t.Error(err) } @@ -212,7 +212,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankDepositFee feeBuilder.FiatCurrency = currency.PLN if resp, err := e.GetFee(feeBuilder); resp != float64(30) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(30), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(30), resp) t.Error(err) } @@ -221,7 +221,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.PLN if resp, err := e.GetFee(feeBuilder); resp != float64(125) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(125), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(125), resp) t.Error(err) } @@ -230,7 +230,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.TRY if resp, err := e.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -239,7 +239,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.EUR if resp, err := e.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -248,7 +248,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.RUB if resp, err := e.GetFee(feeBuilder); resp != float64(3200) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(3200), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(3200), resp) t.Error(err) } } @@ -393,7 +393,7 @@ func TestCancelAllExchangeOrders(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := e.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -456,12 +456,12 @@ func TestGetDepositAddress(t *testing.T) { if areTestAPIKeysSet() { _, err := e.GetDepositAddress(currency.LTC, "") if err != nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } else { _, err := e.GetDepositAddress(currency.LTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } } diff --git a/exchanges/exmo/exmo_wrapper.go b/exchanges/exmo/exmo_wrapper.go index abccfa43..6aa4fcb6 100644 --- a/exchanges/exmo/exmo_wrapper.go +++ b/exchanges/exmo/exmo_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -71,9 +72,27 @@ func (e *EXMO) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: false, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + SubmitOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + FiatDepositFee: true, + FiatWithdrawalFee: true, + CryptoDepositFee: true, + CryptoWithdrawalFee: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithSetup | exchange.NoFiatWithdrawals, diff --git a/exchanges/gateio/gateio_test.go b/exchanges/gateio/gateio_test.go index cdeb8d19..6ba9a5ab 100644 --- a/exchanges/gateio/gateio_test.go +++ b/exchanges/gateio/gateio_test.go @@ -32,11 +32,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - GateIO load config error", err) + t.Fatal("GateIO load config error", err) } gateioConfig, err := cfg.GetExchangeConfig("GateIO") if err != nil { - t.Error("Test Failed - GateIO Setup() init error") + t.Error("GateIO Setup() init error") } gateioConfig.API.AuthenticatedSupport = true gateioConfig.API.AuthenticatedWebsocketSupport = true @@ -45,7 +45,7 @@ func TestSetup(t *testing.T) { err = g.Setup(gateioConfig) if err != nil { - t.Fatal("Test Failed - GateIO setup error", err) + t.Fatal("GateIO setup error", err) } } @@ -53,7 +53,7 @@ func TestGetSymbols(t *testing.T) { t.Parallel() _, err := g.GetSymbols() if err != nil { - t.Errorf("Test failed - Gateio TestGetSymbols: %s", err) + t.Errorf("Gateio TestGetSymbols: %s", err) } } @@ -61,7 +61,7 @@ func TestGetMarketInfo(t *testing.T) { t.Parallel() _, err := g.GetMarketInfo() if err != nil { - t.Errorf("Test failed - Gateio GetMarketInfo: %s", err) + t.Errorf("Gateio GetMarketInfo: %s", err) } } @@ -79,7 +79,7 @@ func TestSpotNewOrder(t *testing.T) { Type: exchange.SellOrderSide.ToLower().ToString(), }) if err != nil { - t.Errorf("Test failed - Gateio SpotNewOrder: %s", err) + t.Errorf("Gateio SpotNewOrder: %s", err) } } @@ -92,7 +92,7 @@ func TestCancelExistingOrder(t *testing.T) { _, err := g.CancelExistingOrder(917591554, "btc_usdt") if err != nil { - t.Errorf("Test failed - Gateio CancelExistingOrder: %s", err) + t.Errorf("Gateio CancelExistingOrder: %s", err) } } @@ -105,7 +105,7 @@ func TestGetBalances(t *testing.T) { _, err := g.GetBalances() if err != nil { - t.Errorf("Test failed - Gateio GetBalances: %s", err) + t.Errorf("Gateio GetBalances: %s", err) } } @@ -113,7 +113,7 @@ func TestGetLatestSpotPrice(t *testing.T) { t.Parallel() _, err := g.GetLatestSpotPrice("btc_usdt") if err != nil { - t.Errorf("Test failed - Gateio GetLatestSpotPrice: %s", err) + t.Errorf("Gateio GetLatestSpotPrice: %s", err) } } @@ -121,7 +121,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := g.GetTicker("btc_usdt") if err != nil { - t.Errorf("Test failed - Gateio GetTicker: %s", err) + t.Errorf("Gateio GetTicker: %s", err) } } @@ -129,7 +129,7 @@ func TestGetTickers(t *testing.T) { t.Parallel() _, err := g.GetTickers() if err != nil { - t.Errorf("Test failed - Gateio GetTicker: %s", err) + t.Errorf("Gateio GetTicker: %s", err) } } @@ -137,7 +137,7 @@ func TestGetOrderbook(t *testing.T) { t.Parallel() _, err := g.GetOrderbook("btc_usdt") if err != nil { - t.Errorf("Test failed - Gateio GetTicker: %s", err) + t.Errorf("Gateio GetTicker: %s", err) } } @@ -151,7 +151,7 @@ func TestGetSpotKline(t *testing.T) { }) if err != nil { - t.Errorf("Test failed - Gateio GetSpotKline: %s", err) + t.Errorf("Gateio GetSpotKline: %s", err) } } @@ -192,7 +192,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := g.GetFee(feeBuilder); resp != float64(0.002) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) } // CryptocurrencyTradeFee High quantity @@ -200,7 +200,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := g.GetFee(feeBuilder); resp != float64(2000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2000), resp) t.Error(err) } @@ -208,7 +208,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := g.GetFee(feeBuilder); resp != float64(0.002) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) t.Error(err) } @@ -216,7 +216,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -224,7 +224,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := g.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) } @@ -233,7 +233,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -241,7 +241,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -249,7 +249,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -258,7 +258,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -405,12 +405,12 @@ func TestGetAccountInfo(t *testing.T) { if apiSecret == "" || apiKey == "" { _, err := g.GetAccountInfo() if err == nil { - t.Error("Test Failed - GetAccountInfo() error") + t.Error("GetAccountInfo() Expected error") } } else { _, err := g.GetAccountInfo() if err != nil { - t.Error("Test Failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() error", err) } } } @@ -418,7 +418,7 @@ func TestGetAccountInfo(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := g.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } diff --git a/exchanges/gateio/gateio_wrapper.go b/exchanges/gateio/gateio_wrapper.go index d3d602a0..c4436beb 100644 --- a/exchanges/gateio/gateio_wrapper.go +++ b/exchanges/gateio/gateio_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,9 +70,34 @@ func (g *Gateio) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + OrderbookFetching: true, + TradeFetching: true, + KlineFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, + MessageCorrelation: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.NoFiatWithdrawals, @@ -92,14 +118,6 @@ func (g *Gateio) SetDefaults() { g.API.Endpoints.URLSecondary = g.API.Endpoints.URLSecondaryDefault g.API.Endpoints.WebsocketURL = gateioWebsocketEndpoint g.Websocket = wshandler.New() - g.Websocket.Functionality = wshandler.WebsocketTickerSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketKlineSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketMessageCorrelationSupported g.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit g.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout g.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -129,6 +147,7 @@ func (g *Gateio) Setup(exch *config.ExchangeConfig) error { Connector: g.WsConnect, Subscriber: g.Subscribe, UnSubscriber: g.Unsubscribe, + Features: &g.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/gemini/gemini_live_test.go b/exchanges/gemini/gemini_live_test.go index 52721fff..cf5daf3e 100644 --- a/exchanges/gemini/gemini_live_test.go +++ b/exchanges/gemini/gemini_live_test.go @@ -19,11 +19,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Gemini load config error", err) + log.Fatal("Gemini load config error", err) } geminiConfig, err := cfg.GetExchangeConfig("Gemini") if err != nil { - log.Fatal("Test Failed - Gemini Setup() init error", err) + log.Fatal("Gemini Setup() init error", err) } geminiConfig.API.AuthenticatedSupport = true geminiConfig.API.Credentials.Key = apiKey @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { g.SetDefaults() err = g.Setup(geminiConfig) if err != nil { - log.Fatal("Test Failed - Gemini setup error", err) + log.Fatal("Gemini setup error", err) } g.API.Endpoints.URL = geminiSandboxAPIURL log.Printf(sharedtestvalues.LiveTesting, g.GetName(), g.API.Endpoints.URL) diff --git a/exchanges/gemini/gemini_mock_test.go b/exchanges/gemini/gemini_mock_test.go index 4fc36d59..6b56984a 100644 --- a/exchanges/gemini/gemini_mock_test.go +++ b/exchanges/gemini/gemini_mock_test.go @@ -22,11 +22,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Gemini load config error", err) + log.Fatal("Gemini load config error", err) } geminiConfig, err := cfg.GetExchangeConfig("Gemini") if err != nil { - log.Fatal("Test Failed - Mock server error", err) + log.Fatal("Mock server error", err) } g.SkipAuthCheck = true geminiConfig.API.AuthenticatedSupport = true @@ -35,12 +35,12 @@ func TestMain(m *testing.M) { g.SetDefaults() err = g.Setup(geminiConfig) if err != nil { - log.Fatal("Test Failed - Gemini setup error", err) + log.Fatal("Gemini setup error", err) } serverDetails, newClient, err := mock.NewVCRServer(mockFile) if err != nil { - log.Fatalf("Test Failed - Mock server error %s", err) + log.Fatalf("Mock server error %s", err) } g.HTTPClient = newClient diff --git a/exchanges/gemini/gemini_test.go b/exchanges/gemini/gemini_test.go index 32c4b703..032ec73f 100644 --- a/exchanges/gemini/gemini_test.go +++ b/exchanges/gemini/gemini_test.go @@ -30,7 +30,7 @@ func TestGetSymbols(t *testing.T) { t.Parallel() _, err := g.GetSymbols() if err != nil { - t.Error("Test Failed - GetSymbols() error", err) + t.Error("GetSymbols() error", err) } } @@ -38,11 +38,11 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := g.GetTicker("BTCUSD") if err != nil { - t.Error("Test Failed - GetTicker() error", err) + t.Error("GetTicker() error", err) } _, err = g.GetTicker("bla") if err == nil { - t.Error("Test Failed - GetTicker() error", err) + t.Error("GetTicker() Expected error") } } @@ -50,7 +50,7 @@ func TestGetOrderbook(t *testing.T) { t.Parallel() _, err := g.GetOrderbook(testCurrency, url.Values{}) if err != nil { - t.Error("Test Failed - GetOrderbook() error", err) + t.Error("GetOrderbook() error", err) } } @@ -58,7 +58,7 @@ func TestGetTrades(t *testing.T) { t.Parallel() _, err := g.GetTrades(testCurrency, url.Values{}) if err != nil { - t.Error("Test Failed - GetTrades() error", err) + t.Error("GetTrades() error", err) } } @@ -66,9 +66,9 @@ func TestGetNotionalVolume(t *testing.T) { t.Parallel() _, err := g.GetNotionalVolume() if err != nil && mockTests { - t.Error("Test Failed - GetNotionalVolume() error", err) + t.Error("GetNotionalVolume() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - GetNotionalVolume() error cannot be nil") + t.Error("GetNotionalVolume() error cannot be nil") } } @@ -76,7 +76,7 @@ func TestGetAuction(t *testing.T) { t.Parallel() _, err := g.GetAuction(testCurrency) if err != nil { - t.Error("Test Failed - GetAuction() error", err) + t.Error("GetAuction() error", err) } } @@ -84,7 +84,7 @@ func TestGetAuctionHistory(t *testing.T) { t.Parallel() _, err := g.GetAuctionHistory(testCurrency, url.Values{}) if err != nil { - t.Error("Test Failed - GetAuctionHistory() error", err) + t.Error("GetAuctionHistory() error", err) } } @@ -92,9 +92,9 @@ func TestNewOrder(t *testing.T) { t.Parallel() _, err := g.NewOrder(testCurrency, 1, 9000, "buy", "exchange limit") if err != nil && mockTests { - t.Error("Test Failed - NewOrder() error", err) + t.Error("NewOrder() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - NewOrder() error cannot be nil") + t.Error("NewOrder() error cannot be nil") } } @@ -102,9 +102,9 @@ func TestCancelExistingOrder(t *testing.T) { t.Parallel() _, err := g.CancelExistingOrder(265555413) if err != nil && mockTests { - t.Error("Test Failed - CancelExistingOrder() error", err) + t.Error("CancelExistingOrder() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - CancelExistingOrder() error cannot be nil") + t.Error("CancelExistingOrder() error cannot be nil") } } @@ -112,9 +112,9 @@ func TestCancelExistingOrders(t *testing.T) { t.Parallel() _, err := g.CancelExistingOrders(false) if err != nil && mockTests { - t.Error("Test Failed - CancelExistingOrders() error", err) + t.Error("CancelExistingOrders() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - CancelExistingOrders() error cannot be nil") + t.Error("CancelExistingOrders() error cannot be nil") } } @@ -122,9 +122,9 @@ func TestGetOrderStatus(t *testing.T) { t.Parallel() _, err := g.GetOrderStatus(265563260) if err != nil && mockTests { - t.Error("Test Failed - GetOrderStatus() error", err) + t.Error("GetOrderStatus() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - GetOrderStatus() error cannot be nil") + t.Error("GetOrderStatus() error cannot be nil") } } @@ -132,9 +132,9 @@ func TestGetOrders(t *testing.T) { t.Parallel() _, err := g.GetOrders() if err != nil && mockTests { - t.Error("Test Failed - GetOrders() error", err) + t.Error("GetOrders() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - GetOrders() error cannot be nil") + t.Error("GetOrders() error cannot be nil") } } @@ -142,9 +142,9 @@ func TestGetTradeHistory(t *testing.T) { t.Parallel() _, err := g.GetTradeHistory(testCurrency, 0) if err != nil && mockTests { - t.Error("Test Failed - GetTradeHistory() error", err) + t.Error("GetTradeHistory() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - GetTradeHistory() error cannot be nil") + t.Error("GetTradeHistory() error cannot be nil") } } @@ -152,9 +152,9 @@ func TestGetTradeVolume(t *testing.T) { t.Parallel() _, err := g.GetTradeVolume() if err != nil && mockTests { - t.Error("Test Failed - GetTradeVolume() error", err) + t.Error("GetTradeVolume() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - GetTradeVolume() error cannot be nil") + t.Error("GetTradeVolume() error cannot be nil") } } @@ -162,9 +162,9 @@ func TestGetBalances(t *testing.T) { t.Parallel() _, err := g.GetBalances() if err != nil && mockTests { - t.Error("Test Failed - GetBalances() error", err) + t.Error("GetBalances() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - GetBalances() error cannot be nil") + t.Error("GetBalances() error cannot be nil") } } @@ -172,7 +172,7 @@ func TestGetCryptoDepositAddress(t *testing.T) { t.Parallel() _, err := g.GetCryptoDepositAddress("LOL123", "btc") if err == nil { - t.Error("Test Failed - GetCryptoDepositAddress() error", err) + t.Error("GetCryptoDepositAddress() Expected error") } } @@ -180,7 +180,7 @@ func TestWithdrawCrypto(t *testing.T) { t.Parallel() _, err := g.WithdrawCrypto("LOL123", "btc", 1) if err == nil { - t.Error("Test Failed - WithdrawCrypto() error", err) + t.Error("WithdrawCrypto() Expected error") } } @@ -188,9 +188,9 @@ func TestPostHeartbeat(t *testing.T) { t.Parallel() _, err := g.PostHeartbeat() if err != nil && mockTests { - t.Error("Test Failed - PostHeartbeat() error", err) + t.Error("PostHeartbeat() error", err) } else if err == nil && !mockTests { - t.Error("Test Failed - PostHeartbeat() error cannot be nil") + t.Error("PostHeartbeat() error cannot be nil") } } @@ -234,7 +234,7 @@ func TestGetFee(t *testing.T) { if areTestAPIKeysSet() || mockTests { // CryptocurrencyTradeFee Basic if resp, err := g.GetFee(feeBuilder); resp != float64(0.0035) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0035), resp) t.Error(err) @@ -245,7 +245,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := g.GetFee(feeBuilder); resp != float64(3500) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(3500), resp) t.Error(err) @@ -255,7 +255,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := g.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) @@ -265,7 +265,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -275,7 +275,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -286,7 +286,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -296,7 +296,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -306,7 +306,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -317,7 +317,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := g.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) @@ -470,7 +470,7 @@ func TestModifyOrder(t *testing.T) { t.Parallel() _, err := g.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -535,7 +535,7 @@ func TestGetDepositAddress(t *testing.T) { t.Parallel() _, err := g.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress error cannot be nil") + t.Error("GetDepositAddress error cannot be nil") } } diff --git a/exchanges/gemini/gemini_wrapper.go b/exchanges/gemini/gemini_wrapper.go index dd2338a9..93a2cbc9 100644 --- a/exchanges/gemini/gemini_wrapper.go +++ b/exchanges/gemini/gemini_wrapper.go @@ -15,6 +15,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,9 +70,28 @@ func (g *Gemini) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: false, + RESTCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + FiatWithdrawalFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + OrderbookFetching: true, + TradeFetching: true, + AuthenticatedEndpoints: true, + MessageSequenceNumbers: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | exchange.AutoWithdrawCryptoWithSetup | @@ -91,10 +111,6 @@ func (g *Gemini) SetDefaults() { g.API.Endpoints.URL = g.API.Endpoints.URLDefault g.API.Endpoints.WebsocketURL = geminiWebsocketEndpoint g.Websocket = wshandler.New() - g.Websocket.Functionality = wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketSequenceNumberSupported g.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit g.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout g.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -126,6 +142,7 @@ func (g *Gemini) Setup(exch *config.ExchangeConfig) error { ExchangeName: exch.Name, RunningURL: exch.API.Endpoints.WebsocketURL, Connector: g.WsConnect, + Features: &g.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/hitbtc/hitbtc_test.go b/exchanges/hitbtc/hitbtc_test.go index ba39081a..4326501e 100644 --- a/exchanges/hitbtc/hitbtc_test.go +++ b/exchanges/hitbtc/hitbtc_test.go @@ -33,11 +33,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - HitBTC load config error", err) + t.Fatal("HitBTC load config error", err) } hitbtcConfig, err := cfg.GetExchangeConfig("HitBTC") if err != nil { - t.Error("Test Failed - HitBTC Setup() init error") + t.Error("HitBTC Setup() init error") } hitbtcConfig.API.AuthenticatedSupport = true hitbtcConfig.API.AuthenticatedWebsocketSupport = true @@ -46,7 +46,7 @@ func TestSetup(t *testing.T) { err = h.Setup(hitbtcConfig) if err != nil { - t.Fatal("Test Failed - HitBTC setup error", err) + t.Fatal("HitBTC setup error", err) } } @@ -143,7 +143,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := h.GetFee(feeBuilder); resp != float64(0.002) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) } // CryptocurrencyTradeFee High quantity @@ -151,7 +151,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := h.GetFee(feeBuilder); resp != float64(2000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2000), resp) t.Error(err) } @@ -159,7 +159,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := h.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) } @@ -167,7 +167,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -175,7 +175,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := h.GetFee(feeBuilder); resp != float64(0.042800) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.042800), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.042800), resp) t.Error(err) } @@ -184,7 +184,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err == nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -195,7 +195,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.BTC feeBuilder.Pair.Quote = currency.LTC if resp, err := h.GetFee(feeBuilder); resp != float64(0.0006) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0006), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0006), resp) t.Error(err) } @@ -203,7 +203,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -212,7 +212,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -355,7 +355,7 @@ func TestCancelAllExchangeOrders(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := h.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -418,12 +418,12 @@ func TestGetDepositAddress(t *testing.T) { if areTestAPIKeysSet() { _, err := h.GetDepositAddress(currency.BTC, "") if err != nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } else { _, err := h.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } } diff --git a/exchanges/hitbtc/hitbtc_wrapper.go b/exchanges/hitbtc/hitbtc_wrapper.go index f1fcaa90..2c36f2bc 100644 --- a/exchanges/hitbtc/hitbtc_wrapper.go +++ b/exchanges/hitbtc/hitbtc_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,9 +70,36 @@ func (h *HitBTC) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + ModifyOrder: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoDepositFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, + SubmitOrder: true, + CancelOrder: true, + MessageSequenceNumbers: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.NoFiatWithdrawals, @@ -90,14 +118,6 @@ func (h *HitBTC) SetDefaults() { h.API.Endpoints.URL = h.API.Endpoints.URLDefault h.API.Endpoints.WebsocketURL = hitbtcWebsocketAddress h.Websocket = wshandler.New() - h.Websocket.Functionality = wshandler.WebsocketTickerSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketSubmitOrderSupported | - wshandler.WebsocketCancelOrderSupported | - wshandler.WebsocketMessageCorrelationSupported h.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit h.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout h.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -127,6 +147,7 @@ func (h *HitBTC) Setup(exch *config.ExchangeConfig) error { Connector: h.WsConnect, Subscriber: h.Subscribe, UnSubscriber: h.Unsubscribe, + Features: &h.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/huobi/huobi_test.go b/exchanges/huobi/huobi_test.go index 644471e4..18aae6b2 100644 --- a/exchanges/huobi/huobi_test.go +++ b/exchanges/huobi/huobi_test.go @@ -40,11 +40,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Huobi load config error", err) + log.Fatal("Huobi load config error", err) } hConfig, err := cfg.GetExchangeConfig("Huobi") if err != nil { - t.Error("Test Failed - Huobi Setup() init error") + t.Error("Huobi Setup() init error") } hConfig.API.AuthenticatedSupport = true hConfig.API.AuthenticatedWebsocketSupport = true @@ -53,7 +53,7 @@ func TestSetup(t *testing.T) { err = h.Setup(hConfig) if err != nil { - t.Fatal("Test Failed - Huobi setup error", err) + t.Fatal("Huobi setup error", err) } } @@ -105,7 +105,7 @@ func TestGetSpotKline(t *testing.T) { Size: 0, }) if err != nil { - t.Errorf("Test failed - Huobi TestGetSpotKline: %s", err) + t.Errorf("Huobi TestGetSpotKline: %s", err) } } @@ -113,7 +113,7 @@ func TestGetMarketDetailMerged(t *testing.T) { t.Parallel() _, err := h.GetMarketDetailMerged(testSymbol) if err != nil { - t.Errorf("Test failed - Huobi TestGetMarketDetailMerged: %s", err) + t.Errorf("Huobi TestGetMarketDetailMerged: %s", err) } } @@ -125,7 +125,7 @@ func TestGetDepth(t *testing.T) { }) if err != nil { - t.Errorf("Test failed - Huobi TestGetDepth: %s", err) + t.Errorf("Huobi TestGetDepth: %s", err) } } @@ -133,7 +133,7 @@ func TestGetTrades(t *testing.T) { t.Parallel() _, err := h.GetTrades(testSymbol) if err != nil { - t.Errorf("Test failed - Huobi TestGetTrades: %s", err) + t.Errorf("Huobi TestGetTrades: %s", err) } } @@ -141,7 +141,7 @@ func TestGetLatestSpotPrice(t *testing.T) { t.Parallel() _, err := h.GetLatestSpotPrice(testSymbol) if err != nil { - t.Errorf("Test failed - Huobi GetLatestSpotPrice: %s", err) + t.Errorf("Huobi GetLatestSpotPrice: %s", err) } } @@ -149,7 +149,7 @@ func TestGetTradeHistory(t *testing.T) { t.Parallel() _, err := h.GetTradeHistory(testSymbol, "50") if err != nil { - t.Errorf("Test failed - Huobi TestGetTradeHistory: %s", err) + t.Errorf("Huobi TestGetTradeHistory: %s", err) } } @@ -157,7 +157,7 @@ func TestGetMarketDetail(t *testing.T) { t.Parallel() _, err := h.GetMarketDetail(testSymbol) if err != nil { - t.Errorf("Test failed - Huobi TestGetTradeHistory: %s", err) + t.Errorf("Huobi TestGetTradeHistory: %s", err) } } @@ -165,7 +165,7 @@ func TestGetSymbols(t *testing.T) { t.Parallel() _, err := h.GetSymbols() if err != nil { - t.Errorf("Test failed - Huobi TestGetSymbols: %s", err) + t.Errorf("Huobi TestGetSymbols: %s", err) } } @@ -173,7 +173,7 @@ func TestGetCurrencies(t *testing.T) { t.Parallel() _, err := h.GetCurrencies() if err != nil { - t.Errorf("Test failed - Huobi TestGetCurrencies: %s", err) + t.Errorf("Huobi TestGetCurrencies: %s", err) } } @@ -188,7 +188,7 @@ func TestGetTimestamp(t *testing.T) { t.Parallel() _, err := h.GetTimestamp() if err != nil { - t.Errorf("Test failed - Huobi TestGetTimestamp: %s", err) + t.Errorf("Huobi TestGetTimestamp: %s", err) } } @@ -201,7 +201,7 @@ func TestGetAccounts(t *testing.T) { _, err := h.GetAccounts() if err != nil { - t.Errorf("Test failed - Huobi GetAccounts: %s", err) + t.Errorf("Huobi GetAccounts: %s", err) } } @@ -214,13 +214,13 @@ func TestGetAccountBalance(t *testing.T) { result, err := h.GetAccounts() if err != nil { - t.Errorf("Test failed - Huobi GetAccounts: %s", err) + t.Errorf("Huobi GetAccounts: %s", err) } userID := strconv.FormatInt(result[0].ID, 10) _, err = h.GetAccountBalance(userID) if err != nil { - t.Errorf("Test failed - Huobi GetAccountBalance: %s", err) + t.Errorf("Huobi GetAccountBalance: %s", err) } } @@ -233,7 +233,7 @@ func TestGetAggregatedBalance(t *testing.T) { _, err := h.GetAggregatedBalance() if err != nil { - t.Errorf("Test failed - Huobi GetAggregatedBalance: %s", err) + t.Errorf("Huobi GetAggregatedBalance: %s", err) } } @@ -254,7 +254,7 @@ func TestSpotNewOrder(t *testing.T) { _, err := h.SpotNewOrder(arg) if err != nil { - t.Errorf("Test failed - Huobi SpotNewOrder: %s", err) + t.Errorf("Huobi SpotNewOrder: %s", err) } } @@ -263,7 +263,7 @@ func TestCancelExistingOrder(t *testing.T) { _, err := h.CancelExistingOrder(1337) if err == nil { - t.Error("Test failed - Huobi TestCancelExistingOrder: Invalid orderID returned true") + t.Error("Huobi TestCancelExistingOrder Expected error") } } @@ -272,7 +272,7 @@ func TestGetOrder(t *testing.T) { _, err := h.GetOrder(1337) if err == nil { - t.Error("Test failed - Huobi TestCancelOrder: Invalid orderID returned true") + t.Error("Huobi TestCancelOrder Expected error") } } @@ -285,7 +285,7 @@ func TestGetMarginLoanOrders(t *testing.T) { _, err := h.GetMarginLoanOrders(testSymbol, "", "", "", "", "", "", "") if err != nil { - t.Errorf("Test failed - Huobi TestGetMarginLoanOrders: %s", err) + t.Errorf("Huobi TestGetMarginLoanOrders: %s", err) } } @@ -298,7 +298,7 @@ func TestGetMarginAccountBalance(t *testing.T) { _, err := h.GetMarginAccountBalance(testSymbol) if err != nil { - t.Errorf("Test failed - Huobi TestGetMarginAccountBalance: %s", err) + t.Errorf("Huobi TestGetMarginAccountBalance: %s", err) } } @@ -307,7 +307,7 @@ func TestCancelWithdraw(t *testing.T) { _, err := h.CancelWithdraw(1337) if err == nil { - t.Error("Test failed - Huobi TestCancelWithdraw: Invalid withdraw-ID was valid") + t.Error("Huobi TestCancelWithdraw Expected error") } } @@ -317,23 +317,23 @@ func TestPEMLoadAndSign(t *testing.T) { pemKey := strings.NewReader(h.API.Credentials.PEMKey) pemBytes, err := ioutil.ReadAll(pemKey) if err != nil { - t.Fatalf("Test Failed. TestPEMLoadAndSign Unable to ioutil.ReadAll PEM key: %s", err) + t.Fatalf("TestPEMLoadAndSign Unable to ioutil.ReadAll PEM key: %s", err) } block, _ := pem.Decode(pemBytes) if block == nil { - t.Fatalf("Test Failed. TestPEMLoadAndSign Block is nil") + t.Fatalf("TestPEMLoadAndSign Block is nil") } x509Encoded := block.Bytes privKey, err := x509.ParseECPrivateKey(x509Encoded) if err != nil { - t.Fatalf("Test Failed. TestPEMLoadAndSign Unable to ParseECPrivKey: %s", err) + t.Fatalf("TestPEMLoadAndSign Unable to ParseECPrivKey: %s", err) } _, _, err = ecdsa.Sign(rand.Reader, privKey, crypto.GetSHA256([]byte("test"))) if err != nil { - t.Fatalf("Test Failed. TestPEMLoadAndSign Unable to sign: %s", err) + t.Fatalf("TestPEMLoadAndSign Unable to sign: %s", err) } } @@ -371,7 +371,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := h.GetFee(feeBuilder); resp != float64(0.002) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) } // CryptocurrencyTradeFee High quantity @@ -379,7 +379,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := h.GetFee(feeBuilder); resp != float64(2000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2000), resp) t.Error(err) } @@ -387,7 +387,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := h.GetFee(feeBuilder); resp != float64(0.002) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) t.Error(err) } @@ -395,14 +395,14 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } // CryptocurrencyWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -411,7 +411,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -419,7 +419,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -427,7 +427,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -436,7 +436,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := h.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -586,12 +586,12 @@ func TestGetAccountInfo(t *testing.T) { if apiKey == "" || apiSecret == "" { _, err := h.GetAccountInfo() if err == nil { - t.Error("Test Failed - GetAccountInfo() error") + t.Error("GetAccountInfo() Expected error") } } else { _, err := h.GetAccountInfo() if err != nil { - t.Error("Test Failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() error", err) } } } @@ -599,7 +599,7 @@ func TestGetAccountInfo(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := h.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -661,7 +661,7 @@ func TestWithdrawInternationalBank(t *testing.T) { func TestGetDepositAddress(t *testing.T) { _, err := h.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } diff --git a/exchanges/huobi/huobi_wrapper.go b/exchanges/huobi/huobi_wrapper.go index 8aa6ccce..ec423131 100644 --- a/exchanges/huobi/huobi_wrapper.go +++ b/exchanges/huobi/huobi_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -70,9 +71,31 @@ func (h *HUOBI) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + CryptoWithdrawal: true, + TradeFee: true, + }, + WebsocketCapabilities: protocol.Features{ + KlineFetching: true, + OrderbookFetching: true, + TradeFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, + AccountInfo: true, + MessageCorrelation: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithSetup | exchange.NoFiatWithdrawals, @@ -91,14 +114,6 @@ func (h *HUOBI) SetDefaults() { h.API.Endpoints.URL = h.API.Endpoints.URLDefault h.API.Endpoints.WebsocketURL = wsMarketURL h.Websocket = wshandler.New() - h.Websocket.Functionality = wshandler.WebsocketKlineSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketAccountDataSupported | - wshandler.WebsocketMessageCorrelationSupported h.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit h.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout h.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -131,6 +146,7 @@ func (h *HUOBI) Setup(exch *config.ExchangeConfig) error { Connector: h.WsConnect, Subscriber: h.Subscribe, UnSubscriber: h.Unsubscribe, + Features: &h.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/itbit/itbit_test.go b/exchanges/itbit/itbit_test.go index b7d3dc95..5c2c91e9 100644 --- a/exchanges/itbit/itbit_test.go +++ b/exchanges/itbit/itbit_test.go @@ -28,11 +28,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Itbit load config error", err) + t.Fatal("Itbit load config error", err) } itbitConfig, err := cfg.GetExchangeConfig("ITBIT") if err != nil { - t.Error("Test Failed - Itbit Setup() init error") + t.Error("Itbit Setup() init error") } itbitConfig.API.AuthenticatedSupport = true itbitConfig.API.Credentials.Key = apiKey @@ -41,7 +41,7 @@ func TestSetup(t *testing.T) { err = i.Setup(itbitConfig) if err != nil { - t.Fatal("Test Failed - Itbit setup error", err) + t.Fatal("Itbit setup error", err) } } @@ -49,7 +49,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := i.GetTicker("XBTUSD") if err != nil { - t.Error("Test Failed - GetTicker() error", err) + t.Error("GetTicker() error", err) } } @@ -57,7 +57,7 @@ func TestGetOrderbook(t *testing.T) { t.Parallel() _, err := i.GetOrderbook("XBTSGD") if err != nil { - t.Error("Test Failed - GetOrderbook() error", err) + t.Error("GetOrderbook() error", err) } } @@ -65,49 +65,49 @@ func TestGetTradeHistory(t *testing.T) { t.Parallel() _, err := i.GetTradeHistory("XBTUSD", "0") if err != nil { - t.Error("Test Failed - GetTradeHistory() error", err) + t.Error("GetTradeHistory() error", err) } } func TestGetWallets(t *testing.T) { _, err := i.GetWallets(url.Values{}) if err == nil { - t.Error("Test Failed - GetWallets() error", err) + t.Error("GetWallets() Expected error") } } func TestCreateWallet(t *testing.T) { _, err := i.CreateWallet("test") if err == nil { - t.Error("Test Failed - CreateWallet() error", err) + t.Error("CreateWallet() Expected error") } } func TestGetWallet(t *testing.T) { _, err := i.GetWallet("1337") if err == nil { - t.Error("Test Failed - GetWallet() error", err) + t.Error("GetWallet() Expected error") } } func TestGetWalletBalance(t *testing.T) { _, err := i.GetWalletBalance("1337", "XRT") if err == nil { - t.Error("Test Failed - GetWalletBalance() error", err) + t.Error("GetWalletBalance() Expected error") } } func TestGetWalletTrades(t *testing.T) { _, err := i.GetWalletTrades("1337", url.Values{}) if err == nil { - t.Error("Test Failed - GetWalletTrades() error", err) + t.Error("GetWalletTrades() Expected error") } } func TestGetFundingHistory(t *testing.T) { _, err := i.GetFundingHistoryForWallet("1337", url.Values{}) if err == nil { - t.Error("Test Failed - GetFundingHistory() error", err) + t.Error("GetFundingHistory() Expected error") } } @@ -116,14 +116,14 @@ func TestPlaceOrder(t *testing.T) { exchange.LimitOrderType.ToLower().ToString(), "USD", 1, 0.2, "banjo", "sauce") if err == nil { - t.Error("Test Failed - PlaceOrder() error", err) + t.Error("PlaceOrder() Expected error") } } func TestGetOrder(t *testing.T) { _, err := i.GetOrder("1337", url.Values{}) if err == nil { - t.Error("Test Failed - GetOrder() error", err) + t.Error("GetOrder() Expected error") } } @@ -131,21 +131,21 @@ func TestCancelExistingOrder(t *testing.T) { t.Skip() err := i.CancelExistingOrder("1337", "1337order") if err == nil { - t.Error("Test Failed - CancelOrder() error", err) + t.Error("CancelOrder() Expected error") } } func TestGetCryptoDepositAddress(t *testing.T) { _, err := i.GetCryptoDepositAddress("1337", "AUD") if err == nil { - t.Error("Test Failed - GetCryptoDepositAddress() error", err) + t.Error("GetCryptoDepositAddress() Expected error") } } func TestWalletTransfer(t *testing.T) { _, err := i.WalletTransfer("1337", "mywallet", "anotherwallet", 200, "USD") if err == nil { - t.Error("Test Failed - WalletTransfer() error", err) + t.Error("WalletTransfer() Expected error") } } @@ -183,7 +183,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := i.GetFee(feeBuilder); resp != float64(0.0035) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0035), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0035), resp) } // CryptocurrencyTradeFee High quantity @@ -191,7 +191,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := i.GetFee(feeBuilder); resp != float64(3500) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(3500), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(3500), resp) t.Error(err) } @@ -199,7 +199,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := i.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -207,14 +207,14 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := i.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } // CryptocurrencyWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := i.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -223,7 +223,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := i.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -231,7 +231,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := i.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -239,7 +239,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := i.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -248,7 +248,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := i.GetFee(feeBuilder); resp != float64(40) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(40), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(40), resp) t.Error(err) } } @@ -390,7 +390,7 @@ func TestGetAccountInfo(t *testing.T) { if apiKey != "" || apiSecret != "" || clientID != "" { _, err := i.GetAccountInfo() if err == nil { - t.Error("Test Failed - GetAccountInfo() error") + t.Error("GetAccountInfo() Expected error") } } } @@ -398,7 +398,7 @@ func TestGetAccountInfo(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := i.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -457,6 +457,6 @@ func TestWithdrawInternationalBank(t *testing.T) { func TestGetDepositAddress(t *testing.T) { _, err := i.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } diff --git a/exchanges/itbit/itbit_wrapper.go b/exchanges/itbit/itbit_wrapper.go index 092baa9e..b7c3d88b 100644 --- a/exchanges/itbit/itbit_wrapper.go +++ b/exchanges/itbit/itbit_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -68,9 +69,21 @@ func (i *ItBit) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: false, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: false, - TickerBatching: false, + RESTCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + SubmitOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + TradeFee: true, + FiatWithdrawalFee: true, }, WithdrawPermissions: exchange.WithdrawCryptoViaWebsiteOnly | exchange.WithdrawFiatViaWebsiteOnly, diff --git a/exchanges/kraken/kraken_test.go b/exchanges/kraken/kraken_test.go index be1b4954..37b71e5b 100644 --- a/exchanges/kraken/kraken_test.go +++ b/exchanges/kraken/kraken_test.go @@ -34,11 +34,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Kraken load config error", err) + log.Fatal("Kraken load config error", err) } krakenConfig, err := cfg.GetExchangeConfig("Kraken") if err != nil { - t.Error("Test Failed - kraken Setup() init error", err) + t.Error("kraken Setup() init error", err) } krakenConfig.API.AuthenticatedSupport = true krakenConfig.API.Credentials.Key = apiKey @@ -49,7 +49,7 @@ func TestSetup(t *testing.T) { err = k.Setup(krakenConfig) if err != nil { - t.Fatal("Test Failed - Kraken setup error", err) + t.Fatal("Kraken setup error", err) } } @@ -58,7 +58,7 @@ func TestGetServerTime(t *testing.T) { t.Parallel() _, err := k.GetServerTime() if err != nil { - t.Error("Test Failed - GetServerTime() error", err) + t.Error("GetServerTime() error", err) } } @@ -67,7 +67,7 @@ func TestGetAssets(t *testing.T) { t.Parallel() _, err := k.GetAssets() if err != nil { - t.Error("Test Failed - GetAssets() error", err) + t.Error("GetAssets() error", err) } } @@ -76,7 +76,7 @@ func TestGetAssetPairs(t *testing.T) { t.Parallel() _, err := k.GetAssetPairs() if err != nil { - t.Error("Test Failed - GetAssetPairs() error", err) + t.Error("GetAssetPairs() error", err) } } @@ -85,7 +85,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := k.GetTicker("BCHEUR") if err != nil { - t.Error("Test Failed - GetTicker() error", err) + t.Error("GetTicker() error", err) } } @@ -94,7 +94,7 @@ func TestGetTickers(t *testing.T) { t.Parallel() _, err := k.GetTickers("LTCUSD,ETCUSD") if err != nil { - t.Error("Test failed - GetTickers() error", err) + t.Error("GetTickers() error", err) } } @@ -103,7 +103,7 @@ func TestGetOHLC(t *testing.T) { t.Parallel() _, err := k.GetOHLC("BCHEUR") if err != nil { - t.Error("Test Failed - GetOHLC() error", err) + t.Error("GetOHLC() error", err) } } @@ -112,7 +112,7 @@ func TestGetDepth(t *testing.T) { t.Parallel() _, err := k.GetDepth("BCHEUR") if err != nil { - t.Error("Test Failed - GetDepth() error", err) + t.Error("GetDepth() error", err) } } @@ -121,7 +121,7 @@ func TestGetTrades(t *testing.T) { t.Parallel() _, err := k.GetTrades("BCHEUR") if err != nil { - t.Error("Test Failed - GetTrades() error", err) + t.Error("GetTrades() error", err) } } @@ -130,7 +130,7 @@ func TestGetSpread(t *testing.T) { t.Parallel() _, err := k.GetSpread("BCHEUR") if err != nil { - t.Error("Test Failed - GetSpread() error", err) + t.Error("GetSpread() error", err) } } @@ -139,7 +139,7 @@ func TestGetBalance(t *testing.T) { t.Parallel() _, err := k.GetBalance() if err == nil { - t.Error("Test Failed - GetBalance() error", err) + t.Error("GetBalance() Expected error") } } @@ -149,7 +149,7 @@ func TestGetTradeBalance(t *testing.T) { args := TradeBalanceOptions{Asset: "ZEUR"} _, err := k.GetTradeBalance(args) if err == nil { - t.Error("Test Failed - GetTradeBalance() error", err) + t.Error("GetTradeBalance() Expected error") } } @@ -159,7 +159,7 @@ func TestGetOpenOrders(t *testing.T) { args := OrderInfoOptions{Trades: true} _, err := k.GetOpenOrders(args) if err == nil { - t.Error("Test Failed - GetOpenOrders() error", err) + t.Error("GetOpenOrders() Expected error") } } @@ -169,7 +169,7 @@ func TestGetClosedOrders(t *testing.T) { args := GetClosedOrdersOptions{Trades: true, Start: "OE4KV4-4FVQ5-V7XGPU"} _, err := k.GetClosedOrders(args) if err == nil { - t.Error("Test Failed - GetClosedOrders() error", err) + t.Error("GetClosedOrders() Expected error") } } @@ -179,7 +179,7 @@ func TestQueryOrdersInfo(t *testing.T) { args := OrderInfoOptions{Trades: true} _, err := k.QueryOrdersInfo(args, "OR6ZFV-AA6TT-CKFFIW", "OAMUAJ-HLVKG-D3QJ5F") if err == nil { - t.Error("Test Failed - QueryOrdersInfo() error", err) + t.Error("QueryOrdersInfo() Expected error") } } @@ -189,7 +189,7 @@ func TestGetTradesHistory(t *testing.T) { args := GetTradesHistoryOptions{Trades: true, Start: "TMZEDR-VBJN2-NGY6DX", End: "TVRXG2-R62VE-RWP3UW"} _, err := k.GetTradesHistory(args) if err == nil { - t.Error("Test Failed - GetTradesHistory() error", err) + t.Error("GetTradesHistory() Expected error") } } @@ -198,7 +198,7 @@ func TestQueryTrades(t *testing.T) { t.Parallel() _, err := k.QueryTrades(true, "TMZEDR-VBJN2-NGY6DX", "TFLWIB-KTT7L-4TWR3L", "TDVRAH-2H6OS-SLSXRX") if err == nil { - t.Error("Test Failed - QueryTrades() error", err) + t.Error("QueryTrades() Expected error") } } @@ -207,7 +207,7 @@ func TestOpenPositions(t *testing.T) { t.Parallel() _, err := k.OpenPositions(false) if err == nil { - t.Error("Test Failed - OpenPositions() error", err) + t.Error("OpenPositions() Expected error") } } @@ -217,7 +217,7 @@ func TestGetLedgers(t *testing.T) { args := GetLedgersOptions{Start: "LRUHXI-IWECY-K4JYGO", End: "L5NIY7-JZQJD-3J4M2V", Ofs: 15} _, err := k.GetLedgers(args) if err == nil { - t.Error("Test Failed - GetLedgers() error", err) + t.Error("GetLedgers() Expected error") } } @@ -226,7 +226,7 @@ func TestQueryLedgers(t *testing.T) { t.Parallel() _, err := k.QueryLedgers("LVTSFS-NHZVM-EXNZ5M") if err == nil { - t.Error("Test Failed - QueryLedgers() error", err) + t.Error("QueryLedgers() Expected error") } } @@ -235,7 +235,7 @@ func TestGetTradeVolume(t *testing.T) { t.Parallel() _, err := k.GetTradeVolume(true, "OAVY7T-MV5VK-KHDF5X") if err == nil { - t.Error("Test Failed - GetTradeVolume() error", err) + t.Error("GetTradeVolume() Expected error") } } @@ -247,7 +247,7 @@ func TestAddOrder(t *testing.T) { exchange.SellOrderSide.ToLower().ToString(), exchange.LimitOrderType.ToLower().ToString(), 0.00000001, 0, 0, 0, &args) if err == nil { - t.Error("Test Failed - AddOrder() error", err) + t.Error("AddOrder() Expected error") } } @@ -256,7 +256,7 @@ func TestCancelExistingOrder(t *testing.T) { t.Parallel() _, err := k.CancelExistingOrder("OAVY7T-MV5VK-KHDF5X") if err == nil { - t.Error("Test Failed - CancelExistingOrder() error", err) + t.Error("CancelExistingOrder() Expected error") } } @@ -297,7 +297,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := k.GetFee(feeBuilder); resp != float64(0.0026) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0026), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0026), resp) } // CryptocurrencyTradeFee High quantity @@ -305,7 +305,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := k.GetFee(feeBuilder); resp != float64(2600) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2600), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2600), resp) t.Error(err) } @@ -313,7 +313,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := k.GetFee(feeBuilder); resp != float64(0.0016) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0016), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0016), resp) t.Error(err) } @@ -321,7 +321,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := k.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -329,7 +329,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := k.GetFee(feeBuilder); resp != float64(5) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(5), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(5), resp) t.Error(err) } } @@ -339,7 +339,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.CyptocurrencyDepositFee feeBuilder.Pair.Base = currency.XXBT if resp, err := k.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(5), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(5), resp) t.Error(err) } @@ -347,7 +347,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := k.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Error(err) } @@ -356,7 +356,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := k.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -365,7 +365,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := k.GetFee(feeBuilder); resp != float64(5) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(5), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(5), resp) t.Error(err) } } @@ -514,12 +514,12 @@ func TestGetAccountInfo(t *testing.T) { if apiKey != "" || apiSecret != "" || clientID != "" { _, err := k.GetAccountInfo() if err != nil { - t.Error("Test Failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() error", err) } } else { _, err := k.GetAccountInfo() if err == nil { - t.Error("Test Failed - GetAccountInfo() error") + t.Error("GetAccountInfo() Expected error") } } } @@ -528,7 +528,7 @@ func TestGetAccountInfo(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := k.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -619,12 +619,12 @@ func TestGetDepositAddress(t *testing.T) { if areTestAPIKeysSet() { _, err := k.GetDepositAddress(currency.BTC, "") if err != nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } else { _, err := k.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error can not be nil") + t.Error("GetDepositAddress() error can not be nil") } } } @@ -637,12 +637,12 @@ func TestWithdrawStatus(t *testing.T) { if areTestAPIKeysSet() { _, err := k.WithdrawStatus(currency.BTC, "") if err != nil { - t.Error("Test Failed - WithdrawStatus() error", err) + t.Error("WithdrawStatus() error", err) } } else { _, err := k.WithdrawStatus(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error can not be nil", err) + t.Error("GetDepositAddress() error can not be nil") } } } @@ -653,9 +653,9 @@ func TestWithdrawCancel(t *testing.T) { TestSetup(t) _, err := k.WithdrawCancel(currency.BTC, "") if areTestAPIKeysSet() && err == nil { - t.Error("Test Failed - WithdrawCancel() error cannot be nil") + t.Error("WithdrawCancel() error cannot be nil") } else if !areTestAPIKeysSet() && err == nil { - t.Errorf("Test Failed - WithdrawCancel() error - expecting an error when no keys are set but received nil") + t.Errorf("WithdrawCancel() error - expecting an error when no keys are set but received nil") } } diff --git a/exchanges/kraken/kraken_wrapper.go b/exchanges/kraken/kraken_wrapper.go index 3763a672..a2c40be5 100644 --- a/exchanges/kraken/kraken_wrapper.go +++ b/exchanges/kraken/kraken_wrapper.go @@ -13,6 +13,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -72,9 +73,37 @@ func (k *Kraken) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: false, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + SubmitOrder: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + FiatDeposit: true, + FiatWithdraw: true, + TradeFee: true, + FiatDepositFee: true, + FiatWithdrawalFee: true, + CryptoDepositFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + KlineFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, + MessageCorrelation: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithSetup | exchange.WithdrawCryptoWith2FA | @@ -95,13 +124,6 @@ func (k *Kraken) SetDefaults() { k.API.Endpoints.URL = k.API.Endpoints.URLDefault k.Websocket = wshandler.New() k.API.Endpoints.WebsocketURL = krakenWSURL - k.Websocket.Functionality = wshandler.WebsocketTickerSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketKlineSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketMessageCorrelationSupported k.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit k.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout k.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -131,6 +153,7 @@ func (k *Kraken) Setup(exch *config.ExchangeConfig) error { Connector: k.WsConnect, Subscriber: k.Subscribe, UnSubscriber: k.Unsubscribe, + Features: &k.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/lakebtc/lakebtc_test.go b/exchanges/lakebtc/lakebtc_test.go index 8c18c824..bf1fa5df 100644 --- a/exchanges/lakebtc/lakebtc_test.go +++ b/exchanges/lakebtc/lakebtc_test.go @@ -35,11 +35,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - LakeBTC load config error", err) + log.Fatal("LakeBTC load config error", err) } lakebtcConfig, err := cfg.GetExchangeConfig("LakeBTC") if err != nil { - t.Error("Test Failed - LakeBTC Setup() init error") + t.Error("LakeBTC Setup() init error") } lakebtcConfig.API.AuthenticatedSupport = true lakebtcConfig.API.Credentials.Key = apiKey @@ -47,7 +47,7 @@ func TestSetup(t *testing.T) { lakebtcConfig.Features.Enabled.Websocket = true err = l.Setup(lakebtcConfig) if err != nil { - t.Fatal("Test Failed - LakeBTC setup error", err) + t.Fatal("LakeBTC setup error", err) } l.API.Endpoints.WebsocketURL = lakeBTCWSURL setupRan = true @@ -58,7 +58,7 @@ func TestFetchTradablePairs(t *testing.T) { t.Parallel() _, err := l.FetchTradablePairs(asset.Spot) if err != nil { - t.Fatalf("Test failed. GetTradablePairs err: %s", err) + t.Fatalf("GetTradablePairs err: %s", err) } } @@ -66,7 +66,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := l.GetTicker() if err != nil { - t.Error("Test Failed - GetTicker() error", err) + t.Error("GetTicker() error", err) } } @@ -74,7 +74,7 @@ func TestGetOrderBook(t *testing.T) { t.Parallel() _, err := l.GetOrderBook("BTCUSD") if err != nil { - t.Error("Test Failed - GetOrderBook() error", err) + t.Error("GetOrderBook() error", err) } } @@ -82,7 +82,7 @@ func TestGetTradeHistory(t *testing.T) { t.Parallel() _, err := l.GetTradeHistory("BTCUSD") if err != nil { - t.Error("Test Failed - GetTradeHistory() error", err) + t.Error("GetTradeHistory() error", err) } } @@ -93,7 +93,7 @@ func TestTrade(t *testing.T) { } _, err := l.Trade(false, 0, 0, "USD") if err == nil { - t.Error("Test Failed - Trade() error", err) + t.Error("Trade() Expected error") } } @@ -104,7 +104,7 @@ func TestGetOpenOrders(t *testing.T) { } _, err := l.GetOpenOrders() if err == nil { - t.Error("Test Failed - GetOpenOrders() error", err) + t.Error("GetOpenOrders() Expected error") } } @@ -115,7 +115,7 @@ func TestGetOrders(t *testing.T) { } _, err := l.GetOrders([]int64{1, 2}) if err == nil { - t.Error("Test Failed - GetOrders() error", err) + t.Error("GetOrders() Expected error") } } @@ -126,7 +126,7 @@ func TestCancelOrder(t *testing.T) { } err := l.CancelExistingOrder(1337) if err == nil { - t.Error("Test Failed - CancelExistingOrder() error", err) + t.Error("CancelExistingOrder() Expected error") } } @@ -137,7 +137,7 @@ func TestGetTrades(t *testing.T) { } _, err := l.GetTrades(1337) if err == nil { - t.Error("Test Failed - GetTrades() error", err) + t.Error("GetTrades() Expected error") } } @@ -148,7 +148,7 @@ func TestGetExternalAccounts(t *testing.T) { } _, err := l.GetExternalAccounts() if err == nil { - t.Error("Test Failed - GetExternalAccounts() error", err) + t.Error("GetExternalAccounts() Expected error") } } @@ -187,7 +187,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := l.GetFee(feeBuilder); resp != float64(0.002) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) } // CryptocurrencyTradeFee High quantity @@ -195,7 +195,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := l.GetFee(feeBuilder); resp != float64(2000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2000), resp) t.Error(err) } @@ -203,7 +203,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := l.GetFee(feeBuilder); resp != float64(0.0015) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) t.Error(err) } @@ -211,14 +211,14 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } // CryptocurrencyWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -227,7 +227,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -235,7 +235,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := l.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) } @@ -243,7 +243,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -252,7 +252,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -393,7 +393,7 @@ func TestCancelAllExchangeOrders(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := l.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -456,12 +456,12 @@ func TestGetDepositAddress(t *testing.T) { if areTestAPIKeysSet() { _, err := l.GetDepositAddress(currency.BTC, "") if err != nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } else { _, err := l.GetDepositAddress(currency.DASH, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error cannot be nil") + t.Error("GetDepositAddress() error cannot be nil") } } } diff --git a/exchanges/lakebtc/lakebtc_wrapper.go b/exchanges/lakebtc/lakebtc_wrapper.go index c7c9be68..91503dc2 100644 --- a/exchanges/lakebtc/lakebtc_wrapper.go +++ b/exchanges/lakebtc/lakebtc_wrapper.go @@ -14,6 +14,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,9 +70,27 @@ func (l *LakeBTC) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrders: true, + CancelOrder: true, + SubmitOrder: true, + UserTradeHistory: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoDepositFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TradeFetching: true, + OrderbookFetching: true, + Subscribe: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.WithdrawFiatViaWebsiteOnly, @@ -90,9 +109,6 @@ func (l *LakeBTC) SetDefaults() { l.API.Endpoints.URL = l.API.Endpoints.URLDefault l.Websocket = wshandler.New() l.API.Endpoints.WebsocketURL = lakeBTCWSURL - l.Websocket.Functionality = wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketSubscribeSupported l.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit l.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout l.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -121,6 +137,7 @@ func (l *LakeBTC) Setup(exch *config.ExchangeConfig) error { RunningURL: exch.API.Endpoints.WebsocketURL, Connector: l.WsConnect, Subscriber: l.Subscribe, + Features: &l.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/lbank/lbank_test.go b/exchanges/lbank/lbank_test.go index 25c75f2c..3c909081 100644 --- a/exchanges/lbank/lbank_test.go +++ b/exchanges/lbank/lbank_test.go @@ -34,18 +34,18 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatalf("Test Failed - Lbank Setup() init error:, %v", err) + t.Fatalf("Lbank Setup() init error:, %v", err) } lbankConfig, err := cfg.GetExchangeConfig("Lbank") if err != nil { - t.Fatalf("Test Failed - Lbank Setup() init error: %v", err) + t.Fatalf("Lbank Setup() init error: %v", err) } lbankConfig.API.AuthenticatedSupport = true lbankConfig.API.Credentials.Secret = testAPISecret lbankConfig.API.Credentials.Key = testAPIKey err = l.Setup(lbankConfig) if err != nil { - t.Fatal("Test Failed - LBank setup error", err) + t.Fatal("LBank setup error", err) } setupRan = true } @@ -58,7 +58,7 @@ func TestGetTicker(t *testing.T) { TestSetup(t) _, err := l.GetTicker("btc_usdt") if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } } @@ -66,7 +66,7 @@ func TestGetTickers(t *testing.T) { TestSetup(t) tickers, err := l.GetTickers() if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } if len(tickers) <= 1 { t.Errorf("Expected multiple tickers, received %v", len(tickers)) @@ -77,7 +77,7 @@ func TestGetCurrencyPairs(t *testing.T) { TestSetup(t) _, err := l.GetCurrencyPairs() if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } } @@ -97,11 +97,11 @@ func TestGetTrades(t *testing.T) { TestSetup(t) _, err := l.GetTrades("btc_usdt", "600", fmt.Sprintf("%v", time.Now().Unix())) if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } a, err := l.GetTrades("btc_usdt", "600", "0") if len(a) != 600 && err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } } @@ -109,7 +109,7 @@ func TestGetKlines(t *testing.T) { TestSetup(t) _, err := l.GetKlines("btc_usdt", "600", "minute1", fmt.Sprintf("%v", time.Now().Unix())) if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } } @@ -145,15 +145,15 @@ func TestCreateOrder(t *testing.T) { cp := currency.NewPairWithDelimiter(currency.BTC.String(), currency.USDT.String(), "_") _, err := l.CreateOrder(cp.Lower().String(), "what", 1231, 12314) if err == nil { - t.Error("Test Failed - CreateOrder error cannot be nil") + t.Error("CreateOrder error cannot be nil") } _, err = l.CreateOrder(cp.Lower().String(), "buy", 0, 0) if err == nil { - t.Error("Test Failed - CreateOrder error cannot be nil") + t.Error("CreateOrder error cannot be nil") } _, err = l.CreateOrder(cp.Lower().String(), "sell", 1231, 0) if err == nil { - t.Error("Test Failed - CreateOrder error cannot be nil") + t.Error("CreateOrder error cannot be nil") } _, err = l.CreateOrder(cp.Lower().String(), "buy", 58, 681) if err != nil { @@ -193,7 +193,7 @@ func TestQueryOrderHistory(t *testing.T) { cp := currency.NewPairWithDelimiter(currency.BTC.String(), currency.USDT.String(), "_") _, err := l.QueryOrderHistory(cp.Lower().String(), "1", "100") if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } } @@ -289,7 +289,7 @@ func TestLoadPrivKey(t *testing.T) { l.API.Credentials.Secret = "errortest" err = l.loadPrivKey() if err == nil { - t.Errorf("expected error due to pemblock nil, got err: %v", err) + t.Errorf("Expected error due to pemblock nil") } } @@ -302,7 +302,7 @@ func TestSign(t *testing.T) { l.loadPrivKey() _, err := l.sign("hello123") if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } } @@ -343,7 +343,7 @@ func TestCancelOrder(t *testing.T) { a.OrderID = "24f7ce27-af1d-4dca-a8c1-ef1cbeec1b23" err := l.CancelOrder(&a) if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } } @@ -354,7 +354,7 @@ func TestGetOrderInfo(t *testing.T) { } _, err := l.GetOrderInfo("9ead39f5-701a-400b-b635-d7349eb0f6b") if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } } @@ -365,7 +365,7 @@ func TestGetAllOpenOrderID(t *testing.T) { } _, err := l.getAllOpenOrderID() if err != nil { - t.Errorf("test failed: %v", err) + t.Errorf("%v", err) } } @@ -378,7 +378,7 @@ func TestGetFeeByType(t *testing.T) { input.Pair = cp a, err := l.GetFeeByType(&input) if err != nil { - t.Errorf("test failed. couldnt get fee: %v", err) + t.Errorf("couldnt get fee: %v", err) } if a != 0.0005 { t.Errorf("testGetFeeByType failed. Expected: 0.0005, Received: %v", a) diff --git a/exchanges/lbank/lbank_wrapper.go b/exchanges/lbank/lbank_wrapper.go index 2090dcc4..5f4e90e8 100644 --- a/exchanges/lbank/lbank_wrapper.go +++ b/exchanges/lbank/lbank_wrapper.go @@ -13,6 +13,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -67,9 +68,23 @@ func (l *Lbank) SetDefaults() { l.Features = exchange.Features{ Supports: exchange.FeaturesSupported{ REST: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + SubmitOrder: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoWithdrawalFee: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | exchange.NoFiatWithdrawals, diff --git a/exchanges/localbitcoins/localbitcoins_live_test.go b/exchanges/localbitcoins/localbitcoins_live_test.go index 1fa86101..332da00d 100644 --- a/exchanges/localbitcoins/localbitcoins_live_test.go +++ b/exchanges/localbitcoins/localbitcoins_live_test.go @@ -19,11 +19,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - LocalBitcoins load config error", err) + log.Fatal("LocalBitcoins load config error", err) } localbitcoinsConfig, err := cfg.GetExchangeConfig("LocalBitcoins") if err != nil { - log.Fatal("Test Failed - LocalBitcoins Setup() init error", err) + log.Fatal("LocalBitcoins Setup() init error", err) } localbitcoinsConfig.API.AuthenticatedSupport = true localbitcoinsConfig.API.Credentials.Key = apiKey @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { l.SetDefaults() err = l.Setup(localbitcoinsConfig) if err != nil { - log.Fatal("Test Failed - Localbitcoins setup error", err) + log.Fatal("Localbitcoins setup error", err) } log.Printf(sharedtestvalues.LiveTesting, l.GetName(), l.API.Endpoints.URL) os.Exit(m.Run()) diff --git a/exchanges/localbitcoins/localbitcoins_mock_test.go b/exchanges/localbitcoins/localbitcoins_mock_test.go index a09aa423..40992afe 100644 --- a/exchanges/localbitcoins/localbitcoins_mock_test.go +++ b/exchanges/localbitcoins/localbitcoins_mock_test.go @@ -22,11 +22,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Localbitcoins load config error", err) + log.Fatal("Localbitcoins load config error", err) } localbitcoinsConfig, err := cfg.GetExchangeConfig("LocalBitcoins") if err != nil { - log.Fatal("Test Failed - Localbitcoins Setup() init error", err) + log.Fatal("Localbitcoins Setup() init error", err) } l.SkipAuthCheck = true localbitcoinsConfig.API.AuthenticatedSupport = true @@ -35,12 +35,12 @@ func TestMain(m *testing.M) { l.SetDefaults() err = l.Setup(localbitcoinsConfig) if err != nil { - log.Fatal("Test Failed - Localbitcoins setup error", err) + log.Fatal("Localbitcoins setup error", err) } serverDetails, newClient, err := mock.NewVCRServer(mockfile) if err != nil { - log.Fatalf("Test Failed - Mock server error %s", err) + log.Fatalf("Mock server error %s", err) } l.HTTPClient = newClient diff --git a/exchanges/localbitcoins/localbitcoins_test.go b/exchanges/localbitcoins/localbitcoins_test.go index d99d9a0e..647de2c7 100644 --- a/exchanges/localbitcoins/localbitcoins_test.go +++ b/exchanges/localbitcoins/localbitcoins_test.go @@ -23,7 +23,7 @@ func TestGetTicker(t *testing.T) { _, err := l.GetTicker() if err != nil { - t.Errorf("Test failed - GetTicker() returned: %s", err) + t.Errorf("GetTicker() returned: %s", err) } } @@ -32,7 +32,7 @@ func TestGetTradableCurrencies(t *testing.T) { _, err := l.GetTradableCurrencies() if err != nil { - t.Errorf("Test failed - GetTradableCurrencies() returned: %s", err) + t.Errorf("GetTradableCurrencies() returned: %s", err) } } @@ -112,7 +112,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) } // CryptocurrencyTradeFee High quantity @@ -120,7 +120,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -128,7 +128,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -136,14 +136,14 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } // CryptocurrencyWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -152,7 +152,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -160,7 +160,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -168,7 +168,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -177,7 +177,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := l.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -327,7 +327,7 @@ func TestModifyOrder(t *testing.T) { _, err := l.ModifyOrder(&exchange.ModifyOrder{}) if err != common.ErrFunctionNotSupported { - t.Error("Test failed - ModifyOrder() error", err) + t.Error("ModifyOrder() error", err) } } @@ -388,10 +388,10 @@ func TestGetDepositAddress(t *testing.T) { _, err := l.GetDepositAddress(currency.BTC, "") switch { case areTestAPIKeysSet() && err != nil && !mockTests: - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) case !areTestAPIKeysSet() && err == nil && !mockTests: - t.Error("Test Failed - GetDepositAddress() expecting an error when no APIKeys are set") + t.Error("GetDepositAddress() expecting an error when no APIKeys are set") case mockTests && err != nil: - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() error", err) } } diff --git a/exchanges/localbitcoins/localbitcoins_wrapper.go b/exchanges/localbitcoins/localbitcoins_wrapper.go index 67671a14..020e3be0 100644 --- a/exchanges/localbitcoins/localbitcoins_wrapper.go +++ b/exchanges/localbitcoins/localbitcoins_wrapper.go @@ -15,6 +15,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -70,9 +71,19 @@ func (l *LocalBitcoins) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: false, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + CancelOrder: true, + SubmitOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.WithdrawFiatViaWebsiteOnly, diff --git a/exchanges/mock/README.md b/exchanges/mock/README.md index 8734035c..d8eea5c3 100644 --- a/exchanges/mock/README.md +++ b/exchanges/mock/README.md @@ -56,7 +56,7 @@ func TestMain(m *testing.M) { cfg.LoadConfig("../../testdata/configtest.json") your_current_exchange_nameConfig, err := cfg.GetExchangeConfig("your_current_exchange_name") if err != nil { - log.Fatal("Test Failed - your_current_exchange_name Setup() init error", err) + log.Fatal("your_current_exchange_name Setup() init error", err) } your_current_exchange_nameConfig.AuthenticatedAPISupport = true your_current_exchange_nameConfig.APIKey = apiKey @@ -96,7 +96,7 @@ func TestMain(m *testing.M) { cfg.LoadConfig("../../testdata/configtest.json") your_current_exchange_nameConfig, err := cfg.GetExchangeConfig("your_current_exchange_name") if err != nil { - log.Fatal("Test Failed - your_current_exchange_name Setup() init error", err) + log.Fatal("your_current_exchange_name Setup() init error", err) } your_current_exchange_nameConfig.AuthenticatedAPISupport = true your_current_exchange_nameConfig.APIKey = apiKey @@ -106,7 +106,7 @@ func TestMain(m *testing.M) { serverDetails, newClient, err := mock.NewVCRServer(mockfile) if err != nil { - log.Fatalf("Test Failed - Mock server error %s", err) + log.Fatalf("Mock server error %s", err) } g.HTTPClient = newClient diff --git a/exchanges/mock/common_test.go b/exchanges/mock/common_test.go index d06269dc..ae7ede80 100644 --- a/exchanges/mock/common_test.go +++ b/exchanges/mock/common_test.go @@ -19,42 +19,42 @@ func TestMatchURLVals(t *testing.T) { var expected = false received := MatchURLVals(testVal, emptyVal) if received != expected { - t.Errorf("Test Failed - MatchURLVals error expected %v received %v", + t.Errorf("MatchURLVals error expected %v received %v", expected, received) } received = MatchURLVals(emptyVal, testVal) if received != expected { - t.Errorf("Test Failed - MatchURLVals error expected %v received %v", + t.Errorf("MatchURLVals error expected %v received %v", expected, received) } received = MatchURLVals(testVal, testVal2) if received != expected { - t.Errorf("Test Failed - MatchURLVals error expected %v received %v", + t.Errorf("MatchURLVals error expected %v received %v", expected, received) } received = MatchURLVals(testVal2, testVal) if received != expected { - t.Errorf("Test Failed - MatchURLVals error expected %v received %v", + t.Errorf("MatchURLVals error expected %v received %v", expected, received) } received = MatchURLVals(testVal, testVal3) if received != expected { - t.Errorf("Test Failed - MatchURLVals error expected %v received %v", + t.Errorf("MatchURLVals error expected %v received %v", expected, received) } received = MatchURLVals(nonceVal1, testVal2) if received != expected { - t.Errorf("Test Failed - MatchURLVals error expected %v received %v", + t.Errorf("MatchURLVals error expected %v received %v", expected, received) } @@ -62,21 +62,21 @@ func TestMatchURLVals(t *testing.T) { expected = true received = MatchURLVals(emptyVal, emptyVal) if received != expected { - t.Errorf("Test Failed - MatchURLVals error expected %v received %v", + t.Errorf("MatchURLVals error expected %v received %v", expected, received) } received = MatchURLVals(testVal, testVal) if received != expected { - t.Errorf("Test Failed - MatchURLVals error expected %v received %v", + t.Errorf("MatchURLVals error expected %v received %v", expected, received) } received = MatchURLVals(nonceVal1, nonceVal2) if received != expected { - t.Errorf("Test Failed - MatchURLVals error expected %v received %v", + t.Errorf("MatchURLVals error expected %v received %v", expected, received) } @@ -105,12 +105,12 @@ func TestDeriveURLValsFromJSON(t *testing.T) { payload, err := json.Marshal(test1) if err != nil { - t.Error("Test Failed - marshal error", err) + t.Error("marshal error", err) } _, err = DeriveURLValsFromJSONMap(payload) if err != nil { - t.Error("Test Failed - DeriveURLValsFromJSON error", err) + t.Error("DeriveURLValsFromJSON error", err) } test2 := map[string]string{ @@ -125,16 +125,16 @@ func TestDeriveURLValsFromJSON(t *testing.T) { payload, err = json.Marshal(test2) if err != nil { - t.Error("Test Failed - marshal error", err) + t.Error("marshal error", err) } vals, err := DeriveURLValsFromJSONMap(payload) if err != nil { - t.Error("Test Failed - DeriveURLValsFromJSON error", err) + t.Error("DeriveURLValsFromJSON error", err) } if vals["val"][0] != "1" { - t.Error("Test Failed - DeriveURLValsFromJSON unexpected value", + t.Error("DeriveURLValsFromJSON unexpected value", vals["val"][0]) } } diff --git a/exchanges/mock/recording_test.go b/exchanges/mock/recording_test.go index 978c0c2b..3198e32f 100644 --- a/exchanges/mock/recording_test.go +++ b/exchanges/mock/recording_test.go @@ -19,7 +19,7 @@ func TestGetFilteredHeader(t *testing.T) { } if fMap.Get("Key") != "" { - t.Error("Test Failed - risky vals where not replaced correctly") + t.Error("risky vals where not replaced correctly") } } @@ -29,11 +29,11 @@ func TestGetFilteredURLVals(t *testing.T) { shadyVals.Set("real_name", superSecretData) cleanVals, err := GetFilteredURLVals(shadyVals) if err != nil { - t.Error("Test Failed - GetFilteredURLVals error", err) + t.Error("GetFilteredURLVals error", err) } if strings.Contains(cleanVals, superSecretData) { - t.Error("Test Failed - Super secret data found") + t.Error("Super secret data found") } } @@ -46,12 +46,12 @@ func TestCheckResponsePayload(t *testing.T) { payload, err := json.Marshal(testbody) if err != nil { - t.Fatal("Test Failed - json marshal error", err) + t.Fatal("json marshal error", err) } data, err := CheckResponsePayload(payload) if err != nil { - t.Error("Test Failed - CheckBody error", err) + t.Error("CheckBody error", err) } expected := `{ @@ -126,23 +126,23 @@ func TestCheckJSON(t *testing.T) { exclusionList, err := GetExcludedItems() if err != nil { - t.Error("Test Failed - GetExcludedItems error", err) + t.Error("GetExcludedItems error", err) } vals, err := CheckJSON(testVal, &exclusionList) if err != nil { - t.Error("Test Failed - Check JSON error", err) + t.Error("Check JSON error", err) } payload, err := json.Marshal(vals) if err != nil { - t.Fatal("Test Failed - json marshal error", err) + t.Fatal("json marshal error", err) } newStruct := TestStructLevel0{} err = json.Unmarshal(payload, &newStruct) if err != nil { - t.Fatal("Test Failed - Umarshal error", err) + t.Fatal("Umarshal error", err) } if newStruct.StructVal.BadVal != "" { @@ -173,14 +173,14 @@ func TestCheckJSON(t *testing.T) { func TestGetExcludedItems(t *testing.T) { exclusionList, err := GetExcludedItems() if err != nil { - t.Error("Test Failed - GetExcludedItems error", err) + t.Error("GetExcludedItems error", err) } if len(exclusionList.Headers) == 0 { - t.Error("Test Failed - Header exclusion list not popoulated") + t.Error("Header exclusion list not popoulated") } if len(exclusionList.Variables) == 0 { - t.Error("Test Failed - Variable exclusion list not popoulated") + t.Error("Variable exclusion list not popoulated") } } diff --git a/exchanges/mock/server_test.go b/exchanges/mock/server_test.go index 370d1a31..68042057 100644 --- a/exchanges/mock/server_test.go +++ b/exchanges/mock/server_test.go @@ -24,7 +24,7 @@ const testFile = "test.json" func TestNewVCRServer(t *testing.T) { _, _, err := NewVCRServer("") if err == nil { - t.Error("Test Failed - NewVCRServer error cannot be nil") + t.Error("NewVCRServer error cannot be nil") } // Set up mock data @@ -36,7 +36,7 @@ func TestNewVCRServer(t *testing.T) { Amount: 1, Currency: "bitcoin"}) if err != nil { - t.Fatal("Test Failed - marshal error", err) + t.Fatal("marshal error", err) } testValue := HTTPResponse{Data: rp, QueryString: queryString, BodyParams: queryString} @@ -44,17 +44,17 @@ func TestNewVCRServer(t *testing.T) { payload, err := json.Marshal(test1) if err != nil { - t.Fatal("Test Failed - marshal error", err) + t.Fatal("marshal error", err) } err = ioutil.WriteFile(testFile, payload, os.ModePerm) if err != nil { - t.Fatal("Test Failed - marshal error", err) + t.Fatal("marshal error", err) } deets, client, err := NewVCRServer(testFile) if err != nil { - t.Error("Test Failed - NewVCRServer error", err) + t.Error("NewVCRServer error", err) } common.HTTPClient = client // Set common package global HTTP Client @@ -64,7 +64,7 @@ func TestNewVCRServer(t *testing.T) { nil, bytes.NewBufferString("")) if err == nil { - t.Error("Test Failed - Sending http request expected an error") + t.Error("Sending http request expected an error") } // Expected good outcome @@ -73,11 +73,11 @@ func TestNewVCRServer(t *testing.T) { nil, bytes.NewBufferString("")) if err != nil { - t.Error("Test Failed - Sending http request error", err) + t.Error("Sending http request error", err) } if !strings.Contains(r, "404 page not found") { - t.Error("Test Failed - Was not expecting any value returned:", r) + t.Error("Was not expecting any value returned:", r) } r, err = common.SendHTTPRequest(http.MethodGet, @@ -85,33 +85,33 @@ func TestNewVCRServer(t *testing.T) { nil, bytes.NewBufferString("")) if err != nil { - t.Error("Test Failed - Sending http request error", err) + t.Error("Sending http request error", err) } var res responsePayload err = json.Unmarshal([]byte(r), &res) if err != nil { - t.Error("Test Failed - unmarshal error", err) + t.Error("unmarshal error", err) } if res.Price != 8000 { - t.Error("Test Failed - response error expected 8000 but received:", + t.Error("response error expected 8000 but received:", res.Price) } if res.Amount != 1 { - t.Error("Test Failed - response error expected 1 but received:", + t.Error("response error expected 1 but received:", res.Amount) } if res.Currency != "bitcoin" { - t.Error("Test Failed - response error expected \"bitcoin\" but received:", + t.Error("response error expected \"bitcoin\" but received:", res.Currency) } // clean up test.json file err = os.Remove(testFile) if err != nil { - t.Fatal("Test Failed - Remove error", err) + t.Fatal("Remove error", err) } } diff --git a/exchanges/nonce/nonce_test.go b/exchanges/nonce/nonce_test.go index a4923bed..3ddc290b 100644 --- a/exchanges/nonce/nonce_test.go +++ b/exchanges/nonce/nonce_test.go @@ -12,7 +12,7 @@ func TestInc(t *testing.T) { expected := Value(2) result := nonce.Get() if result != expected { - t.Errorf("Test failed. Expected %d got %d", expected, result) + t.Errorf("Expected %d got %d", expected, result) } } @@ -22,7 +22,7 @@ func TestGet(t *testing.T) { expected := Value(112321313) result := nonce.Get() if expected != result { - t.Errorf("Test failed. Expected %d got %d", expected, result) + t.Errorf("Expected %d got %d", expected, result) } } @@ -32,7 +32,7 @@ func TestGetInc(t *testing.T) { expected := Value(2) result := nonce.GetInc() if expected != result { - t.Errorf("Test failed. Expected %d got %d", expected, result) + t.Errorf("Expected %d got %d", expected, result) } } @@ -42,7 +42,7 @@ func TestSet(t *testing.T) { expected := Value(1) result := nonce.Get() if expected != result { - t.Errorf("Test failed. Expected %d got %d", expected, result) + t.Errorf("Expected %d got %d", expected, result) } } @@ -52,12 +52,12 @@ func TestString(t *testing.T) { expected := "12312313131" result := nonce.String() if expected != result { - t.Errorf("Test failed. Expected %s got %s", expected, result) + t.Errorf("Expected %s got %s", expected, result) } v := nonce.Get() if expected != v.String() { - t.Errorf("Test failed. Expected %s got %s", expected, result) + t.Errorf("Expected %s got %s", expected, result) } } @@ -75,6 +75,6 @@ func TestNonceConcurrency(t *testing.T) { result := nonce.Get() expected := Value(12312 + 1000) if expected != result { - t.Errorf("Test failed. Expected %d got %d", expected, result) + t.Errorf("Expected %d got %d", expected, result) } } diff --git a/exchanges/okcoin/okcoin_test.go b/exchanges/okcoin/okcoin_test.go index 8c35ed07..25f7bf1e 100644 --- a/exchanges/okcoin/okcoin_test.go +++ b/exchanges/okcoin/okcoin_test.go @@ -38,7 +38,7 @@ func TestSetDefaults(t *testing.T) { o.SetDefaults() } if o.GetName() != OKGroupExchange { - t.Errorf("Test Failed - %v - SetDefaults() error", OKGroupExchange) + t.Errorf("%v - SetDefaults() error", OKGroupExchange) } TestSetup(t) } @@ -64,11 +64,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Okcoin load config error", err) + t.Fatal("Okcoin load config error", err) } okcoinConfig, err := cfg.GetExchangeConfig(OKGroupExchange) if err != nil { - t.Fatalf("Test Failed - %v Setup() init error", OKGroupExchange) + t.Fatalf("%v Setup() init error", OKGroupExchange) } if okcoinConfig.Features.Enabled.Websocket { websocketEnabled = true @@ -82,7 +82,7 @@ func TestSetup(t *testing.T) { okcoinConfig.API.Endpoints.WebsocketURL = o.API.Endpoints.WebsocketURL err = o.Setup(okcoinConfig) if err != nil { - t.Fatal("Test Failed - OKCoin setup error", err) + t.Fatal("OKCoin setup error", err) } testSetupRan = true o.Websocket.DataHandler = sharedtestvalues.GetWebsocketInterfaceChannelOverride() @@ -990,42 +990,42 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := o.GetFee(feeBuilder); resp != float64(0.0015) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) } // CryptocurrencyTradeFee High quantity feeBuilder = setFeeBuilder() feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := o.GetFee(feeBuilder); resp != float64(1500) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(1500), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(1500), resp) t.Error(err) } // CryptocurrencyTradeFee IsMaker feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := o.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Error(err) } // CryptocurrencyTradeFee Negative purchase price feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := o.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } // CyptocurrencyDepositFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := o.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } // InternationalBankDepositFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := o.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } // InternationalBankWithdrawalFee Basic @@ -1033,7 +1033,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := o.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } diff --git a/exchanges/okcoin/okcoin_wrapper.go b/exchanges/okcoin/okcoin_wrapper.go index ef65153f..ce5a2a92 100644 --- a/exchanges/okcoin/okcoin_wrapper.go +++ b/exchanges/okcoin/okcoin_wrapper.go @@ -10,6 +10,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -73,9 +74,37 @@ func (o *OKCoin) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + CancelOrders: true, + SubmitOrder: true, + SubmitOrders: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + KlineFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, + MessageCorrelation: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.NoFiatWithdrawals, @@ -96,14 +125,6 @@ func (o *OKCoin) SetDefaults() { o.API.Endpoints.WebsocketURL = okCoinWebsocketURL o.APIVersion = okCoinAPIVersion o.Websocket = wshandler.New() - o.Websocket.Functionality = wshandler.WebsocketTickerSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketKlineSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketMessageCorrelationSupported o.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit o.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout o.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit diff --git a/exchanges/okex/okex_test.go b/exchanges/okex/okex_test.go index 506ec7ab..b565cec8 100644 --- a/exchanges/okex/okex_test.go +++ b/exchanges/okex/okex_test.go @@ -39,7 +39,7 @@ func TestSetDefaults(t *testing.T) { o.SetDefaults() } if o.GetName() != OKGroupExchange { - t.Errorf("Test Failed - %v - SetDefaults() error", OKGroupExchange) + t.Errorf("%v - SetDefaults() error", OKGroupExchange) } TestSetup(t) } @@ -65,12 +65,12 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Okex load config error", err) + t.Fatal("Okex load config error", err) } okexConfig, err := cfg.GetExchangeConfig(OKGroupExchange) if err != nil { - t.Fatalf("Test Failed - %v Setup() init error", OKGroupExchange) + t.Fatalf("%v Setup() init error", OKGroupExchange) } if okexConfig.Features.Enabled.Websocket { websocketEnabled = true @@ -83,7 +83,7 @@ func TestSetup(t *testing.T) { okexConfig.API.Endpoints.WebsocketURL = o.API.Endpoints.WebsocketURL err = o.Setup(okexConfig) if err != nil { - t.Fatal("Test Failed - Okex setup error", err) + t.Fatal("Okex setup error", err) } testSetupRan = true o.Websocket.DataHandler = sharedtestvalues.GetWebsocketInterfaceChannelOverride() @@ -1748,7 +1748,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := o.GetFee(feeBuilder); resp != float64(0.0015) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) } // CryptocurrencyTradeFee High quantity @@ -1756,7 +1756,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := o.GetFee(feeBuilder); resp != float64(1500) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(1500), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(1500), resp) t.Error(err) } @@ -1764,7 +1764,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := o.GetFee(feeBuilder); resp != float64(0.0005) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0005), resp) t.Error(err) } @@ -1772,7 +1772,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := o.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -1780,7 +1780,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := o.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -1788,7 +1788,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := o.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -1797,7 +1797,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := o.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } diff --git a/exchanges/okex/okex_wrapper.go b/exchanges/okex/okex_wrapper.go index 9d01460a..3e1b96f2 100644 --- a/exchanges/okex/okex_wrapper.go +++ b/exchanges/okex/okex_wrapper.go @@ -10,6 +10,7 @@ import ( "github.com/thrasher-corp/gocryptotrader/currency" exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -90,9 +91,37 @@ func (o *OKEX) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + CancelOrders: true, + SubmitOrder: true, + SubmitOrders: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + KlineFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, + MessageCorrelation: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.NoFiatWithdrawals, @@ -113,14 +142,6 @@ func (o *OKEX) SetDefaults() { o.API.Endpoints.WebsocketURL = OkExWebsocketURL o.Websocket = wshandler.New() o.APIVersion = okExAPIVersion - o.Websocket.Functionality = wshandler.WebsocketTickerSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketKlineSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketMessageCorrelationSupported o.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit o.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout o.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit diff --git a/exchanges/okgroup/okgroup_wrapper.go b/exchanges/okgroup/okgroup_wrapper.go index a0ae6828..ee74e1a0 100644 --- a/exchanges/okgroup/okgroup_wrapper.go +++ b/exchanges/okgroup/okgroup_wrapper.go @@ -42,6 +42,7 @@ func (o *OKGroup) Setup(exch *config.ExchangeConfig) error { Connector: o.WsConnect, Subscriber: o.Subscribe, UnSubscriber: o.Unsubscribe, + Features: &o.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/orderbook/orderbook_test.go b/exchanges/orderbook/orderbook_test.go index 03db6595..9389ad08 100644 --- a/exchanges/orderbook/orderbook_test.go +++ b/exchanges/orderbook/orderbook_test.go @@ -56,7 +56,7 @@ func TestSubscribeOrderbook(t *testing.T) { err = b.Process() if err != nil { - t.Error("test failed - process error", err) + t.Error("process error", err) } _, err = SubscribeOrderbook("SubscribeOBTest", p, asset.Spot) @@ -67,7 +67,7 @@ func TestSubscribeOrderbook(t *testing.T) { // process redundant update err = b.Process() if err != nil { - t.Error("test failed - process error", err) + t.Error("process error", err) } } @@ -125,7 +125,7 @@ func TestSubscribeToExchangeOrderbooks(t *testing.T) { err = b.Process() if err != nil { - t.Error("test failed:", err) + t.Error("", err) } _, err = SubscribeToExchangeOrderbooks("SubscribeToExchangeOrderbooks") @@ -167,7 +167,7 @@ func TestCalculateTotalBids(t *testing.T) { a, b := base.TotalBidsAmount() if a != 10 && b != 1000 { - t.Fatal("Test failed. TestCalculateTotalBids expected a = 10 and b = 1000") + t.Fatal("TestCalculateTotalBids expected a = 10 and b = 1000") } } @@ -181,7 +181,7 @@ func TestCalculateTotaAsks(t *testing.T) { a, b := base.TotalAsksAmount() if a != 10 && b != 1000 { - t.Fatal("Test failed. TestCalculateTotalAsks expected a = 10 and b = 1000") + t.Fatal("TestCalculateTotalAsks expected a = 10 and b = 1000") } } @@ -202,17 +202,17 @@ func TestUpdate(t *testing.T) { base.Update(bids, asks) if !base.LastUpdated.After(timeNow) { - t.Fatal("test failed. TestUpdate expected LastUpdated to be greater then original time") + t.Fatal("TestUpdate expected LastUpdated to be greater then original time") } a, b := base.TotalAsksAmount() if a != 100 && b != 20200 { - t.Fatal("Test failed. TestUpdate expected a = 100 and b = 20100") + t.Fatal("TestUpdate expected a = 100 and b = 20100") } a, b = base.TotalBidsAmount() if a != 100 && b != 20100 { - t.Fatal("Test failed. TestUpdate expected a = 100 and b = 20100") + t.Fatal("TestUpdate expected a = 100 and b = 20100") } } @@ -233,28 +233,28 @@ func TestGetOrderbook(t *testing.T) { result, err := Get("Exchange", c, asset.Spot) if err != nil { - t.Fatalf("Test failed. TestGetOrderbook failed to get orderbook. Error %s", + t.Fatalf("TestGetOrderbook failed to get orderbook. Error %s", err) } if !result.Pair.Equal(c) { - t.Fatal("Test failed. TestGetOrderbook failed. Mismatched pairs") + t.Fatal("TestGetOrderbook failed. Mismatched pairs") } _, err = Get("nonexistent", c, asset.Spot) if err == nil { - t.Fatal("Test failed. TestGetOrderbook retrieved non-existent orderbook") + t.Fatal("TestGetOrderbook retrieved non-existent orderbook") } c.Base = currency.NewCode("blah") _, err = Get("Exchange", c, asset.Spot) if err == nil { - t.Fatal("Test failed. TestGetOrderbook retrieved non-existent orderbook using invalid first currency") + t.Fatal("TestGetOrderbook retrieved non-existent orderbook using invalid first currency") } newCurrency := currency.NewPairFromStrings("BTC", "AUD") _, err = Get("Exchange", newCurrency, asset.Spot) if err == nil { - t.Fatal("Test failed. TestGetOrderbook retrieved non-existent orderbook using invalid second currency") + t.Fatal("TestGetOrderbook retrieved non-existent orderbook using invalid second currency") } base.Pair = newCurrency @@ -286,21 +286,21 @@ func TestCreateNewOrderbook(t *testing.T) { result, err := Get("testCreateNewOrderbook", c, asset.Spot) if err != nil { - t.Fatal("Test failed. TestCreateNewOrderbook failed to create new orderbook", err) + t.Fatal("TestCreateNewOrderbook failed to create new orderbook", err) } if !result.Pair.Equal(c) { - t.Fatal("Test failed. TestCreateNewOrderbook result pair is incorrect") + t.Fatal("TestCreateNewOrderbook result pair is incorrect") } a, b := result.TotalAsksAmount() if a != 10 && b != 1000 { - t.Fatal("Test failed. TestCreateNewOrderbook CalculateTotalAsks value is incorrect") + t.Fatal("TestCreateNewOrderbook CalculateTotalAsks value is incorrect") } a, b = result.TotalBidsAmount() if a != 10 && b != 2000 { - t.Fatal("Test failed. TestCreateNewOrderbook CalculateTotalBids value is incorrect") + t.Fatal("TestCreateNewOrderbook CalculateTotalBids value is incorrect") } } @@ -334,10 +334,10 @@ func TestProcessOrderbook(t *testing.T) { } result, err := Get("ProcessOrderbook", c, asset.Spot) if err != nil { - t.Fatal("Test failed. TestProcessOrderbook failed to create new orderbook") + t.Fatal("TestProcessOrderbook failed to create new orderbook") } if !result.Pair.Equal(c) { - t.Fatal("Test failed. TestProcessOrderbook result pair is incorrect") + t.Fatal("TestProcessOrderbook result pair is incorrect") } // now test for processing a pair with a different quote currency @@ -345,14 +345,14 @@ func TestProcessOrderbook(t *testing.T) { base.Pair = c err = base.Process() if err != nil { - t.Error("Test Failed - Process() error", err) + t.Error("Process() error", err) } result, err = Get("ProcessOrderbook", c, asset.Spot) if err != nil { - t.Fatal("Test failed. TestProcessOrderbook failed to retrieve new orderbook") + t.Fatal("TestProcessOrderbook failed to retrieve new orderbook") } if !result.Pair.Equal(c) { - t.Fatal("Test failed. TestProcessOrderbook result pair is incorrect") + t.Fatal("TestProcessOrderbook result pair is incorrect") } // now test for processing a pair which has a different base currency @@ -360,31 +360,31 @@ func TestProcessOrderbook(t *testing.T) { base.Pair = c err = base.Process() if err != nil { - t.Error("Test Failed - Process() error", err) + t.Error("Process() error", err) } result, err = Get("ProcessOrderbook", c, asset.Spot) if err != nil { - t.Fatal("Test failed. TestProcessOrderbook failed to retrieve new orderbook") + t.Fatal("TestProcessOrderbook failed to retrieve new orderbook") } if !result.Pair.Equal(c) { - t.Fatal("Test failed. TestProcessOrderbook result pair is incorrect") + t.Fatal("TestProcessOrderbook result pair is incorrect") } base.Asks = []Item{{Price: 200, Amount: 200}} base.AssetType = "monthly" err = base.Process() if err != nil { - t.Error("Test Failed - Process() error", err) + t.Error("Process() error", err) } result, err = Get("ProcessOrderbook", c, "monthly") if err != nil { - t.Fatal("Test failed. TestProcessOrderbook failed to retrieve new orderbook") + t.Fatal("TestProcessOrderbook failed to retrieve new orderbook") } a, b := result.TotalAsksAmount() if a != 200 && b != 40000 { - t.Fatal("Test failed. TestProcessOrderbook CalculateTotalsAsks incorrect values") + t.Fatal("TestProcessOrderbook CalculateTotalsAsks incorrect values") } base.Bids = []Item{{Price: 420, Amount: 200}} @@ -392,16 +392,16 @@ func TestProcessOrderbook(t *testing.T) { base.AssetType = "quarterly" err = base.Process() if err != nil { - t.Error("Test Failed - Process() error", err) + t.Error("Process() error", err) } result, err = Get("Blah", c, "quarterly") if err != nil { - t.Fatal("Test failed. TestProcessOrderbook failed to create new orderbook") + t.Fatal("TestProcessOrderbook failed to create new orderbook") } if a != 200 && b != 84000 { - t.Fatal("Test failed. TestProcessOrderbook CalculateTotalsBids incorrect values") + t.Fatal("TestProcessOrderbook CalculateTotalsBids incorrect values") } type quick struct { @@ -456,7 +456,7 @@ func TestProcessOrderbook(t *testing.T) { } if catastrophicFailure { - t.Fatal("Test Failed - Process() error", err) + t.Fatal("Process() error", err) } wg.Wait() @@ -472,18 +472,18 @@ func TestProcessOrderbook(t *testing.T) { } if result.Asks[0] != test.Asks[0] { - t.Error("Test failed. TestProcessOrderbook failed bad values") + t.Error("TestProcessOrderbook failed bad values") } if result.Bids[0] != test.Bids[0] { - t.Error("Test failed. TestProcessOrderbook failed bad values") + t.Error("TestProcessOrderbook failed bad values") } wg.Done() }(test) if fatalErr { - t.Fatal("Test failed. TestProcessOrderbook failed to retrieve new orderbook") + t.Fatal("TestProcessOrderbook failed to retrieve new orderbook") } } @@ -493,13 +493,13 @@ func TestProcessOrderbook(t *testing.T) { func TestSetNewData(t *testing.T) { err := service.SetNewData(nil) if err == nil { - t.Error("error cannot be nil ") + t.Error("error cannot be nil") } } func TestGetAssociations(t *testing.T) { _, err := service.GetAssociations(nil) if err == nil { - t.Error("error cannot be nil ") + t.Error("error cannot be nil") } } diff --git a/exchanges/orders/orders_test.go b/exchanges/orders/orders_test.go index 4237165f..0a7eef4e 100644 --- a/exchanges/orders/orders_test.go +++ b/exchanges/orders/orders_test.go @@ -7,31 +7,31 @@ import ( func TestNewOrder(t *testing.T) { ID := NewOrder("ANX", 2000, 20.00) if ID != 0 { - t.Error("Test Failed - Orders_test.go NewOrder() - Error") + t.Error("Orders_test.go NewOrder() - Error") } ID = NewOrder("BATMAN", 400, 25.00) if ID != 1 { - t.Error("Test Failed - Orders_test.go NewOrder() - Error") + t.Error("Orders_test.go NewOrder() - Error") } } func TestDeleteOrder(t *testing.T) { if value := DeleteOrder(0); !value { - t.Error("Test Failed - Orders_test.go DeleteOrder() - Error") + t.Error("Orders_test.go DeleteOrder() - Error") } if value := DeleteOrder(100); value { - t.Error("Test Failed - Orders_test.go DeleteOrder() - Error") + t.Error("Orders_test.go DeleteOrder() - Error") } } func TestGetOrdersByExchange(t *testing.T) { if value := GetOrdersByExchange("ANX"); len(value) != 0 { - t.Error("Test Failed - Orders_test.go GetOrdersByExchange() - Error") + t.Error("Orders_test.go GetOrdersByExchange() - Error") } } func TestGetOrderByOrderID(t *testing.T) { if value := GetOrderByOrderID(69); value != nil { - t.Error("Test Failed - Orders_test.go GetOrdersByExchange() - Error") + t.Error("Orders_test.go GetOrdersByExchange() - Error") } } diff --git a/exchanges/poloniex/poloniex_live_test.go b/exchanges/poloniex/poloniex_live_test.go index 7eb685c9..26d83788 100644 --- a/exchanges/poloniex/poloniex_live_test.go +++ b/exchanges/poloniex/poloniex_live_test.go @@ -19,11 +19,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Poloniex load config error", err) + log.Fatal("Poloniex load config error", err) } poloniexConfig, err := cfg.GetExchangeConfig("Poloniex") if err != nil { - log.Fatal("Test Failed - Poloniex Setup() init error", err) + log.Fatal("Poloniex Setup() init error", err) } poloniexConfig.API.AuthenticatedSupport = true poloniexConfig.API.Credentials.Key = apiKey @@ -31,7 +31,7 @@ func TestMain(m *testing.M) { p.SetDefaults() err = p.Setup(poloniexConfig) if err != nil { - log.Fatal("Test Failed - Poloniex setup error", err) + log.Fatal("Poloniex setup error", err) } log.Printf(sharedtestvalues.LiveTesting, p.GetName(), p.API.Endpoints.URL) os.Exit(m.Run()) diff --git a/exchanges/poloniex/poloniex_mock_test.go b/exchanges/poloniex/poloniex_mock_test.go index 96748300..2e7205dc 100644 --- a/exchanges/poloniex/poloniex_mock_test.go +++ b/exchanges/poloniex/poloniex_mock_test.go @@ -22,11 +22,11 @@ func TestMain(m *testing.M) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - log.Fatal("Test Failed - Poloniex load config error", err) + log.Fatal("Poloniex load config error", err) } poloniexConfig, err := cfg.GetExchangeConfig("Poloniex") if err != nil { - log.Fatal("Test Failed - Poloniex Setup() init error", err) + log.Fatal("Poloniex Setup() init error", err) } p.SkipAuthCheck = true poloniexConfig.API.AuthenticatedSupport = true @@ -35,12 +35,12 @@ func TestMain(m *testing.M) { p.SetDefaults() err = p.Setup(poloniexConfig) if err != nil { - log.Fatal("Test Failed - Poloniex setup error", err) + log.Fatal("Poloniex setup error", err) } serverDetails, newClient, err := mock.NewVCRServer(mockfile) if err != nil { - log.Fatalf("Test Failed - Mock server error %s", err) + log.Fatalf("Mock server error %s", err) } p.HTTPClient = newClient diff --git a/exchanges/poloniex/poloniex_test.go b/exchanges/poloniex/poloniex_test.go index bed54367..5107ada9 100644 --- a/exchanges/poloniex/poloniex_test.go +++ b/exchanges/poloniex/poloniex_test.go @@ -30,7 +30,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := p.GetTicker() if err != nil { - t.Error("Test Failed - Poloniex GetTicker() error", err) + t.Error("Poloniex GetTicker() error", err) } } @@ -124,7 +124,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := p.GetFee(feeBuilder); resp != float64(0.0025) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0025), resp) } @@ -133,7 +133,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := p.GetFee(feeBuilder); resp != float64(2500) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2500), resp) t.Error(err) } @@ -142,7 +142,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := p.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -151,7 +151,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := p.GetFee(feeBuilder); resp != float64(0.001) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.001), resp) t.Error(err) } @@ -161,7 +161,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := p.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -170,7 +170,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := p.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -179,7 +179,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := p.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -189,7 +189,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := p.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -219,11 +219,11 @@ func TestGetActiveOrders(t *testing.T) { _, err := p.GetActiveOrders(&getOrdersRequest) switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - GetActiveOrders() error", err) + t.Error("GetActiveOrders() error", err) case !areTestAPIKeysSet() && !mockTests && err == nil: - t.Error("Test Failed - Expecting an error when no keys are set") + t.Error("Expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock GetActiveOrders() err", err) + t.Error("Mock GetActiveOrders() err", err) } } @@ -273,7 +273,7 @@ func TestSubmitOrder(t *testing.T) { case !areTestAPIKeysSet() && !mockTests && err == nil: t.Error("Expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock SubmitOrder() err", err) + t.Error("Mock SubmitOrder() err", err) } } @@ -297,7 +297,7 @@ func TestCancelExchangeOrder(t *testing.T) { case areTestAPIKeysSet() && err != nil: t.Errorf("Could not cancel orders: %v", err) case mockTests && err != nil: - t.Error("Test Failed - Mock CancelExchangeOrder() err", err) + t.Error("Mock CancelExchangeOrder() err", err) } } @@ -323,7 +323,7 @@ func TestCancelAllExchangeOrders(t *testing.T) { case areTestAPIKeysSet() && err != nil: t.Errorf("Could not cancel orders: %v", err) case mockTests && err != nil: - t.Error("Test Failed - Mock CancelAllExchangeOrders() err", err) + t.Error("Mock CancelAllExchangeOrders() err", err) } if len(resp.OrderStatus) > 0 { t.Errorf("%v orders failed to cancel", len(resp.OrderStatus)) @@ -339,11 +339,11 @@ func TestModifyOrder(t *testing.T) { _, err := p.ModifyOrder(&exchange.ModifyOrder{OrderID: "1337", Price: 1337}) switch { case areTestAPIKeysSet() && err != nil && mockTests: - t.Error("Test Failed - ModifyOrder() error", err) + t.Error("ModifyOrder() error", err) case !areTestAPIKeysSet() && !mockTests && err == nil: - t.Error("Test Failed - ModifyOrder() error cannot be nil") + t.Error("ModifyOrder() error cannot be nil") case mockTests && err != nil: - t.Error("Test Failed - Mock ModifyOrder() err", err) + t.Error("Mock ModifyOrder() err", err) } } @@ -369,7 +369,7 @@ func TestWithdraw(t *testing.T) { case !areTestAPIKeysSet() && !mockTests && err == nil: t.Error("Expecting an error when no keys are set") case mockTests && err != nil: - t.Error("Test Failed - Mock Withdraw() err", err) + t.Error("Mock Withdraw() err", err) } } @@ -406,11 +406,11 @@ func TestGetDepositAddress(t *testing.T) { _, err := p.GetDepositAddress(currency.DASH, "") switch { case areTestAPIKeysSet() && err != nil: - t.Error("Test Failed - GetDepositAddress()", err) + t.Error("GetDepositAddress()", err) case !areTestAPIKeysSet() && !mockTests && err == nil: - t.Error("Test Failed - GetDepositAddress() cannot be nil") + t.Error("GetDepositAddress() cannot be nil") case mockTests && err != nil: - t.Error("Test Failed - Mock GetDepositAddress() err", err) + t.Error("Mock GetDepositAddress() err", err) } } diff --git a/exchanges/poloniex/poloniex_wrapper.go b/exchanges/poloniex/poloniex_wrapper.go index 2febf687..6477eda0 100644 --- a/exchanges/poloniex/poloniex_wrapper.go +++ b/exchanges/poloniex/poloniex_wrapper.go @@ -13,6 +13,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,9 +70,34 @@ func (p *Poloniex) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + CancelOrders: true, + SubmitOrder: true, + DepositHistory: true, + WithdrawalHistory: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + Subscribe: true, + Unsubscribe: true, + AuthenticatedEndpoints: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | exchange.NoFiatWithdrawals, @@ -90,12 +116,6 @@ func (p *Poloniex) SetDefaults() { p.API.Endpoints.URL = p.API.Endpoints.URLDefault p.API.Endpoints.WebsocketURL = poloniexWebsocketAddress p.Websocket = wshandler.New() - p.Websocket.Functionality = wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketTickerSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketUnsubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported p.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit p.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout p.WebsocketOrderbookBufferLimit = exchange.DefaultWebsocketOrderbookBufferLimit @@ -125,6 +145,7 @@ func (p *Poloniex) Setup(exch *config.ExchangeConfig) error { Connector: p.WsConnect, Subscriber: p.Subscribe, UnSubscriber: p.Unsubscribe, + Features: &p.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/exchanges/protocol/features.go b/exchanges/protocol/features.go new file mode 100644 index 00000000..09e24396 --- /dev/null +++ b/exchanges/protocol/features.go @@ -0,0 +1,40 @@ +package protocol + +// Features holds all variables for the exchanges supported features +// for a protocol (e.g REST or Websocket) +type Features struct { + TickerBatching bool `json:"tickerBatching,omitempty"` + AutoPairUpdates bool `json:"autoPairUpdates,omitempty"` + AccountBalance bool `json:"accountBalance,omitempty"` + CryptoDeposit bool `json:"cryptoDeposit,omitempty"` + CryptoWithdrawal bool `json:"cryptoWithdrawal,omitempty"` + FiatWithdraw bool `json:"fiatWithdraw,omitempty"` + GetOrder bool `json:"getOrder,omitempty"` + GetOrders bool `json:"getOrders,omitempty"` + CancelOrders bool `json:"cancelOrders,omitempty"` + CancelOrder bool `json:"cancelOrder,omitempty"` + SubmitOrder bool `json:"submitOrder,omitempty"` + SubmitOrders bool `json:"submitOrders,omitempty"` + ModifyOrder bool `json:"modifyOrder,omitempty"` + DepositHistory bool `json:"depositHistory,omitempty"` + WithdrawalHistory bool `json:"withdrawalHistory,omitempty"` + TradeHistory bool `json:"tradeHistory,omitempty"` + UserTradeHistory bool `json:"userTradeHistory,omitempty"` + TradeFee bool `json:"tradeFee,omitempty"` + FiatDepositFee bool `json:"fiatDepositFee,omitempty"` + FiatWithdrawalFee bool `json:"fiatWithdrawalFee,omitempty"` + CryptoDepositFee bool `json:"cryptoDepositFee,omitempty"` + CryptoWithdrawalFee bool `json:"cryptoWithdrawalFee,omitempty"` + TickerFetching bool `json:"tickerFetching,omitempty"` + KlineFetching bool `json:"klineFetching,omitempty"` + TradeFetching bool `json:"tradeFetching,omitempty"` + OrderbookFetching bool `json:"orderbookFetching,omitempty"` + AccountInfo bool `json:"accountInfo,omitempty"` + FiatDeposit bool `json:"fiatDeposit,omitempty"` + DeadMansSwitch bool `json:"deadMansSwitch,omitempty"` + Subscribe bool `json:"subscribe,omitempty"` + Unsubscribe bool `json:"unsubscribe,omitempty"` + AuthenticatedEndpoints bool `json:"authenticatedEndpoints,omitempty"` + MessageCorrelation bool `json:"messageCorrelation,omitempty"` + MessageSequenceNumbers bool `json:"messageSequenceNumbers,omitempty"` +} diff --git a/exchanges/request/request_test.go b/exchanges/request/request_test.go index b93eb826..9acf9a58 100644 --- a/exchanges/request/request_test.go +++ b/exchanges/request/request_test.go @@ -202,32 +202,29 @@ func TestDoRequest(t *testing.T) { var test = new(Requester) err := test.SendPayload(http.MethodGet, "https://www.google.com", nil, nil, nil, false, false, true, false, false) if err == nil { - t.Fatal("not iniitalised") + t.Fatal("Expected error") } r := New("", NewRateLimit(time.Second*10, 5), NewRateLimit(time.Second*20, 100), new(http.Client)) - if err == nil { - t.Fatal("unexpected values") - } r.Name = "bitfinex" err = r.SendPayload("BLAH", "https://www.google.com", nil, nil, nil, false, false, true, false, false) if err == nil { - t.Fatal("unexpected values") + t.Fatal("Expected error") } err = r.SendPayload(http.MethodGet, "", nil, nil, nil, false, false, true, false, false) if err == nil { - t.Fatal("unexpected values") + t.Fatal("Expected error") } err = r.SendPayload(http.MethodGet, "https://www.google.com", nil, nil, nil, false, false, true, false, false) if err != nil { - t.Fatal("unexpected values") + t.Fatal("unexpected values", err) } if !r.RequiresRateLimiter() { - t.Fatal("unexpcted values") + t.Fatal("unexpected values") } r.SetRateLimit(false, time.Second, 0) @@ -235,7 +232,7 @@ func TestDoRequest(t *testing.T) { err = r.SendPayload(http.MethodGet, "https://www.google.com", nil, nil, nil, false, false, true, false, false) if err != nil { - t.Fatal("unexpected values") + t.Fatal("unexpected values", err) } if r.RequiresRateLimiter() { @@ -247,7 +244,7 @@ func TestDoRequest(t *testing.T) { r.Cycle = time.Now().Add(time.Millisecond * -201) if r.IsValidCycle(false) { - t.Fatal("unexepcted values") + t.Fatal("unexpected values") } err = r.SendPayload(http.MethodGet, "https://www.google.com", nil, nil, nil, false, false, true, false, false) @@ -288,18 +285,18 @@ func TestDoRequest(t *testing.T) { err = r.SetTimeoutRetryAttempts(1) if err != nil { - t.Fatal("test failed - setting timeout retry attempts") + t.Fatal("setting timeout retry attempts") } err = r.SetTimeoutRetryAttempts(-1) if err == nil { - t.Fatal("test failed - setting timeout retry attempts with negative value") + t.Fatal("setting timeout retry attempts with negative value") } r.HTTPClient.Timeout = 1 * time.Second err = r.SendPayload(http.MethodPost, "https://httpstat.us/200?sleep=20000", nil, nil, nil, false, false, true, false, false) if err == nil { - t.Fatal(err) + t.Fatal("Expected error") } proxy, err := url.Parse("") @@ -309,7 +306,7 @@ func TestDoRequest(t *testing.T) { err = r.SetProxy(proxy) if err == nil { - t.Error("failed to set proxy") + t.Error("Expected error") } proxy, err = url.Parse("https://192.0.0.1") diff --git a/exchanges/stats/stats_test.go b/exchanges/stats/stats_test.go index e5aa2cea..0e22edd6 100644 --- a/exchanges/stats/stats_test.go +++ b/exchanges/stats/stats_test.go @@ -20,7 +20,7 @@ func TestLenByPrice(t *testing.T) { } if ByPrice.Len(Items) < 1 { - t.Error("Test Failed - stats LenByPrice() length not correct.") + t.Error("stats LenByPrice() length not correct.") } } @@ -45,10 +45,10 @@ func TestLessByPrice(t *testing.T) { } if !ByPrice.Less(Items, 1, 0) { - t.Error("Test Failed - stats LessByPrice() incorrect return.") + t.Error("stats LessByPrice() incorrect return.") } if ByPrice.Less(Items, 0, 1) { - t.Error("Test Failed - stats LessByPrice() incorrect return.") + t.Error("stats LessByPrice() incorrect return.") } } @@ -74,22 +74,22 @@ func TestSwapByPrice(t *testing.T) { ByPrice.Swap(Items, 0, 1) if Items[0].Exchange != "bitfinex" || Items[1].Exchange != "bitstamp" { - t.Error("Test Failed - stats SwapByPrice did not swap values.") + t.Error("stats SwapByPrice did not swap values.") } } func TestLenByVolume(t *testing.T) { if ByVolume.Len(Items) != 2 { - t.Error("Test Failed - stats lenByVolume did not swap values.") + t.Error("stats lenByVolume did not swap values.") } } func TestLessByVolume(t *testing.T) { if !ByVolume.Less(Items, 1, 0) { - t.Error("Test Failed - stats LessByVolume() incorrect return.") + t.Error("stats LessByVolume() incorrect return.") } if ByVolume.Less(Items, 0, 1) { - t.Error("Test Failed - stats LessByVolume() incorrect return.") + t.Error("stats LessByVolume() incorrect return.") } } @@ -97,7 +97,7 @@ func TestSwapByVolume(t *testing.T) { ByPrice.Swap(Items, 0, 1) if Items[1].Exchange != "bitfinex" || Items[0].Exchange != "bitstamp" { - t.Error("Test Failed - stats SwapByVolume did not swap values.") + t.Error("stats SwapByVolume did not swap values.") } } @@ -107,27 +107,27 @@ func TestAdd(t *testing.T) { Add("ANX", p, asset.Spot, 1200, 42) if len(Items) < 1 { - t.Error("Test Failed - stats Add did not add exchange info.") + t.Error("stats Add did not add exchange info.") } Add("", p, "", 0, 0) if len(Items) != 1 { - t.Error("Test Failed - stats Add did not add exchange info.") + t.Error("stats Add did not add exchange info.") } p.Base = currency.XBT Add("ANX", p, asset.Spot, 1201, 43) if Items[1].Pair.String() != "XBTUSD" { - t.Fatal("Test failed. stats Add did not add exchange info.") + t.Fatal("stats Add did not add exchange info.") } p = currency.NewPairFromStrings("ETH", "USDT") Add("ANX", p, asset.Spot, 300, 1000) if Items[2].Pair.String() != "ETHUSD" { - t.Fatal("Test failed. stats Add did not add exchange info.") + t.Fatal("stats Add did not add exchange info.") } } @@ -135,23 +135,23 @@ func TestAppend(t *testing.T) { p := currency.NewPairFromStrings("BTC", "USD") Append("sillyexchange", p, asset.Spot, 1234, 45) if len(Items) < 2 { - t.Error("Test Failed - stats Append did not add exchange values.") + t.Error("stats Append did not add exchange values.") } Append("sillyexchange", p, asset.Spot, 1234, 45) if len(Items) == 3 { - t.Error("Test Failed - stats Append added exchange values") + t.Error("stats Append added exchange values") } } func TestAlreadyExists(t *testing.T) { p := currency.NewPairFromStrings("BTC", "USD") if !AlreadyExists("ANX", p, asset.Spot, 1200, 42) { - t.Error("Test Failed - stats AlreadyExists exchange does not exist.") + t.Error("stats AlreadyExists exchange does not exist.") } p.Base = currency.NewCode("dii") if AlreadyExists("bla", p, asset.Spot, 1234, 123) { - t.Error("Test Failed - stats AlreadyExists found incorrect exchange.") + t.Error("stats AlreadyExists found incorrect exchange.") } } @@ -159,12 +159,12 @@ func TestSortExchangesByVolume(t *testing.T) { p := currency.NewPairFromStrings("BTC", "USD") topVolume := SortExchangesByVolume(p, asset.Spot, true) if topVolume[0].Exchange != "sillyexchange" { - t.Error("Test Failed - stats SortExchangesByVolume incorrectly sorted values.") + t.Error("stats SortExchangesByVolume incorrectly sorted values.") } topVolume = SortExchangesByVolume(p, asset.Spot, false) if topVolume[0].Exchange != "ANX" { - t.Error("Test Failed - stats SortExchangesByVolume incorrectly sorted values.") + t.Error("stats SortExchangesByVolume incorrectly sorted values.") } } @@ -172,11 +172,11 @@ func TestSortExchangesByPrice(t *testing.T) { p := currency.NewPairFromStrings("BTC", "USD") topPrice := SortExchangesByPrice(p, asset.Spot, true) if topPrice[0].Exchange != "sillyexchange" { - t.Error("Test Failed - stats SortExchangesByPrice incorrectly sorted values.") + t.Error("stats SortExchangesByPrice incorrectly sorted values.") } topPrice = SortExchangesByPrice(p, asset.Spot, false) if topPrice[0].Exchange != "ANX" { - t.Error("Test Failed - stats SortExchangesByPrice incorrectly sorted values.") + t.Error("stats SortExchangesByPrice incorrectly sorted values.") } } diff --git a/exchanges/ticker/ticker_test.go b/exchanges/ticker/ticker_test.go index 91e6c9ab..9cc686d9 100644 --- a/exchanges/ticker/ticker_test.go +++ b/exchanges/ticker/ticker_test.go @@ -107,64 +107,64 @@ func TestGetTicker(t *testing.T) { err := ProcessTicker("bitfinex", &priceStruct, asset.Spot) if err != nil { - t.Fatal("Test failed. ProcessTicker error", err) + t.Fatal("ProcessTicker error", err) } tickerPrice, err := GetTicker("bitfinex", newPair, asset.Spot) if err != nil { - t.Errorf("Test Failed - Ticker GetTicker init error: %s", err) + t.Errorf("Ticker GetTicker init error: %s", err) } if !tickerPrice.Pair.Equal(newPair) { - t.Error("Test Failed - ticker tickerPrice.CurrencyPair value is incorrect") + t.Error("ticker tickerPrice.CurrencyPair value is incorrect") } _, err = GetTicker("blah", newPair, asset.Spot) if err == nil { - t.Fatal("Test Failed. TestGetTicker returned nil error on invalid exchange") + t.Fatal("TestGetTicker returned nil error on invalid exchange") } newPair.Base = currency.ETH _, err = GetTicker("bitfinex", newPair, asset.Spot) if err == nil { - t.Fatal("Test Failed. TestGetTicker returned ticker for invalid first currency") + t.Fatal("TestGetTicker returned ticker for invalid first currency") } btcltcPair := currency.NewPairFromStrings("BTC", "LTC") _, err = GetTicker("bitfinex", btcltcPair, asset.Spot) if err == nil { - t.Fatal("Test Failed. TestGetTicker returned ticker for invalid second currency") + t.Fatal("TestGetTicker returned ticker for invalid second currency") } priceStruct.PriceATH = 9001 priceStruct.Pair.Base = currency.ETH err = ProcessTicker("bitfinex", &priceStruct, "futures_3m") if err != nil { - t.Fatal("Test failed. ProcessTicker error", err) + t.Fatal("ProcessTicker error", err) } tickerPrice, err = GetTicker("bitfinex", newPair, "futures_3m") if err != nil { - t.Errorf("Test Failed - Ticker GetTicker init error: %s", err) + t.Errorf("Ticker GetTicker init error: %s", err) } if tickerPrice.PriceATH != 9001 { - t.Error("Test Failed - ticker tickerPrice.PriceATH value is incorrect") + t.Error("ticker tickerPrice.PriceATH value is incorrect") } _, err = GetTicker("bitfinex", newPair, "meowCats") if err == nil { - t.Error("Test Failed - Ticker GetTicker error cannot be nil") + t.Error("Ticker GetTicker error cannot be nil") } err = ProcessTicker("bitfinex", &priceStruct, "meowCats") if err != nil { - t.Fatal("Test failed. ProcessTicker error", err) + t.Fatal("ProcessTicker error", err) } // process update again err = ProcessTicker("bitfinex", &priceStruct, "meowCats") if err != nil { - t.Fatal("Test failed. ProcessTicker error", err) + t.Fatal("ProcessTicker error", err) } } @@ -196,20 +196,20 @@ func TestProcessTicker(t *testing.T) { // non-appending function to tickers priceStruct.Pair = newPair err = ProcessTicker(exchName, &priceStruct, "") if err == nil { - t.Fatal("Test failed. ProcessTicker error cannot be nil") + t.Fatal("ProcessTicker error cannot be nil") } // now process a valid ticker err = ProcessTicker(exchName, &priceStruct, asset.Spot) if err != nil { - t.Fatal("Test failed. ProcessTicker error", err) + t.Fatal("ProcessTicker error", err) } result, err := GetTicker(exchName, newPair, asset.Spot) if err != nil { - t.Fatal("Test failed. TestProcessTicker failed to create and return a new ticker") + t.Fatal("TestProcessTicker failed to create and return a new ticker") } if !result.Pair.Equal(newPair) { - t.Fatal("Test failed. TestProcessTicker pair mismatch") + t.Fatal("TestProcessTicker pair mismatch") } // now test for processing a pair with a different quote currency @@ -217,15 +217,15 @@ func TestProcessTicker(t *testing.T) { // non-appending function to tickers priceStruct.Pair = newPair err = ProcessTicker(exchName, &priceStruct, asset.Spot) if err != nil { - t.Fatal("Test failed. ProcessTicker error", err) + t.Fatal("ProcessTicker error", err) } result, err = GetTicker(exchName, newPair, asset.Spot) if err != nil { - t.Fatal("Test failed. TestProcessTicker failed to create and return a new ticker") + t.Fatal("TestProcessTicker failed to create and return a new ticker") } result, err = GetTicker(exchName, newPair, asset.Spot) if err != nil { - t.Fatal("Test failed. TestProcessTicker failed to return an existing ticker") + t.Fatal("TestProcessTicker failed to return an existing ticker") } // now test for processing a pair which has a different base currency @@ -233,15 +233,15 @@ func TestProcessTicker(t *testing.T) { // non-appending function to tickers priceStruct.Pair = newPair err = ProcessTicker(exchName, &priceStruct, asset.Spot) if err != nil { - t.Fatal("Test failed. ProcessTicker error", err) + t.Fatal("ProcessTicker error", err) } result, err = GetTicker(exchName, newPair, asset.Spot) if err != nil { - t.Fatal("Test failed. TestProcessTicker failed to create and return a new ticker") + t.Fatal("TestProcessTicker failed to create and return a new ticker") } result, err = GetTicker(exchName, newPair, asset.Spot) if err != nil { - t.Fatal("Test failed. TestProcessTicker failed to return an existing ticker") + t.Fatal("TestProcessTicker failed to return an existing ticker") } type quick struct { @@ -289,7 +289,7 @@ func TestProcessTicker(t *testing.T) { // non-appending function to tickers } if catastrophicFailure { - t.Fatal("Test failed. ProcessTicker error") + t.Fatal("ProcessTicker error") } wg.Wait() @@ -305,14 +305,14 @@ func TestProcessTicker(t *testing.T) { // non-appending function to tickers } if result.Last != test.TP.Last { - t.Error("Test failed. TestProcessTicker failed bad values") + t.Error("TestProcessTicker failed bad values") } wg.Done() }(test) if fatalErr { - t.Fatal("Test failed. TestProcessTicker failed to retrieve new ticker") + t.Fatal("TestProcessTicker failed to retrieve new ticker") } } wg.Wait() @@ -343,7 +343,7 @@ func TestSetItemID(t *testing.T) { func TestGetAssociation(t *testing.T) { _, err := service.GetAssociations(nil) if err == nil { - t.Error("error cannot be nil ") + t.Error("error cannot be nil") } p := currency.NewPair(currency.CYC, currency.CYG) @@ -352,7 +352,7 @@ func TestGetAssociation(t *testing.T) { _, err = service.GetAssociations(&Price{Pair: p, ExchangeName: "GetAssociation"}) if err == nil { - t.Error("error cannot be nil ") + t.Error("error cannot be nil") } service.mux = cpyMux diff --git a/exchanges/websocket/wshandler/wshandler.go b/exchanges/websocket/wshandler/wshandler.go index caa29869..596a631b 100644 --- a/exchanges/websocket/wshandler/wshandler.go +++ b/exchanges/websocket/wshandler/wshandler.go @@ -45,6 +45,7 @@ func (w *Websocket) Setup(setupData *WebsocketSetup) error { w.SetExchangeName(setupData.ExchangeName) w.SetCanUseAuthenticatedEndpoints(setupData.AuthenticatedWebsocketAPISupport) w.trafficTimeout = setupData.WebsocketTimeout + w.features = setupData.Features err := w.Initialise() if err != nil { return err @@ -91,7 +92,7 @@ func (w *Websocket) Connect() error { if !w.IsConnectionMonitorRunning() { go w.connectionMonitor() } - if w.SupportsFunctionality(WebsocketSubscribeSupported) || w.SupportsFunctionality(WebsocketUnsubscribeSupported) { + if w.features.Subscribe || w.features.Unsubscribe { w.Wg.Add(1) go w.manageSubscriptions() } @@ -402,87 +403,6 @@ func (w *Websocket) GetName() string { return w.exchangeName } -// GetFunctionality returns a functionality bitmask for the websocket -// connection -func (w *Websocket) GetFunctionality() uint32 { - return w.Functionality -} - -// SupportsFunctionality returns if the functionality is supported as a boolean -func (w *Websocket) SupportsFunctionality(f uint32) bool { - return w.GetFunctionality()&f == f -} - -// FormatFunctionality will return each of the websocket connection compatible -// stream methods as a string -func (w *Websocket) FormatFunctionality() string { - var functionality []string - for i := 0; i < 32; i++ { - var check uint32 = 1 << uint32(i) - if w.GetFunctionality()&check != 0 { - switch check { - case WebsocketTickerSupported: - functionality = append(functionality, WebsocketTickerSupportedText) - - case WebsocketOrderbookSupported: - functionality = append(functionality, WebsocketOrderbookSupportedText) - - case WebsocketKlineSupported: - functionality = append(functionality, WebsocketKlineSupportedText) - - case WebsocketTradeDataSupported: - functionality = append(functionality, WebsocketTradeDataSupportedText) - - case WebsocketAccountSupported: - functionality = append(functionality, WebsocketAccountSupportedText) - - case WebsocketAllowsRequests: - functionality = append(functionality, WebsocketAllowsRequestsText) - - case WebsocketSubscribeSupported: - functionality = append(functionality, WebsocketSubscribeSupportedText) - - case WebsocketUnsubscribeSupported: - functionality = append(functionality, WebsocketUnsubscribeSupportedText) - - case WebsocketAuthenticatedEndpointsSupported: - functionality = append(functionality, WebsocketAuthenticatedEndpointsSupportedText) - - case WebsocketAccountDataSupported: - functionality = append(functionality, WebsocketAccountDataSupportedText) - - case WebsocketSubmitOrderSupported: - functionality = append(functionality, WebsocketSubmitOrderSupportedText) - - case WebsocketCancelOrderSupported: - functionality = append(functionality, WebsocketCancelOrderSupportedText) - - case WebsocketWithdrawSupported: - functionality = append(functionality, WebsocketWithdrawSupportedText) - - case WebsocketMessageCorrelationSupported: - functionality = append(functionality, WebsocketMessageCorrelationSupportedText) - - case WebsocketSequenceNumberSupported: - functionality = append(functionality, WebsocketSequenceNumberSupportedText) - - case WebsocketDeadMansSwitchSupported: - functionality = append(functionality, WebsocketDeadMansSwitchSupportedText) - - default: - functionality = append(functionality, - fmt.Sprintf("%s[1<<%v]", UnknownWebsocketFunctionality, i)) - } - } - } - - if len(functionality) > 0 { - return strings.Join(functionality, " & ") - } - - return NoWebsocketSupportText -} - // SetChannelSubscriber sets the function to use the base subscribe func func (w *Websocket) SetChannelSubscriber(subscriber func(channelToSubscribe WebsocketChannelSubscription) error) { w.channelSubscriber = subscriber @@ -495,7 +415,7 @@ func (w *Websocket) SetChannelUnsubscriber(unsubscriber func(channelToUnsubscrib // ManageSubscriptions ensures the subscriptions specified continue to be subscribed to func (w *Websocket) manageSubscriptions() { - if !w.SupportsFunctionality(WebsocketSubscribeSupported) && !w.SupportsFunctionality(WebsocketUnsubscribeSupported) { + if !w.features.Subscribe && !w.features.Unsubscribe { w.DataHandler <- fmt.Errorf("%v does not support channel subscriptions, exiting ManageSubscriptions()", w.exchangeName) return } @@ -528,13 +448,13 @@ func (w *Websocket) manageSubscriptions() { log.Debugf(log.WebsocketMgr, "%v checking subscriptions", w.exchangeName) } // Subscribe to channels Pending a subscription - if w.SupportsFunctionality(WebsocketSubscribeSupported) { + if w.features.Subscribe { err := w.appendSubscribedChannels() if err != nil { w.DataHandler <- err } } - if w.SupportsFunctionality(WebsocketUnsubscribeSupported) { + if w.features.Unsubscribe { err := w.unsubscribeToChannels() if err != nil { w.DataHandler <- err diff --git a/exchanges/websocket/wshandler/wshandler_test.go b/exchanges/websocket/wshandler/wshandler_test.go index dc293cf1..0c7cb7ec 100644 --- a/exchanges/websocket/wshandler/wshandler_test.go +++ b/exchanges/websocket/wshandler/wshandler_test.go @@ -16,6 +16,7 @@ import ( "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/common" "github.com/thrasher-corp/gocryptotrader/currency" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" ) func TestTrafficMonitorTimeout(t *testing.T) { @@ -85,6 +86,7 @@ func TestConnectionMessageErrors(t *testing.T) { ws.DataHandler = make(chan interface{}) ws.ShutdownC = make(chan struct{}) ws.connector = func() error { return nil } + ws.features = &protocol.Features{} go ws.connectionMonitor() timer := time.NewTimer(900 * time.Millisecond) ws.ReadMessageErrors <- errors.New("errorText") @@ -126,7 +128,7 @@ func TestWebsocket(t *testing.T) { ws = *New() err = ws.SetProxyAddress("testProxy") if err != nil { - t.Error("test failed - SetProxyAddress", err) + t.Error("SetProxyAddress", err) } err = ws.Setup( @@ -140,102 +142,60 @@ func TestWebsocket(t *testing.T) { Connector: func() error { return nil }, Subscriber: func(test WebsocketChannelSubscription) error { return nil }, UnSubscriber: func(test WebsocketChannelSubscription) error { return nil }, + Features: &protocol.Features{}, }) if err != nil { t.Error(err) } if ws.GetName() != "exchangeName" { - t.Error("test failed - WebsocketSetup") + t.Error("WebsocketSetup") } if !ws.IsEnabled() { - t.Error("test failed - WebsocketSetup") + t.Error("WebsocketSetup") } if ws.GetProxyAddress() != "testProxy" { - t.Error("test failed - WebsocketSetup") + t.Error("WebsocketSetup") } if ws.GetDefaultURL() != "testDefaultURL" { - t.Error("test failed - WebsocketSetup") + t.Error("WebsocketSetup") } if ws.GetWebsocketURL() != "testRunningURL" { - t.Error("test failed - WebsocketSetup") + t.Error("WebsocketSetup") } if ws.trafficTimeout != time.Duration(2) { - t.Error("test failed - WebsocketSetup") + t.Error("WebsocketSetup") } // -- Not connected shutdown err = ws.Shutdown() if err == nil { - t.Fatal("test failed - should not be connected to able to shut down") + t.Fatal("should not be connected to able to shut down") } ws.Wg.Wait() // -- Normal connect err = ws.Connect() if err != nil { - t.Fatal("test failed - WebsocketSetup", err) + t.Fatal("WebsocketSetup", err) } ws.SetWebsocketURL("ws://demos.kaazing.com/echo") // -- Already connected connect err = ws.Connect() if err == nil { - t.Fatal("test failed - should not connect, already connected") + t.Fatal("should not connect, already connected") } // -- Normal shutdown err = ws.Shutdown() if err != nil { - t.Fatal("test failed - WebsocketSetup", err) + t.Fatal("WebsocketSetup", err) } ws.Wg.Wait() } -func TestFunctionality(t *testing.T) { - ws := New() - if ws.FormatFunctionality() != NoWebsocketSupportText { - t.Fatalf("Test Failed - FormatFunctionality error expected %s but received %s", - NoWebsocketSupportText, ws.FormatFunctionality()) - } - - ws.Functionality = 1 << 31 - - if ws.FormatFunctionality() != UnknownWebsocketFunctionality+"[1<<31]" { - t.Fatal("Test Failed - GetFunctionality error incorrect error returned") - } - - ws.Functionality = WebsocketOrderbookSupported - - if ws.GetFunctionality() != WebsocketOrderbookSupported { - t.Fatal("Test Failed - GetFunctionality error incorrect bitmask returned") - } - - if !ws.SupportsFunctionality(WebsocketOrderbookSupported) { - t.Fatal("Test Failed - SupportsFunctionality error should be true") - } - - ws.Functionality = WebsocketTickerSupported | WebsocketOrderbookSupported | WebsocketKlineSupported | - WebsocketTradeDataSupported | WebsocketAccountSupported | WebsocketAllowsRequests | - WebsocketSubscribeSupported | WebsocketUnsubscribeSupported | WebsocketAuthenticatedEndpointsSupported | - WebsocketAccountDataSupported | WebsocketSubmitOrderSupported | WebsocketCancelOrderSupported | - WebsocketWithdrawSupported | WebsocketMessageCorrelationSupported | WebsocketSequenceNumberSupported | - WebsocketDeadMansSwitchSupported - formatted := ws.FormatFunctionality() - - if !strings.Contains(formatted, WebsocketTickerSupportedText) || !strings.Contains(formatted, WebsocketOrderbookSupportedText) || - !strings.Contains(formatted, WebsocketKlineSupportedText) || !strings.Contains(formatted, WebsocketTradeDataSupportedText) || - !strings.Contains(formatted, WebsocketAccountSupportedText) || !strings.Contains(formatted, WebsocketAllowsRequestsText) || - !strings.Contains(formatted, WebsocketSubscribeSupportedText) || !strings.Contains(formatted, WebsocketUnsubscribeSupportedText) || - !strings.Contains(formatted, WebsocketAuthenticatedEndpointsSupportedText) || !strings.Contains(formatted, WebsocketAccountDataSupportedText) || - !strings.Contains(formatted, WebsocketSubmitOrderSupportedText) || !strings.Contains(formatted, WebsocketCancelOrderSupportedText) || - !strings.Contains(formatted, WebsocketWithdrawSupportedText) || !strings.Contains(formatted, WebsocketMessageCorrelationSupportedText) || - !strings.Contains(formatted, WebsocketSequenceNumberSupportedText) || !strings.Contains(formatted, WebsocketDeadMansSwitchSupportedText) { - t.Error("Failed to format and include supported websocket features") - } -} - // placeholderSubscriber basic function to test subscriptions func placeholderSubscriber(channelToSubscribe WebsocketChannelSubscription) error { return nil @@ -349,8 +309,8 @@ func TestUnsubscriptionWithExistingEntry(t *testing.T) { // TestManageSubscriptionsStartStop logic test func TestManageSubscriptionsStartStop(t *testing.T) { w := Websocket{ - ShutdownC: make(chan struct{}), - Functionality: WebsocketSubscribeSupported | WebsocketUnsubscribeSupported, + ShutdownC: make(chan struct{}), + features: &protocol.Features{Subscribe: true, Unsubscribe: true}, } w.Wg.Add(1) go w.manageSubscriptions() @@ -361,8 +321,8 @@ func TestManageSubscriptionsStartStop(t *testing.T) { // TestManageSubscriptions logic test func TestManageSubscriptions(t *testing.T) { w := Websocket{ - ShutdownC: make(chan struct{}), - Functionality: WebsocketSubscribeSupported | WebsocketUnsubscribeSupported, + ShutdownC: make(chan struct{}), + features: &protocol.Features{Subscribe: true, Unsubscribe: true}, subscribedChannels: []WebsocketChannelSubscription{ { Channel: "hello", diff --git a/exchanges/websocket/wshandler/wshandler_types.go b/exchanges/websocket/wshandler/wshandler_types.go index 6469efe4..c4e9b341 100644 --- a/exchanges/websocket/wshandler/wshandler_types.go +++ b/exchanges/websocket/wshandler/wshandler_types.go @@ -7,47 +7,12 @@ import ( "github.com/gorilla/websocket" "github.com/thrasher-corp/gocryptotrader/currency" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wsorderbook" ) // Websocket functionality list and state consts const ( - NoWebsocketSupport uint32 = 0 - WebsocketTickerSupported uint32 = 1 << (iota - 1) - WebsocketOrderbookSupported - WebsocketKlineSupported - WebsocketTradeDataSupported - WebsocketAccountSupported - WebsocketAllowsRequests - WebsocketSubscribeSupported - WebsocketUnsubscribeSupported - WebsocketAuthenticatedEndpointsSupported - WebsocketAccountDataSupported - WebsocketSubmitOrderSupported - WebsocketCancelOrderSupported - WebsocketWithdrawSupported - WebsocketMessageCorrelationSupported - WebsocketSequenceNumberSupported - WebsocketDeadMansSwitchSupported - - WebsocketTickerSupportedText = "TICKER STREAMING SUPPORTED" - WebsocketOrderbookSupportedText = "ORDERBOOK STREAMING SUPPORTED" - WebsocketKlineSupportedText = "KLINE STREAMING SUPPORTED" - WebsocketTradeDataSupportedText = "TRADE STREAMING SUPPORTED" - WebsocketAccountSupportedText = "ACCOUNT STREAMING SUPPORTED" - WebsocketAllowsRequestsText = "WEBSOCKET REQUESTS SUPPORTED" - NoWebsocketSupportText = "WEBSOCKET NOT SUPPORTED" - UnknownWebsocketFunctionality = "UNKNOWN FUNCTIONALITY BITMASK" - WebsocketSubscribeSupportedText = "WEBSOCKET SUBSCRIBE SUPPORTED" - WebsocketUnsubscribeSupportedText = "WEBSOCKET UNSUBSCRIBE SUPPORTED" - WebsocketAuthenticatedEndpointsSupportedText = "WEBSOCKET AUTHENTICATED ENDPOINTS SUPPORTED" - WebsocketAccountDataSupportedText = "WEBSOCKET ACCOUNT DATA SUPPORTED" - WebsocketSubmitOrderSupportedText = "WEBSOCKET SUBMIT ORDER SUPPORTED" - WebsocketCancelOrderSupportedText = "WEBSOCKET CANCEL ORDER SUPPORTED" - WebsocketWithdrawSupportedText = "WEBSOCKET WITHDRAW SUPPORTED" - WebsocketMessageCorrelationSupportedText = "WEBSOCKET MESSAGE CORRELATION SUPPORTED" - WebsocketSequenceNumberSupportedText = "WEBSOCKET SEQUENCE NUMBER SUPPORTED" - WebsocketDeadMansSwitchSupportedText = "WEBSOCKET DEAD MANS SWITCH SUPPORTED" // WebsocketNotEnabled alerts of a disabled websocket WebsocketNotEnabled = "exchange_websocket_not_enabled" manageSubscriptionsDelay = 5 * time.Second @@ -58,8 +23,6 @@ const ( // Websocket defines a return type for websocket connections via the interface // wrapper for routine processing in routines.go type Websocket struct { - // Functionality defines websocket stream capabilities - Functionality uint32 canUseAuthenticatedEndpoints bool enabled bool init bool @@ -93,6 +56,7 @@ type Websocket struct { TrafficAlert chan struct{} // ReadMessageErrors will received all errors from ws.ReadMessage() and verify if its a disconnection ReadMessageErrors chan error + features *protocol.Features } type WebsocketSetup struct { @@ -106,6 +70,7 @@ type WebsocketSetup struct { Connector func() error Subscriber func(channelToSubscribe WebsocketChannelSubscription) error UnSubscriber func(channelToUnsubscribe WebsocketChannelSubscription) error + Features *protocol.Features } // WebsocketChannelSubscription container for websocket subscriptions diff --git a/exchanges/websocket/wsorderbook/wsorderbook_test.go b/exchanges/websocket/wsorderbook/wsorderbook_test.go index a60fd067..78e27cf7 100644 --- a/exchanges/websocket/wsorderbook/wsorderbook_test.go +++ b/exchanges/websocket/wsorderbook/wsorderbook_test.go @@ -242,6 +242,39 @@ func BenchmarkNoBufferPerformance(b *testing.B) { } } +func TestUpdates(t *testing.T) { + obl, curr, _, _, err := createSnapshot() + if err != nil { + t.Error(err) + } + + obl.updateAsksByPrice(obl.ob[curr][asset.Spot], &WebsocketOrderbookUpdate{ + Bids: itemArray[5], + Asks: itemArray[5], + CurrencyPair: curr, + UpdateTime: time.Now(), + AssetType: asset.Spot, + }) + if err != nil { + t.Error(err) + } + + obl.updateAsksByPrice(obl.ob[curr][asset.Spot], &WebsocketOrderbookUpdate{ + Bids: itemArray[0], + Asks: itemArray[0], + CurrencyPair: curr, + UpdateTime: time.Now(), + AssetType: asset.Spot, + }) + if err != nil { + t.Error(err) + } + + if len(obl.ob[curr][asset.Spot].Asks) != 3 { + t.Error("Did not update") + } +} + // TestHittingTheBuffer logic test func TestHittingTheBuffer(t *testing.T) { obl, curr, _, _, err := createSnapshot() diff --git a/exchanges/yobit/yobit_test.go b/exchanges/yobit/yobit_test.go index 20193af2..a0d92fa2 100644 --- a/exchanges/yobit/yobit_test.go +++ b/exchanges/yobit/yobit_test.go @@ -29,11 +29,11 @@ func TestSetup(t *testing.T) { yobitConfig := config.GetConfig() err := yobitConfig.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - Yobit load config error", err) + t.Fatal("Yobit load config error", err) } conf, err := yobitConfig.GetExchangeConfig("Yobit") if err != nil { - t.Fatal("Test Failed - Yobit init error", err) + t.Fatal("Yobit init error", err) } conf.API.Credentials.Key = apiKey conf.API.Credentials.Secret = apiSecret @@ -41,7 +41,7 @@ func TestSetup(t *testing.T) { err = y.Setup(conf) if err != nil { - t.Fatal("Test Failed - Yobit setup error", err) + t.Fatal("Yobit setup error", err) } } @@ -49,7 +49,7 @@ func TestFetchTradablePairs(t *testing.T) { t.Parallel() _, err := y.FetchTradablePairs(asset.Spot) if err != nil { - t.Errorf("Test failed. FetchTradablePairs err: %s", err) + t.Errorf("FetchTradablePairs err: %s", err) } } @@ -57,7 +57,7 @@ func TestGetInfo(t *testing.T) { t.Parallel() _, err := y.GetInfo() if err != nil { - t.Error("Test Failed - GetInfo() error") + t.Error("GetInfo() error") } } @@ -65,7 +65,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := y.GetTicker("btc_usd") if err != nil { - t.Error("Test Failed - GetTicker() error", err) + t.Error("GetTicker() error", err) } } @@ -73,7 +73,7 @@ func TestGetDepth(t *testing.T) { t.Parallel() _, err := y.GetDepth("btc_usd") if err != nil { - t.Error("Test Failed - GetDepth() error", err) + t.Error("GetDepth() error", err) } } @@ -81,7 +81,7 @@ func TestGetTrades(t *testing.T) { t.Parallel() _, err := y.GetTrades("btc_usd") if err != nil { - t.Error("Test Failed - GetTrades() error", err) + t.Error("GetTrades() error", err) } } @@ -89,7 +89,7 @@ func TestGetAccountInfo(t *testing.T) { t.Parallel() _, err := y.GetAccountInfo() if err == nil { - t.Error("Test Failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() Expected error") } } @@ -97,7 +97,7 @@ func TestGetOpenOrders(t *testing.T) { t.Parallel() _, err := y.GetOpenOrders("") if err == nil { - t.Error("Test Failed - GetOpenOrders() error", err) + t.Error("GetOpenOrders() Expected error") } } @@ -105,7 +105,7 @@ func TestGetOrderInfo(t *testing.T) { t.Parallel() _, err := y.GetOrderInfo("6196974") if err == nil { - t.Error("Test Failed - GetOrderInfo() error", err) + t.Error("GetOrderInfo() Expected error") } } @@ -113,7 +113,7 @@ func TestCancelOrder(t *testing.T) { t.Parallel() _, err := y.CancelExistingOrder(1337) if err == nil { - t.Error("Test Failed - CancelOrder() error", err) + t.Error("CancelOrder() Expected error") } } @@ -121,7 +121,7 @@ func TestTrade(t *testing.T) { t.Parallel() _, err := y.Trade("", exchange.BuyOrderSide.ToLower().ToString(), 0, 0) if err == nil { - t.Error("Test Failed - Trade() error", err) + t.Error("Trade() Expected error") } } @@ -129,7 +129,7 @@ func TestWithdrawCoinsToAddress(t *testing.T) { t.Parallel() _, err := y.WithdrawCoinsToAddress("", 0, "") if err == nil { - t.Error("Test Failed - WithdrawCoinsToAddress() error", err) + t.Error("WithdrawCoinsToAddress() Expected error") } } @@ -137,7 +137,7 @@ func TestCreateYobicode(t *testing.T) { t.Parallel() _, err := y.CreateCoupon("bla", 0) if err == nil { - t.Error("Test Failed - CreateYobicode() error", err) + t.Error("CreateYobicode() Expected error") } } @@ -145,7 +145,7 @@ func TestRedeemYobicode(t *testing.T) { t.Parallel() _, err := y.RedeemCoupon("bla2") if err == nil { - t.Error("Test Failed - RedeemYobicode() error", err) + t.Error("RedeemYobicode() Expected error") } } @@ -185,7 +185,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := y.GetFee(feeBuilder); resp != float64(0.002) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) } // CryptocurrencyTradeFee High quantity @@ -193,7 +193,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := y.GetFee(feeBuilder); resp != float64(2000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2000), resp) t.Error(err) } @@ -201,7 +201,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := y.GetFee(feeBuilder); resp != float64(0.002) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) t.Error(err) } @@ -209,14 +209,14 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := y.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } // CryptocurrencyWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := y.GetFee(feeBuilder); resp != float64(0.002) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) t.Error(err) } @@ -225,7 +225,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := y.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -233,7 +233,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := y.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -241,7 +241,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := y.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -250,7 +250,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := y.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -260,7 +260,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FiatCurrency = currency.USD feeBuilder.BankTransactionType = exchange.Qiwi if resp, err := y.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -270,7 +270,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FiatCurrency = currency.USD feeBuilder.BankTransactionType = exchange.WireTransfer if resp, err := y.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -280,7 +280,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FiatCurrency = currency.USD feeBuilder.BankTransactionType = exchange.Payeer if resp, err := y.GetFee(feeBuilder); resp != float64(0.03) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.03), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.03), resp) t.Error(err) } @@ -290,7 +290,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FiatCurrency = currency.RUR feeBuilder.BankTransactionType = exchange.Capitalist if resp, err := y.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -300,7 +300,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FiatCurrency = currency.USD feeBuilder.BankTransactionType = exchange.AdvCash if resp, err := y.GetFee(feeBuilder); resp != float64(0.04) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.04), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.04), resp) t.Error(err) } @@ -310,7 +310,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FiatCurrency = currency.RUR feeBuilder.BankTransactionType = exchange.PerfectMoney if resp, err := y.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -458,7 +458,7 @@ func TestCancelAllExchangeOrders(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := y.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -521,12 +521,12 @@ func TestGetDepositAddress(t *testing.T) { if apiKey != "" || apiSecret != "" { _, err := y.GetDepositAddress(currency.BTC, "") if err != nil { - t.Error("Test Failed - GetDepositAddress() error", err) + t.Error("GetDepositAddress() Expected error") } } else { _, err := y.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error") + t.Error("GetDepositAddress() error") } } } diff --git a/exchanges/yobit/yobit_wrapper.go b/exchanges/yobit/yobit_wrapper.go index b2f960a1..c4edd5c0 100644 --- a/exchanges/yobit/yobit_wrapper.go +++ b/exchanges/yobit/yobit_wrapper.go @@ -15,6 +15,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -72,9 +73,23 @@ func (y *Yobit) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: false, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + UserTradeHistory: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + FiatDepositFee: true, + FiatWithdrawalFee: true, + CryptoWithdrawalFee: true, }, WithdrawPermissions: exchange.AutoWithdrawCryptoWithAPIPermission | exchange.WithdrawFiatViaWebsiteOnly, diff --git a/exchanges/zb/zb_test.go b/exchanges/zb/zb_test.go index 1f0004cb..bbd77cc3 100644 --- a/exchanges/zb/zb_test.go +++ b/exchanges/zb/zb_test.go @@ -31,11 +31,11 @@ func TestSetup(t *testing.T) { cfg := config.GetConfig() err := cfg.LoadConfig("../../testdata/configtest.json", true) if err != nil { - t.Fatal("Test Failed - ZB load config error", err) + t.Fatal("ZB load config error", err) } zbConfig, err := cfg.GetExchangeConfig("ZB") if err != nil { - t.Fatal("Test Failed - ZB Setup() init error", err) + t.Fatal("ZB Setup() init error", err) } zbConfig.API.AuthenticatedSupport = true zbConfig.API.AuthenticatedWebsocketSupport = true @@ -44,7 +44,7 @@ func TestSetup(t *testing.T) { err = z.Setup(zbConfig) if err != nil { - t.Fatal("Test Failed - ZB setup error", err) + t.Fatal("ZB setup error", err) } } @@ -90,7 +90,7 @@ func TestSpotNewOrder(t *testing.T) { } orderid, err := z.SpotNewOrder(arg) if err != nil { - t.Errorf("Test failed - ZB SpotNewOrder: %s", err) + t.Errorf("ZB SpotNewOrder: %s", err) } else { t.Log(orderid) } @@ -105,7 +105,7 @@ func TestCancelExistingOrder(t *testing.T) { err := z.CancelExistingOrder(20180629145864850, "btc_usdt") if err != nil { - t.Errorf("Test failed - ZB CancelExistingOrder: %s", err) + t.Errorf("ZB CancelExistingOrder: %s", err) } } @@ -113,7 +113,7 @@ func TestGetLatestSpotPrice(t *testing.T) { t.Parallel() _, err := z.GetLatestSpotPrice("btc_usdt") if err != nil { - t.Errorf("Test failed - ZB GetLatestSpotPrice: %s", err) + t.Errorf("ZB GetLatestSpotPrice: %s", err) } } @@ -121,7 +121,7 @@ func TestGetTicker(t *testing.T) { t.Parallel() _, err := z.GetTicker("btc_usdt") if err != nil { - t.Errorf("Test failed - ZB GetTicker: %s", err) + t.Errorf("ZB GetTicker: %s", err) } } @@ -129,7 +129,7 @@ func TestGetTickers(t *testing.T) { t.Parallel() _, err := z.GetTickers() if err != nil { - t.Errorf("Test failed - ZB GetTicker: %s", err) + t.Errorf("ZB GetTicker: %s", err) } } @@ -137,7 +137,7 @@ func TestGetOrderbook(t *testing.T) { t.Parallel() _, err := z.GetOrderbook("btc_usdt") if err != nil { - t.Errorf("Test failed - ZB GetTicker: %s", err) + t.Errorf("ZB GetTicker: %s", err) } } @@ -145,7 +145,7 @@ func TestGetMarkets(t *testing.T) { t.Parallel() _, err := z.GetMarkets() if err != nil { - t.Errorf("Test failed - ZB GetMarkets: %s", err) + t.Errorf("ZB GetMarkets: %s", err) } } @@ -159,7 +159,7 @@ func TestGetSpotKline(t *testing.T) { } _, err := z.GetSpotKline(arg) if err != nil { - t.Errorf("Test failed - ZB GetSpotKline: %s", err) + t.Errorf("ZB GetSpotKline: %s", err) } } @@ -199,7 +199,7 @@ func TestGetFee(t *testing.T) { // CryptocurrencyTradeFee Basic if resp, err := z.GetFee(feeBuilder); resp != float64(0.002) || err != nil { t.Error(err) - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.0015), resp) } // CryptocurrencyTradeFee High quantity @@ -207,7 +207,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Amount = 1000 feeBuilder.PurchasePrice = 1000 if resp, err := z.GetFee(feeBuilder); resp != float64(2000) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(2000), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(2000), resp) t.Error(err) } @@ -215,7 +215,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.IsMaker = true if resp, err := z.GetFee(feeBuilder); resp != float64(0.002) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.002), resp) t.Error(err) } @@ -223,14 +223,14 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.PurchasePrice = -1000 if resp, err := z.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } // CryptocurrencyWithdrawalFee Basic feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := z.GetFee(feeBuilder); resp != float64(0.005) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0.005), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0.005), resp) t.Error(err) } @@ -239,7 +239,7 @@ func TestGetFee(t *testing.T) { feeBuilder.Pair.Base = currency.NewCode("hello") feeBuilder.FeeType = exchange.CryptocurrencyWithdrawalFee if resp, err := z.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -247,7 +247,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.CyptocurrencyDepositFee if resp, err := z.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -255,7 +255,7 @@ func TestGetFee(t *testing.T) { feeBuilder = setFeeBuilder() feeBuilder.FeeType = exchange.InternationalBankDepositFee if resp, err := z.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } @@ -264,7 +264,7 @@ func TestGetFee(t *testing.T) { feeBuilder.FeeType = exchange.InternationalBankWithdrawalFee feeBuilder.FiatCurrency = currency.USD if resp, err := z.GetFee(feeBuilder); resp != float64(0) || err != nil { - t.Errorf("Test Failed - GetFee() error. Expected: %f, Received: %f", float64(0), resp) + t.Errorf("GetFee() error. Expected: %f, Received: %f", float64(0), resp) t.Error(err) } } @@ -413,12 +413,12 @@ func TestGetAccountInfo(t *testing.T) { if z.ValidateAPICredentials() { _, err := z.GetAccountInfo() if err != nil { - t.Error("Test Failed - GetAccountInfo() error", err) + t.Error("GetAccountInfo() error", err) } } else { _, err := z.GetAccountInfo() if err == nil { - t.Error("Test Failed - GetAccountInfo() error") + t.Error("GetAccountInfo() Expected error") } } } @@ -426,7 +426,7 @@ func TestGetAccountInfo(t *testing.T) { func TestModifyOrder(t *testing.T) { _, err := z.ModifyOrder(&exchange.ModifyOrder{}) if err == nil { - t.Error("Test failed - ModifyOrder() error") + t.Error("ModifyOrder() Expected error") } } @@ -490,13 +490,13 @@ func TestGetDepositAddress(t *testing.T) { if apiKey != "" || apiSecret != "" { _, err := z.GetDepositAddress(currency.BTC, "") if err != nil { - t.Error("Test Failed - GetDepositAddress() error PLEASE MAKE SURE YOU CREATE DEPOSIT ADDRESSES VIA ZB.COM", + t.Error("GetDepositAddress() error PLEASE MAKE SURE YOU CREATE DEPOSIT ADDRESSES VIA ZB.COM", err) } } else { _, err := z.GetDepositAddress(currency.BTC, "") if err == nil { - t.Error("Test Failed - GetDepositAddress() error") + t.Error("GetDepositAddress() Expected error") } } } diff --git a/exchanges/zb/zb_wrapper.go b/exchanges/zb/zb_wrapper.go index 37a2a637..1b56dc54 100644 --- a/exchanges/zb/zb_wrapper.go +++ b/exchanges/zb/zb_wrapper.go @@ -13,6 +13,7 @@ import ( exchange "github.com/thrasher-corp/gocryptotrader/exchanges" "github.com/thrasher-corp/gocryptotrader/exchanges/asset" "github.com/thrasher-corp/gocryptotrader/exchanges/orderbook" + "github.com/thrasher-corp/gocryptotrader/exchanges/protocol" "github.com/thrasher-corp/gocryptotrader/exchanges/request" "github.com/thrasher-corp/gocryptotrader/exchanges/ticker" "github.com/thrasher-corp/gocryptotrader/exchanges/websocket/wshandler" @@ -69,9 +70,32 @@ func (z *ZB) SetDefaults() { Supports: exchange.FeaturesSupported{ REST: true, Websocket: true, - RESTCapabilities: exchange.ProtocolFeatures{ - AutoPairUpdates: true, - TickerBatching: true, + RESTCapabilities: protocol.Features{ + TickerBatching: true, + TickerFetching: true, + KlineFetching: true, + OrderbookFetching: true, + AutoPairUpdates: true, + AccountInfo: true, + GetOrder: true, + GetOrders: true, + CancelOrder: true, + CryptoDeposit: true, + CryptoWithdrawal: true, + TradeFee: true, + CryptoDepositFee: true, + CryptoWithdrawalFee: true, + }, + WebsocketCapabilities: protocol.Features{ + TickerFetching: true, + TradeFetching: true, + OrderbookFetching: true, + Subscribe: true, + AuthenticatedEndpoints: true, + AccountInfo: true, + CancelOrder: true, + SubmitOrder: true, + MessageCorrelation: true, }, WithdrawPermissions: exchange.AutoWithdrawCrypto | exchange.NoFiatWithdrawals, @@ -92,15 +116,6 @@ func (z *ZB) SetDefaults() { z.API.Endpoints.URLSecondary = z.API.Endpoints.URLSecondaryDefault z.API.Endpoints.WebsocketURL = zbWebsocketAPI z.Websocket = wshandler.New() - z.Websocket.Functionality = wshandler.WebsocketTickerSupported | - wshandler.WebsocketOrderbookSupported | - wshandler.WebsocketTradeDataSupported | - wshandler.WebsocketSubscribeSupported | - wshandler.WebsocketAuthenticatedEndpointsSupported | - wshandler.WebsocketAccountDataSupported | - wshandler.WebsocketCancelOrderSupported | - wshandler.WebsocketSubmitOrderSupported | - wshandler.WebsocketMessageCorrelationSupported z.WebsocketResponseMaxLimit = exchange.DefaultWebsocketResponseMaxLimit z.WebsocketResponseCheckTimeout = exchange.DefaultWebsocketResponseCheckTimeout } @@ -128,6 +143,7 @@ func (z *ZB) Setup(exch *config.ExchangeConfig) error { RunningURL: exch.API.Endpoints.WebsocketURL, Connector: z.WsConnect, Subscriber: z.Subscribe, + Features: &z.Features.Supports.WebsocketCapabilities, }) if err != nil { return err diff --git a/logger/logger_test.go b/logger/logger_test.go index 7af289e0..29fb2ce2 100644 --- a/logger/logger_test.go +++ b/logger/logger_test.go @@ -108,7 +108,7 @@ func TestLevel(t *testing.T) { _, err = Level("totallyinvalidlogger") if err == nil { - t.Error("expected error on invalid logger") + t.Error("Expected error on invalid logger") } } @@ -141,7 +141,7 @@ func TestValidSubLogger(t *testing.T) { t.Skip("validSubLogger() should return found, pointer if valid logger found") } if logPtr == nil { - t.Error("validSubLogger() should return a pointer and not nil ") + t.Error("validSubLogger() should return a pointer and not nil") } } diff --git a/ntpclient/ntpclient_test.go b/ntpclient/ntpclient_test.go index 0668409e..6fe5ee5e 100644 --- a/ntpclient/ntpclient_test.go +++ b/ntpclient/ntpclient_test.go @@ -14,7 +14,7 @@ func TestNTPClient(t *testing.T) { invalidpool := []string{"pool.thisisinvalid.org"} _, err = NTPClient(invalidpool) if err == nil { - t.Errorf("failed to get time %v", err) + t.Errorf("Expected error") } firstInvalid := []string{"pool.thisisinvalid.org", "pool.ntp.org:123", "0.pool.ntp.org:123"} diff --git a/portfolio/portfolio_test.go b/portfolio/portfolio_test.go index 03b75ddd..6334b4e2 100644 --- a/portfolio/portfolio_test.go +++ b/portfolio/portfolio_test.go @@ -14,16 +14,16 @@ func TestGetEthereumBalance(t *testing.T) { response, err := GetEthereumBalance(address) if err != nil { - t.Errorf("Test Failed - Portfolio GetEthereumBalance() Error: %s", err) + t.Errorf("Portfolio GetEthereumBalance() Error: %s", err) } if response.Address != "0xb794f5ea0ba39494ce839613fffba74279579268" { - t.Error("Test Failed - Portfolio GetEthereumBalance() address invalid") + t.Error("Portfolio GetEthereumBalance() address invalid") } response, err = GetEthereumBalance(nonsenseAddress) if response.Error.Message != "" || err == nil { - t.Errorf("Test Failed - Portfolio GetEthereumBalance() Error: %s", + t.Errorf("Portfolio GetEthereumBalance() Error: %s", response.Error.Message) } } @@ -32,7 +32,7 @@ func TestGetCryptoIDBalance(t *testing.T) { ltcAddress := "LX2LMYXtuv5tiYEMztSSoEZcafFPYJFRK1" _, err := GetCryptoIDAddress(ltcAddress, currency.LTC) if err != nil { - t.Fatalf("Test failed. TestGetCryptoIDBalance error: %s", err) + t.Fatalf("TestGetCryptoIDBalance error: %s", err) } } @@ -50,7 +50,7 @@ func TestGetAddressBalance(t *testing.T) { ltc) if addBalance != balance { - t.Error("Test Failed - Portfolio GetAddressBalance() Error: Incorrect value") + t.Error("Portfolio GetAddressBalance() Error: Incorrect value") } addBalance, found := portfolio.GetAddressBalance("WigWham", @@ -58,10 +58,10 @@ func TestGetAddressBalance(t *testing.T) { ltc) if addBalance != 0 { - t.Error("Test Failed - Portfolio GetAddressBalance() Error: Incorrect value") + t.Error("Portfolio GetAddressBalance() Error: Incorrect value") } if found { - t.Error("Test Failed - Portfolio GetAddressBalance() Error: Incorrect value") + t.Error("Portfolio GetAddressBalance() Error: Incorrect value") } } @@ -73,10 +73,10 @@ func TestExchangeExists(t *testing.T) { 0.02) if !newBase.ExchangeExists("someaddress") { - t.Error("Test Failed - portfolio_test.go - AddressExists error") + t.Error("portfolio_test.go - AddressExists error") } if newBase.ExchangeExists("bla") { - t.Error("Test Failed - portfolio_test.go - AddressExists error") + t.Error("portfolio_test.go - AddressExists error") } } @@ -88,10 +88,10 @@ func TestAddressExists(t *testing.T) { 0.02) if !newbase.AddressExists("someaddress") { - t.Error("Test Failed - portfolio_test.go - AddressExists error") + t.Error("portfolio_test.go - AddressExists error") } if newbase.AddressExists("bla") { - t.Error("Test Failed - portfolio_test.go - AddressExists error") + t.Error("portfolio_test.go - AddressExists error") } } @@ -103,10 +103,10 @@ func TestExchangeAddressExists(t *testing.T) { 0.02) if !newbase.ExchangeAddressExists("someaddress", currency.LTC) { - t.Error("Test Failed - portfolio_test.go - ExchangeAddressExists error") + t.Error("portfolio_test.go - ExchangeAddressExists error") } if newbase.ExchangeAddressExists("TEST", currency.LTC) { - t.Error("Test Failed - portfolio_test.go - ExchangeAddressExists error") + t.Error("portfolio_test.go - ExchangeAddressExists error") } } @@ -117,7 +117,7 @@ func TestAddExchangeAddress(t *testing.T) { newbase.AddExchangeAddress("ANX", currency.BTC, 200) if !newbase.ExchangeAddressExists("ANX", currency.BTC) { - t.Error("Test Failed - TestExchangeAddressExists address doesn't exist") + t.Error("TestExchangeAddressExists address doesn't exist") } } @@ -133,7 +133,7 @@ func TestUpdateAddressBalance(t *testing.T) { value := newbase.GetPortfolioSummary() if value.Totals[0].Coin != currency.LTC && value.Totals[0].Balance != 0.03 { - t.Error("Test Failed - portfolio_test.go - UpdateUpdateAddressBalance error") + t.Error("portfolio_test.go - UpdateUpdateAddressBalance error") } } @@ -157,14 +157,14 @@ func TestRemoveAddress(t *testing.T) { 420) if !newbase.AddressExists("someaddr") { - t.Error("Test failed - portfolio_test.go - TestRemoveAddress") + t.Error("portfolio_test.go - TestRemoveAddress") } newbase.RemoveAddress("someaddr", currency.LTC.String(), currency.NewCode("LTCWALLETTEST")) if newbase.AddressExists("someaddr") { - t.Error("Test failed - portfolio_test.go - TestRemoveAddress") + t.Error("portfolio_test.go - TestRemoveAddress") } } @@ -176,12 +176,12 @@ func TestRemoveExchangeAddress(t *testing.T) { newbase.AddExchangeAddress(exchangeName, coinType, 420) if !newbase.ExchangeAddressExists(exchangeName, coinType) { - t.Error("Test failed - portfolio_test.go - TestRemoveAddress") + t.Error("portfolio_test.go - TestRemoveAddress") } newbase.RemoveExchangeAddress(exchangeName, coinType) if newbase.ExchangeAddressExists(exchangeName, coinType) { - t.Error("Test failed - portfolio_test.go - TestRemoveAddress") + t.Error("portfolio_test.go - TestRemoveAddress") } } @@ -194,7 +194,7 @@ func TestUpdateExchangeAddressBalance(t *testing.T) { value := portfolio.GetPortfolioSummary() if value.Totals[0].Coin != currency.LTC && value.Totals[0].Balance != 0.04 { - t.Error("Test Failed - portfolio_test.go - UpdateExchangeAddressBalance error") + t.Error("portfolio_test.go - UpdateExchangeAddressBalance error") } } @@ -232,7 +232,7 @@ func TestAddAddress(t *testing.T) { portfolio := GetPortfolio() portfolio.Seed(newbase) if !portfolio.AddressExists("Gibson") { - t.Error("Test Failed - portfolio_test.go - AddAddress error") + t.Error("portfolio_test.go - AddAddress error") } // Test updating balance to <= 0, expected result is to remove the address. @@ -243,7 +243,7 @@ func TestAddAddress(t *testing.T) { -1) if newbase.AddressExists("Gibson") { - t.Error("Test Failed - portfolio_test.go - AddAddress error") + t.Error("portfolio_test.go - AddAddress error") } } @@ -261,24 +261,24 @@ func TestUpdatePortfolio(t *testing.T) { []string{"LdP8Qox1VAhCzLJNqrr74YovaWYyNBUWvL"}, currency.LTC, ) if !value { - t.Error("Test Failed - portfolio_test.go - UpdatePortfolio error") + t.Error("portfolio_test.go - UpdatePortfolio error") } value = portfolio.UpdatePortfolio([]string{"Testy"}, currency.LTC) if value { - t.Error("Test Failed - portfolio_test.go - UpdatePortfolio error") + t.Error("portfolio_test.go - UpdatePortfolio error") } value = portfolio.UpdatePortfolio( []string{"LdP8Qox1VAhCzLJNqrr74YovaWYyNBUWvL", "LVa8wZ983PvWtdwXZ8viK6SocMENLCXkEy"}, currency.LTC, ) if !value { - t.Error("Test Failed - portfolio_test.go - UpdatePortfolio error") + t.Error("portfolio_test.go - UpdatePortfolio error") } value = portfolio.UpdatePortfolio( []string{"LdP8Qox1VAhCzLJNqrr74YovaWYyNBUWvL", "Testy"}, currency.LTC, ) if value { - t.Error("Test Failed - portfolio_test.go - UpdatePortfolio error") + t.Error("portfolio_test.go - UpdatePortfolio error") } time.Sleep(time.Second * 5) @@ -287,20 +287,20 @@ func TestUpdatePortfolio(t *testing.T) { "0xe853c56864a2ebe4576a807d26fdc4a0ada51919"}, currency.ETH, ) if !value { - t.Error("Test Failed - portfolio_test.go - UpdatePortfolio error") + t.Error("portfolio_test.go - UpdatePortfolio error") } value = portfolio.UpdatePortfolio( []string{"0xb794f5ea0ba39494ce839613fffba74279579268", "TESTY"}, currency.ETH, ) if value { - t.Error("Test Failed - portfolio_test.go - UpdatePortfolio error") + t.Error("portfolio_test.go - UpdatePortfolio error") } value = portfolio.UpdatePortfolio( []string{PortfolioAddressExchange, PortfolioAddressPersonal}, currency.LTC) if !value { - t.Error("Test Failed - portfolio_test.go - UpdatePortfolio error") + t.Error("portfolio_test.go - UpdatePortfolio error") } } @@ -314,21 +314,21 @@ func TestGetPortfolioByExchange(t *testing.T) { value := portfolio.GetPortfolioByExchange("ANX") result, ok := value[currency.LTC] if !ok { - t.Error("Test Failed - portfolio_test.go - GetPortfolioByExchange error") + t.Error("portfolio_test.go - GetPortfolioByExchange error") } if result != 0.07 { - t.Error("Test Failed - portfolio_test.go - GetPortfolioByExchange result != 0.10") + t.Error("portfolio_test.go - GetPortfolioByExchange result != 0.10") } value = portfolio.GetPortfolioByExchange("Bitfinex") result, ok = value[currency.LTC] if !ok { - t.Error("Test Failed - portfolio_test.go - GetPortfolioByExchange error") + t.Error("portfolio_test.go - GetPortfolioByExchange error") } if result != 0.05 { - t.Error("Test Failed - portfolio_test.go - GetPortfolioByExchange result != 0.05") + t.Error("portfolio_test.go - GetPortfolioByExchange result != 0.05") } } @@ -343,11 +343,11 @@ func TestGetExchangePortfolio(t *testing.T) { result, ok := value[currency.LTC] if !ok { - t.Error("Test Failed - portfolio_test.go - GetExchangePortfolio error") + t.Error("portfolio_test.go - GetExchangePortfolio error") } if result != 0.08 { - t.Error("Test Failed - portfolio_test.go - GetExchangePortfolio result != 0.08") + t.Error("portfolio_test.go - GetExchangePortfolio result != 0.08") } } @@ -361,11 +361,11 @@ func TestGetPersonalPortfolio(t *testing.T) { value := portfolio.GetPersonalPortfolio() result, ok := value[currency.N2O] if !ok { - t.Error("Test Failed - portfolio_test.go - GetPersonalPortfolio error") + t.Error("portfolio_test.go - GetPersonalPortfolio error") } if result != 0.05 { - t.Error("Test Failed - portfolio_test.go - GetPersonalPortfolio result != 0.05") + t.Error("portfolio_test.go - GetPersonalPortfolio result != 0.05") } } @@ -399,19 +399,19 @@ func TestGetPortfolioSummary(t *testing.T) { } if getTotalsVal(currency.LTC).Coin != currency.LTC { - t.Error("Test Failed - portfolio_test.go - TestGetPortfolioSummary error") + t.Error("portfolio_test.go - TestGetPortfolioSummary error") } if getTotalsVal(currency.ETH).Coin == currency.LTC { - t.Error("Test Failed - portfolio_test.go - TestGetPortfolioSummary error") + t.Error("portfolio_test.go - TestGetPortfolioSummary error") } if getTotalsVal(currency.LTC).Balance != 23 { - t.Error("Test Failed - portfolio_test.go - TestGetPortfolioSummary error") + t.Error("portfolio_test.go - TestGetPortfolioSummary error") } if getTotalsVal(currency.BTC).Balance != 200 { - t.Error("Test Failed - portfolio_test.go - TestGetPortfolioSummary error") + t.Error("portfolio_test.go - TestGetPortfolioSummary error") } } @@ -423,7 +423,7 @@ func TestGetPortfolioGroupedCoin(t *testing.T) { portfolio.Seed(newbase) value := portfolio.GetPortfolioGroupedCoin() if value[currency.LTC][0] != "someaddress" && len(value[currency.LTC][0]) != 1 { - t.Error("Test Failed - portfolio_test.go - GetPortfolioGroupedCoin error") + t.Error("portfolio_test.go - GetPortfolioGroupedCoin error") } } @@ -434,7 +434,7 @@ func TestSeed(t *testing.T) { portfolio.Seed(newbase) if !portfolio.AddressExists("someaddress") { - t.Error("Test Failed - portfolio_test.go - Seed error") + t.Error("portfolio_test.go - Seed error") } } @@ -454,7 +454,7 @@ func TestStartPortfolioWatcher(t *testing.T) { portfolio.Seed(newBase) if !portfolio.AddressExists("LX2LMYXtuv5tiYEMztSSoEZcafFPYJFRK1") { - t.Error("Test Failed - portfolio_test.go - TestStartPortfolioWatcher") + t.Error("portfolio_test.go - TestStartPortfolioWatcher") } go StartPortfolioWatcher() @@ -463,6 +463,6 @@ func TestStartPortfolioWatcher(t *testing.T) { func TestGetPortfolio(t *testing.T) { ptrBASE := GetPortfolio() if reflect.TypeOf(ptrBASE).String() != "*portfolio.Base" { - t.Error("Test Failed - portfolio_test.go - GetoPortfolio error") + t.Error("portfolio_test.go - GetoPortfolio error") } }