|
@@ -0,0 +1,142 @@
|
|
|
+package application
|
|
|
+
|
|
|
+import (
|
|
|
+ "context"
|
|
|
+ "io"
|
|
|
+ "log"
|
|
|
+ "testing"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "git.ali33.ru/fcg-xvii/go-tools/json"
|
|
|
+ "git.ali33.ru/fcg-xvii/rest"
|
|
|
+)
|
|
|
+
|
|
|
+// Пустая реализация IStream
|
|
|
+type TestStream struct {
|
|
|
+ ctx context.Context
|
|
|
+ cancel context.CancelFunc
|
|
|
+}
|
|
|
+
|
|
|
+func NewTestStream() *TestStream {
|
|
|
+ ctx, cancel := context.WithCancel(context.Background())
|
|
|
+ return &TestStream{
|
|
|
+ ctx: ctx,
|
|
|
+ cancel: cancel,
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (t *TestStream) SetAuth(auth json.Map) {}
|
|
|
+
|
|
|
+func (t *TestStream) Auth() json.Map { return nil }
|
|
|
+
|
|
|
+func (t *TestStream) SetClientData(key string, val any) {}
|
|
|
+
|
|
|
+func (t *TestStream) ClientData(key string) (any, bool) { return nil, false }
|
|
|
+
|
|
|
+func (t *TestStream) Context() context.Context {
|
|
|
+ return t.ctx
|
|
|
+}
|
|
|
+
|
|
|
+func (t *TestStream) SendMessage(req rest.IRequestOut) (<-chan *rest.RequestStream, error) {
|
|
|
+ log.Printf("TestStream %p send message.\n", t)
|
|
|
+ return nil, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (t *TestStream) Close() {
|
|
|
+ t.cancel()
|
|
|
+ log.Printf("TestStream %p closed.\n", t)
|
|
|
+}
|
|
|
+
|
|
|
+// Пустая реализация IRequestOut
|
|
|
+type TestRequestOut struct {
|
|
|
+ TestRequest
|
|
|
+}
|
|
|
+
|
|
|
+func NewTestRequestOut() *TestRequestOut {
|
|
|
+ return &TestRequestOut{
|
|
|
+ TestRequest: TestRequest{},
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (r *TestRequestOut) Write(w io.Writer) rest.IErrorArgs {
|
|
|
+ // Пустая реализация записи
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+// Пустая реализация IRequest
|
|
|
+type TestRequest struct{}
|
|
|
+
|
|
|
+func (r *TestRequest) RType() rest.RequestType {
|
|
|
+ return 0 // Возвращаем значение по умолчанию
|
|
|
+}
|
|
|
+
|
|
|
+func (r *TestRequest) RCommand() string {
|
|
|
+ return "" // Возвращаем пустую строку
|
|
|
+}
|
|
|
+
|
|
|
+func (r *TestRequest) RData() json.Map {
|
|
|
+ return make(json.Map) // Возвращаем пустую карту
|
|
|
+}
|
|
|
+
|
|
|
+func (r *TestRequest) RFiles() rest.RequestFiles {
|
|
|
+ return nil // Возвращаем nil
|
|
|
+}
|
|
|
+
|
|
|
+func (r *TestRequest) RFile(name string) (rest.IReadCloserLen, bool) {
|
|
|
+ return nil, false // Возвращаем nil и false
|
|
|
+}
|
|
|
+
|
|
|
+func (r *TestRequest) RClose() {
|
|
|
+ // Пустая реализация
|
|
|
+}
|
|
|
+
|
|
|
+////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+func TestStreamClose(t *testing.T) {
|
|
|
+ stream := NewTestStream()
|
|
|
+ store := NewStreamStore(stream, context.Background())
|
|
|
+ go func() {
|
|
|
+ <-store.Context().Done()
|
|
|
+ log.Println("store closedddd...")
|
|
|
+ store.Close()
|
|
|
+ store.Close()
|
|
|
+ }()
|
|
|
+ stream.Close()
|
|
|
+ time.Sleep(time.Second * 5)
|
|
|
+}
|
|
|
+
|
|
|
+func TestStreamStoreClose(t *testing.T) {
|
|
|
+ stream := NewTestStream()
|
|
|
+ store := NewStreamStore(stream, context.Background())
|
|
|
+ store.Add(NewTestStream())
|
|
|
+ store.Add(NewTestStream())
|
|
|
+ store.Add(NewTestStream())
|
|
|
+ store.Add(NewTestStream())
|
|
|
+ store.Close()
|
|
|
+ time.Sleep(time.Minute * 5)
|
|
|
+}
|
|
|
+
|
|
|
+func TestGroupClose(t *testing.T) {
|
|
|
+ group := NewStreamGroup(context.Background())
|
|
|
+ stream := NewTestStream()
|
|
|
+ group.Store("1", stream)
|
|
|
+ group.Close()
|
|
|
+ time.Sleep(time.Minute * 5)
|
|
|
+}
|
|
|
+
|
|
|
+func TestGroupStreamClose(t *testing.T) {
|
|
|
+ group := NewStreamGroup(context.Background())
|
|
|
+ add := func() {
|
|
|
+ stream := NewTestStream()
|
|
|
+ group.Store("1", stream)
|
|
|
+ go func() {
|
|
|
+ time.Sleep(time.Second * 3)
|
|
|
+ log.Println("remove", stream)
|
|
|
+ stream.Close()
|
|
|
+ }()
|
|
|
+ log.Println("add", stream)
|
|
|
+ }
|
|
|
+ add()
|
|
|
+ add()
|
|
|
+ time.Sleep(time.Second * 10)
|
|
|
+}
|