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