nim-libp2p/tests/testmultibase.nim

306 lines
10 KiB
Nim

{.used.}
# Nim-Libp2p
# Copyright (c) 2023 Status Research & Development GmbH
# Licensed under either of
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
# at your option.
# This file may not be copied, modified, or distributed except according to
# those terms.
import unittest2
import ../libp2p/multibase
import stew/results
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).get() == "\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).get() == "v"
MultiBase.encode("base32hexupper", plain).get() == "V"
MultiBase.encode("base32hexpad", plain).get() == "t"
MultiBase.encode("base32hexpadupper", plain).get() == "T"
MultiBase.encode("base32", plain).get() == "b"
MultiBase.encode("base32upper", plain).get() == "B"
MultiBase.encode("base32pad", plain).get() == "c"
MultiBase.encode("base32padupper", plain).get() == "C"
MultiBase.encode("base58btc", plain).get() == "z"
MultiBase.encode("base58flickr", plain).get() == "Z"
MultiBase.encode("base64", plain).get() == "m"
MultiBase.encode("base64pad", plain).get() == "M"
MultiBase.encode("base64url", plain).get() == "u"
MultiBase.encode("base64urlpad", plain).get() == "U"
check:
len(MultiBase.decode("\x00").get()) == 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").get()) == 0
len(MultiBase.decode("V").get()) == 0
len(MultiBase.decode("t").get()) == 0
len(MultiBase.decode("T").get()) == 0
len(MultiBase.decode("b").get()) == 0
len(MultiBase.decode("B").get()) == 0
len(MultiBase.decode("c").get()) == 0
len(MultiBase.decode("C").get()) == 0
len(MultiBase.decode("z").get()) == 0
len(MultiBase.decode("Z").get()) == 0
len(MultiBase.decode("m").get()) == 0
len(MultiBase.decode("M").get()) == 0
len(MultiBase.decode("u").get()) == 0
len(MultiBase.decode("U").get()) == 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).get() == encoded
MultiBase.decode(encoded).get() == 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
MultiBase.encode("unknwon", data).isErr()
MultiBase.decode("\x01\x00").isErr()