mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-27 09:05:18 +00:00
43 lines
1.3 KiB
Go
43 lines
1.3 KiB
Go
|
//go:build race
|
||
|
// +build race
|
||
|
|
||
|
// Copyright 2020 The LevelDB-Go and Pebble Authors. All rights reserved. Use
|
||
|
// of this source code is governed by a BSD-style license that can be found in
|
||
|
// the LICENSE file.
|
||
|
|
||
|
package arenaskl
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
// TestNodeArenaEnd tests allocating a node at the boundary of an arena. In Go
|
||
|
// 1.14 when the race detector is running, Go will also perform some pointer
|
||
|
// alignment checks. It will detect alignment issues, for example #667 where a
|
||
|
// node's memory would straddle the arena boundary, with unused regions of the
|
||
|
// node struct dipping into unallocated memory. This test is only run when the
|
||
|
// race build tag is provided.
|
||
|
func TestNodeArenaEnd(t *testing.T) {
|
||
|
ikey := makeIkey("a")
|
||
|
val := []byte("b")
|
||
|
|
||
|
// Rather than hardcode an arena size at just the right size, try
|
||
|
// allocating using successively larger arena sizes until we allocate
|
||
|
// successfully. The prior attempt will have exercised the right code
|
||
|
// path.
|
||
|
for i := uint32(1); i < 256; i++ {
|
||
|
a := newArena(i)
|
||
|
_, err := newNode(a, 1, ikey, val)
|
||
|
if err == nil {
|
||
|
// We reached an arena size big enough to allocate a node.
|
||
|
// If there's an issue at the boundary, the race detector would
|
||
|
// have found it by now.
|
||
|
t.Log(i)
|
||
|
break
|
||
|
}
|
||
|
require.Equal(t, ErrArenaFull, err)
|
||
|
}
|
||
|
}
|