mirror of
https://github.com/status-im/nim-libp2p.git
synced 2025-02-21 17:18:35 +00:00
547 lines
16 KiB
Nim
547 lines
16 KiB
Nim
import unittest
|
|
import ../libp2p/multibase, ../libp2p/errors
|
|
|
|
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]
|
|
let r1 = MultiBase.encodedLength("identity", 0)
|
|
let r2 = MultiBase.decodedLength('\x00', 0)
|
|
let r3 = MultiBase.decodedLength('\x00', 1)
|
|
check:
|
|
r1.isOk == true
|
|
r1.value == 1
|
|
r2.isOk == false
|
|
r2.error == errors.IncorrectEncodingError
|
|
r3.isOk == true
|
|
r3.value == 0
|
|
|
|
let e1 = MultiBase.encode("identity", plain)
|
|
# let e2 = MultiBase.encode("base1", plain)
|
|
# let e3 = MultiBase.encode("base2", plain)
|
|
# let e4 = MultiBase.encode("base8", plain)
|
|
# let e5 = MultiBase.encode("base10", plain)
|
|
# let e6 = MultiBase.encode("base16", plain)
|
|
# let e7 = MultiBase.encode("base16upper", plain)
|
|
let e8 = MultiBase.encode("base32hex", plain)
|
|
let e9 = MultiBase.encode("base32hexupper", plain)
|
|
let e10 = MultiBase.encode("base32hexpad", plain)
|
|
let e11 = MultiBase.encode("base32hexpadupper", plain)
|
|
let e12 = MultiBase.encode("base32", plain)
|
|
let e13 = MultiBase.encode("base32upper", plain)
|
|
let e14 = MultiBase.encode("base32pad", plain)
|
|
let e15 = MultiBase.encode("base32padupper", plain)
|
|
let e16 = MultiBase.encode("base58btc", plain)
|
|
let e17 = MultiBase.encode("base58flickr", plain)
|
|
let e18 = MultiBase.encode("base64", plain)
|
|
let e19 = MultiBase.encode("base64pad", plain)
|
|
let e20 = MultiBase.encode("base64url", plain)
|
|
let e21 = MultiBase.encode("base64urlpad", plain)
|
|
|
|
check:
|
|
e1.isOk == true
|
|
# e2.isOk == true
|
|
# e3.isOk == true
|
|
# e4.isOk == true
|
|
# e5.isOk == true
|
|
# e6.isOk == true
|
|
# e7.isOk == true
|
|
e8.isOk == true
|
|
e9.isOk == true
|
|
e10.isOk == true
|
|
e11.isOk == true
|
|
e12.isOk == true
|
|
e13.isOk == true
|
|
e14.isOk == true
|
|
e15.isOk == true
|
|
e16.isOk == true
|
|
e17.isOk == true
|
|
e18.isOk == true
|
|
e19.isOk == true
|
|
e20.isOk == true
|
|
e21.isOk == true
|
|
e1.value == "\x00"
|
|
# e2.value == "1"
|
|
# e3.value == "0"
|
|
# e4.value == "7"
|
|
# e5.value == "9"
|
|
# e6.value == "f"
|
|
# e7.value == "F"
|
|
e8.value == "v"
|
|
e9.value == "V"
|
|
e10.value == "t"
|
|
e11.value == "T"
|
|
e12.value == "b"
|
|
e13.value == "B"
|
|
e14.value == "c"
|
|
e15.value == "C"
|
|
e16.value == "z"
|
|
e17.value == "Z"
|
|
e18.value == "m"
|
|
e19.value == "M"
|
|
e20.value == "u"
|
|
e21.value == "U"
|
|
|
|
MultiBase.Identity.encode(plain) == "\x00"
|
|
# MultiBase.Base1.encode(plain) == "1"
|
|
# MultiBase.Base2.encode(plain) == "0"
|
|
# MultiBase.Base8.encode(plain) == "7"
|
|
# MultiBase.Base10.encode(plain) == "9"
|
|
# MultiBase.Base16.encode(plain) == "f"
|
|
# MultiBase.Base16Upper.encode(plain) == "F"
|
|
MultiBase.Base32Hex.encode(plain) == "v"
|
|
MultiBase.Base32HexUpper.encode(plain) == "V"
|
|
MultiBase.Base32HexPad.encode(plain) == "t"
|
|
MultiBase.Base32HexPadUpper.encode(plain) == "T"
|
|
MultiBase.Base32.encode(plain) == "b"
|
|
MultiBase.Base32Upper.encode(plain) == "B"
|
|
MultiBase.Base32Pad.encode(plain) == "c"
|
|
MultiBase.Base32PadUpper.encode(plain) == "C"
|
|
MultiBase.Base58Btc.encode(plain) == "z"
|
|
MultiBase.Base58Flickr.encode(plain) == "Z"
|
|
MultiBase.Base64.encode(plain) == "m"
|
|
MultiBase.Base64Pad.encode(plain) == "M"
|
|
MultiBase.Base64Url.encode(plain) == "u"
|
|
MultiBase.Base64UrlPad.encode(plain) == "U"
|
|
|
|
MultiBase.Identity.encodedLength(0) == 1
|
|
# MultiBase.Base1.encodedLength(0) == 1
|
|
# MultiBase.Base2.encodedLength(0) == 1
|
|
# MultiBase.Base8.encodedLength(0) == 1
|
|
# MultiBase.Base10.encodedLength(0) == 1
|
|
# MultiBase.Base16.encodedLength(0) == 1
|
|
# MultiBase.Base16Upper.encodedLength(0) == 1
|
|
MultiBase.Base32Hex.encodedLength(0) == 1
|
|
MultiBase.Base32HexUpper.encodedLength(0) == 1
|
|
MultiBase.Base32HexPad.encodedLength(0) == 1
|
|
MultiBase.Base32HexPadUpper.encodedLength(0) == 1
|
|
MultiBase.Base32.encodedLength(0) == 1
|
|
MultiBase.Base32Upper.encodedLength(0) == 1
|
|
MultiBase.Base32Pad.encodedLength(0) == 1
|
|
MultiBase.Base32PadUpper.encodedLength(0) == 1
|
|
MultiBase.Base58Btc.encodedLength(0) == 1
|
|
MultiBase.Base58Flickr.encodedLength(0) == 1
|
|
MultiBase.Base64.encodedLength(0) == 1
|
|
MultiBase.Base64Pad.encodedLength(0) == 1
|
|
MultiBase.Base64Url.encodedLength(0) == 1
|
|
MultiBase.Base64UrlPad.encodedLength(0) == 1
|
|
|
|
MultiBase.Identity.decodedLength(1) == 0
|
|
# MultiBase.Base1.decodedLength(1) == 0
|
|
# MultiBase.Base2.decodedLength(1) == 0
|
|
# MultiBase.Base8.decodedLength(1) == 0
|
|
# MultiBase.Base10.decodedLength(1) == 0
|
|
# MultiBase.Base16.decodedLength(1) == 0
|
|
# MultiBase.Base16Upper.decodedLength(1) == 0
|
|
MultiBase.Base32Hex.decodedLength(1) == 0
|
|
MultiBase.Base32HexUpper.decodedLength(1) == 0
|
|
MultiBase.Base32HexPad.decodedLength(1) == 0
|
|
MultiBase.Base32HexPadUpper.decodedLength(1) == 0
|
|
MultiBase.Base32.decodedLength(1) == 0
|
|
MultiBase.Base32Upper.decodedLength(1) == 0
|
|
MultiBase.Base32Pad.decodedLength(1) == 0
|
|
MultiBase.Base32PadUpper.decodedLength(1) == 0
|
|
MultiBase.Base58Btc.decodedLength(1) == 0
|
|
MultiBase.Base58Flickr.decodedLength(1) == 0
|
|
MultiBase.Base64.decodedLength(1) == 0
|
|
MultiBase.Base64Pad.decodedLength(1) == 0
|
|
MultiBase.Base64Url.decodedLength(1) == 0
|
|
MultiBase.Base64UrlPad.decodedLength(1) == 0
|
|
|
|
let d1 = MultiBase.decode("\x00")
|
|
# let d2 = MultiBase.decode("1")
|
|
# let d3 = MultiBase.decode("0")
|
|
# let d4 = MultiBase.decode("7")
|
|
# let d5 = MultiBase.decode("9")
|
|
# let d6 = MultiBase.decode("f")
|
|
# let d7 = MultiBase.decode("F")
|
|
let d8 = MultiBase.decode("v")
|
|
let d9 = MultiBase.decode("V")
|
|
let d10 = MultiBase.decode("t")
|
|
let d11 = MultiBase.decode("T")
|
|
let d12 = MultiBase.decode("b")
|
|
let d13 = MultiBase.decode("B")
|
|
let d14 = MultiBase.decode("c")
|
|
let d15 = MultiBase.decode("C")
|
|
let d16 = MultiBase.decode("z")
|
|
let d17 = MultiBase.decode("Z")
|
|
let d18 = MultiBase.decode("m")
|
|
let d19 = MultiBase.decode("M")
|
|
let d20 = MultiBase.decode("u")
|
|
let d21 = MultiBase.decode("U")
|
|
check:
|
|
d1.isOk == true
|
|
# d2.isOk == true
|
|
# d3.isOk == true
|
|
# d4.isOk == true
|
|
# d5.isOk == true
|
|
# d6.isOk == true
|
|
# d7.isOk == true
|
|
d8.isOk == true
|
|
d9.isOk == true
|
|
d10.isOk == true
|
|
d11.isOk == true
|
|
d12.isOk == true
|
|
d13.isOk == true
|
|
d14.isOk == true
|
|
d15.isOk == true
|
|
d16.isOk == true
|
|
d17.isOk == true
|
|
d18.isOk == true
|
|
d19.isOk == true
|
|
d20.isOk == true
|
|
d21.isOk == true
|
|
len(d1.value) == 0
|
|
# len(d2.value) == 0
|
|
# len(d3.value) == 0
|
|
# len(d4.value) == 0
|
|
# len(d5.value) == 0
|
|
# len(d6.value) == 0
|
|
# len(d7.value) == 0
|
|
len(d8.value) == 0
|
|
len(d9.value) == 0
|
|
len(d10.value) == 0
|
|
len(d11.value) == 0
|
|
len(d12.value) == 0
|
|
len(d13.value) == 0
|
|
len(d14.value) == 0
|
|
len(d15.value) == 0
|
|
len(d16.value) == 0
|
|
len(d17.value) == 0
|
|
len(d18.value) == 0
|
|
len(d19.value) == 0
|
|
len(d20.value) == 0
|
|
len(d21.value) == 0
|
|
|
|
let n1 = MultiBase.encode("identity", plain, enc)
|
|
check:
|
|
n1.isOk == true
|
|
n1.value == 1
|
|
enc == "\x00"
|
|
# let n2 = MultiBase.encode("base1", plain, enc)
|
|
# check:
|
|
# n2.isOk == true
|
|
# n2.value == 1
|
|
# enc == "1"
|
|
# let n3 = MultiBase.encode("base2", plain, enc)
|
|
# check:
|
|
# n3.isOk == true
|
|
# n3.value == 1
|
|
# enc == "0"
|
|
# let n4 = MultiBase.encode("base8", plain, enc)
|
|
# check:
|
|
# n4.isOk == true
|
|
# n4.value == 1
|
|
# enc == "7"
|
|
# let n5 = MultiBase.encode("base10", plain, enc)
|
|
# check:
|
|
# n5.isOk == true
|
|
# n5.value == 1
|
|
# enc == "9"
|
|
# let n6 = MultiBase.encode("base16", plain, enc)
|
|
# check:
|
|
# n6.isOk == true
|
|
# n6.value == 1
|
|
# enc == "f"
|
|
# let n7 = MultiBase.encode("base16upper", plain, enc)
|
|
# check:
|
|
# n7.isOk == true
|
|
# n7.value == 1
|
|
# enc == "F"
|
|
let n8 = MultiBase.encode("base32hex", plain, enc)
|
|
check:
|
|
n8.isOk == true
|
|
n8.value == 1
|
|
enc == "v"
|
|
let n9 = MultiBase.encode("base32hexupper", plain, enc)
|
|
check:
|
|
n9.isOk == true
|
|
n9.value == 1
|
|
enc == "V"
|
|
let n10 = MultiBase.encode("base32hexpad", plain, enc)
|
|
check:
|
|
n10.isOk == true
|
|
n10.value == 1
|
|
enc == "t"
|
|
let n11 = MultiBase.encode("base32hexpadupper", plain, enc)
|
|
check:
|
|
n11.isOk == true
|
|
n11.value == 1
|
|
enc == "T"
|
|
let n12 = MultiBase.encode("base32", plain, enc)
|
|
check:
|
|
n12.isOk == true
|
|
n12.value == 1
|
|
enc == "b"
|
|
let n13 = MultiBase.encode("base32upper", plain, enc)
|
|
check:
|
|
n13.isOk == true
|
|
n13.value == 1
|
|
enc == "B"
|
|
let n14 = MultiBase.encode("base32pad", plain, enc)
|
|
check:
|
|
n14.isOk == true
|
|
n14.value == 1
|
|
enc == "c"
|
|
let n15 = MultiBase.encode("base32padupper", plain, enc)
|
|
check:
|
|
n15.isOk == true
|
|
n15.value == 1
|
|
enc == "C"
|
|
let n16 = MultiBase.encode("base58btc", plain, enc)
|
|
check:
|
|
n16.isOk == true
|
|
n16.value == 1
|
|
enc == "z"
|
|
let n17 = MultiBase.encode("base58flickr", plain, enc)
|
|
check:
|
|
n17.isOk == true
|
|
n17.value == 1
|
|
enc == "Z"
|
|
let n18 = MultiBase.encode("base64", plain, enc)
|
|
check:
|
|
n18.isOk == true
|
|
n18.value == 1
|
|
enc == "m"
|
|
let n19 = MultiBase.encode("base64pad", plain, enc)
|
|
check:
|
|
n19.isOk == true
|
|
n19.value == 1
|
|
enc == "M"
|
|
let n20 = MultiBase.encode("base64url", plain, enc)
|
|
check:
|
|
n20.isOk == true
|
|
n20.value == 1
|
|
enc == "u"
|
|
let n21 = MultiBase.encode("base64urlpad", plain, enc)
|
|
check:
|
|
n21.isOk == true
|
|
n21.value == 1
|
|
enc == "U"
|
|
|
|
let c0 = MultiBase.decode("", dec)
|
|
check:
|
|
c0.isErr == true
|
|
c0.error == errors.IncorrectEncodingError
|
|
let c1 = MultiBase.decode("\x00", dec)
|
|
check:
|
|
c1.isOk == true
|
|
c1.value == 0
|
|
# let c2 = MultiBase.decode("1", dec)
|
|
# check:
|
|
# c2.isOk == true
|
|
# c2.value == 0
|
|
# let c3 = MultiBase.decode("0", dec)
|
|
# check:
|
|
# c3.isOk == true
|
|
# c3.value == 0
|
|
# let c4 = MultiBase.decode("7", dec)
|
|
# check:
|
|
# c4.isOk == true
|
|
# c4.value == 0
|
|
# let c5 = MultiBase.decode("9", dec)
|
|
# check:
|
|
# c5.isOk == true
|
|
# c5.value == 0
|
|
# let c6 = MultiBase.decode("f", dec)
|
|
# check:
|
|
# c6.isOk == true
|
|
# c6.value == 0
|
|
# let c7 = MultiBase.decode("F", dec)
|
|
# check:
|
|
# c7.isOk == true
|
|
# c7.value == 0
|
|
let c8 = MultiBase.decode("v", dec)
|
|
check:
|
|
c8.isOk == true
|
|
c8.value == 0
|
|
let c9 = MultiBase.decode("V", dec)
|
|
check:
|
|
c9.isOk == true
|
|
c9.value == 0
|
|
let c10 = MultiBase.decode("t", dec)
|
|
check:
|
|
c10.isOk == true
|
|
c10.value == 0
|
|
let c11 = MultiBase.decode("T", dec)
|
|
check:
|
|
c11.isOk == true
|
|
c11.value == 0
|
|
let c12 = MultiBase.decode("b", dec)
|
|
check:
|
|
c12.isOk == true
|
|
c12.value == 0
|
|
let c13 = MultiBase.decode("B", dec)
|
|
check:
|
|
c13.isOk == true
|
|
c13.value == 0
|
|
let c14 = MultiBase.decode("c", dec)
|
|
check:
|
|
c14.isOk == true
|
|
c14.value == 0
|
|
let c15 = MultiBase.decode("C", dec)
|
|
check:
|
|
c15.isOk == true
|
|
c15.value == 0
|
|
let c16 = MultiBase.decode("z", dec)
|
|
check:
|
|
c16.isOk == true
|
|
c16.value == 0
|
|
let c17 = MultiBase.decode("Z", dec)
|
|
check:
|
|
c17.isOk == true
|
|
c17.value == 0
|
|
let c18 = MultiBase.decode("m", dec)
|
|
check:
|
|
c18.isOk == true
|
|
c18.value == 0
|
|
let c19 = MultiBase.decode("M", dec)
|
|
check:
|
|
c19.isOk == true
|
|
c19.value == 0
|
|
let c20 = MultiBase.decode("u", dec)
|
|
check:
|
|
c20.isOk == true
|
|
c20.value == 0
|
|
let c21 = MultiBase.decode("U", dec)
|
|
check:
|
|
c21.isOk == true
|
|
c21.value == 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
|
|
let e1 = MultiBase.encode(encoding, bexpect)
|
|
let e2 = MultiBase.decode(encoded)
|
|
check:
|
|
e1.isOk == true
|
|
e2.isOk == true
|
|
e1.value == encoded
|
|
e2.value == bexpect
|
|
|
|
let e3 = MultiBase.encodedLength(encoding, len(expect))
|
|
check e3.isOk == true
|
|
var ebuffer = newString(e3.value)
|
|
let e4 = MultiBase.encode(encoding, bexpect, ebuffer)
|
|
check e4.isOk == true
|
|
ebuffer.setLen(e4.value)
|
|
check encoded == ebuffer
|
|
|
|
let e5 = MultiBase.decodedLength(encoded[0], len(encoded))
|
|
check e5.isOk == true
|
|
var dbuffer = newSeq[byte](e5.value)
|
|
let e6 = MultiBase.decode(encoded, dbuffer)
|
|
check e6.isOk == true
|
|
dbuffer.setLen(e6.value)
|
|
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
|
|
let r1 = MultiBase.encode("unknown", data, ebuffer)
|
|
let r2 = MultiBase.decode("\x01\x00", dbuffer)
|
|
check:
|
|
r1.isErr == true
|
|
r2.isErr == true
|
|
r1.error == errors.NoSupportError
|
|
r2.error == errors.NoSupportError
|
|
|
|
let r3 = MultiBase.encode("unknown", data)
|
|
let r4 = MultiBase.decode("\x01\x00")
|
|
check:
|
|
r3.isErr == true
|
|
r4.isErr == true
|
|
r3.error == errors.NoSupportError
|
|
r4.error == errors.NoSupportError
|