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:
Gareth Kirwan
2023-05-23 00:19:28 +01:00
committed by GitHub
parent d4e7736bf7
commit 0ecd082254
5 changed files with 70 additions and 42 deletions

View File

@@ -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)