mirror of
https://github.com/d0zingcat/gocryptotrader.git
synced 2026-05-13 15:09:42 +00:00
wsManager: Fix IsRunning true before flushed (#1201)
* Engine: Expose WebsocketRoutineManager Without exposing the manager users don't know when it's ready to use. * wsManager: Remove duplicate shutdown chan make The shutdown channel was already in setup. Consumers could reasonably expect it to not be replaced in between the two, and it's not really part of Start to assign it. * wsManager: Fix IsRunning true before flushed Consumers must be able to tell when it's safe to start new subscriptions. Before this fix any new subscriptions would get unsubbed as part of the flush during `websocketRoutine`. * WSM: Fix Stop/Start/Stop failing We previously removed the shutdown channel from Start to avoid duplicate allocation. However that will result in a closed channel after the first Stop So it's better to remove it from the setup. It's private anyway. * WSM: Export WebsocketRoutineManager type
This commit is contained in:
@@ -3,7 +3,9 @@ package engine
|
||||
import (
|
||||
"errors"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/thrasher-corp/gocryptotrader/currency"
|
||||
"github.com/thrasher-corp/gocryptotrader/exchanges/asset"
|
||||
@@ -48,7 +50,7 @@ func TestWebsocketRoutineManagerSetup(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestWebsocketRoutineManagerStart(t *testing.T) {
|
||||
var m *websocketRoutineManager
|
||||
var m *WebsocketRoutineManager
|
||||
err := m.Start()
|
||||
if !errors.Is(err, ErrNilSubsystem) {
|
||||
t.Errorf("error '%v', expected '%v'", err, ErrNilSubsystem)
|
||||
@@ -72,7 +74,7 @@ func TestWebsocketRoutineManagerStart(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestWebsocketRoutineManagerIsRunning(t *testing.T) {
|
||||
var m *websocketRoutineManager
|
||||
var m *WebsocketRoutineManager
|
||||
if m.IsRunning() {
|
||||
t.Error("expected false")
|
||||
}
|
||||
@@ -89,13 +91,16 @@ func TestWebsocketRoutineManagerIsRunning(t *testing.T) {
|
||||
if !errors.Is(err, nil) {
|
||||
t.Errorf("error '%v', expected '%v'", err, nil)
|
||||
}
|
||||
for atomic.LoadInt32(&m.state) == startingState {
|
||||
<-time.After(time.Second / 100)
|
||||
}
|
||||
if !m.IsRunning() {
|
||||
t.Error("expected true")
|
||||
}
|
||||
}
|
||||
|
||||
func TestWebsocketRoutineManagerStop(t *testing.T) {
|
||||
var m *websocketRoutineManager
|
||||
var m *WebsocketRoutineManager
|
||||
err := m.Stop()
|
||||
if !errors.Is(err, ErrNilSubsystem) {
|
||||
t.Errorf("error '%v', expected '%v'", err, ErrNilSubsystem)
|
||||
@@ -258,13 +263,13 @@ func TestWebsocketRoutineManagerHandleData(t *testing.T) {
|
||||
|
||||
func TestRegisterWebsocketDataHandlerWithFunctionality(t *testing.T) {
|
||||
t.Parallel()
|
||||
var m *websocketRoutineManager
|
||||
var m *WebsocketRoutineManager
|
||||
err := m.registerWebsocketDataHandler(nil, false)
|
||||
if !errors.Is(err, ErrNilSubsystem) {
|
||||
t.Fatalf("received: '%v' but expected: '%v'", err, ErrNilSubsystem)
|
||||
}
|
||||
|
||||
m = new(websocketRoutineManager)
|
||||
m = new(WebsocketRoutineManager)
|
||||
m.shutdown = make(chan struct{})
|
||||
|
||||
err = m.registerWebsocketDataHandler(nil, false)
|
||||
@@ -294,7 +299,7 @@ func TestRegisterWebsocketDataHandlerWithFunctionality(t *testing.T) {
|
||||
|
||||
mock := stream.New()
|
||||
mock.ToRoutine = make(chan interface{})
|
||||
m.started = 1
|
||||
m.state = readyState
|
||||
err = m.websocketDataReceiver(mock)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
@@ -314,13 +319,13 @@ func TestRegisterWebsocketDataHandlerWithFunctionality(t *testing.T) {
|
||||
|
||||
func TestSetWebsocketDataHandler(t *testing.T) {
|
||||
t.Parallel()
|
||||
var m *websocketRoutineManager
|
||||
var m *WebsocketRoutineManager
|
||||
err := m.setWebsocketDataHandler(nil)
|
||||
if !errors.Is(err, ErrNilSubsystem) {
|
||||
t.Fatalf("received: '%v' but expected: '%v'", err, ErrNilSubsystem)
|
||||
}
|
||||
|
||||
m = new(websocketRoutineManager)
|
||||
m = new(WebsocketRoutineManager)
|
||||
m.shutdown = make(chan struct{})
|
||||
|
||||
err = m.setWebsocketDataHandler(nil)
|
||||
|
||||
Reference in New Issue
Block a user