diff --git a/pdu/bufpool_test.go b/pdu/bufpool_test.go new file mode 100644 index 0000000..22d5e3a --- /dev/null +++ b/pdu/bufpool_test.go @@ -0,0 +1,143 @@ +package pdu + +import ( + "sync" + "testing" +) + +func TestRetrieveBufferOfRequestedSize(t *testing.T) { + bpm := &BufferPoolManager{ + pools: make(map[int]*sync.Pool), + mu: sync.Mutex{}, + } + + size := 1024 + buffer := bpm.GetBuffer(size) + + if buffer == nil { + t.Fatalf("Expected buffer, got nil") + } + + if len(*buffer) != size { + t.Errorf("Expected buffer size %d, got %d", size, len(*buffer)) + } +} + +func TestRequestBufferSizeZero(t *testing.T) { + bpm := &BufferPoolManager{ + pools: make(map[int]*sync.Pool), + mu: sync.Mutex{}, + } + + size := 0 + buffer := bpm.GetBuffer(size) + + if buffer == nil { + t.Fatalf("Expected buffer, got nil") + } + + if len(*buffer) != size { + t.Errorf("Expected buffer size %d, got %d", size, len(*buffer)) + } +} + +func TestConcurrentAccessToBufferPool(t *testing.T) { + bpm := &BufferPoolManager{ + pools: make(map[int]*sync.Pool), + mu: sync.Mutex{}, + } + + size := 1024 + var wg sync.WaitGroup + numRoutines := 100 + + for i := 0; i < numRoutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + buffer := bpm.GetBuffer(size) + if buffer == nil { + t.Errorf("Expected buffer, got nil") + } + if len(*buffer) != size { + t.Errorf("Expected buffer size %d, got %d", size, len(*buffer)) + } + }() + } + + wg.Wait() +} + +func TestGetBufferLockUnlock(t *testing.T) { + bpm := &BufferPoolManager{ + pools: make(map[int]*sync.Pool), + mu: sync.Mutex{}, + } + + size := 1024 + buffer := bpm.GetBuffer(size) + + if buffer == nil { + t.Fatalf("Expected buffer, got nil") + } + + if len(*buffer) != size { + t.Errorf("Expected buffer size %d, got %d", size, len(*buffer)) + } +} + +func TestVerifyPoolCreationForNewSizes(t *testing.T) { + bpm := &BufferPoolManager{ + pools: make(map[int]*sync.Pool), + mu: sync.Mutex{}, + } + + size := 512 + buffer := bpm.GetBuffer(size) + + if buffer == nil { + t.Fatalf("Expected buffer, got nil") + } + + if len(*buffer) != size { + t.Errorf("Expected buffer size %d, got %d", size, len(*buffer)) + } +} + +func TestBufferPoolManagerGetBuffer(t *testing.T) { + bpm := &BufferPoolManager{ + pools: make(map[int]*sync.Pool), + mu: sync.Mutex{}, + } + + size := 1024 + buffer := bpm.GetBuffer(size) + + if buffer == nil { + t.Fatalf("Expected buffer, got nil") + } + + if len(*buffer) != size { + t.Errorf("Expected buffer size %d, got %d", size, len(*buffer)) + } +} + +func TestGetBufferWithMultipleSizes(t *testing.T) { + bpm := &BufferPoolManager{ + pools: make(map[int]*sync.Pool), + mu: sync.Mutex{}, + } + + sizes := []int{512, 1024, 2048} + for _, size := range sizes { + buffer := bpm.GetBuffer(size) + + if buffer == nil { + t.Fatalf("Expected buffer for size %d, got nil", size) + } + + if len(*buffer) != size { + t.Errorf("Expected buffer size %d, got %d", size, len(*buffer)) + } + } +} diff --git a/pdu/global.go b/pdu/global.go new file mode 100644 index 0000000..6117068 --- /dev/null +++ b/pdu/global.go @@ -0,0 +1,8 @@ +package pdu + +import "sync" + +var byteBufferPool = &BufferPoolManager{ + pools: make(map[int]*sync.Pool), + mu: sync.Mutex{}, +}