You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
458 lines
9.7 KiB
458 lines
9.7 KiB
package text |
|
|
|
import ( |
|
"testing" |
|
|
|
"crypto.orly/sha256" |
|
"lol.mleku.dev/chk" |
|
"lukechampine.com/frand" |
|
) |
|
|
|
func TestUnescapeByteString(t *testing.T) { |
|
b := make([]byte, 256) |
|
for i := range b { |
|
b[i] = byte(i) |
|
} |
|
escaped := NostrEscape(nil, b) |
|
unescaped := NostrUnescape(escaped) |
|
if string(b) != string(unescaped) { |
|
t.Log(b) |
|
t.Log(unescaped) |
|
t.FailNow() |
|
} |
|
} |
|
|
|
func GenRandString(l int, src *frand.RNG) (str []byte) { |
|
return src.Bytes(l) |
|
} |
|
|
|
var seed = sha256.Sum256( |
|
[]byte(` |
|
The tao that can be told |
|
is not the eternal Tao |
|
The name that can be named |
|
is not the eternal Name |
|
|
|
The unnamable is the eternally real |
|
Naming is the origin of all particular things |
|
|
|
Free from desire, you realize the mystery |
|
Caught in desire, you see only the manifestations |
|
|
|
Yet mystery and manifestations arise from the same source |
|
This source is called darkness |
|
|
|
Darkness within darkness |
|
The gateway to all understanding |
|
`), |
|
) |
|
|
|
var src = frand.NewCustom(seed[:], 32, 12) |
|
|
|
func TestRandomEscapeByteString(t *testing.T) { |
|
// this is a kind of fuzz test, does a massive number of iterations of |
|
// random content that ensures the escaping is correct without creating a |
|
// fixed set of test vectors. |
|
|
|
for i := 0; i < 1000; i++ { |
|
l := src.Intn(1<<8) + 32 |
|
s1 := GenRandString(l, src) |
|
s2 := make([]byte, l) |
|
orig := make([]byte, l) |
|
copy(s2, s1) |
|
copy(orig, s1) |
|
|
|
// first we are checking our implementation comports to the one from go-nostr. |
|
escapeStringVersion := NostrEscape([]byte{}, s1) |
|
escapeJSONStringAndWrapVersion := NostrEscape(nil, s2) |
|
if len(escapeJSONStringAndWrapVersion) != len(escapeStringVersion) { |
|
t.Logf( |
|
"escapeString\nlength: %d\n%s\n%v\n", |
|
len(escapeStringVersion), string(escapeStringVersion), |
|
escapeStringVersion, |
|
) |
|
t.Logf( |
|
"escapJSONStringAndWrap\nlength: %d\n%s\n%v\n", |
|
len(escapeJSONStringAndWrapVersion), |
|
escapeJSONStringAndWrapVersion, |
|
escapeJSONStringAndWrapVersion, |
|
) |
|
t.FailNow() |
|
} |
|
for i := range escapeStringVersion { |
|
if i > len(escapeJSONStringAndWrapVersion) { |
|
t.Fatal("escapeString version is shorter") |
|
} |
|
if escapeStringVersion[i] != escapeJSONStringAndWrapVersion[i] { |
|
t.Logf( |
|
"escapeString version differs at index %d from "+ |
|
"escapeJSONStringAndWrap version\n%s\n%s\n%v\n%v", i, |
|
escapeStringVersion[i-4:], |
|
escapeJSONStringAndWrapVersion[i-4:], |
|
escapeStringVersion[i-4:], |
|
escapeJSONStringAndWrapVersion[i-4:], |
|
) |
|
t.Logf( |
|
"escapeString\nlength: %d %s\n", |
|
len(escapeStringVersion), escapeStringVersion, |
|
) |
|
t.Logf( |
|
"escapJSONStringAndWrap\nlength: %d %s\n", |
|
len(escapeJSONStringAndWrapVersion), |
|
escapeJSONStringAndWrapVersion, |
|
) |
|
t.Logf( |
|
"got '%s' %d expected '%s' %d\n", |
|
string(escapeJSONStringAndWrapVersion[i]), |
|
escapeJSONStringAndWrapVersion[i], |
|
string(escapeStringVersion[i]), |
|
escapeStringVersion[i], |
|
) |
|
t.FailNow() |
|
} |
|
} |
|
|
|
// next, unescape the output and see if it matches the original |
|
unescaped := NostrUnescape(escapeJSONStringAndWrapVersion) |
|
// t.Logf("unescaped: \n%s\noriginal: \n%s", unescaped, orig) |
|
if string(unescaped) != string(orig) { |
|
t.Fatalf( |
|
"\ngot %d %v\nexpected %d %v\n", |
|
len(unescaped), |
|
unescaped, |
|
len(orig), |
|
orig, |
|
) |
|
} |
|
} |
|
} |
|
|
|
func BenchmarkNostrEscapeNostrUnescape(b *testing.B) { |
|
const size = 65536 |
|
b.Run( |
|
"frand64k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
in := make([]byte, size) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscape64k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscapeNostrUnescape64k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
in = in[:0] |
|
out = NostrUnescape(out) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"frand32k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 2 |
|
in := make([]byte, size) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscape32k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 2 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscapeNostrUnescape32k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 2 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
in = in[:0] |
|
out = NostrUnescape(out) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"frand16k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 4 |
|
in := make([]byte, size) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscape16k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 4 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscapeNostrUnescape16k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 4 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
in = in[:0] |
|
out = NostrUnescape(out) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"frand8k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 8 |
|
in := make([]byte, size) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscape8k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 8 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscapeNostrUnescape8k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 8 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
in = in[:0] |
|
out = NostrUnescape(out) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"frand4k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 16 |
|
in := make([]byte, size) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscape4k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 16 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscapeNostrUnescape4k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 16 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
in = in[:0] |
|
out = NostrUnescape(out) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"frand2k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 32 |
|
in := make([]byte, size) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscape2k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 32 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscapeNostrUnescape2k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 32 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
in = in[:0] |
|
out = NostrUnescape(out) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"frand1k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 64 |
|
in := make([]byte, size) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscape1k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 64 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
b.Run( |
|
"NostrEscapeNostrUnescape1k", func(b *testing.B) { |
|
b.ReportAllocs() |
|
size := size / 64 |
|
in := make([]byte, size) |
|
out := make([]byte, size*2) |
|
var err error |
|
for i := 0; i < b.N; i++ { |
|
if _, err = frand.Read(in); chk.E(err) { |
|
b.Fatal(err) |
|
} |
|
out = NostrEscape(out, in) |
|
in = in[:0] |
|
out = NostrUnescape(out) |
|
out = out[:0] |
|
} |
|
}, |
|
) |
|
}
|
|
|