blob: b41c44b7927bb1f6e08cd4e2c6e38f9f7ccbde11 [file] [log] [blame] [edit]
/*
* Copyright 2019 Dgraph Labs, Inc. and Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package z
import (
"math"
"testing"
"github.com/stretchr/testify/require"
)
func verifyHashProduct(t *testing.T, wantKey, wantConflict, key, conflict uint64) {
require.Equal(t, wantKey, key)
require.Equal(t, wantConflict, conflict)
}
func TestKeyToHash(t *testing.T) {
var key uint64
var conflict uint64
key, conflict = KeyToHash(uint64(1))
verifyHashProduct(t, 1, 0, key, conflict)
key, conflict = KeyToHash(1)
verifyHashProduct(t, 1, 0, key, conflict)
key, conflict = KeyToHash(int32(2))
verifyHashProduct(t, 2, 0, key, conflict)
key, conflict = KeyToHash(int32(-2))
verifyHashProduct(t, math.MaxUint64-1, 0, key, conflict)
key, conflict = KeyToHash(int64(-2))
verifyHashProduct(t, math.MaxUint64-1, 0, key, conflict)
key, conflict = KeyToHash(uint32(3))
verifyHashProduct(t, 3, 0, key, conflict)
key, conflict = KeyToHash(int64(3))
verifyHashProduct(t, 3, 0, key, conflict)
}
func TestMulipleSignals(t *testing.T) {
closer := NewCloser(0)
require.NotPanics(t, func() { closer.Signal() })
// Should not panic.
require.NotPanics(t, func() { closer.Signal() })
require.NotPanics(t, func() { closer.SignalAndWait() })
// Attempt 2.
closer = NewCloser(1)
require.NotPanics(t, func() { closer.Done() })
require.NotPanics(t, func() { closer.SignalAndWait() })
// Should not panic.
require.NotPanics(t, func() { closer.SignalAndWait() })
require.NotPanics(t, func() { closer.Signal() })
}
func TestCloser(t *testing.T) {
closer := NewCloser(1)
go func() {
defer closer.Done()
<-closer.Ctx().Done()
}()
closer.SignalAndWait()
}
func TestZeroOut(t *testing.T) {
dst := make([]byte, 4*1024)
fill := func() {
for i := 0; i < len(dst); i++ {
dst[i] = 0xFF
}
}
check := func(buf []byte, b byte) {
for i := 0; i < len(buf); i++ {
require.Equalf(t, b, buf[i], "idx: %d", i)
}
}
fill()
ZeroOut(dst, 0, 1)
check(dst[:1], 0x00)
check(dst[1:], 0xFF)
ZeroOut(dst, 0, 1024)
check(dst[:1024], 0x00)
check(dst[1024:], 0xFF)
ZeroOut(dst, 0, len(dst))
check(dst, 0x00)
}