state_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package main
  2. import (
  3. "reflect"
  4. "testing"
  5. "github.com/weaveworks/mesh"
  6. )
  7. func TestStateMergeReceived(t *testing.T) {
  8. for _, testcase := range []struct {
  9. initial map[mesh.PeerName]int
  10. merge map[mesh.PeerName]int
  11. want map[mesh.PeerName]int
  12. }{
  13. {
  14. map[mesh.PeerName]int{},
  15. map[mesh.PeerName]int{123: 1, 456: 2},
  16. map[mesh.PeerName]int{123: 1, 456: 2},
  17. },
  18. {
  19. map[mesh.PeerName]int{123: 1, 456: 2},
  20. map[mesh.PeerName]int{123: 1, 456: 2},
  21. map[mesh.PeerName]int{},
  22. },
  23. {
  24. map[mesh.PeerName]int{123: 1, 456: 2},
  25. map[mesh.PeerName]int{789: 3},
  26. map[mesh.PeerName]int{789: 3},
  27. },
  28. {
  29. map[mesh.PeerName]int{456: 3},
  30. map[mesh.PeerName]int{123: 1, 456: 2},
  31. map[mesh.PeerName]int{123: 1}, // we drop keys that don't semantically merge
  32. },
  33. } {
  34. initial, merge := testcase.initial, testcase.merge // mergeReceived modifies arguments
  35. delta := newState(999).mergeComplete(initial).(*state).mergeReceived(merge)
  36. if want, have := testcase.want, delta.(*state).set; !reflect.DeepEqual(want, have) {
  37. t.Errorf("%v mergeReceived %v: want %v, have %v", testcase.initial, testcase.merge, want, have)
  38. }
  39. }
  40. }
  41. func TestStateMergeDelta(t *testing.T) {
  42. for _, testcase := range []struct {
  43. initial map[mesh.PeerName]int
  44. merge map[mesh.PeerName]int
  45. want map[mesh.PeerName]int
  46. }{
  47. {
  48. map[mesh.PeerName]int{},
  49. map[mesh.PeerName]int{123: 1, 456: 2},
  50. map[mesh.PeerName]int{123: 1, 456: 2},
  51. },
  52. {
  53. map[mesh.PeerName]int{123: 1, 456: 2},
  54. map[mesh.PeerName]int{123: 1, 456: 2},
  55. nil,
  56. },
  57. {
  58. map[mesh.PeerName]int{123: 1, 456: 2},
  59. map[mesh.PeerName]int{789: 3},
  60. map[mesh.PeerName]int{789: 3},
  61. },
  62. {
  63. map[mesh.PeerName]int{123: 1, 456: 2},
  64. map[mesh.PeerName]int{456: 3},
  65. map[mesh.PeerName]int{456: 3},
  66. },
  67. } {
  68. initial, merge := testcase.initial, testcase.merge // mergeDelta modifies arguments
  69. delta := newState(999).mergeComplete(initial).(*state).mergeDelta(merge)
  70. if want := testcase.want; want == nil {
  71. if delta != nil {
  72. t.Errorf("%v mergeDelta %v: want nil, have non-nil", testcase.initial, testcase.merge)
  73. }
  74. } else {
  75. if have := delta.(*state).set; !reflect.DeepEqual(want, have) {
  76. t.Errorf("%v mergeDelta %v: want %v, have %v", testcase.initial, testcase.merge, want, have)
  77. }
  78. }
  79. }
  80. }
  81. func TestStateMergeComplete(t *testing.T) {
  82. for _, testcase := range []struct {
  83. initial map[mesh.PeerName]int
  84. merge map[mesh.PeerName]int
  85. want map[mesh.PeerName]int
  86. }{
  87. {
  88. map[mesh.PeerName]int{},
  89. map[mesh.PeerName]int{123: 1, 456: 2},
  90. map[mesh.PeerName]int{123: 1, 456: 2},
  91. },
  92. {
  93. map[mesh.PeerName]int{123: 1, 456: 2},
  94. map[mesh.PeerName]int{123: 1, 456: 2},
  95. map[mesh.PeerName]int{123: 1, 456: 2},
  96. },
  97. {
  98. map[mesh.PeerName]int{123: 1, 456: 2},
  99. map[mesh.PeerName]int{789: 3},
  100. map[mesh.PeerName]int{123: 1, 456: 2, 789: 3},
  101. },
  102. {
  103. map[mesh.PeerName]int{123: 1, 456: 2},
  104. map[mesh.PeerName]int{123: 0, 456: 3},
  105. map[mesh.PeerName]int{123: 1, 456: 3},
  106. },
  107. } {
  108. st := newState(999).mergeComplete(testcase.initial).(*state).mergeComplete(testcase.merge).(*state)
  109. if want, have := testcase.want, st.set; !reflect.DeepEqual(want, have) {
  110. t.Errorf("%v mergeComplete %v: want %v, have %v", testcase.initial, testcase.merge, want, have)
  111. }
  112. }
  113. }