github.com/futurehomeno/fimpgo@v1.14.0/mqtt_transport_test.go (about) 1 package fimpgo 2 3 import ( 4 MQTT "github.com/eclipse/paho.mqtt.golang" 5 log "github.com/sirupsen/logrus" 6 "testing" 7 "time" 8 ) 9 10 11 12 var msgChan = make(chan int) 13 14 func onMsg(topic string, addr *Address, iotMsg *FimpMessage,rawMessage []byte){ 15 log.Info("New message") 16 if addr.ServiceName == "temp_sensor" && addr.ServiceAddress == "300"{ 17 msgChan <- 1 18 }else { 19 msgChan <- 2 20 } 21 } 22 23 var isCorrect = make(map[int]bool) 24 25 26 27 func TestMqttTransport_Publish(t *testing.T) { 28 29 log.SetLevel(log.DebugLevel) 30 mqtt := NewMqttTransport("tcp://localhost:1883","fimpgotest","","",true,1,1) 31 err := mqtt.Start() 32 t.Log("Connected") 33 if err != nil { 34 t.Error("Error connecting to broker ",err) 35 } 36 37 mqtt.SetMessageHandler(onMsg) 38 mqtt.Subscribe("#") 39 t.Log("Publishing message") 40 41 msg := NewFloatMessage("evt.sensor.report", "temp_sensor", float64(35.5), nil, nil, nil) 42 adr := Address{MsgType: MsgTypeEvt, ResourceType: ResourceTypeDevice, ResourceName: "test", ResourceAddress: "1", ServiceName: "temp_sensor", ServiceAddress: "300"} 43 mqtt.Publish(&adr,msg) 44 45 t.Log("Waiting for new message") 46 result := <- msgChan 47 t.Log("Got new message") 48 mqtt.Stop() 49 if result != 1 { 50 t.Error("Wrong message") 51 } 52 53 } 54 55 func TestMqttTransport_PublishStopPublish(t *testing.T) { 56 57 log.SetLevel(log.DebugLevel) 58 mqtt := NewMqttTransport("tcp://localhost:1883","fimpgotest","","",true,1,1) 59 err := mqtt.Start() 60 t.Log("Connected") 61 if err != nil { 62 t.Error("Error connecting to broker ",err) 63 } 64 65 mqtt.SetMessageHandler(onMsg) 66 mqtt.Subscribe("#") 67 t.Log("Publishing message") 68 69 msg := NewFloatMessage("evt.sensor.report", "temp_sensor", float64(35.5), nil, nil, nil) 70 adr := Address{MsgType: MsgTypeEvt, ResourceType: ResourceTypeDevice, ResourceName: "test", ResourceAddress: "1", ServiceName: "temp_sensor", ServiceAddress: "300"} 71 mqtt.Publish(&adr,msg) 72 73 t.Log("Waiting for new message") 74 result := <- msgChan 75 t.Log("Got new message") 76 mqtt.Stop() 77 if result != 1 { 78 t.Error("Wrong message") 79 } 80 time.Sleep(time.Second*5) 81 mqtt = NewMqttTransport("tcp://localhost:1883","fimpgotest","","",true,1,1) 82 err = mqtt.Start() 83 t.Log("Connected 2") 84 if err != nil { 85 t.Error("Error connecting to broker ",err) 86 } 87 88 time.Sleep(time.Second*5) 89 90 t.Log("Done") 91 mqtt.Stop() 92 93 } 94 95 96 func TestMqttTransport_PublishSync(t *testing.T) { 97 log.SetLevel(log.DebugLevel) 98 MQTT.DEBUG = log.StandardLogger() 99 mqtt := NewMqttTransport("tcp://localhost:1883","fimpgotest","","",true,1,1) 100 err := mqtt.Start() 101 t.Log("Connected") 102 if err != nil { 103 t.Error("Error connecting to broker ",err) 104 } 105 106 t.Log("Publishing message") 107 108 msg := NewFloatMessage("evt.sensor.report", "temp_sensor", float64(35.5), nil, nil, nil) 109 adr := Address{MsgType: MsgTypeEvt, ResourceType: ResourceTypeDevice, ResourceName: "test", ResourceAddress: "1", ServiceName: "temp_sensor", ServiceAddress: "300"} 110 111 for i:=0;i<10;i++ { 112 err = mqtt.PublishSync(&adr,msg) 113 if err != nil { 114 log.Info("Publish failed . Err :",) 115 }else { 116 log.Info("Publish success ") 117 } 118 time.Sleep(time.Second*5) 119 120 } 121 122 t.Log("Waiting for new message") 123 t.Log("Got new message") 124 mqtt.Stop() 125 126 } 127 128 func TestMqttTransport_SubUnsub(t *testing.T) { 129 log.SetLevel(log.DebugLevel) 130 mqtt := NewMqttTransport("tcp://localhost:1883","fimpgotest","","",true,1,1) 131 err := mqtt.Start() 132 t.Log("Connected") 133 if err != nil { 134 t.Error("Error connecting to broker ",err) 135 } 136 137 mqtt.SetMessageHandler(onMsg) 138 mqtt.Subscribe("pt:j1/mt:evt/#") 139 //mqtt.Subscribe("pt:j1/mt:evt/rt:dev/rn:test/ad:1/sv:temp_sensor/ad:300") 140 //mqtt.Unsubscribe("pt:j1/mt:evt/rt:dev/rn:test/ad:1/sv:temp_sensor/ad:300") 141 mqtt.Unsubscribe("pt:j1/mt:evt/#") 142 t.Log("Publishing message") 143 144 msg := NewFloatMessage("evt.sensor.report", "temp_sensor", float64(35.5), nil, nil, nil) 145 adr := Address{PayloadType: DefaultPayload,MsgType: MsgTypeEvt, ResourceType: ResourceTypeDevice, ResourceName: "test", ResourceAddress: "1", ServiceName: "temp_sensor", ServiceAddress: "300"} 146 mqtt.PublishSync(&adr,msg) 147 148 t.Log("Waiting for new message") 149 result := <- msgChan 150 t.Log("Got new message") 151 mqtt.Stop() 152 if result != 1 { 153 t.Error("Wrong message") 154 } 155 156 } 157 158 func TestMqttTransport_PublishTls(t *testing.T) { 159 log.SetLevel(log.DebugLevel) 160 // for test replace XYZ with actual AWS IoT core address and ABC with actual clientid 161 mqtt := NewMqttTransport("ssl://a1ds8ixdqbiw53-ats.iot.eu-central-1.amazonaws.com:443","00000000alexdevtest","","",false,1,1) 162 163 // for test enter valid site-id 164 mqtt.SetGlobalTopicPrefix("331D092F-4685-4CC9-8337-2598E6F5D8D5") 165 // for test place certificate and key into certs folder 166 err := mqtt.ConfigureTls("awsiot.private.key","awsiot.crt","./certs",true) 167 168 if err != nil { 169 t.Error("Certificate error :",err) 170 } 171 172 err = mqtt.Start() 173 t.Log("Connected") 174 if err != nil { 175 t.Error("Error connecting to broker ",err) 176 } 177 178 mqtt.SetMessageHandler(onMsg) 179 time.Sleep(time.Second*1) 180 mqtt.Subscribe("#") 181 t.Log("Publishing message") 182 183 msg := NewFloatMessage("evt.sensor.report", "temp_sensor", float64(35.5), nil, nil, nil) 184 adr := Address{PayloadType: DefaultPayload,MsgType: MsgTypeEvt, ResourceType: ResourceTypeDevice, ResourceName: "test", ResourceAddress: "1", ServiceName: "temp_sensor", ServiceAddress: "300"} 185 mqtt.Publish(&adr,msg) 186 187 t.Log("Waiting for new message") 188 result := <- msgChan 189 t.Log("Got new message") 190 mqtt.Stop() 191 if result != 1 { 192 t.Error("Wrong message") 193 } 194 195 } 196 197 func TestMqttTransport_PublishTls_2(t *testing.T) { 198 199 connConfig := MqttConnectionConfigs{ 200 ServerURI: "ssl://a1ds8ixdqbiw53-ats.iot.eu-central-1.amazonaws.com:443", 201 ClientID: "00000000alexdevtest", 202 CleanSession: true, 203 SubQos: 1, 204 PubQos: 1, 205 CertDir: "./certs", 206 PrivateKeyFileName: "awsiot.private.key", 207 CertFileName: "awsiot.crt", 208 } 209 210 log.SetLevel(log.DebugLevel) 211 // for test replace XYZ with actual AWS IoT core address and ABC with actual clientid 212 mqtt := NewMqttTransportFromConfigs(connConfig) 213 214 // for test enter valid site-id 215 mqtt.SetGlobalTopicPrefix("331D092F-4685-4CC9-8337-2598E6F5D8D5") 216 // for test place certificate and key into certs folder 217 err := mqtt.ConfigureTls("awsiot.private.key","awsiot.crt","./certs",true) 218 219 if err != nil { 220 t.Error("Certificate error :",err) 221 } 222 223 err = mqtt.Start() 224 t.Log("Connected") 225 if err != nil { 226 t.Error("Error connecting to broker ",err) 227 } 228 229 mqtt.SetMessageHandler(onMsg) 230 time.Sleep(time.Second*1) 231 mqtt.Subscribe("#") 232 t.Log("Publishing message") 233 234 msg := NewFloatMessage("evt.sensor.report", "temp_sensor", float64(35.5), nil, nil, nil) 235 adr := Address{PayloadType: DefaultPayload,MsgType: MsgTypeEvt, ResourceType: ResourceTypeDevice, ResourceName: "test", ResourceAddress: "1", ServiceName: "temp_sensor", ServiceAddress: "300"} 236 mqtt.Publish(&adr,msg) 237 238 t.Log("Waiting for new message") 239 result := <- msgChan 240 t.Log("Got new message") 241 mqtt.Stop() 242 if result != 1 { 243 t.Error("Wrong message") 244 } 245 246 } 247 248 249 func TestMqttTransport_TestChannels(t *testing.T) { 250 251 log.SetLevel(log.DebugLevel) 252 mqtt := NewMqttTransport("tcp://localhost:1883","fimpgotest","","",true,1,1) 253 err := mqtt.Start() 254 t.Log("Connected") 255 time.Sleep(time.Second*1) 256 mqtt.Subscribe("#") 257 if err != nil { 258 t.Error("Error connecting to broker ",err) 259 } 260 chan1 := make(MessageCh) 261 chan2 := make(MessageCh) 262 mqtt.RegisterChannel("chan1",chan1) 263 mqtt.RegisterChannel("chan2",chan2) 264 isCorrect[1] = false 265 isCorrect[2] = false 266 go func(msgChan MessageCh) { 267 newMsg :=<- chan1 268 if newMsg.Payload.Service == "temp_sensor" { 269 isCorrect[1] = true 270 } 271 }(chan1) 272 go func(msgChan MessageCh) { 273 newMsg :=<- chan2 274 if newMsg.Payload.Service == "temp_sensor" { 275 isCorrect[2] = true 276 } 277 }(chan2) 278 279 msg := NewFloatMessage("evt.sensor.report", "temp_sensor", float64(35.5), nil, nil, nil) 280 adr := Address{PayloadType: DefaultPayload,MsgType: MsgTypeEvt, ResourceType: ResourceTypeDevice, ResourceName: "test", ResourceAddress: "1", ServiceName: "temp_sensor", ServiceAddress: "300"} 281 mqtt.Publish(&adr,msg) 282 time.Sleep(time.Second*1) 283 mqtt.UnregisterChannel("chan1") 284 mqtt.UnregisterChannel("chan2") 285 if isCorrect[1] && isCorrect[2] { 286 t.Log("Channel test - OK") 287 }else { 288 t.Error("Wrong result") 289 t.Fail() 290 } 291 } 292 293 func TestMqttTransport_TestResponder(t *testing.T) { 294 295 log.SetLevel(log.TraceLevel) 296 var isResponseReceived bool 297 mqtt := NewMqttTransport("tcp://localhost:1883","fimpgotest-1","","",true,1,1) 298 err := mqtt.Start() 299 t.Log("Connected") 300 time.Sleep(time.Second*1) 301 mqtt.Subscribe("#") 302 303 mqtt2 := NewMqttTransport("tcp://localhost:1883","fimpgotest-2","","",true,1,1) 304 err = mqtt2.Start() 305 t.Log("Connected") 306 time.Sleep(time.Second*1) 307 mqtt2.Subscribe("pt:j1c1/mt:rsp/rt:app/rn:response_tester/ad:1") 308 309 310 if err != nil { 311 t.Error("Error connecting to broker ",err) 312 } 313 chan1 := make(MessageCh) 314 chan2 := make(MessageCh) 315 mqtt.RegisterChannel("chan1",chan1) 316 mqtt2.RegisterChannel("chan2",chan2) 317 // responder 318 go func(msgChan MessageCh) { 319 for { 320 newMsg :=<- chan1 321 t.Log("New message for responder. Service = "+newMsg.Payload.Service) 322 if newMsg.Payload.Service == "tester" { 323 mqtt.RespondToRequest(newMsg.Payload,NewFloatMessage("evt.test.response", "test_responder", 35.5, nil, nil, nil)) 324 } 325 } 326 327 }(chan1) 328 329 go func(msgChan MessageCh) { 330 for { 331 newMsg :=<- chan2 332 t.Log("Service = "+newMsg.Payload.Service) 333 if newMsg.Payload.Service == "test_responder" && newMsg.Topic == "pt:j1c1/mt:rsp/rt:app/rn:response_tester/ad:1" { 334 isResponseReceived = true 335 } 336 } 337 338 339 }(chan2) 340 341 msg := NewFloatMessage("cmd.test.get_response", "tester", float64(35.5), nil, nil, nil) 342 msg.ResponseToTopic = "pt:j1c1/mt:rsp/rt:app/rn:response_tester/ad:1" 343 adr := Address{PayloadType: DefaultPayload,MsgType: MsgTypeCmd, ResourceType: ResourceTypeApp, ResourceName: "test", ResourceAddress: "1"} 344 mqtt.Publish(&adr,msg) 345 time.Sleep(time.Second*2) 346 mqtt.UnregisterChannel("chan1") 347 mqtt.UnregisterChannel("chan2") 348 mqtt.Unsubscribe("#") 349 if isResponseReceived { 350 t.Log("Response received") 351 }else { 352 t.Error("Wrong result") 353 t.Fail() 354 } 355 } 356 357 func TestMqttTransport_TestChannelsWithFilters(t *testing.T) { 358 359 log.SetLevel(log.DebugLevel) 360 mqtt := NewMqttTransport("tcp://localhost:1883","fimpgotest","","",true,1,1) 361 err := mqtt.Start() 362 t.Log("Connected") 363 time.Sleep(time.Second*1) 364 mqtt.Subscribe("#") 365 if err != nil { 366 t.Error("Error connecting to broker ",err) 367 } 368 chan1 := make(MessageCh) 369 chan2 := make(MessageCh) 370 chan3 := make(MessageCh) 371 chan4 := make(MessageCh) 372 chan5 := make(MessageCh) 373 mqtt.RegisterChannel("chan1",chan1) 374 mqtt.RegisterChannel("chan2",chan2) 375 mqtt.RegisterChannelWithFilter("chan3",chan3,FimpFilter{ 376 Topic: "pt:j1/mt:evt/#", 377 Service: "temp_sensor", 378 Interface: "evt.sensor.report", 379 }) 380 381 mqtt.RegisterChannelWithFilter("chan4",chan4,FimpFilter{ 382 Topic: "pt:j1/mt:cmd/#", 383 Service: "temp_sensor", 384 Interface: "cmd.sensor.report", 385 }) 386 387 testFilterFunc := func (topic string, addr *Address, iotMsg *FimpMessage) bool { 388 if iotMsg.Type == "evt.sensor.report"{ 389 return true 390 } 391 return false 392 } 393 394 mqtt.RegisterChannelWithFilterFunc("chan5",chan5,testFilterFunc) 395 396 isCorrect[1] = false 397 isCorrect[2] = false 398 isCorrect[3] = false 399 isCorrect[4] = true 400 isCorrect[5] = false 401 go func(msgChan MessageCh) { 402 newMsg :=<- msgChan 403 if newMsg.Payload.Service == "temp_sensor" { 404 isCorrect[1] = true 405 } 406 }(chan1) 407 go func(msgChan MessageCh) { 408 newMsg :=<- msgChan 409 if newMsg.Payload.Service == "temp_sensor" { 410 isCorrect[2] = true 411 } 412 }(chan2) 413 414 go func(msgChan MessageCh) { 415 newMsg :=<- msgChan 416 if newMsg.Payload.Service == "temp_sensor" { 417 isCorrect[3] = true 418 } 419 }(chan3) 420 // Negative test 421 go func(msgChan MessageCh) { 422 _=<- msgChan 423 isCorrect[4] = false 424 425 }(chan4) 426 427 go func(msgChan MessageCh) { 428 _=<- msgChan 429 isCorrect[5] = true 430 431 }(chan5) 432 433 msg := NewFloatMessage("evt.sensor.report", "temp_sensor", float64(35.5), nil, nil, nil) 434 adr := Address{MsgType: MsgTypeEvt, ResourceType: ResourceTypeDevice, ResourceName: "test", ResourceAddress: "1", ServiceName: "temp_sensor", ServiceAddress: "300"} 435 mqtt.Publish(&adr,msg) 436 time.Sleep(time.Second*1) 437 mqtt.UnregisterChannel("chan1") 438 mqtt.UnregisterChannel("chan2") 439 mqtt.UnregisterChannel("chan3") 440 mqtt.UnregisterChannel("chan4") 441 mqtt.UnregisterChannel("chan5") 442 if isCorrect[1] && isCorrect[2] && isCorrect[3] && isCorrect[4] && isCorrect[5]{ 443 t.Log("Channel test - OK") 444 }else { 445 t.Error("Wrong result") 446 t.Log(isCorrect) 447 t.Fail() 448 } 449 450 451 } 452 453 func TestAddGlobalPrefixToTopic(t *testing.T) { 454 result := AddGlobalPrefixToTopic("12345","pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0") 455 if result != "12345/pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0" { 456 t.Error("Wrong topic") 457 }else { 458 t.Log("AddGlobalPrefixToTopic test 1 - OK") 459 } 460 result = AddGlobalPrefixToTopic("12345","/pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0") 461 if result != "12345/pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0" { 462 t.Error("Wrong topic") 463 }else { 464 t.Log("AddGlobalPrefixToTopic test 2 - OK") 465 } 466 result = AddGlobalPrefixToTopic("","pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0") 467 if result != "pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0" { 468 t.Error("Wrong topic") 469 }else { 470 t.Log("AddGlobalPrefixToTopic test 3 - OK") 471 } 472 } 473 474 func TestDetachGlobalPrefixFromTopic(t *testing.T) { 475 globalPrefix,topic := DetachGlobalPrefixFromTopic("12345/pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0") 476 if globalPrefix != "12345" || topic != "pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0" { 477 t.Error("Wrong topic") 478 }else { 479 t.Log("DetachGlobalPrefixFromTopic test 1 - OK") 480 } 481 globalPrefix,topic = DetachGlobalPrefixFromTopic("ABC/12345/pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0") 482 if globalPrefix != "ABC/12345" || topic != "pt:j1/mt:evt/rt:dev/rn:zw/ad:1/sv:dev_sys/ad:49_0" { 483 t.Error("Wrong topic") 484 }else { 485 t.Log("Result ,",globalPrefix,topic) 486 t.Log("DetachGlobalPrefixFromTopic test 2 - OK") 487 } 488 } 489