Files
opentimestamps/detached_timestamp_test.go
2023-09-18 16:31:05 -03:00

111 lines
2.2 KiB
Go

package opentimestamps
import (
"bytes"
"encoding/hex"
"io/ioutil"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
)
func examplePaths() []string {
matches, err := filepath.Glob("./examples/*ots")
if err != nil {
panic(err)
}
return matches
}
func containsUnknownAttestation(ts *Timestamp) (res bool) {
ts.Walk(func(subTs *Timestamp) {
for _, att := range subTs.Attestations {
if _, ok := att.(unknownAttestation); ok {
res = true
}
}
})
return
}
func TestDecodeHelloWorld(t *testing.T) {
dts, err := NewDetachedTimestampFromPath(
"./examples/hello-world.txt.ots",
)
assert.NoError(t, err)
attCount := 0
checkAttestation := func(ts *Timestamp, att Attestation) {
assert.Equal(t, 0, attCount)
expectedAtt := newBitcoinAttestation()
expectedAtt.Height = 358391
assert.Equal(t, expectedAtt, att)
// If ts.Message is correct, opcode parsing and execution should
// have succeeded.
assert.Equal(t,
"007ee445d23ad061af4a36b809501fab1ac4f2d7e7a739817dd0cbb7ec661b8a",
hex.EncodeToString(ts.Message),
)
attCount += 1
}
dts.Timestamp.Walk(func(ts *Timestamp) {
for _, att := range ts.Attestations {
// this should be called exactly once
checkAttestation(ts, att)
}
})
assert.Equal(t, 1, attCount)
}
func TestDecodeEncodeAll(t *testing.T) {
for _, path := range examplePaths() {
t.Log(path)
dts, err := NewDetachedTimestampFromPath(path)
assert.NoError(t, err, path)
if containsUnknownAttestation(dts.Timestamp) {
t.Logf("skipping encode cycle: unknownAttestation")
continue
}
buf := &bytes.Buffer{}
err = dts.Timestamp.encode(&serializationContext{buf})
if !assert.NoError(t, err, path) {
continue
}
buf = bytes.NewBuffer(buf.Bytes())
ts1, err := NewTimestampFromReader(buf, dts.Timestamp.Message)
if !assert.NoError(t, err, path) {
continue
}
dts1, err := NewDetachedTimestamp(
dts.HashOp, dts.FileHash, ts1,
)
if !assert.NoError(t, err) {
continue
}
dts1Target := &bytes.Buffer{}
err = dts1.WriteToStream(dts1Target)
if !assert.NoError(t, err) {
continue
}
orgBytes, err := ioutil.ReadFile(path)
if !assert.NoError(t, err) {
continue
}
assert.Equal(t, orgBytes, dts1Target.Bytes())
t.Log("encode cycle success")
}
}