| 300 | } |
| 301 | |
| 302 | func (s) TestBuffer_Slice(t *testing.T) { |
| 303 | freed := make(chan struct{}) |
| 304 | data := []byte{1, 2, 3, 4} |
| 305 | buf := mem.NewBuffer(&data, poolFunc(func(*[]byte) { |
| 306 | close(freed) |
| 307 | })) |
| 308 | |
| 309 | // Slice the buffer and verify the data. |
| 310 | slice1 := buf.Slice(1, 3) |
| 311 | if !bytes.Equal(slice1.ReadOnlyData(), data[1:3]) { |
| 312 | t.Fatalf("Buffer did not contain expected data. got %v, want %v", slice1.ReadOnlyData(), data[1:3]) |
| 313 | } |
| 314 | |
| 315 | // Verify the original buffer is not modified. |
| 316 | if !bytes.Equal(buf.ReadOnlyData(), data) { |
| 317 | t.Fatalf("Buffer did not contain expected data. got %v, want %v", buf.ReadOnlyData(), data) |
| 318 | } |
| 319 | |
| 320 | // Slice the slice. |
| 321 | slice2 := slice1.Slice(0, 1) |
| 322 | if !bytes.Equal(slice2.ReadOnlyData(), data[1:2]) { |
| 323 | t.Fatalf("Buffer did not contain expected data. got %v, want %v", slice2.ReadOnlyData(), data[1:2]) |
| 324 | } |
| 325 | |
| 326 | // Free original and first slice — root should not be freed yet. |
| 327 | buf.Free() |
| 328 | slice1.Free() |
| 329 | select { |
| 330 | case <-freed: |
| 331 | t.Fatalf("Freed too early") |
| 332 | default: |
| 333 | } |
| 334 | |
| 335 | // The last slice keeps the root alive. |
| 336 | if !bytes.Equal(slice2.ReadOnlyData(), data[1:2]) { |
| 337 | t.Fatalf("Buffer did not contain expected data. got %v, want %v", slice2.ReadOnlyData(), data[1:2]) |
| 338 | } |
| 339 | |
| 340 | slice2.Free() |
| 341 | |
| 342 | select { |
| 343 | case <-freed: |
| 344 | default: |
| 345 | t.Fatalf("Still not freed") |
| 346 | } |
| 347 | } |
| 348 | |
| 349 | func (s) TestBuffer_SliceAfterFree(t *testing.T) { |
| 350 | buf := newBuffer([]byte("abcd"), mem.NopBufferPool{}) |