framing_test.go raw
1 package mls
2
3 import (
4 "bytes"
5 "fmt"
6 "testing"
7 )
8
9 func testMessages(t *testing.T, tc map[string]testBytes) {
10 msgs := []struct {
11 name string
12 v interface {
13 unmarshaler
14 marshaler
15 }
16 }{
17 {"mls_welcome", new(mlsMessage)},
18 {"mls_group_info", new(mlsMessage)},
19 {"mls_key_package", new(mlsMessage)},
20
21 {"ratchet_tree", new(ratchetTree)},
22 {"group_secrets", new(groupSecrets)},
23
24 {"add_proposal", new(add)},
25 {"update_proposal", new(update)},
26 {"remove_proposal", new(remove)},
27 {"pre_shared_key_proposal", new(preSharedKey)},
28 {"re_init_proposal", new(reInit)},
29 {"external_init_proposal", new(externalInit)},
30 {"group_context_extensions_proposal", new(groupContextExtensions)},
31
32 {"commit", new(commit)},
33
34 {"public_message_application", new(mlsMessage)},
35 {"public_message_proposal", new(mlsMessage)},
36 {"public_message_commit", new(mlsMessage)},
37 {"private_message", new(mlsMessage)},
38 }
39 for _, msg := range msgs {
40 t.Run(msg.name, func(t *testing.T) {
41 raw, ok := tc[msg.name]
42 if !ok {
43 t.Fatal("reference blob not found")
44 }
45 if err := unmarshal(raw, msg.v); err != nil {
46 t.Fatalf("unmarshal() = %v", err)
47 }
48
49 out, err := marshal(msg.v)
50 if err != nil {
51 t.Errorf("marshal() = %v", err)
52 } else if !bytes.Equal(out, raw) {
53 t.Errorf("marshal() = \n%v\nbut want \n%v", out, raw)
54 }
55 })
56 }
57 }
58
59 func TestMessages(t *testing.T) {
60 var tests []map[string]testBytes
61 loadTestVector(t, "testdata/messages.json", &tests)
62
63 for i, tc := range tests {
64 t.Run(fmt.Sprintf("[%v]", i), func(t *testing.T) {
65 testMessages(t, tc)
66 })
67 }
68 }
69