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