307 lines
10 KiB
Nim
307 lines
10 KiB
Nim
import unittest
|
|
import ../libp2p/multibase
|
|
|
|
const GoTestVectors = [
|
|
[
|
|
"identity",
|
|
"\x00Decentralize everything!!!",
|
|
"Decentralize everything!!!"
|
|
],
|
|
# [
|
|
# "base16",
|
|
# "f446563656e7472616c697a652065766572797468696e67212121",
|
|
# "Decentralize everything!!!"
|
|
# ],
|
|
# [
|
|
# "base16upper",
|
|
# "F446563656E7472616C697A652065766572797468696E67212121",
|
|
# "Decentralize everything!!!"
|
|
# ],
|
|
[
|
|
"base32",
|
|
"birswgzloorzgc3djpjssazlwmvzhs5dinfxgoijbee",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32upper",
|
|
"BIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJBEE",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32pad",
|
|
"cirswgzloorzgc3djpjssazlwmvzhs5dinfxgoijbee======",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32padupper",
|
|
"CIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJBEE======",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32hex",
|
|
"v8him6pbeehp62r39f9ii0pbmclp7it38d5n6e89144",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32hexupper",
|
|
"V8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E89144",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32hexpad",
|
|
"t8him6pbeehp62r39f9ii0pbmclp7it38d5n6e89144======",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32hexpadupper",
|
|
"T8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E89144======",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base58btc",
|
|
"z36UQrhJq9fNDS7DiAHM9YXqDHMPfr4EMArvt",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base64",
|
|
"mRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base64url",
|
|
"uRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base64pad",
|
|
"MRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE=",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base64urlpad",
|
|
"URGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE=",
|
|
"Decentralize everything!!!"
|
|
],
|
|
]
|
|
|
|
suite "MultiBase test suite":
|
|
test "Zero-length data encoding/decoding test":
|
|
var enc = newString(1)
|
|
var dec = newSeq[byte]()
|
|
var plain = newSeq[byte]()
|
|
var olens: array[21, int]
|
|
check:
|
|
MultiBase.encodedLength("identity", 0) == 1
|
|
MultiBase.decodedLength('\x00', 0) == -1
|
|
MultiBase.decodedLength('\x00', 1) == 0
|
|
check:
|
|
MultiBase.encode("identity", plain) == "\x00"
|
|
# MultiBase.encode("base1", plain) == "1"
|
|
# MultiBase.encode("base2", plain) == "0"
|
|
# MultiBase.encode("base8", plain) == "7"
|
|
# MultiBase.encode("base10", plain) == "9"
|
|
# MultiBase.encode("base16", plain) == "f"
|
|
# MultiBase.encode("base16upper", plain) == "F"
|
|
MultiBase.encode("base32hex", plain) == "v"
|
|
MultiBase.encode("base32hexupper", plain) == "V"
|
|
MultiBase.encode("base32hexpad", plain) == "t"
|
|
MultiBase.encode("base32hexpadupper", plain) == "T"
|
|
MultiBase.encode("base32", plain) == "b"
|
|
MultiBase.encode("base32upper", plain) == "B"
|
|
MultiBase.encode("base32pad", plain) == "c"
|
|
MultiBase.encode("base32padupper", plain) == "C"
|
|
MultiBase.encode("base58btc", plain) == "z"
|
|
MultiBase.encode("base58flickr", plain) == "Z"
|
|
MultiBase.encode("base64", plain) == "m"
|
|
MultiBase.encode("base64pad", plain) == "M"
|
|
MultiBase.encode("base64url", plain) == "u"
|
|
MultiBase.encode("base64urlpad", plain) == "U"
|
|
check:
|
|
len(MultiBase.decode("\x00")) == 0
|
|
# len(MultiBase.decode("1")) == 0
|
|
# len(MultiBase.decode("0")) == 0
|
|
# len(MultiBase.decode("7")) == 0
|
|
# len(MultiBase.decode("9")) == 0
|
|
# len(MultiBase.decode("f")) == 0
|
|
# len(MultiBase.decode("F")) == 0
|
|
len(MultiBase.decode("v")) == 0
|
|
len(MultiBase.decode("V")) == 0
|
|
len(MultiBase.decode("t")) == 0
|
|
len(MultiBase.decode("T")) == 0
|
|
len(MultiBase.decode("b")) == 0
|
|
len(MultiBase.decode("B")) == 0
|
|
len(MultiBase.decode("c")) == 0
|
|
len(MultiBase.decode("C")) == 0
|
|
len(MultiBase.decode("z")) == 0
|
|
len(MultiBase.decode("Z")) == 0
|
|
len(MultiBase.decode("m")) == 0
|
|
len(MultiBase.decode("M")) == 0
|
|
len(MultiBase.decode("u")) == 0
|
|
len(MultiBase.decode("U")) == 0
|
|
check:
|
|
MultiBase.encode("identity", plain, enc,
|
|
olens[0]) == MultiBaseStatus.Success
|
|
enc == "\x00"
|
|
olens[0] == 1
|
|
# MultiBase.encode("base1", plain, enc,
|
|
# olens[1]) == MultiBaseStatus.Success
|
|
# enc == "1"
|
|
# olens[1] == 1
|
|
# MultiBase.encode("base2", plain, enc,
|
|
# olens[2]) == MultiBaseStatus.Success
|
|
# enc == "0"
|
|
# olens[2] == 1
|
|
# MultiBase.encode("base8", plain, enc,
|
|
# olens[3]) == MultiBaseStatus.Success
|
|
# enc == "7"
|
|
# olens[3] == 1
|
|
# MultiBase.encode("base10", plain, enc,
|
|
# olens[4]) == MultiBaseStatus.Success
|
|
# enc == "9"
|
|
# olens[4] == 1
|
|
# MultiBase.encode("base16", plain, enc,
|
|
# olens[5]) == MultiBaseStatus.Success
|
|
# enc == "f"
|
|
# olens[5] == 1
|
|
# MultiBase.encode("base16upper", plain, enc,
|
|
# olens[6]) == MultiBaseStatus.Success
|
|
# enc == "F"
|
|
# olens[6] == 1
|
|
MultiBase.encode("base32hex", plain, enc,
|
|
olens[7]) == MultiBaseStatus.Success
|
|
enc == "v"
|
|
olens[7] == 1
|
|
MultiBase.encode("base32hexupper", plain, enc,
|
|
olens[8]) == MultiBaseStatus.Success
|
|
enc == "V"
|
|
olens[8] == 1
|
|
MultiBase.encode("base32hexpad", plain, enc,
|
|
olens[9]) == MultiBaseStatus.Success
|
|
enc == "t"
|
|
olens[9] == 1
|
|
MultiBase.encode("base32hexpadupper", plain, enc,
|
|
olens[10]) == MultiBaseStatus.Success
|
|
enc == "T"
|
|
olens[10] == 1
|
|
MultiBase.encode("base32", plain, enc,
|
|
olens[11]) == MultiBaseStatus.Success
|
|
enc == "b"
|
|
olens[11] == 1
|
|
MultiBase.encode("base32upper", plain, enc,
|
|
olens[12]) == MultiBaseStatus.Success
|
|
enc == "B"
|
|
olens[12] == 1
|
|
MultiBase.encode("base32pad", plain, enc,
|
|
olens[13]) == MultiBaseStatus.Success
|
|
enc == "c"
|
|
olens[13] == 1
|
|
MultiBase.encode("base32padupper", plain, enc,
|
|
olens[14]) == MultiBaseStatus.Success
|
|
enc == "C"
|
|
olens[14] == 1
|
|
MultiBase.encode("base58btc", plain, enc,
|
|
olens[15]) == MultiBaseStatus.Success
|
|
enc == "z"
|
|
olens[15] == 1
|
|
MultiBase.encode("base58flickr", plain, enc,
|
|
olens[16]) == MultiBaseStatus.Success
|
|
enc == "Z"
|
|
olens[16] == 1
|
|
check:
|
|
MultiBase.decode("", dec, olens[0]) == MultiBaseStatus.Incorrect
|
|
MultiBase.decode("\x00", dec, olens[0]) == MultiBaseStatus.Success
|
|
olens[0] == 0
|
|
# MultiBase.decode("1", dec, olens[1]) == MultiBaseStatus.Success
|
|
# olens[1] == 0
|
|
# MultiBase.decode("0", dec, olens[2]) == MultiBaseStatus.Success
|
|
# olens[2] == 0
|
|
# MultiBase.decode("7", dec, olens[3]) == MultiBaseStatus.Success
|
|
# olens[3] == 0
|
|
# MultiBase.decode("9", dec, olens[4]) == MultiBaseStatus.Success
|
|
# olens[4] == 0
|
|
# MultiBase.decode("f", dec, olens[5]) == MultiBaseStatus.Success
|
|
# olens[5] == 0
|
|
# MultiBase.decode("F", dec, olens[6]) == MultiBaseStatus.Success
|
|
# olens[6] == 0
|
|
MultiBase.decode("v", dec, olens[7]) == MultiBaseStatus.Success
|
|
olens[7] == 0
|
|
MultiBase.decode("V", dec, olens[8]) == MultiBaseStatus.Success
|
|
olens[8] == 0
|
|
MultiBase.decode("t", dec, olens[9]) == MultiBaseStatus.Success
|
|
olens[9] == 0
|
|
MultiBase.decode("T", dec, olens[10]) == MultiBaseStatus.Success
|
|
olens[10] == 0
|
|
MultiBase.decode("b", dec, olens[11]) == MultiBaseStatus.Success
|
|
olens[11] == 0
|
|
MultiBase.decode("B", dec, olens[12]) == MultiBaseStatus.Success
|
|
olens[12] == 0
|
|
MultiBase.decode("c", dec, olens[13]) == MultiBaseStatus.Success
|
|
olens[13] == 0
|
|
MultiBase.decode("C", dec, olens[14]) == MultiBaseStatus.Success
|
|
olens[14] == 0
|
|
MultiBase.decode("z", dec, olens[15]) == MultiBaseStatus.Success
|
|
olens[15] == 0
|
|
MultiBase.decode("Z", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
MultiBase.decode("m", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
MultiBase.decode("M", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
MultiBase.decode("u", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
MultiBase.decode("U", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
test "go-multibase test vectors":
|
|
for item in GoTestVectors:
|
|
let encoding = item[0]
|
|
let encoded = item[1]
|
|
var expect = item[2]
|
|
var bexpect = cast[seq[byte]](expect)
|
|
var outlen = 0
|
|
check:
|
|
MultiBase.encode(encoding, bexpect) == encoded
|
|
MultiBase.decode(encoded) == bexpect
|
|
|
|
let elength = MultiBase.encodedLength(encoding, len(expect))
|
|
var ebuffer = newString(elength)
|
|
outlen = 0
|
|
check:
|
|
MultiBase.encode(encoding, bexpect, ebuffer,
|
|
outlen) == MultiBaseStatus.Success
|
|
ebuffer.setLen(outlen)
|
|
check:
|
|
encoded == ebuffer
|
|
|
|
let dlength = MultiBase.decodedLength(encoded[0], len(encoded))
|
|
var dbuffer = newSeq[byte](dlength)
|
|
outlen = 0
|
|
check:
|
|
MultiBase.decode(encoded, dbuffer, outlen) == MultiBaseStatus.Success
|
|
dbuffer.setLen(outlen)
|
|
check:
|
|
bexpect == dbuffer
|
|
test "Unknown codec test":
|
|
var data = @[0x00'u8, 0x01'u8]
|
|
var ebuffer = newString(100)
|
|
var dbuffer = newSeq[byte](100)
|
|
var outlen = 0
|
|
check:
|
|
MultiBase.encode("unknown", data, ebuffer,
|
|
outlen) == MultiBaseStatus.BadCodec
|
|
MultiBase.decode("\x01\x00", dbuffer, outlen) == MultiBaseStatus.BadCodec
|
|
var r1 = false
|
|
var r2 = false
|
|
try:
|
|
var enc = MultiBase.encode("unknwon", data)
|
|
except MultiBaseError:
|
|
r1 = true
|
|
|
|
try:
|
|
var dec = MultiBase.decode("\x01\x00")
|
|
except MultiBaseError:
|
|
r2 = true
|
|
|
|
check:
|
|
r1 == true
|
|
r2 == true
|