summaryrefslogtreecommitdiff
path: root/test/regression/interoperability_test/mqtt_test/netx_mqtt_subscriber_empty_message_test.c
blob: 75f4734da9aa92a759a6aad61cdc854a93256ed3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
/***************************************************************************/
/* Copyright (c) 2024 Microsoft Corporation                                */
/* Copyright (c) 2026 Eclipse ThreadX contributors                         */
/*                                                                         */
/* This program and the accompanying materials are made available under    */
/* the terms of the MIT License which is available at                      */
/* https://opensource.org/licenses/MIT.                                    */
/*                                                                         */
/* SPDX-License-Identifier: MIT                                            */
/***************************************************************************/

#include "mqtt_interoperability_test.h"
#include "nxd_mqtt_client.h"

#ifdef NXD_MQTT_REQUIRE_TLS
INT mqtt_subscriber_entry(TLS_TEST_INSTANCE* instance_ptr)
{
    print_error_message( "Require TLS.\n");
    return 0;
}
#else /* ifdef NX_SECURE_ENABLE */
/* Define the ThreadX and NetX object control blocks...  */

NX_PACKET_POOL    pool_0;
NX_IP             ip_0;  

NX_TCP_SOCKET tcp_socket;

#define REMOTE_SERVER_PORT          4433
#define LOCAL_CLIENT_PORT           30024

/* Define the IP thread's stack area.  */
ULONG             ip_thread_stack[3 * 1024 / sizeof(ULONG)];

/* Define packet pool for the demonstration.  */
#define NX_PACKET_POOL_SIZE ((1536 + sizeof(NX_PACKET)) * 32)
ULONG             packet_pool_area[NX_PACKET_POOL_SIZE/sizeof(ULONG) + 64 / sizeof(ULONG)];

/* Define the ARP cache area.  */
ULONG             arp_space_area[512 / sizeof(ULONG)];

/* Define the demo thread.  */
ULONG             demo_thread_stack[6 * 1024 / sizeof(ULONG)];
TX_THREAD         demo_thread;

/* Define the pcap driver function. */
VOID    _nx_pcap_network_driver(NX_IP_DRIVER *driver_req_ptr);

/* Define a global variable for the pointer of current test instance. */
TLS_TEST_INSTANCE* client_instance_ptr;
void client_thread_entry(ULONG thread_input);

/* Declare semaphores. */
extern TLS_TEST_SEMAPHORE* semaphore_mqtt_server_prepared;
extern TLS_TEST_SEMAPHORE* semaphore_mqtt_topic_subscribed;
extern TLS_TEST_SEMAPHORE* semaphore_mqtt_message_published;
extern TLS_TEST_SEMAPHORE* semaphore_mqtt_test_finished;

INT mqtt_subscriber_entry(TLS_TEST_INSTANCE* instance_ptr)
{
    client_instance_ptr = instance_ptr;
    tx_kernel_enter();
}

#ifdef CTEST
VOID test_application_define(void *first_unused_memory)
#else
void    tx_application_define(void *first_unused_memory)
#endif
{
UINT  status;

    /* Initialize the NetX system.  */
    nx_system_initialize();
    
    /* Create a packet pool.  */
    status =  nx_packet_pool_create(&pool_0, "NetX Main Packet Pool", 1536,  (ULONG*)(((int)packet_pool_area + 64) & ~63) , NX_PACKET_POOL_SIZE);
    show_error_message_if_fail(NX_SUCCESS == status);

    /* Create an IP instance.  */
    status = nx_ip_create(&ip_0, 
                          "NetX IP Instance 0", 
                          TLS_TEST_IP_ADDRESS_NUMBER,                           
                          0xFFFFFF00UL, 
                          &pool_0,
                          _nx_pcap_network_driver,
                          (UCHAR*)ip_thread_stack,
                          sizeof(ip_thread_stack),
                          1);
    show_error_message_if_fail(NX_SUCCESS == status);
    
    /* Enable ARP and supply ARP cache memory for IP Instance 0.  */
    status =  nx_arp_enable(&ip_0, (void *)arp_space_area, sizeof(arp_space_area));
    show_error_message_if_fail(NX_SUCCESS == status);

    /* Enable TCP traffic.  */
    status =  nx_tcp_enable(&ip_0);
    show_error_message_if_fail(NX_SUCCESS == status);

    /* Enable UDP traffic.  */
    status =  nx_udp_enable(&ip_0);
    show_error_message_if_fail(NX_SUCCESS == status);

    /* Enable ICMP.  */
    status =  nx_icmp_enable(&ip_0);
    show_error_message_if_fail(NX_SUCCESS == status);

    status =  nx_ip_fragment_enable(&ip_0);
    show_error_message_if_fail(NX_SUCCESS == status);
    tx_thread_create(&demo_thread, "demo thread", client_thread_entry, 0,
            demo_thread_stack, sizeof(demo_thread_stack),
            16, 16, 4, TX_AUTO_START);
}

/* Declare the MQTT client control block. */
static NXD_MQTT_CLIENT              mqtt_client;
#define  CLIENT_ID_STRING           "mytestclient"
#define  MQTT_CLIENT_STACK_SIZE     4096

/* Define the priority of the MQTT internal thread. */
#define MQTT_THREAD_PRIORTY         2

/* Declare a 2000-byte memory space the application supplies to the MQTT client instance. */
static ULONG                        client_memory[2000 / sizeof(ULONG)];

/* Declare the MQTT thread stack space. */
static ULONG                        mqtt_client_stack[MQTT_CLIENT_STACK_SIZE / sizeof(ULONG)];

/* Define the MQTT keep alive timer for 5 minutes */
#define MQTT_KEEP_ALIVE_TIMER       300

/* Define the subscribed topic. */
#define TOPIC_NAME                  "test"

#define QOS0                        0
#define QOS1                        1

/* Declare buffers to hold message and topic. */
static UCHAR message_buffer[NXD_MQTT_MAX_MESSAGE_LENGTH];
static UCHAR topic_buffer[NXD_MQTT_MAX_TOPIC_NAME_LENGTH];

void client_thread_entry(ULONG thread_input)
{
UINT        status, topic_length, message_length = 0xFFFFFFFF;
NXD_ADDRESS server_ip;
INT         test_result = 0;
    
    /* Address of remote server. */
    print_error_message( "remote ip address number %lu, remote ip address string %s.\n", REMOTE_IP_ADDRESS_NUMBER, REMOTE_IP_ADDRESS_STRING);
    
    /* Create MQTT client instance. */
    status = nxd_mqtt_client_create(&mqtt_client, "my_client", CLIENT_ID_STRING, strlen(CLIENT_ID_STRING),
                                    &ip_0, &pool_0, (VOID*)mqtt_client_stack, sizeof(mqtt_client_stack), 
                                    MQTT_THREAD_PRIORTY,
                                    (UCHAR*)client_memory, sizeof(client_memory));
    exit_if_fail(NX_SUCCESS == status, TLS_TEST_UNKNOWN_TYPE_ERROR);
    
    /* Wait for the mqtt server. */
    tls_test_semaphore_wait(semaphore_mqtt_server_prepared);
    print_error_message( "subscriber get semaphore_server_prepared.\n");

    /* Start the connection to the server. */
    server_ip.nxd_ip_version = 4;
    server_ip.nxd_ip_address.v4 = REMOTE_IP_ADDRESS_NUMBER;
    status = nxd_mqtt_client_connect(&mqtt_client, &server_ip, MQTT_PORT, 
                                     MQTT_KEEP_ALIVE_TIMER, 0, NX_WAIT_FOREVER);
    exit_if_fail(NX_SUCCESS == status, TLS_TEST_UNKNOWN_TYPE_ERROR);
    
    /* Subscribe to the topic with QoS level 0. */
    status = nxd_mqtt_client_subscribe(&mqtt_client, TOPIC_NAME, strlen(TOPIC_NAME), QOS0);
    add_error_counter_if_fail(NX_SUCCESS == status, test_result);

    /* Post the semaphore to indicate that the given topic is subscribed. */
    tls_test_semaphore_post(semaphore_mqtt_topic_subscribed);
    
    /* Wait for the publisher. */
    tls_test_semaphore_wait(semaphore_mqtt_message_published);
    status = nxd_mqtt_client_message_get(&mqtt_client, topic_buffer, sizeof(topic_buffer), &topic_length, 
                                         message_buffer, sizeof(message_buffer), &message_length);
    add_error_counter_if_fail(NX_SUCCESS == status, test_result);

    /* Verify test result. */
    if(status == NXD_MQTT_SUCCESS)
    {
        add_error_counter_if_fail( 0 == message_length, test_result);
    }
    
    /* Now unsubscribe the topic. */
    status = nxd_mqtt_client_unsubscribe(&mqtt_client, TOPIC_NAME, strlen(TOPIC_NAME));
    add_error_counter_if_fail(NX_SUCCESS == status, test_result);

    /* Disconnect from the broker. */
    status = nxd_mqtt_client_disconnect(&mqtt_client);
    add_error_counter_if_fail(NX_SUCCESS == status, test_result);

    /* Delete the client instance, release all the resources. */
    status = nxd_mqtt_client_delete(&mqtt_client);
    add_error_counter_if_fail(NX_SUCCESS == status, test_result);
    
    /* Post the semaphore to indicate that the test is finished. */
    status = tls_test_semaphore_post(semaphore_mqtt_test_finished);
    add_error_counter_if_fail(NX_SUCCESS == status, test_result);

    exit(test_result);
}
#endif