You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

check_rep_count_test.go 3.6 kB

2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package event
  2. import (
  3. "testing"
  4. "github.com/samber/lo"
  5. . "github.com/smartystreets/goconvey/convey"
  6. "gitlink.org.cn/cloudream/common/utils/sort"
  7. "gitlink.org.cn/cloudream/storage-common/consts"
  8. "gitlink.org.cn/cloudream/storage-common/pkgs/db/model"
  9. )
  10. func Test_chooseNewRepNodes(t *testing.T) {
  11. testcases := []struct {
  12. title string
  13. allNodes []model.Node
  14. curRepNodes []model.Node
  15. newCount int
  16. wantNodeIDs []int
  17. }{
  18. {
  19. title: "优先选择不同地域的节点",
  20. allNodes: []model.Node{
  21. {
  22. NodeID: 1,
  23. LocationID: 1,
  24. State: consts.NodeStateNormal,
  25. },
  26. {
  27. NodeID: 2,
  28. LocationID: 1,
  29. State: consts.NodeStateNormal,
  30. },
  31. {
  32. NodeID: 3,
  33. LocationID: 2,
  34. State: consts.NodeStateNormal,
  35. },
  36. {
  37. NodeID: 4,
  38. LocationID: 3,
  39. State: consts.NodeStateNormal,
  40. },
  41. },
  42. curRepNodes: []model.Node{
  43. {
  44. NodeID: 1,
  45. LocationID: 1,
  46. },
  47. },
  48. newCount: 2,
  49. wantNodeIDs: []int{3, 4},
  50. },
  51. {
  52. title: "就算节点数不足,也不能选择重复节点",
  53. allNodes: []model.Node{
  54. {
  55. NodeID: 1,
  56. LocationID: 1,
  57. State: consts.NodeStateNormal,
  58. },
  59. {
  60. NodeID: 2,
  61. LocationID: 1,
  62. State: consts.NodeStateNormal,
  63. },
  64. },
  65. curRepNodes: []model.Node{
  66. {
  67. NodeID: 1,
  68. LocationID: 1,
  69. },
  70. },
  71. newCount: 2,
  72. wantNodeIDs: []int{2},
  73. },
  74. {
  75. title: "就算节点数不足,也不能选择状态unavailable的节点",
  76. allNodes: []model.Node{
  77. {
  78. NodeID: 1,
  79. LocationID: 1,
  80. State: consts.NodeStateUnavailable,
  81. },
  82. {
  83. NodeID: 2,
  84. LocationID: 1,
  85. State: consts.NodeStateNormal,
  86. },
  87. },
  88. curRepNodes: []model.Node{
  89. {
  90. NodeID: 3,
  91. LocationID: 1,
  92. },
  93. },
  94. newCount: 2,
  95. wantNodeIDs: []int{2},
  96. },
  97. }
  98. for _, test := range testcases {
  99. Convey(test.title, t, func() {
  100. chooseNodes := chooseNewRepNodes(test.allNodes, test.curRepNodes, test.newCount)
  101. chooseNodeIDs := lo.Map(chooseNodes, func(node model.Node, index int) int64 { return node.NodeID })
  102. sort.Sort(chooseNodeIDs, sort.Cmp[int64])
  103. So(chooseNodeIDs, ShouldResemble, test.wantNodeIDs)
  104. })
  105. }
  106. }
  107. func Test_chooseDeleteAvaiRepNodes(t *testing.T) {
  108. testcases := []struct {
  109. title string
  110. allNodes []model.Node
  111. curRepNodes []model.Node
  112. delCount int
  113. wantNodeLocationIDs []int
  114. }{
  115. {
  116. title: "优先选择地域重复的节点",
  117. allNodes: []model.Node{},
  118. curRepNodes: []model.Node{
  119. {NodeID: 1, LocationID: 1}, {NodeID: 2, LocationID: 1},
  120. {NodeID: 3, LocationID: 2}, {NodeID: 4, LocationID: 2},
  121. {NodeID: 5, LocationID: 3}, {NodeID: 6, LocationID: 3}, {NodeID: 7, LocationID: 3},
  122. {NodeID: 8, LocationID: 4},
  123. },
  124. delCount: 4,
  125. wantNodeLocationIDs: []int{1, 2, 3, 3},
  126. },
  127. {
  128. title: "节点不够删",
  129. allNodes: []model.Node{},
  130. curRepNodes: []model.Node{
  131. {NodeID: 1, LocationID: 1},
  132. },
  133. delCount: 2,
  134. wantNodeLocationIDs: []int{1},
  135. },
  136. }
  137. for _, test := range testcases {
  138. Convey(test.title, t, func() {
  139. chooseNodes := chooseDeleteAvaiRepNodes(test.allNodes, test.curRepNodes, test.delCount)
  140. chooseNodeLocationIDs := lo.Map(chooseNodes, func(node model.Node, index int) int64 { return node.LocationID })
  141. sort.Sort(chooseNodeLocationIDs, sort.Cmp[int64])
  142. So(chooseNodeLocationIDs, ShouldResemble, test.wantNodeLocationIDs)
  143. })
  144. }
  145. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。