1package xturbo_test
2
3import (
4 "bytes"
5 "testing"
6
7 "bnema.dev/xturbo"
8 "bnema.dev/xturbo/bigreq"
9 "bnema.dev/xturbo/internal/xtest"
10 "bnema.dev/xturbo/xcmisc"
11 "bnema.dev/xturbo/xproto"
12)
13
14// Root encodes the requests it issues itself; they must match the generated
15// encoders byte for byte, and the committed goldens where they exist.
16func TestBootstrapRequestsMatchGenerated(t *testing.T) {
17 newBuf := func() *xturbo.Buf {
18 b := xturbo.NewBuf(0)
19 var ext xturbo.ExtTable
20 ext.Set(xturbo.ExtBigRequests, 133, 0, 0)
21 ext.Set(xturbo.ExtXCMisc, 136, 0, 0)
22 b.Ext = &ext
23 return b
24 }
25 for _, tc := range []struct {
26 name string
27 root, gen func(*xturbo.Buf) xturbo.Seq
28 golden string
29 }{
30 {"InternAtom", func(b *xturbo.Buf) xturbo.Seq { return xturbo.EncodeInternAtom(b, false, "XTURBO_") },
31 func(b *xturbo.Buf) xturbo.Seq { return xproto.InternAtom(b, false, "XTURBO_") }, "xproto/InternAtom"},
32 {"InternAtomOnlyIfExists", func(b *xturbo.Buf) xturbo.Seq { return xturbo.EncodeInternAtom(b, true, "WM_STATE") },
33 func(b *xturbo.Buf) xturbo.Seq { return xproto.InternAtom(b, true, "WM_STATE") }, ""},
34 {"QueryExtension", func(b *xturbo.Buf) xturbo.Seq { return xturbo.EncodeQueryExtension(b, "Generic Event Extension") },
35 func(b *xturbo.Buf) xturbo.Seq { return xproto.QueryExtension(b, "Generic Event Extension") }, ""},
36 {"QueryExtensionAligned", func(b *xturbo.Buf) xturbo.Seq { return xturbo.EncodeQueryExtension(b, "XFIXES") },
37 func(b *xturbo.Buf) xturbo.Seq { return xproto.QueryExtension(b, "XFIXES") }, ""},
38 {"GetInputFocus", xturbo.EncodeGetInputFocus, xproto.GetInputFocus, ""},
39 {"BigreqEnable", xturbo.EncodeBigreqEnable, bigreq.Enable, ""},
40 {"GetXIDRange", xturbo.EncodeGetXIDRange, xcmisc.GetXIDRange, ""},
41 } {
42 t.Run(tc.name, func(t *testing.T) {
43 rb, gb := newBuf(), newBuf()
44 if tc.root(rb) != 1 || tc.gen(gb) != 1 || rb.Err() != nil || gb.Err() != nil {
45 t.Fatal(rb.Err(), gb.Err())
46 }
47 if !bytes.Equal(rb.Bytes(), gb.Bytes()) {
48 t.Fatalf("root %x, generated %x", rb.Bytes(), gb.Bytes())
49 }
50 if tc.golden == "" {
51 return
52 }
53 want, err := xtest.LoadHex("testdata/golden/" + tc.golden + ".req.hex")
54 if err != nil {
55 t.Fatal(err)
56 }
57 if !bytes.Equal(rb.Bytes(), want) {
58 t.Fatalf("root %x, golden %x", rb.Bytes(), want)
59 }
60 })
61 }
62 // Extension requests fail sticky when the extension is absent.
63 b := xturbo.NewBuf(0)
64 b.Ext = &xturbo.ExtTable{}
65 if xturbo.EncodeGetXIDRange(b) != 0 || b.Err() != xturbo.ErrExtMissing {
66 t.Fatal(b.Err())
67 }
68}