144 lines
2.5 KiB
Go
144 lines
2.5 KiB
Go
|
package zero_test
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"math/big"
|
||
|
"strings"
|
||
|
"testing"
|
||
|
|
||
|
. "github.com/btcsuite/btcwallet/internal/zero"
|
||
|
)
|
||
|
|
||
|
func makeOneBytes(n int) []byte {
|
||
|
b := make([]byte, n)
|
||
|
for i := range b {
|
||
|
b[i] = 1
|
||
|
}
|
||
|
return b
|
||
|
}
|
||
|
|
||
|
func checkZeroBytes(b []byte) error {
|
||
|
for i, v := range b {
|
||
|
if v != 0 {
|
||
|
return fmt.Errorf("b[%d] = %d", i, v)
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func TestBytes(t *testing.T) {
|
||
|
tests := []int{
|
||
|
0,
|
||
|
31,
|
||
|
32,
|
||
|
33,
|
||
|
127,
|
||
|
128,
|
||
|
129,
|
||
|
255,
|
||
|
256,
|
||
|
256,
|
||
|
257,
|
||
|
383,
|
||
|
384,
|
||
|
385,
|
||
|
511,
|
||
|
512,
|
||
|
513,
|
||
|
}
|
||
|
|
||
|
for i, n := range tests {
|
||
|
b := makeOneBytes(n)
|
||
|
Bytes(b)
|
||
|
err := checkZeroBytes(b)
|
||
|
if err != nil {
|
||
|
t.Errorf("Test %d (n=%d) failed: %v", i, n, err)
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func checkZeroWords(b []big.Word) error {
|
||
|
for i, v := range b {
|
||
|
if v != 0 {
|
||
|
return fmt.Errorf("b[%d] = %d", i, v)
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
var bigZero = new(big.Int)
|
||
|
|
||
|
func TestBigInt(t *testing.T) {
|
||
|
tests := []string{
|
||
|
// 16 0xFFFFFFFF 32-bit uintptrs
|
||
|
strings.Repeat("FFFFFFFF", 16),
|
||
|
|
||
|
// 17 32-bit uintptrs, minimum value which enters loop on 32-bit
|
||
|
"01" + strings.Repeat("00000000", 16),
|
||
|
|
||
|
// 32 0xFFFFFFFF 32-bit uintptrs, maximum value which enters loop exactly once on 32-bit
|
||
|
strings.Repeat("FFFFFFFF", 32),
|
||
|
|
||
|
// 33 32-bit uintptrs, minimum value which enters loop twice on 32-bit
|
||
|
"01" + strings.Repeat("00000000", 32),
|
||
|
|
||
|
// 16 0xFFFFFFFFFFFFFFFF 64-bit uintptrs
|
||
|
strings.Repeat("FFFFFFFFFFFFFFFF", 16),
|
||
|
|
||
|
// 17 64-bit uintptrs, minimum value which enters loop on 64-bit
|
||
|
"01" + strings.Repeat("0000000000000000", 16),
|
||
|
|
||
|
// 32 0xFFFFFFFFFFFFFFFF 64-bit uintptrs, maximum value which enters loop exactly once on 64-bit
|
||
|
strings.Repeat("FFFFFFFFFFFFFFFF", 32),
|
||
|
|
||
|
// 33 64-bit uintptrs, minimum value which enters loop twice on 64-bit
|
||
|
"01" + strings.Repeat("0000000000000000", 32),
|
||
|
}
|
||
|
|
||
|
for i, s := range tests {
|
||
|
v, ok := new(big.Int).SetString(s, 16)
|
||
|
if !ok {
|
||
|
t.Errorf("Test %d includes invalid hex number %s", i, s)
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
BigInt(v)
|
||
|
err := checkZeroWords(v.Bits())
|
||
|
if err != nil {
|
||
|
t.Errorf("Test %d (s=%s) failed: %v", i, s, err)
|
||
|
continue
|
||
|
}
|
||
|
if v.Cmp(bigZero) != 0 {
|
||
|
t.Errorf("Test %d (s=%s) zeroed big.Int represents non-zero number %v", i, s, v)
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBytea32(t *testing.T) {
|
||
|
const sz = 32
|
||
|
var b [sz]byte
|
||
|
copy(b[:], makeOneBytes(sz))
|
||
|
|
||
|
Bytea32(&b)
|
||
|
|
||
|
err := checkZeroBytes(b[:])
|
||
|
if err != nil {
|
||
|
t.Error(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestBytea64(t *testing.T) {
|
||
|
const sz = 64
|
||
|
var b [sz]byte
|
||
|
copy(b[:], makeOneBytes(sz))
|
||
|
|
||
|
Bytea64(&b)
|
||
|
|
||
|
err := checkZeroBytes(b[:])
|
||
|
if err != nil {
|
||
|
t.Error(err)
|
||
|
}
|
||
|
}
|