2024-09-18 12:20:54 -04:00
|
|
|
package delegation_test
|
2024-08-30 22:06:59 +02:00
|
|
|
|
|
|
|
|
import (
|
2024-09-24 06:46:48 -04:00
|
|
|
"bytes"
|
2024-09-18 12:20:54 -04:00
|
|
|
_ "embed"
|
2024-08-30 22:06:59 +02:00
|
|
|
"fmt"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
"github.com/ipld/go-ipld-prime"
|
2024-09-24 06:46:48 -04:00
|
|
|
"github.com/stretchr/testify/assert"
|
2024-08-30 22:06:59 +02:00
|
|
|
"github.com/stretchr/testify/require"
|
2024-09-18 12:20:54 -04:00
|
|
|
"gotest.tools/v3/golden"
|
2024-09-19 10:48:25 +02:00
|
|
|
|
|
|
|
|
"github.com/ucan-wg/go-ucan/delegation"
|
2024-09-19 13:29:33 -04:00
|
|
|
"github.com/ucan-wg/go-ucan/internal/envelope"
|
2024-08-30 22:06:59 +02:00
|
|
|
)
|
|
|
|
|
|
2024-09-18 12:20:54 -04:00
|
|
|
//go:embed delegation.ipldsch
|
|
|
|
|
var schemaBytes []byte
|
|
|
|
|
|
2024-08-30 22:06:59 +02:00
|
|
|
func TestSchemaRoundTrip(t *testing.T) {
|
2024-09-19 13:29:33 -04:00
|
|
|
t.Parallel()
|
2024-09-18 12:20:54 -04:00
|
|
|
|
|
|
|
|
delegationJson := golden.Get(t, "new.dagjson")
|
|
|
|
|
privKey := privKey(t, issuerPrivKeyCfg)
|
|
|
|
|
|
2024-09-24 06:46:48 -04:00
|
|
|
t.Run("via buffers", func(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
2024-09-02 02:26:48 +02:00
|
|
|
|
2024-09-24 06:46:48 -04:00
|
|
|
// format: dagJson --> PayloadModel --> dagCbor --> PayloadModel --> dagJson
|
|
|
|
|
// function: DecodeDagJson() Seal() Unseal() EncodeDagJson()
|
2024-08-30 22:06:59 +02:00
|
|
|
|
2024-09-24 14:09:36 +02:00
|
|
|
p1, err := delegation.FromDagJson(delegationJson)
|
2024-09-24 06:46:48 -04:00
|
|
|
require.NoError(t, err)
|
2024-08-30 22:06:59 +02:00
|
|
|
|
2024-09-24 06:46:48 -04:00
|
|
|
cborBytes, id, err := p1.Seal(privKey)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
assert.Equal(t, newCID, envelope.CIDToBase58BTC(id))
|
|
|
|
|
fmt.Println("cborBytes length", len(cborBytes))
|
|
|
|
|
fmt.Println("cbor", string(cborBytes))
|
2024-08-30 22:06:59 +02:00
|
|
|
|
2024-09-24 06:46:48 -04:00
|
|
|
p2, err := delegation.Unseal(cborBytes)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
assert.Equal(t, id, p2.CID())
|
|
|
|
|
fmt.Println("read Cbor", p2)
|
2024-08-30 22:06:59 +02:00
|
|
|
|
2024-09-24 06:46:48 -04:00
|
|
|
readJson, err := p2.ToDagJson(privKey)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
fmt.Println("readJson length", len(readJson))
|
|
|
|
|
fmt.Println("json: ", string(readJson))
|
|
|
|
|
|
|
|
|
|
assert.JSONEq(t, string(delegationJson), string(readJson))
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("via streaming", func(t *testing.T) {
|
|
|
|
|
t.Parallel()
|
|
|
|
|
|
|
|
|
|
buf := bytes.NewBuffer(delegationJson)
|
|
|
|
|
|
|
|
|
|
// format: dagJson --> PayloadModel --> dagCbor --> PayloadModel --> dagJson
|
|
|
|
|
// function: DecodeDagJson() Seal() Unseal() EncodeDagJson()
|
|
|
|
|
|
|
|
|
|
p1, err := delegation.FromDagJsonReader(buf)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
cborBytes := &bytes.Buffer{}
|
|
|
|
|
id, err := p1.SealWriter(cborBytes, privKey)
|
|
|
|
|
t.Log(len(id.Bytes()), id.Bytes())
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
assert.Equal(t, newCID, envelope.CIDToBase58BTC(id))
|
|
|
|
|
|
|
|
|
|
// buf = bytes.NewBuffer(cborBytes.Bytes())
|
|
|
|
|
p2, err := delegation.UnsealReader(cborBytes)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
t.Log(len(p2.CID().Bytes()), p2.CID().Bytes())
|
|
|
|
|
assert.Equal(t, envelope.CIDToBase58BTC(id), envelope.CIDToBase58BTC(p2.CID()))
|
|
|
|
|
|
|
|
|
|
readJson := &bytes.Buffer{}
|
|
|
|
|
require.NoError(t, p2.ToDagJsonWriter(readJson, privKey))
|
|
|
|
|
|
|
|
|
|
assert.JSONEq(t, string(delegationJson), readJson.String())
|
|
|
|
|
})
|
2024-08-30 22:06:59 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkSchemaLoad(b *testing.B) {
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
_, _ = ipld.LoadSchemaBytes(schemaBytes)
|
|
|
|
|
}
|
|
|
|
|
}
|
2024-09-24 14:09:36 +02:00
|
|
|
|
|
|
|
|
func BenchmarkRoundTrip(b *testing.B) {
|
|
|
|
|
delegationJson := golden.Get(b, "new.dagjson")
|
|
|
|
|
privKey := privKey(b, issuerPrivKeyCfg)
|
|
|
|
|
|
|
|
|
|
b.Run("via buffers", func(b *testing.B) {
|
|
|
|
|
p1, _ := delegation.FromDagJson(delegationJson)
|
|
|
|
|
cborBytes, _, _ := p1.Seal(privKey)
|
|
|
|
|
p2, _ := delegation.Unseal(cborBytes)
|
|
|
|
|
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
|
|
|
|
|
b.Run("FromDagJson", func(b *testing.B) {
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
_, _ = delegation.FromDagJson(delegationJson)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
b.Run("Seal", func(b *testing.B) {
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
_, _, _ = p1.Seal(privKey)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
b.Run("Unseal", func(b *testing.B) {
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
_, _ = delegation.Unseal(cborBytes)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
b.Run("ToDagJson", func(b *testing.B) {
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
_, _ = p2.ToDagJson(privKey)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
b.Run("via streaming", func(b *testing.B) {
|
|
|
|
|
p1, _ := delegation.FromDagJsonReader(bytes.NewReader(delegationJson))
|
|
|
|
|
cborBuf := &bytes.Buffer{}
|
|
|
|
|
_, _ = p1.SealWriter(cborBuf, privKey)
|
|
|
|
|
cborBytes := cborBuf.Bytes()
|
|
|
|
|
p2, _ := delegation.UnsealReader(bytes.NewReader(cborBytes))
|
|
|
|
|
|
|
|
|
|
b.ResetTimer()
|
|
|
|
|
|
|
|
|
|
b.Run("FromDagJsonReader", func(b *testing.B) {
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
reader := bytes.NewReader(delegationJson)
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
_, _ = reader.Seek(0, 0)
|
|
|
|
|
_, _ = delegation.FromDagJsonReader(reader)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
b.Run("SealWriter", func(b *testing.B) {
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
buf.Reset()
|
|
|
|
|
_, _ = p1.SealWriter(buf, privKey)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
b.Run("UnsealReader", func(b *testing.B) {
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
reader := bytes.NewReader(cborBytes)
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
_, _ = reader.Seek(0, 0)
|
|
|
|
|
_, _ = delegation.UnsealReader(reader)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
b.Run("ToDagJsonReader", func(b *testing.B) {
|
|
|
|
|
b.ReportAllocs()
|
|
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
buf.Reset()
|
|
|
|
|
_ = p2.ToDagJsonWriter(buf, privKey)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
}
|