1//go:build xturbo_poison
2
3package xturbo
4
5import "testing"
6
7// TestPoisonRetainedViews keeps Reply.Raw and Event.Tail past their callback
8// (a lifetime bug) and checks the runtime overwrote them.
9func TestPoisonRetainedViews(t *testing.T) {
10 c, srv := dispatchConn(t)
11 var raw, tail []byte
12 h := Handler{
13 OnReply: func(r *Reply) { raw = r.Raw },
14 OnEvent: func(ev *Event) { tail = ev.Tail },
15 }
16 stream := append(pktReply(1, 64), pktXGE(2, 1, 64)...)
17 expect(t, c, 1, 3, 4)
18 feed(t, c, srv, stream, &h)
19 if len(raw) != 96 || len(tail) != 64 {
20 t.Fatal(len(raw), len(tail))
21 }
22 for _, p := range [][]byte{raw, tail} {
23 for i, v := range p {
24 if v != 0xa5 {
25 t.Fatalf("retained byte %d = %#x, want poison", i, v)
26 }
27 }
28 }
29
30 // Growth poisons the old ring too.
31 feed(t, c, srv, pktReply(3, 8), &h)
32 old := c.rb
33 feed(t, c, srv, pktReply(4, 200<<10), &h)
34 if &old[0] == &c.rb[0] || old[0] != 0xa5 || old[len(old)-1] != 0xa5 {
35 t.Fatal("old ring not poisoned after growth")
36 }
37}