edgex_source_test.go 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. // Copyright 2021-2023 EMQ Technologies Co., Ltd.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. //go:build edgex
  15. // +build edgex
  16. package edgex
  17. import (
  18. "encoding/json"
  19. "fmt"
  20. "math"
  21. "reflect"
  22. "testing"
  23. v3 "github.com/edgexfoundry/go-mod-core-contracts/v3/common"
  24. "github.com/edgexfoundry/go-mod-core-contracts/v3/dtos"
  25. "github.com/edgexfoundry/go-mod-core-contracts/v3/models"
  26. "github.com/edgexfoundry/go-mod-messaging/v3/pkg/types"
  27. "github.com/lf-edge/ekuiper/internal/conf"
  28. )
  29. var (
  30. es = &EdgexSource{}
  31. typeMap = map[string]string{
  32. "b1": v3.ValueTypeBool,
  33. "i1": v3.ValueTypeInt8,
  34. "i2": v3.ValueTypeInt16,
  35. "i3": v3.ValueTypeInt32,
  36. "i4": v3.ValueTypeInt64,
  37. "i5": v3.ValueTypeUint8,
  38. "i6": v3.ValueTypeUint16,
  39. "i7": v3.ValueTypeUint32,
  40. "s1": v3.ValueTypeString,
  41. "f1": v3.ValueTypeFloat32,
  42. "f2": v3.ValueTypeFloat64,
  43. "i8": v3.ValueTypeUint64,
  44. "ba": v3.ValueTypeBoolArray,
  45. "ia1": v3.ValueTypeInt8Array,
  46. "ia2": v3.ValueTypeInt16Array,
  47. "ia3": v3.ValueTypeInt32Array,
  48. "ia4": v3.ValueTypeInt64Array,
  49. "ia5": v3.ValueTypeUint8Array,
  50. "ia6": v3.ValueTypeUint16Array,
  51. "ia7": v3.ValueTypeUint32Array,
  52. "ia8": v3.ValueTypeUint64Array,
  53. "fa1": v3.ValueTypeFloat32Array,
  54. "fa2": v3.ValueTypeFloat64Array,
  55. }
  56. )
  57. func TestGetValue_IntFloat(t *testing.T) {
  58. testEvent := models.Event{DeviceName: "test"}
  59. for i := 1; i < 8; i++ {
  60. name := fmt.Sprintf("i%d", i)
  61. r1 := models.SimpleReading{
  62. BaseReading: models.BaseReading{
  63. ResourceName: name,
  64. ValueType: typeMap[name],
  65. },
  66. Value: "1",
  67. }
  68. testEvent.Readings = append(testEvent.Readings, r1)
  69. }
  70. dtoe := dtos.FromEventModelToDTO(testEvent)
  71. for _, r := range dtoe.Readings {
  72. if v, e := es.getValue(r, conf.Log); e != nil {
  73. t.Errorf("%s", e)
  74. } else {
  75. expectOne(t, v)
  76. }
  77. }
  78. r1 := dtos.BaseReading{ResourceName: "i8", ValueType: typeMap["i8"], SimpleReading: dtos.SimpleReading{Value: "10796529505058023104"}}
  79. if v, e := es.getValue(r1, conf.Log); e != nil {
  80. t.Errorf("%s", e)
  81. } else {
  82. if v1, ok := v.(uint64); ok {
  83. if v1 != 10796529505058023104 {
  84. t.Errorf("expected 10796529505058023104, but it's %d.", v1)
  85. }
  86. }
  87. }
  88. r2 := dtos.BaseReading{ResourceName: "f1", ValueType: typeMap["f1"], SimpleReading: dtos.SimpleReading{Value: "3.14"}}
  89. if v, e := es.getValue(r2, conf.Log); e != nil {
  90. t.Errorf("%s", e)
  91. } else {
  92. if v1, ok := v.(float64); ok {
  93. if !almostEqual(v1, 3.14) {
  94. t.Errorf("expected 3.14, but it's %f.", v1)
  95. }
  96. }
  97. }
  98. }
  99. func almostEqual(a, b float64) bool {
  100. return math.Abs(a-b) <= 1e-6
  101. }
  102. func TestGetValue_IntFloatArr(t *testing.T) {
  103. testEvent := models.Event{DeviceName: "test"}
  104. for i := 1; i < 8; i++ {
  105. ia := []int{i, i * 2}
  106. jsonValue, _ := json.Marshal(ia)
  107. name := fmt.Sprintf("ia%d", i)
  108. r1 := models.SimpleReading{
  109. BaseReading: models.BaseReading{
  110. ResourceName: name,
  111. ValueType: typeMap[name],
  112. },
  113. Value: string(jsonValue),
  114. }
  115. testEvent.Readings = append(testEvent.Readings, r1)
  116. }
  117. dtoe := dtos.FromEventModelToDTO(testEvent)
  118. for i, r := range dtoe.Readings {
  119. if v, e := es.getValue(r, conf.Log); e != nil {
  120. t.Errorf("%s", e)
  121. } else {
  122. checkArray(t, i, v)
  123. }
  124. }
  125. r1 := dtos.BaseReading{ResourceName: "ia8", ValueType: typeMap["ia8"], SimpleReading: dtos.SimpleReading{Value: `[10796529505058023104, 10796529505058023105]`}}
  126. if v, e := es.getValue(r1, conf.Log); e != nil {
  127. t.Errorf("%s", e)
  128. } else {
  129. if v1, ok := v.([]uint64); ok {
  130. if v1[0] != 10796529505058023104 || v1[1] != 10796529505058023105 {
  131. t.Errorf("Failed, the array value is not correct %v.", v1)
  132. }
  133. } else {
  134. t.Errorf("expected uint64 array type, but it's %T.", v1)
  135. }
  136. }
  137. rf_00 := dtos.BaseReading{ResourceName: "fa1", ValueType: typeMap["fa1"], SimpleReading: dtos.SimpleReading{Value: `[3.14, 2.71828]`}}
  138. if v, e := es.getValue(rf_00, conf.Log); e != nil {
  139. t.Errorf("%s", e)
  140. } else {
  141. if v1, ok := v.([]float64); ok {
  142. if v1[0] != 3.14 || v1[1] != 2.71828 {
  143. t.Errorf("expected 3.14 & 2.71828, but it's %v.", v1)
  144. }
  145. } else {
  146. t.Errorf("expected float32 array type, but it's %T.", v)
  147. }
  148. }
  149. }
  150. func checkArray(t *testing.T, index int, val interface{}) {
  151. if v1, ok := val.([]int); ok {
  152. newIdx := index + 1
  153. if v1[0] != newIdx || v1[1] != newIdx*2 {
  154. t.Errorf("Failed, the array value is not correct %v.", v1)
  155. }
  156. } else {
  157. t.Errorf("expected int array type, but it's %T.", val)
  158. }
  159. }
  160. func expectOne(t *testing.T, expected interface{}) {
  161. if v1, ok := expected.(int); ok {
  162. if v1 != 1 {
  163. t.Errorf("expected 1, but it's %d.", v1)
  164. }
  165. } else {
  166. t.Errorf("expected int type, but it's %T.", expected)
  167. }
  168. }
  169. func TestGetValue_Float(t *testing.T) {
  170. testEvent := models.Event{DeviceName: "test"}
  171. for i := 1; i < 3; i++ {
  172. name := fmt.Sprintf("f%d", i)
  173. r1 := models.SimpleReading{
  174. BaseReading: models.BaseReading{
  175. ResourceName: name,
  176. ValueType: typeMap[name],
  177. },
  178. Value: "3.14",
  179. }
  180. testEvent.Readings = append(testEvent.Readings, r1)
  181. }
  182. dtoe := dtos.FromEventModelToDTO(testEvent)
  183. for _, r := range dtoe.Readings {
  184. if v, e := es.getValue(r, conf.Log); e != nil {
  185. t.Errorf("%s", e)
  186. } else {
  187. expectPi(t, v)
  188. }
  189. }
  190. }
  191. func expectPi(t *testing.T, expected interface{}) {
  192. if v1, ok := expected.(float64); ok {
  193. if !almostEqual(v1, 3.14) {
  194. t.Errorf("expected 3.14, but it's %f.", v1)
  195. }
  196. } else {
  197. t.Errorf("expected float type, but it's %T.", expected)
  198. }
  199. }
  200. func TestGetValue_Bool(t *testing.T) {
  201. ///////////True
  202. trues := []string{"1", "t", "T", "true", "TRUE", "True"}
  203. for _, v := range trues {
  204. r1 := dtos.BaseReading{ResourceName: "b1", ValueType: typeMap["b1"], SimpleReading: dtos.SimpleReading{Value: v}}
  205. if v, e := es.getValue(r1, conf.Log); e != nil {
  206. t.Errorf("%s", e)
  207. } else {
  208. expectTrue(t, v)
  209. }
  210. }
  211. r1 := dtos.BaseReading{ResourceName: "b1", ValueType: typeMap["b1"], SimpleReading: dtos.SimpleReading{Value: "TRue"}}
  212. if _, e := es.getValue(r1, conf.Log); e == nil {
  213. t.Errorf("%s", e)
  214. }
  215. ///////////False
  216. falses := []string{"0", "f", "F", "false", "FALSE", "False"}
  217. for _, v := range falses {
  218. r1 := dtos.BaseReading{ResourceName: "b1", ValueType: typeMap["b1"], SimpleReading: dtos.SimpleReading{Value: v}}
  219. if v, e := es.getValue(r1, conf.Log); e != nil {
  220. t.Errorf("%s", e)
  221. } else {
  222. expectFalse(t, v)
  223. }
  224. }
  225. r1 = dtos.BaseReading{ResourceName: "b1", ValueType: typeMap["b1"], SimpleReading: dtos.SimpleReading{Value: "FAlse"}}
  226. if _, e := es.getValue(r1, conf.Log); e == nil {
  227. t.Errorf("%s", e)
  228. }
  229. }
  230. func expectTrue(t *testing.T, expected interface{}) {
  231. if v1, ok := expected.(bool); ok {
  232. if !v1 {
  233. t.Errorf("expected true, but it's false.")
  234. }
  235. } else {
  236. t.Errorf("expected boolean type, but it's %t.", expected)
  237. }
  238. }
  239. func expectFalse(t *testing.T, expected interface{}) {
  240. if v1, ok := expected.(bool); ok {
  241. if v1 {
  242. t.Errorf("expected false, but it's true.")
  243. }
  244. } else {
  245. t.Errorf("expected boolean type, but it's %t.", expected)
  246. }
  247. }
  248. func TestWrongType(t *testing.T) {
  249. r1 := dtos.BaseReading{ResourceName: "f", ValueType: "FLOAT", SimpleReading: dtos.SimpleReading{Value: "100"}}
  250. if v, _ := es.getValue(r1, conf.Log); v != "100" {
  251. t.Errorf("Expected 100, but it's %s!", v)
  252. }
  253. }
  254. func TestWrongValue(t *testing.T) {
  255. testEvent := models.Event{DeviceName: "test"}
  256. // 100 cannot be converted to a boolean value
  257. r1 := models.SimpleReading{
  258. BaseReading: models.BaseReading{
  259. ResourceName: "b1",
  260. ValueType: typeMap["b1"],
  261. },
  262. Value: "100",
  263. }
  264. //'int' string cannot be converted to int value
  265. r2 := models.SimpleReading{
  266. BaseReading: models.BaseReading{
  267. ResourceName: "i1",
  268. ValueType: typeMap["i1"],
  269. },
  270. Value: "int",
  271. }
  272. //'float' string cannot be converted to int value
  273. r3 := models.SimpleReading{
  274. BaseReading: models.BaseReading{
  275. ResourceName: "f1",
  276. ValueType: typeMap["f1"],
  277. },
  278. Value: "float",
  279. }
  280. testEvent.Readings = append(testEvent.Readings, r1, r2, r3)
  281. dtoe := dtos.FromEventModelToDTO(testEvent)
  282. for _, v := range dtoe.Readings {
  283. if _, e := es.getValue(v, conf.Log); e == nil {
  284. t.Errorf("Expected an error!")
  285. }
  286. }
  287. }
  288. func TestPrintConf(t *testing.T) {
  289. expMbconf := types.MessageBusConfig{Broker: 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{Broker: 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. if !reflect.DeepEqual(expMbconf, mbconf) {
  300. t.Errorf("conf changed after printing")
  301. }
  302. }
  303. func TestGetValue_Binary(t *testing.T) {
  304. ev := []byte("Hello World")
  305. r1 := dtos.BaseReading{ResourceName: "bin", ValueType: v3.ValueTypeBinary, BinaryReading: dtos.BinaryReading{MediaType: "application/text", BinaryValue: ev}}
  306. if v, e := es.getValue(r1, conf.Log); e != nil {
  307. t.Errorf("%s", e)
  308. } else if !reflect.DeepEqual(ev, v) {
  309. t.Errorf("result mismatch, expect %v, but got %v", ev, v)
  310. }
  311. }
  312. func TestGetValue_Object(t *testing.T) {
  313. ev := map[string]interface{}{
  314. "a": 3,
  315. "b": "string",
  316. "c": 12.3,
  317. }
  318. r1 := dtos.NewObjectReading("p", "d", "obj", ev)
  319. err := r1.Validate()
  320. if err != nil {
  321. t.Error(err)
  322. return
  323. }
  324. if v, e := es.getValue(r1, conf.Log); e != nil {
  325. t.Errorf("%s", e)
  326. } else if !reflect.DeepEqual(ev, v) {
  327. t.Errorf("result mismatch, expect %v, but got %v", ev, v)
  328. }
  329. }