// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . package readers_test import ( "github.com/TeaOSLab/EdgeNode/internal/utils/readers" "github.com/TeaOSLab/EdgeNode/internal/utils/testutils" "github.com/iwind/TeaGo/types" "os" "testing" "time" ) func TestConcurrentFileReaders_Get(t *testing.T) { if !testutils.IsSingleTesting() { return } var path = "readers_concurrent_file.txt" writeFp, err := os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0666) if err != nil { t.Fatal(err) } var concurrentReaders = readers.NewConcurrentFileReaders(path) defer func() { _ = writeFp.Close() concurrentReaders.NotifyClose() _ = os.Remove(path) time.Sleep(2 * time.Second) }() // pre-write _, _ = writeFp.WriteString("0") for i := 0; i < 5; i++ { go func(i int) { reader, readerErr := concurrentReaders.Get() if readerErr != nil { t.Error(i, "Get():", readerErr) } else { defer func() { _ = reader.Close() }() var buf = make([]byte, 1024) for { n, readErr := reader.Read(buf) if n > 0 { t.Log(i, "Read:", string(buf[:n])) } if readErr != nil { t.Log(i, "readErr:", readErr) break } } } }(i) } for i := 1; i <= 10; i++ { _, _ = writeFp.WriteString(types.String(i)) concurrentReaders.NotifyRead() time.Sleep(2 * time.Second) } }