1package vt
2
3import (
4 "encoding/binary"
5 "testing"
6
7 "github.com/bnema/vev-vt/core"
8 "github.com/stretchr/testify/require"
9)
10
11func TestMeasureHistoryBlobMatchesValidatedResources(t *testing.T) {
12 payload, err := core.NewCellPayload("e\u0301", "https://example.org")
13 require.NoError(t, err)
14 for _, rows := range []int{0, 1, 8} {
15 h := NewHistory(HistoryConfig{MaxRows: 10, ChunkRows: 2})
16 for i := range rows {
17 style := core.DefaultStyle()
18 style.Foreground = i
19 require.NoError(t, h.Append([]core.Cell{{Rune: 'e', Style: style, Payload: payload}}, LineBound{End: 1}))
20 }
21 data, err := MarshalHistory(h.SealAndView())
22 require.NoError(t, err)
23 want, err := PreflightHistoryBlob(data)
24 require.NoError(t, err)
25 got, err := MeasureHistoryBlob(data)
26 require.NoError(t, err)
27 require.Equal(t, want, got)
28 require.Zero(t, testing.AllocsPerRun(20, func() {
29 if _, err := MeasureHistoryBlob(data); err != nil {
30 panic(err)
31 }
32 }))
33 for n := range len(data) {
34 _, err := MeasureHistoryBlob(data[:n])
35 require.Error(t, err)
36 }
37 _, err = MeasureHistoryBlob(append(append([]byte(nil), data...), 0))
38 require.Error(t, err)
39 }
40}
41
42func TestMeasureHistoryBlobDoesNotReplaceValidation(t *testing.T) {
43 h := NewHistory(HistoryConfig{MaxRows: 1})
44 require.NoError(t, h.Append([]core.Cell{{Rune: 'a', Style: core.DefaultStyle()}}, LineBound{End: 1}))
45 data, err := MarshalHistory(h.SealAndView())
46 require.NoError(t, err)
47 binary.BigEndian.PutUint64(data[historyHeaderBytes+historyChunkHeaderBytes:], 0)
48 _, err = MeasureHistoryBlob(data)
49 require.NoError(t, err, "resource sizing deliberately does not validate row identities")
50 _, err = PreflightHistoryBlob(data)
51 require.Error(t, err, "semantic validation must still reject the invalid identity")
52}
53
54func FuzzMeasureHistoryBlob(f *testing.F) {
55 empty, err := MarshalEmptyHistoryTail()
56 if err != nil {
57 f.Fatal(err)
58 }
59 f.Add(empty)
60 f.Fuzz(func(t *testing.T, data []byte) {
61 got, measured := MeasureHistoryBlob(data)
62 want, validated := PreflightHistoryBlob(data)
63 if validated == nil {
64 require.NoError(t, measured)
65 require.Equal(t, want, got)
66 }
67 })
68}