github.heygears.com/openimsdk/tools@v0.0.49/mq/memamq/queue_test.go (about)

     1  package memamq
     2  
     3  import (
     4  	"sync"
     5  	"sync/atomic"
     6  	"testing"
     7  	"time"
     8  )
     9  
    10  //func TestNewMemoryQueue(t *testing.T) {
    11  //	workerCount := 3
    12  //	bufferSize := 10
    13  //	queue := NewMemoryQueue(workerCount, bufferSize)
    14  //
    15  //	if cap(queue.taskChan) != bufferSize {
    16  //		t.Errorf("Expected buffer size %d, got %d", bufferSize, cap(queue.taskChan))
    17  //	}
    18  //
    19  //	if queue.isStopped {
    20  //		t.Errorf("New queue is prematurely stopped")
    21  //	}
    22  //
    23  //	if len(queue.taskChan) != 0 {
    24  //		t.Errorf("New queue should be empty, found %d items", len(queue.taskChan))
    25  //	}
    26  //}
    27  
    28  func TestPushAndStop(t *testing.T) {
    29  	queue := NewMemoryQueue(1, 5)
    30  
    31  	var wg sync.WaitGroup
    32  	wg.Add(1)
    33  	queue.Push(func() {
    34  		time.Sleep(50 * time.Millisecond) // Simulate task delay
    35  		wg.Done()
    36  	})
    37  
    38  	queue.Stop()
    39  	wg.Wait()
    40  
    41  	if err := queue.Push(func() {}); err == nil {
    42  		t.Error("Expected error when pushing to stopped queue, got none")
    43  	}
    44  }
    45  
    46  func TestPushTimeout(t *testing.T) {
    47  	queue := NewMemoryQueue(1, 1) // Small buffer and worker to force full queue
    48  
    49  	done := make(chan bool)
    50  	go func() {
    51  		queue.Push(func() {
    52  			time.Sleep(200 * time.Millisecond) // Long enough to cause the second push to timeout
    53  		})
    54  		done <- true
    55  	}()
    56  
    57  	<-done // Ensure first task is pushed
    58  
    59  	if err := queue.Push(func() {}); err != nil {
    60  		t.Error("Expected timeout error, got nil")
    61  	}
    62  }
    63  
    64  func TestName(t *testing.T) {
    65  	queue := NewMemoryQueue(16, 1024)
    66  	var count atomic.Int64
    67  	for i := 0; i < 128; i++ {
    68  		go func() {
    69  			for {
    70  				queue.Push(func() {
    71  					count.Add(1)
    72  				})
    73  			}
    74  		}()
    75  	}
    76  
    77  	<-time.After(time.Second * 2)
    78  	t.Log("stop 1", time.Now())
    79  	queue.Stop()
    80  	t.Log("stop 2", time.Now())
    81  	t.Log(count.Load(), time.Now())
    82  }