| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // Copyright (c) 2000-2017 Ericsson Telecom AB |
| // |
| // All rights reserved. This program and the accompanying materials |
| // are made available under the terms of the Eclipse Public License v1.0 |
| // which accompanies this distribution, and is available at |
| // http://www.eclipse.org/legal/epl-v10.html |
| /////////////////////////////////////////////////////////////////////////////// |
| // File: MqttTestSuite_Interop.ttcn |
| // Description: |
| // Rev: R1A |
| // Prodnr: LPA 108 661 |
| // Updated: 2017-09-01 |
| // Contact: http://ttcn.ericsson.se |
| /////////////////////////////////////////////////////////////////////////////// |
| module MqttTestSuite_Interop |
| { |
| import from IoT_FT_Framework_Definitions all; |
| import from IoT_FT_Framework_Functions all; |
| import from IFW_MQTT_Client_TestSteps all; |
| import from MQTT_v3_1_1_Types all; |
| |
| testcase tc_Mqtt_client_connect_disconnect() runs on IFW_MAIN_CT |
| { |
| setverdict(pass); |
| |
| var integer mqtt_client := f_IFW_addComponent(MQTT_CLIENT, "mqtt_client"); |
| |
| f_IFW_MqttClient_setRemote(mqtt_client, "mqtt_server"); |
| |
| f_IFW_initComponents(); |
| |
| f_connect(mqtt_client); |
| |
| f_disconnect(mqtt_client); |
| |
| f_IFW_cleanUp(); |
| } |
| |
| testcase tc_Mqtt_client_subscribe() runs on IFW_MAIN_CT |
| { |
| setverdict(pass); |
| |
| var integer mqtt_client := f_IFW_addComponent(MQTT_CLIENT, "mqtt_client"); |
| |
| f_IFW_MqttClient_setRemote(mqtt_client, "mqtt_server"); |
| |
| f_IFW_initComponents(); |
| |
| f_connect(mqtt_client); |
| |
| f_IFW_MqttClient_setMessageToSend(mqtt_client, valueof(t_subscribe("#", 2, AT_MOST_ONCE_DELIVERY))); |
| f_IFW_MqttClient_send(mqtt_client); |
| |
| f_IFW_MqttClient_receive(mqtt_client); |
| f_handleVerdict(f_IFW_MqttClient_check(mqtt_client, tr_suback({0}, 2))); |
| |
| f_disconnect(mqtt_client); |
| |
| f_IFW_cleanUp(); |
| } |
| |
| testcase tc_Mqtt_client_unsubscribe() runs on IFW_MAIN_CT |
| { |
| setverdict(pass); |
| |
| var integer mqtt_client := f_IFW_addComponent(MQTT_CLIENT, "mqtt_client"); |
| var integer vl_id := 2; |
| |
| f_IFW_MqttClient_setRemote(mqtt_client, "mqtt_server"); |
| |
| f_IFW_initComponents(); |
| |
| f_connect(mqtt_client); |
| |
| f_subscribe(mqtt_client, "room/topic", vl_id, AT_MOST_ONCE_DELIVERY); |
| |
| // Unsubscribe |
| f_IFW_MqttClient_setMessageToSend(mqtt_client, valueof(t_unsubscribe("room/topic", 3))); |
| f_IFW_MqttClient_send(mqtt_client); |
| |
| f_IFW_MqttClient_receive(mqtt_client); |
| f_handleVerdict(f_IFW_MqttClient_check(mqtt_client, tr_unsuback(3))); |
| |
| f_disconnect(mqtt_client); |
| |
| f_IFW_cleanUp(); |
| } |
| |
| testcase tc_Mqtt_client_publish_qos0() runs on IFW_MAIN_CT |
| { |
| setverdict(pass); |
| |
| var integer mqtt_client_A := f_IFW_addComponent(MQTT_CLIENT, "mqtt_client"); |
| var integer mqtt_client_B := f_IFW_addComponent(MQTT_CLIENT, "mqtt_client2"); |
| |
| var charstring vl_topic := "room/topic"; |
| var integer vl_id := 1; |
| |
| f_IFW_MqttClient_setRemote(mqtt_client_A, "mqtt_server"); |
| f_IFW_MqttClient_setRemote(mqtt_client_B, "mqtt_server"); |
| |
| f_IFW_initComponents(); |
| |
| f_connect(mqtt_client_A); |
| f_connect(mqtt_client_B); |
| |
| f_subscribe(mqtt_client_B, vl_topic, vl_id, AT_MOST_ONCE_DELIVERY); |
| |
| // Publish - QoS 0 |
| f_IFW_MqttClient_setMessageToSend(mqtt_client_A, |
| valueof(t_publish(vl_topic, omit, AT_MOST_ONCE_DELIVERY)) |
| ); |
| f_IFW_MqttClient_send(mqtt_client_A); |
| |
| f_IFW_MqttClient_receive(mqtt_client_B); |
| f_handleVerdict(f_IFW_MqttClient_check(mqtt_client_B, |
| t_publish(vl_topic, omit, AT_MOST_ONCE_DELIVERY)) |
| ); |
| |
| f_disconnect(mqtt_client_A); |
| f_disconnect(mqtt_client_B); |
| |
| f_IFW_cleanUp(); |
| } |
| |
| testcase tc_Mqtt_client_publish_qos1() runs on IFW_MAIN_CT |
| { |
| setverdict(pass); |
| |
| var integer mqtt_client_A := f_IFW_addComponent(MQTT_CLIENT, "mqtt_client"); |
| var integer mqtt_client_B := f_IFW_addComponent(MQTT_CLIENT, "mqtt_client2"); |
| |
| var charstring vl_topic := "room/topic"; |
| var integer vl_id := 1; |
| |
| f_IFW_MqttClient_setRemote(mqtt_client_A, "mqtt_server"); |
| f_IFW_MqttClient_setRemote(mqtt_client_B, "mqtt_server"); |
| |
| f_IFW_initComponents(); |
| |
| f_connect(mqtt_client_A); |
| f_connect(mqtt_client_B); |
| |
| f_subscribe(mqtt_client_B, vl_topic, vl_id, AT_MOST_ONCE_DELIVERY); |
| |
| // Publish - QoS 0 |
| f_IFW_MqttClient_setMessageToSend(mqtt_client_A, |
| valueof(t_publish(vl_topic, vl_id, AT_LEAST_ONCE_DELIVERY)) |
| ); |
| f_IFW_MqttClient_send(mqtt_client_A); |
| |
| f_IFW_MqttClient_receive(mqtt_client_A); |
| f_handleVerdict(f_IFW_MqttClient_check(mqtt_client_A, |
| t_puback(vl_id)) |
| ); |
| |
| f_IFW_MqttClient_receive(mqtt_client_B); |
| f_handleVerdict(f_IFW_MqttClient_check(mqtt_client_B, |
| t_publish(vl_topic, *, AT_MOST_ONCE_DELIVERY)) |
| ); |
| |
| f_disconnect(mqtt_client_A); |
| f_disconnect(mqtt_client_B); |
| |
| f_IFW_cleanUp(); |
| } |
| |
| template MQTT_v3_1_1_ReqResp t_publish( |
| in charstring p_topic, |
| in template integer p_id, |
| in QoS p_qos) := |
| { |
| publish := { |
| header := { |
| dup_flag := '0'B, |
| qos_level := p_qos, |
| retain_flag := '0'B |
| }, |
| topic_name := p_topic, |
| packet_identifier := p_id, |
| payload := char2oct("publish qos 0 payload") |
| } |
| } |
| |
| template MQTT_v3_1_1_ReqResp t_puback( |
| in template integer p_id) := |
| { |
| puback := { |
| header := { flags := '0000'B }, |
| packet_identifier := p_id |
| } |
| } |
| |
| function f_subscribe( |
| in integer p_client, |
| in charstring p_topic, |
| inout integer p_id, |
| in QoS p_qos) |
| runs on IFW_MAIN_CT |
| { |
| f_IFW_MqttClient_setMessageToSend(p_client, valueof(t_subscribe(p_topic, p_id, p_qos))); |
| f_IFW_MqttClient_send(p_client); |
| |
| f_IFW_MqttClient_receive(p_client); |
| f_handleVerdict(f_IFW_MqttClient_check(p_client, tr_suback({?}, p_id))); |
| |
| f_nextPacketId(p_id); |
| } |
| |
| template MQTT_v3_1_1_ReqResp t_subscribe( |
| in charstring p_topic, |
| in integer p_id, |
| in QoS p_qos) := |
| { |
| subscribe := { |
| header := { flags := '0010'B }, |
| packet_identifier := p_id, |
| payload := { |
| { |
| topic_filter := p_topic, |
| requested_qos := p_qos |
| } |
| } |
| } |
| } |
| |
| template MQTT_v3_1_1_ReqResp tr_suback(in template IntegerList p_code, in template integer p_id) := |
| { |
| suback := { |
| header := { flags := '0000'B }, |
| packet_identifier := p_id, |
| payload := { |
| return_code := p_code |
| } |
| } |
| } |
| |
| function f_unsubscribe(in integer p_client, in charstring p_topic, inout integer p_id) |
| runs on IFW_MAIN_CT |
| { |
| f_IFW_MqttClient_setMessageToSend(p_client, valueof(t_unsubscribe(p_topic, p_id))); |
| f_IFW_MqttClient_send(p_client); |
| |
| f_IFW_MqttClient_receive(p_client); |
| f_handleVerdict(f_IFW_MqttClient_check(p_client, tr_unsuback(p_id))); |
| |
| f_nextPacketId(p_id); |
| } |
| |
| template MQTT_v3_1_1_ReqResp t_unsubscribe(in charstring p_topic, in integer p_id) := |
| { |
| unsubscribe := { |
| header := { flags := '0010'B }, |
| packet_identifier := p_id, |
| payload := { |
| topic_filter := { p_topic } |
| } |
| } |
| } |
| |
| template MQTT_v3_1_1_ReqResp tr_unsuback(in template integer p_id) := |
| { |
| unsuback := { |
| header := { flags := '0000'B }, |
| packet_identifier := p_id |
| } |
| } |
| |
| function f_connect(in integer p_client) runs on IFW_MAIN_CT |
| { |
| f_IFW_MqttClient_setMessageToSend(p_client, valueof(t_connect(p_client))); |
| f_IFW_MqttClient_send(p_client); |
| |
| f_IFW_MqttClient_receive(p_client); |
| f_handleVerdict(f_IFW_MqttClient_check(p_client, tr_connectAck)); |
| } |
| |
| function f_disconnect(in integer p_client) runs on IFW_MAIN_CT |
| { |
| f_IFW_MqttClient_setMessageToSend(p_client, valueof(t_disconnect)); |
| f_IFW_MqttClient_send(p_client); |
| } |
| |
| template MQTT_v3_1_1_ReqResp t_connect(integer p_id) := |
| { |
| connect_msg := { |
| header := { flags := '0000'B }, |
| name := "MQTT", |
| protocol_level := 4, |
| flags := { |
| user_name_flag := '0'B, |
| password_flag := '0'B, |
| will_retain := '0'B, |
| will_qos := AT_MOST_ONCE_DELIVERY, |
| will_flag := '0'B, |
| clean_session := '1'B |
| }, |
| keep_alive := 0, |
| payload := { |
| client_identifier := "myclientid_"&int2str(p_id), |
| will_topic := omit, |
| will_message := omit, |
| user_name := omit, |
| password := omit |
| } |
| } |
| } |
| |
| template MQTT_v3_1_1_ReqResp tr_connectAck := |
| { |
| connack := { |
| header := { flags := '0000'B }, |
| session_present_flag := '0'B, |
| connect_return_code := 0 |
| } |
| } |
| |
| template MQTT_v3_1_1_ReqResp t_disconnect := |
| { |
| disconnect_msg := { |
| header := { flags := '0000'B } |
| } |
| } |
| |
| function f_handleVerdict(in boolean p_verdict) |
| { |
| if (p_verdict) { setverdict(pass) } |
| else { setverdict(fail) } |
| } |
| |
| function f_nextPacketId(inout integer p_id) |
| { |
| p_id := p_id + 1; |
| } |
| |
| control |
| { |
| execute(tc_Mqtt_client_connect_disconnect()); |
| execute(tc_Mqtt_client_subscribe()); |
| execute(tc_Mqtt_client_unsubscribe()); |
| execute(tc_Mqtt_client_publish_qos0()); |
| execute(tc_Mqtt_client_publish_qos1()); |
| } |
| } |