patterns_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package handshake
  2. import (
  3. "testing"
  4. "github.com/flynn/noise"
  5. "github.com/slackhq/nebula/header"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/stretchr/testify/require"
  8. )
  9. func TestSubtypeInfo(t *testing.T) {
  10. t.Run("IX", func(t *testing.T) {
  11. info, err := subtypeInfoFor(header.HandshakeIXPSK0)
  12. require.NoError(t, err)
  13. assert.Equal(t, noise.HandshakeIX.Name, info.pattern.Name)
  14. require.Len(t, info.msgs, 2)
  15. // msg1: payload + cert
  16. assert.True(t, info.msgs[0].expectsPayload)
  17. assert.True(t, info.msgs[0].expectsCert)
  18. // msg2: payload + cert
  19. assert.True(t, info.msgs[1].expectsPayload)
  20. assert.True(t, info.msgs[1].expectsCert)
  21. })
  22. t.Run("XX", func(t *testing.T) {
  23. registerTestXXInfo(t)
  24. info, err := subtypeInfoFor(header.HandshakeXXPSK0)
  25. require.NoError(t, err)
  26. assert.Equal(t, noise.HandshakeXX.Name, info.pattern.Name)
  27. require.Len(t, info.msgs, 3)
  28. // msg1: payload only
  29. assert.True(t, info.msgs[0].expectsPayload)
  30. assert.False(t, info.msgs[0].expectsCert)
  31. // msg2: payload + cert
  32. assert.True(t, info.msgs[1].expectsPayload)
  33. assert.True(t, info.msgs[1].expectsCert)
  34. // msg3: cert only
  35. assert.False(t, info.msgs[2].expectsPayload)
  36. assert.True(t, info.msgs[2].expectsCert)
  37. })
  38. t.Run("unknown subtype returns error", func(t *testing.T) {
  39. _, err := subtypeInfoFor(99)
  40. require.ErrorIs(t, err, ErrUnknownSubtype)
  41. })
  42. }
  43. // registerTestXXInfo temporarily registers XX subtype info for testing.
  44. func registerTestXXInfo(t *testing.T) {
  45. t.Helper()
  46. subtypeInfos[header.HandshakeXXPSK0] = subtypeInfo{
  47. pattern: noise.HandshakeXX,
  48. msgs: []msgFlags{
  49. {expectsPayload: true, expectsCert: false},
  50. {expectsPayload: true, expectsCert: true},
  51. {expectsPayload: false, expectsCert: true},
  52. },
  53. }
  54. t.Cleanup(func() {
  55. delete(subtypeInfos, header.HandshakeXXPSK0)
  56. })
  57. }