Add typo detector test, fix panics
This commit is contained in:
parent
65c880e753
commit
2c0d52f4b5
|
@ -122,6 +122,11 @@ func (c WordCodec) BytesToWords(raw []byte) (words []string, err error) {
|
|||
|
||||
func (c WordCodec) WordsToBytes(words []string) ([]byte, error) {
|
||||
l := len(words)
|
||||
|
||||
if l == 0 {
|
||||
return nil, errors.New("Didn't provide any words")
|
||||
}
|
||||
|
||||
n2048 := big.NewInt(2048)
|
||||
nData := big.NewInt(0)
|
||||
// since we output words based on the remainder, the first word has the lowest
|
||||
|
@ -143,6 +148,9 @@ func (c WordCodec) WordsToBytes(words []string) ([]byte, error) {
|
|||
// copy into the container we have with the expected size
|
||||
outLen, flex := bytelenFromWords(len(words))
|
||||
toCheck := make([]byte, outLen)
|
||||
if len(dataBytes) > outLen {
|
||||
return nil, errors.New("Invalid data, could not have been generated by this codec")
|
||||
}
|
||||
copy(toCheck[outLen-len(dataBytes):], dataBytes)
|
||||
|
||||
// validate the checksum...
|
||||
|
|
|
@ -130,6 +130,52 @@ func TestCheckInvalidLists(t *testing.T) {
|
|||
|
||||
}
|
||||
|
||||
func getRandWord(c WordCodec) string {
|
||||
idx := cmn.RandInt() % BankSize
|
||||
return c.words[idx]
|
||||
}
|
||||
|
||||
func getDiffWord(c WordCodec, not string) string {
|
||||
w := getRandWord(c)
|
||||
if w == not {
|
||||
w = getRandWord(c)
|
||||
}
|
||||
return w
|
||||
}
|
||||
|
||||
func TestCheckTypoDetection(t *testing.T) {
|
||||
assert, require := assert.New(t), require.New(t)
|
||||
|
||||
banks := []string{"english"}
|
||||
|
||||
for _, bank := range banks {
|
||||
codec, err := LoadCodec(bank)
|
||||
require.Nil(err, "%s: %+v", bank, err)
|
||||
for i := 0; i < 10; i++ {
|
||||
numBytes := cmn.RandInt()%60 + 1
|
||||
data := cmn.RandBytes(numBytes)
|
||||
|
||||
words, err := codec.BytesToWords(data)
|
||||
assert.Nil(err, "%s: %+v", bank, err)
|
||||
good, err := codec.WordsToBytes(words)
|
||||
assert.Nil(err, "%s: %+v", bank, err)
|
||||
assert.Equal(data, good, bank)
|
||||
|
||||
// now try some tweaks...
|
||||
cut := words[1:]
|
||||
_, err = codec.WordsToBytes(cut)
|
||||
assert.NotNil(err, "%s: %s", bank, words)
|
||||
|
||||
// swap a word within the bank, should fails
|
||||
words[3] = getDiffWord(codec, words[3])
|
||||
_, err = codec.WordsToBytes(words)
|
||||
assert.NotNil(err, "%s: %s", bank, words)
|
||||
|
||||
// put a random word here, must fail
|
||||
words[3] = cmn.RandStr(10)
|
||||
_, err = codec.WordsToBytes(words)
|
||||
assert.NotNil(err, "%s: %s", bank, words)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue