Project Moscato Team Messaging Middleware Implemetation Message Middleware by Golang Operate as Secure, Effectively
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

subscription_test.go 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package modules
  2. import (
  3. "fmt"
  4. _ "fmt"
  5. "github.com/stretchr/testify/assert"
  6. "math/rand"
  7. "strconv"
  8. "testing"
  9. "time"
  10. )
  11. func makeData(isAlpha bool) MsgUnit{
  12. rand.Seed(time.Now().UnixNano())
  13. // Set Ipaddr
  14. msg := Message{"", "1.0", "", SM}
  15. for i := 0; i < 4; i++{
  16. itoa := strconv.Itoa(rand.Int() % 256)
  17. msg.from += itoa
  18. if i != 3{
  19. msg.from += "."
  20. }
  21. }
  22. // Set Time
  23. msg.time += strconv.Itoa(rand.Int()%24) + ":"
  24. msg.time += strconv.Itoa(rand.Int()%60)
  25. // Set Topic, Value, operator
  26. topic := []int64{}
  27. value := []int64{}
  28. operator := []string{}
  29. candOp := []string{">", ">=", "<=" ,"<", "=="}
  30. logicalOp := []string{"&&", "||"}
  31. if isAlpha {
  32. topicLen := rand.Int() % 10 + 1
  33. for i := 0 ; i < topicLen; i++{
  34. topic = append(topic, rand.Int63())
  35. }
  36. valueLen := rand.Int() % 10 + 1
  37. for i := 0 ; i < valueLen; i++{
  38. value = append(value, rand.Int63())
  39. }
  40. operator = append(operator, "==")
  41. } else{
  42. valueLen := rand.Int() % 2 + 1
  43. topic = append(topic, rand.Int63())
  44. value = append(value, rand.Int63())
  45. if valueLen == 1{
  46. operator = append(operator, candOp[rand.Int()%5])
  47. } else{
  48. value = append(value, rand.Int63())
  49. op := rand.Int()%2
  50. operator = append(operator, candOp[rand.Int()%2])
  51. if op == 0 {
  52. operator = append(operator, logicalOp[0])
  53. } else{
  54. operator = append(operator, logicalOp[1])
  55. }
  56. operator = append(operator, candOp[rand.Int()%2 + 2])
  57. }
  58. }
  59. return &SubscriptionMsg{msg, topic, value, operator, isAlpha}
  60. }
  61. func makeMsgList(dataLen int, isAlpha bool) []MsgUnit{
  62. rand.Seed(time.Now().UnixNano())
  63. var ret []MsgUnit
  64. for i := 0 ; i < dataLen ; i++{
  65. ret = append(ret, makeData(isAlpha))
  66. }
  67. return ret
  68. }
  69. func checkOperatorList(isSingle bool, sub int, operator string, l *valueNode) int{
  70. ret := -1
  71. if isSingle{
  72. switch operator {
  73. case "<":
  74. ret = findSub(l.single2sub_s, sub)
  75. case "<=":
  76. ret = findSub(l.single2sub_es, sub)
  77. case ">":
  78. ret = findSub(l.single2sub_b, sub)
  79. case ">=":
  80. ret = findSub(l.single2sub_eb, sub)
  81. case "==":
  82. ret = findSub(l.single2sub_e, sub)
  83. }
  84. } else{
  85. switch operator {
  86. case "<":
  87. ret = findSub(l.range2sub_s, sub)
  88. case "<=":
  89. ret = findSub(l.range2sub_es, sub)
  90. case ">":
  91. ret = findSub(l.range2sub_b, sub)
  92. case ">=":
  93. ret = findSub(l.range2sub_eb, sub)
  94. }
  95. }
  96. return ret
  97. }
  98. func watchData(msgList []MsgUnit, dataLen int, isSubscription bool){
  99. for i := 0; i < dataLen; i++{
  100. msg := msgList[i]
  101. if isSubscription {
  102. fmt.Println(
  103. "\nfrom = ", msg.(*SubscriptionMsg).Message.from,
  104. "\ntime = ", msg.(*SubscriptionMsg).Message.time,
  105. "\ntopic = ", msg.(*SubscriptionMsg).topic,
  106. "\nvalue = ", msg.(*SubscriptionMsg).value,
  107. "\noperator = ", msg.(*SubscriptionMsg).operator,
  108. "\nisAlpha ?= ", msg.(*SubscriptionMsg).isAlpha,
  109. )
  110. } else{
  111. fmt.Println(
  112. "\nfrom = ", msg.(*PublishMsg).Message.from,
  113. "\ntime = ", msg.(*PublishMsg).Message.time,
  114. "\ntopic = ", msg.(*PublishMsg).topic,
  115. "\nvalue = ", msg.(*PublishMsg).value,
  116. )
  117. }
  118. }
  119. }
  120. //Test addSubScription(1) (dif all [topic, value, operator])
  121. func Test_addSubscription_allDif(t *testing.T) {
  122. rand.Seed(time.Now().UnixNano())
  123. // To Init sub_mng
  124. mos := Moscato{sub_mng: *newSubmng()}
  125. // Make Data set(Subscription)
  126. var msgList []MsgUnit
  127. dataLen := 100
  128. msgList = makeMsgList(dataLen, false)
  129. //Watch Data set
  130. //watchData(msgList, dataLen, true)
  131. for i := 0; i < dataLen; i++ {
  132. msg := msgList[i]
  133. ip := msg.(*SubscriptionMsg).Message.from
  134. topic := msg.(*SubscriptionMsg).topic
  135. value := msg.(*SubscriptionMsg).value
  136. operator := msg.(*SubscriptionMsg).operator
  137. subnumber := mos.sub_mng.count_sub
  138. isSingle := true
  139. // 0. Check addSubscription
  140. err := mos.sub_mng.addSubscription(msg)
  141. assert.Equal(t, nil, err)
  142. // 1. Check if ip mapping is correct
  143. assert.Equal(t, subnumber, mos.sub_mng.ip2sub[ip][len(mos.sub_mng.ip2sub[ip])-1], "Ip mapping is failed")
  144. // 2. Check topicNode
  145. topicPtr := mos.sub_mng.list.head
  146. for topicPtr != nil {
  147. if Compare(topic, topicPtr.topic) == 0 {
  148. break
  149. }
  150. topicPtr = topicPtr.next
  151. }
  152. assert.Equal(t, topic, topicPtr.topic, "topicNode Add is failed")
  153. // Check isSingle ?
  154. if len(operator) == 3 && operator[1] == "&&" {
  155. isSingle = false
  156. }
  157. // 3. Check Value in ValueNode & Check Operator in ValueNode
  158. if !isSingle || (len(operator) == 3 && operator[1] == "||") {
  159. valptr1 := topicPtr.list.getValueNodePos([]int64{value[0]})
  160. valptr2 := topicPtr.list.getValueNodePos([]int64{value[1]})
  161. assert.Equal(t, []int64{value[0]}, valptr1.val)
  162. assert.Equal(t, []int64{value[1]}, valptr2.val)
  163. assert.NotEqual(t, -1, checkOperatorList(isSingle, subnumber, operator[0], valptr1))
  164. assert.NotEqual(t, -1, checkOperatorList(isSingle, subnumber, operator[2], valptr2))
  165. } else {
  166. valptr := topicPtr.list.getValueNodePos(value)
  167. assert.Equal(t, value, valptr.val)
  168. assert.NotEqual(t, -1, checkOperatorList(isSingle, subnumber, operator[0], valptr))
  169. }
  170. }
  171. }
  172. // Test addSubScription(2) (same [topic, value] dif [operator])
  173. func Test_addSubscription_same_topicNvalue(t *testing.T) {
  174. rand.Seed(time.Now().UnixNano())
  175. // To Init sub_mng
  176. mos := Moscato{sub_mng: *newSubmng()}
  177. // Fix Topic & Value
  178. topicLen := rand.Int()%10 + 1
  179. staticTopic := make([]int64, topicLen)
  180. staticValue := []int64{rand.Int63()}
  181. // Make Data
  182. var msgList []MsgUnit
  183. dataLen := 100
  184. msgList = makeMsgList(dataLen, false)
  185. for i := 0; i < topicLen; i++ {
  186. staticTopic[i] = rand.Int63()
  187. }
  188. // Fix Same Topic & Value
  189. for i := 0; i < dataLen; i++ {
  190. operator := msgList[i].(*SubscriptionMsg).operator
  191. msgList[i].(*SubscriptionMsg).topic = staticTopic
  192. if len(operator) == 1{
  193. msgList[i].(*SubscriptionMsg).value = staticValue
  194. }
  195. }
  196. // Watch Data set
  197. //watchData(msgList, dataLen, true)
  198. for i := 0; i < dataLen; i++ {
  199. msg := msgList[i]
  200. err := mos.sub_mng.addSubscription(msg)
  201. assert.Equal(t, nil, err)
  202. }
  203. topicPtr := mos.sub_mng.list.head
  204. for topicPtr != nil {
  205. if Compare(topicPtr.topic, staticTopic) == 0 {
  206. break
  207. }
  208. topicPtr = topicPtr.next
  209. }
  210. watchValueNode(topicPtr.list.head)
  211. }
  212. func watchValueNode(ptr *valueNode) {
  213. valPtr := ptr
  214. for valPtr != nil{
  215. fmt.Println("Value = ", valPtr.val)
  216. if len(valPtr.single2sub_s) != 0 {
  217. fmt.Println("Single2sub (<) List = ", valPtr.single2sub_s)
  218. }
  219. if len(valPtr.single2sub_es) != 0 {
  220. fmt.Println("Single2sub (<=) List = ", valPtr.single2sub_es)
  221. }
  222. if len(valPtr.single2sub_b) != 0 {
  223. fmt.Println("Single2sub (>) List = ", valPtr.single2sub_b)
  224. }
  225. if len(valPtr.single2sub_eb) != 0 {
  226. fmt.Println("Single2sub (>=) List = ", valPtr.single2sub_eb)
  227. }
  228. if len(valPtr.single2sub_e) != 0 {
  229. fmt.Println("Single2sub (==) List = ", valPtr.single2sub_e)
  230. }
  231. if len(valPtr.range2sub_s) != 0 {
  232. fmt.Println("range2sub (<) List = ", valPtr.range2sub_s)
  233. }
  234. if len(valPtr.range2sub_es) != 0 {
  235. fmt.Println("range2sub (<=) List = ", valPtr.range2sub_es)
  236. }
  237. if len(valPtr.range2sub_b) != 0 {
  238. fmt.Println("range2sub (>) List = ", valPtr.range2sub_b)
  239. }
  240. if len(valPtr.range2sub_eb) != 0 {
  241. fmt.Println("range2sub (>=) List = ", valPtr.range2sub_eb)
  242. }
  243. valPtr = valPtr.next
  244. }
  245. }