edgex_source_test.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. // +build edgex
  2. package extensions
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. v2 "github.com/edgexfoundry/go-mod-core-contracts/v2/common"
  7. "github.com/edgexfoundry/go-mod-core-contracts/v2/dtos"
  8. "github.com/edgexfoundry/go-mod-core-contracts/v2/models"
  9. "github.com/edgexfoundry/go-mod-messaging/v2/pkg/types"
  10. "github.com/emqx/kuiper/common"
  11. "math"
  12. "reflect"
  13. "testing"
  14. )
  15. var (
  16. es = &EdgexSource{}
  17. typeMap = map[string]string{
  18. "b1": v2.ValueTypeBool,
  19. "i1": v2.ValueTypeInt8,
  20. "i2": v2.ValueTypeInt16,
  21. "i3": v2.ValueTypeInt32,
  22. "i4": v2.ValueTypeInt64,
  23. "i5": v2.ValueTypeUint8,
  24. "i6": v2.ValueTypeUint16,
  25. "i7": v2.ValueTypeUint32,
  26. "s1": v2.ValueTypeString,
  27. "f1": v2.ValueTypeFloat32,
  28. "f2": v2.ValueTypeFloat64,
  29. "i8": v2.ValueTypeUint64,
  30. "ba": v2.ValueTypeBoolArray,
  31. "ia1": v2.ValueTypeInt8Array,
  32. "ia2": v2.ValueTypeInt16Array,
  33. "ia3": v2.ValueTypeInt32Array,
  34. "ia4": v2.ValueTypeInt64Array,
  35. "ia5": v2.ValueTypeUint8Array,
  36. "ia6": v2.ValueTypeUint16Array,
  37. "ia7": v2.ValueTypeUint32Array,
  38. "ia8": v2.ValueTypeUint64Array,
  39. "fa1": v2.ValueTypeFloat32Array,
  40. "fa2": v2.ValueTypeFloat64Array,
  41. }
  42. )
  43. func TestGetValue_IntFloat(t *testing.T) {
  44. var testEvent = models.Event{DeviceName: "test"}
  45. for i := 1; i < 8; i++ {
  46. name := fmt.Sprintf("i%d", i)
  47. r1 := models.SimpleReading{
  48. BaseReading: models.BaseReading{
  49. ResourceName: name,
  50. ValueType: typeMap[name],
  51. },
  52. Value: "1",
  53. }
  54. testEvent.Readings = append(testEvent.Readings, r1)
  55. }
  56. dtoe := dtos.FromEventModelToDTO(testEvent)
  57. for _, r := range dtoe.Readings {
  58. if v, e := es.getValue(r, common.Log); e != nil {
  59. t.Errorf("%s", e)
  60. } else {
  61. expectOne(t, v)
  62. }
  63. }
  64. r1 := dtos.BaseReading{ResourceName: "i8", ValueType: typeMap["i8"], SimpleReading: dtos.SimpleReading{Value: "10796529505058023104"}}
  65. if v, e := es.getValue(r1, common.Log); e != nil {
  66. t.Errorf("%s", e)
  67. } else {
  68. if v1, ok := v.(uint64); ok {
  69. if v1 != 10796529505058023104 {
  70. t.Errorf("expected 10796529505058023104, but it's %d.", v1)
  71. }
  72. }
  73. }
  74. r2 := dtos.BaseReading{ResourceName: "f1", ValueType: typeMap["f1"], SimpleReading: dtos.SimpleReading{Value: "3.14"}}
  75. if v, e := es.getValue(r2, common.Log); e != nil {
  76. t.Errorf("%s", e)
  77. } else {
  78. if v1, ok := v.(float64); ok {
  79. if !almostEqual(v1, 3.14) {
  80. t.Errorf("expected 3.14, but it's %f.", v1)
  81. }
  82. }
  83. }
  84. }
  85. func almostEqual(a, b float64) bool {
  86. return math.Abs(a-b) <= 1e-6
  87. }
  88. func TestGetValue_IntFloatArr(t *testing.T) {
  89. var testEvent = models.Event{DeviceName: "test"}
  90. for i := 1; i < 8; i++ {
  91. ia := []int{i, i * 2}
  92. jsonValue, _ := json.Marshal(ia)
  93. name := fmt.Sprintf("ia%d", i)
  94. r1 := models.SimpleReading{
  95. BaseReading: models.BaseReading{
  96. ResourceName: name,
  97. ValueType: typeMap[name],
  98. },
  99. Value: string(jsonValue),
  100. }
  101. testEvent.Readings = append(testEvent.Readings, r1)
  102. }
  103. dtoe := dtos.FromEventModelToDTO(testEvent)
  104. for i, r := range dtoe.Readings {
  105. if v, e := es.getValue(r, common.Log); e != nil {
  106. t.Errorf("%s", e)
  107. } else {
  108. checkArray(t, i, v)
  109. }
  110. }
  111. r1 := dtos.BaseReading{ResourceName: "ia8", ValueType: typeMap["ia8"], SimpleReading: dtos.SimpleReading{Value: `[10796529505058023104, 10796529505058023105]`}}
  112. if v, e := es.getValue(r1, common.Log); e != nil {
  113. t.Errorf("%s", e)
  114. } else {
  115. if v1, ok := v.([]uint64); ok {
  116. if v1[0] != 10796529505058023104 || v1[1] != 10796529505058023105 {
  117. t.Errorf("Failed, the array value is not correct %v.", v1)
  118. }
  119. } else {
  120. t.Errorf("expected uint64 array type, but it's %T.", v1)
  121. }
  122. }
  123. rf_00 := dtos.BaseReading{ResourceName: "fa1", ValueType: typeMap["fa1"], SimpleReading: dtos.SimpleReading{Value: `[3.14, 2.71828]`}}
  124. if v, e := es.getValue(rf_00, common.Log); e != nil {
  125. t.Errorf("%s", e)
  126. } else {
  127. if v1, ok := v.([]float64); ok {
  128. if v1[0] != 3.14 || v1[1] != 2.71828 {
  129. t.Errorf("expected 3.14 & 2.71828, but it's %v.", v1)
  130. }
  131. } else {
  132. t.Errorf("expected float32 array type, but it's %T.", v)
  133. }
  134. }
  135. }
  136. func checkArray(t *testing.T, index int, val interface{}) {
  137. if v1, ok := val.([]int); ok {
  138. newIdx := index + 1
  139. if v1[0] != newIdx || v1[1] != newIdx*2 {
  140. t.Errorf("Failed, the array value is not correct %v.", v1)
  141. }
  142. } else {
  143. t.Errorf("expected int array type, but it's %T.", val)
  144. }
  145. }
  146. func expectOne(t *testing.T, expected interface{}) {
  147. if v1, ok := expected.(int); ok {
  148. if v1 != 1 {
  149. t.Errorf("expected 1, but it's %d.", v1)
  150. }
  151. } else {
  152. t.Errorf("expected int type, but it's %T.", expected)
  153. }
  154. }
  155. func TestGetValue_Float(t *testing.T) {
  156. var testEvent = models.Event{DeviceName: "test"}
  157. for i := 1; i < 3; i++ {
  158. name := fmt.Sprintf("f%d", i)
  159. r1 := models.SimpleReading{
  160. BaseReading: models.BaseReading{
  161. ResourceName: name,
  162. ValueType: typeMap[name],
  163. },
  164. Value: "3.14",
  165. }
  166. testEvent.Readings = append(testEvent.Readings, r1)
  167. }
  168. dtoe := dtos.FromEventModelToDTO(testEvent)
  169. for _, r := range dtoe.Readings {
  170. if v, e := es.getValue(r, common.Log); e != nil {
  171. t.Errorf("%s", e)
  172. } else {
  173. expectPi(t, v)
  174. }
  175. }
  176. }
  177. func expectPi(t *testing.T, expected interface{}) {
  178. if v1, ok := expected.(float64); ok {
  179. if !almostEqual(v1, 3.14) {
  180. t.Errorf("expected 3.14, but it's %f.", v1)
  181. }
  182. } else {
  183. t.Errorf("expected float type, but it's %T.", expected)
  184. }
  185. }
  186. func TestGetValue_Bool(t *testing.T) {
  187. ///////////True
  188. trues := []string{"1", "t", "T", "true", "TRUE", "True"}
  189. for _, v := range trues {
  190. r1 := dtos.BaseReading{ResourceName: "b1", ValueType: typeMap["b1"], SimpleReading: dtos.SimpleReading{Value: v}}
  191. if v, e := es.getValue(r1, common.Log); e != nil {
  192. t.Errorf("%s", e)
  193. } else {
  194. expectTrue(t, v)
  195. }
  196. }
  197. r1 := dtos.BaseReading{ResourceName: "b1", ValueType: typeMap["b1"], SimpleReading: dtos.SimpleReading{Value: "TRue"}}
  198. if _, e := es.getValue(r1, common.Log); e == nil {
  199. t.Errorf("%s", e)
  200. }
  201. ///////////False
  202. falses := []string{"0", "f", "F", "false", "FALSE", "False"}
  203. for _, v := range falses {
  204. r1 := dtos.BaseReading{ResourceName: "b1", ValueType: typeMap["b1"], SimpleReading: dtos.SimpleReading{Value: v}}
  205. if v, e := es.getValue(r1, common.Log); e != nil {
  206. t.Errorf("%s", e)
  207. } else {
  208. expectFalse(t, v)
  209. }
  210. }
  211. r1 = dtos.BaseReading{ResourceName: "b1", ValueType: typeMap["b1"], SimpleReading: dtos.SimpleReading{Value: "FAlse"}}
  212. if _, e := es.getValue(r1, common.Log); e == nil {
  213. t.Errorf("%s", e)
  214. }
  215. }
  216. func expectTrue(t *testing.T, expected interface{}) {
  217. if v1, ok := expected.(bool); ok {
  218. if !v1 {
  219. t.Errorf("expected true, but it's false.")
  220. }
  221. } else {
  222. t.Errorf("expected boolean type, but it's %t.", expected)
  223. }
  224. }
  225. func expectFalse(t *testing.T, expected interface{}) {
  226. if v1, ok := expected.(bool); ok {
  227. if v1 {
  228. t.Errorf("expected false, but it's true.")
  229. }
  230. } else {
  231. t.Errorf("expected boolean type, but it's %t.", expected)
  232. }
  233. }
  234. func TestWrongType(t *testing.T) {
  235. r1 := dtos.BaseReading{ResourceName: "f", ValueType: "FLOAT", SimpleReading: dtos.SimpleReading{Value: "100"}}
  236. if v, _ := es.getValue(r1, common.Log); v != "100" {
  237. t.Errorf("Expected 100, but it's %s!", v)
  238. }
  239. }
  240. func TestWrongValue(t *testing.T) {
  241. var testEvent = models.Event{DeviceName: "test"}
  242. //100 cannot be converted to a boolean value
  243. r1 := models.SimpleReading{
  244. BaseReading: models.BaseReading{
  245. ResourceName: "b1",
  246. ValueType: typeMap["b1"],
  247. },
  248. Value: "100",
  249. }
  250. //'int' string cannot be converted to int value
  251. r2 := models.SimpleReading{
  252. BaseReading: models.BaseReading{
  253. ResourceName: "i1",
  254. ValueType: typeMap["i1"],
  255. },
  256. Value: "int",
  257. }
  258. //'float' string cannot be converted to int value
  259. r3 := models.SimpleReading{
  260. BaseReading: models.BaseReading{
  261. ResourceName: "f1",
  262. ValueType: typeMap["f1"],
  263. },
  264. Value: "float",
  265. }
  266. testEvent.Readings = append(testEvent.Readings, r1, r2, r3)
  267. dtoe := dtos.FromEventModelToDTO(testEvent)
  268. for _, v := range dtoe.Readings {
  269. if _, e := es.getValue(v, common.Log); e == nil {
  270. t.Errorf("Expected an error!")
  271. }
  272. }
  273. }
  274. func TestCastToString(t *testing.T) {
  275. if v, ok := CastToString(12); v != "12" || !ok {
  276. t.Errorf("Failed to cast int.")
  277. }
  278. if v, ok := CastToString(true); v != "true" || !ok {
  279. t.Errorf("Failed to cast bool.")
  280. }
  281. if v, ok := CastToString("hello"); v != "hello" || !ok {
  282. t.Errorf("Failed to cast string.")
  283. }
  284. if v, ok := CastToString(12.3); v != "12.30" || !ok {
  285. t.Errorf("Failed to cast float.")
  286. }
  287. }
  288. func TestPrintConf(t *testing.T) {
  289. expMbconf := types.MessageBusConfig{SubscribeHost: types.HostInfo{Protocol: "tcp", Host: "127.0.0.1", Port: 6625}, Type: "mbus", Optional: map[string]string{
  290. "proa": "proa",
  291. "Password": "fafsadfsadf=",
  292. "Prob": "Prob",
  293. }}
  294. mbconf := types.MessageBusConfig{SubscribeHost: types.HostInfo{Protocol: "tcp", Host: "127.0.0.1", Port: 6625}, Type: "mbus", Optional: map[string]string{
  295. "proa": "proa",
  296. "Password": "fafsadfsadf=",
  297. "Prob": "Prob",
  298. }}
  299. printConf(mbconf)
  300. if !reflect.DeepEqual(expMbconf, mbconf) {
  301. t.Errorf("conf changed after printing")
  302. }
  303. }
  304. func TestGetValue_Binary(t *testing.T) {
  305. ev := []byte("Hello World")
  306. r1 := dtos.BaseReading{ResourceName: "bin", ValueType: v2.ValueTypeBinary, BinaryReading: dtos.BinaryReading{MediaType: "application/text", BinaryValue: ev}}
  307. if v, e := es.getValue(r1, common.Log); e != nil {
  308. t.Errorf("%s", e)
  309. } else if !reflect.DeepEqual(ev, v) {
  310. t.Errorf("result mismatch, expect %v, but got %v", ev, v)
  311. }
  312. }