toc_conn_test.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package toc
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/mk6i/open-oscar-server/wire"
  6. )
  7. func TestFeedbagMirror(t *testing.T) {
  8. root := wire.FeedbagItem{ClassID: wire.FeedbagClassIdGroup}
  9. friends := wire.FeedbagItem{ClassID: wire.FeedbagClassIdGroup, GroupID: 1, Name: "Friends"}
  10. alice := wire.FeedbagItem{ClassID: wire.FeedbagClassIdBuddy, GroupID: 1, ItemID: 2, Name: "alice"}
  11. aliceRenamed := wire.FeedbagItem{ClassID: wire.FeedbagClassIdBuddy, GroupID: 1, ItemID: 2, Name: "Alice"}
  12. bob := wire.FeedbagItem{ClassID: wire.FeedbagClassIdBuddy, GroupID: 1, ItemID: 3, Name: "bob"}
  13. carol := wire.FeedbagItem{ClassID: wire.FeedbagClassIdBuddy, GroupID: 1, ItemID: 4, Name: "carol"}
  14. t.Run("pending changes show in the snapshot until confirmed", func(t *testing.T) {
  15. m := &feedbagMirror{}
  16. m.reset([]wire.FeedbagItem{root, friends, alice})
  17. m.sent(1, false, []wire.FeedbagItem{aliceRenamed, bob})
  18. m.sent(2, true, []wire.FeedbagItem{aliceRenamed})
  19. assert.True(t, m.hasPending())
  20. assert.Equal(t, []wire.FeedbagItem{root, friends, bob}, m.snapshot())
  21. // only the accepted items are confirmed
  22. m.confirm(1, []uint16{0, 0x0E})
  23. m.confirm(2, []uint16{0})
  24. assert.False(t, m.hasPending())
  25. assert.Equal(t, []wire.FeedbagItem{root, friends}, m.snapshot())
  26. })
  27. t.Run("a rejected change is discarded", func(t *testing.T) {
  28. m := &feedbagMirror{}
  29. m.reset([]wire.FeedbagItem{root, friends})
  30. m.sent(1, false, []wire.FeedbagItem{bob})
  31. m.discard(1)
  32. assert.False(t, m.hasPending())
  33. assert.Equal(t, []wire.FeedbagItem{root, friends}, m.snapshot())
  34. })
  35. t.Run("a reload keeps changes sent after its query", func(t *testing.T) {
  36. m := &feedbagMirror{}
  37. m.reset([]wire.FeedbagItem{root, friends})
  38. m.sent(1, false, []wire.FeedbagItem{bob}) // dropped by the server
  39. marker := m.mark()
  40. m.sent(2, false, []wire.FeedbagItem{carol})
  41. m.reload(marker, []wire.FeedbagItem{root, friends, alice})
  42. assert.Equal(t, []wire.FeedbagItem{root, friends, alice, carol}, m.snapshot())
  43. // the confirmation of the dropped change never comes; a late one for
  44. // a change the reload covered changes nothing
  45. m.confirm(1, []uint16{0})
  46. m.confirm(2, []uint16{0})
  47. assert.False(t, m.hasPending())
  48. assert.Equal(t, []wire.FeedbagItem{root, friends, alice, carol}, m.snapshot())
  49. })
  50. t.Run("changes from other locations apply right away", func(t *testing.T) {
  51. m := &feedbagMirror{}
  52. m.reset([]wire.FeedbagItem{root, friends, alice})
  53. m.applyRemote(false, []wire.FeedbagItem{bob})
  54. m.applyRemote(true, []wire.FeedbagItem{alice})
  55. assert.False(t, m.hasPending())
  56. assert.Equal(t, []wire.FeedbagItem{root, friends, bob}, m.snapshot())
  57. assert.Equal(t, map[uint16]string{0: "", 1: "Friends"}, m.groupNames())
  58. })
  59. t.Run("a snapshot doesn't change with the mirror", func(t *testing.T) {
  60. m := &feedbagMirror{}
  61. m.reset([]wire.FeedbagItem{root, friends, alice})
  62. snapshot := m.snapshot()
  63. m.applyRemote(true, []wire.FeedbagItem{alice})
  64. assert.Equal(t, []wire.FeedbagItem{root, friends, alice}, snapshot)
  65. })
  66. t.Run("the mirror shares no TLVs with items going in or out", func(t *testing.T) {
  67. order := func(ids ...uint16) wire.FeedbagItem {
  68. return wire.FeedbagItem{
  69. ClassID: wire.FeedbagClassIdGroup,
  70. TLVLBlock: wire.TLVLBlock{TLVList: wire.TLVList{wire.NewTLVBE(wire.FeedbagAttributesOrder, ids)}},
  71. }
  72. }
  73. edit := func(items []wire.FeedbagItem) {
  74. items[0].TLVList.Set(wire.NewTLVBE(wire.FeedbagAttributesOrder, []uint16{9}))
  75. }
  76. m := &feedbagMirror{}
  77. items := []wire.FeedbagItem{order(1)}
  78. m.reset(items)
  79. edit(items)
  80. edit(m.snapshot())
  81. assert.Equal(t, []wire.FeedbagItem{order(1)}, m.snapshot())
  82. items = []wire.FeedbagItem{order(1, 2)}
  83. m.sent(1, false, items)
  84. edit(items)
  85. assert.Equal(t, []wire.FeedbagItem{order(1, 2)}, m.snapshot())
  86. items = []wire.FeedbagItem{order(1, 2, 3)}
  87. m.reload(m.mark(), items)
  88. edit(items)
  89. assert.Equal(t, []wire.FeedbagItem{order(1, 2, 3)}, m.snapshot())
  90. items = []wire.FeedbagItem{order(1, 2, 3, 4)}
  91. m.applyRemote(false, items)
  92. edit(items)
  93. assert.Equal(t, []wire.FeedbagItem{order(1, 2, 3, 4)}, m.snapshot())
  94. })
  95. }