1 /***************************************************************************
2 * Copyright (c) 2024 Microsoft Corporation
3 *
4 * This program and the accompanying materials are made available under the
5 * terms of the MIT License which is available at
6 * https://opensource.org/licenses/MIT.
7 *
8 * SPDX-License-Identifier: MIT
9 **************************************************************************/
10
11 #include <stdio.h>
12 #include <setjmp.h>
13 #include <cmocka.h> /* macros: https://api.cmocka.org/group__cmocka__asserts.html */
14
15 #include "nx_api.h"
16 #include "nx_azure_iot_hub_client.h"
17 #include "nx_azure_iot_cert.h"
18 #include "nx_azure_iot_ciphersuites.h"
19 #include "nx_azure_iot_provisioning_client.h"
20
21
22 #define DEMO_DHCP_DISABLE
23 #define DEMO_IPV4_ADDRESS IP_ADDRESS(192, 168, 100, 33)
24 #define DEMO_IPV4_MASK 0xFFFFFF00UL
25 #define DEMO_GATEWAY_ADDRESS IP_ADDRESS(192, 168, 100, 1)
26 #define DEMO_DNS_SERVER_ADDRESS IP_ADDRESS(192, 168, 100, 1)
27 #define NETWORK_DRIVER _nx_ram_network_driver
28
29 /* Include main.c in the test case since we need to disable DHCP in this test. */
30 #include "main.c"
31
32
33 #define STRING_UNSIGNED_ARGS(s) (UCHAR *)s, strlen(s)
34
35 #ifndef DEMO_CLOUD_STACK_SIZE
36 #define DEMO_CLOUD_STACK_SIZE 2048
37 #endif /* DEMO_CLOUD_STACK_SIZE */
38
39 #ifndef DEMO_CLOUD_THREAD_PRIORITY
40 #define DEMO_CLOUD_THREAD_PRIORITY (4)
41 #endif /* DEMO_CLOUD_THREAD_PRIORITY */
42
43 static NX_AZURE_IOT iot;
44 static NX_AZURE_IOT_HUB_CLIENT iot_client;
45 static NX_AZURE_IOT_PROVISIONING_CLIENT iot_prov_client;
46 static NX_SECURE_X509_CERT root_ca_cert;
47 static NX_SECURE_X509_CERT root_ca_cert_2;
48 static NX_SECURE_X509_CERT root_ca_cert_3;
49 static NX_SECURE_X509_CERT root_ca_cert_4;
50 static UCHAR metadata_buffer[NX_AZURE_IOT_TLS_METADATA_BUFFER_SIZE];
51 static ULONG demo_cloud_thread_stack[DEMO_CLOUD_STACK_SIZE / sizeof(ULONG)];
52 static NX_PACKET *allocated_packets[256];
53 static UCHAR large_property_name[2048];
54 static ULONG small_pool_stack[1024 >> 2];
55 static NX_PACKET_POOL small_pool;
56 extern int g_argc;
57 extern char **g_argv;
58
59 CHAR *expected_topic = "";
60 CHAR *expected_message = "";
61
demo_entry(NX_IP * ip_ptr,NX_PACKET_POOL * pool_ptr,NX_DNS * dns_ptr,UINT (* unix_time_callback)(ULONG * unix_time))62 VOID demo_entry(NX_IP* ip_ptr, NX_PACKET_POOL* pool_ptr, NX_DNS* dns_ptr, UINT (*unix_time_callback)(ULONG *unix_time))
63 {
64 CHAR *host_name = "host_name";
65 CHAR *device_id = "device_id";
66 CHAR *module_id = "module_id";
67 CHAR *endpoint = "host_name";
68 CHAR *id_scope = "id_scope";
69 CHAR *reg_id = "reg_id";
70
71 assert_int_equal(nx_packet_pool_create(&small_pool, "Small Packet Pool", 4,
72 (UCHAR *)small_pool_stack , sizeof(small_pool_stack)),
73 NX_AZURE_IOT_SUCCESS);
74
75 /* Initialize root certificate. */
76 assert_int_equal(nx_secure_x509_certificate_initialize(&root_ca_cert, (UCHAR *)_nx_azure_iot_root_cert, (USHORT)_nx_azure_iot_root_cert_size,
77 NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE),
78 NX_AZURE_IOT_SUCCESS);
79 assert_int_equal(nx_secure_x509_certificate_initialize(&root_ca_cert_2, (UCHAR *)_nx_azure_iot_root_cert_2, (USHORT)_nx_azure_iot_root_cert_size_2,
80 NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE),
81 NX_AZURE_IOT_SUCCESS);
82 assert_int_equal(nx_secure_x509_certificate_initialize(&root_ca_cert_2, (UCHAR *)_nx_azure_iot_root_cert_3, (USHORT)_nx_azure_iot_root_cert_size_3,
83 NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE),
84 NX_AZURE_IOT_SUCCESS);
85
86 assert_int_equal(nx_azure_iot_create(&iot, (UCHAR *)"Azure IoT", ip_ptr, pool_ptr, dns_ptr, (UCHAR *)demo_cloud_thread_stack,
87 sizeof(demo_cloud_thread_stack), DEMO_CLOUD_THREAD_PRIORITY, unix_time_callback),
88 NX_AZURE_IOT_SUCCESS);
89
90 /* Initialize IoT hub client. */
91 assert_int_equal(nx_azure_iot_hub_client_initialize(&iot_client, &iot,
92 STRING_UNSIGNED_ARGS(host_name),
93 STRING_UNSIGNED_ARGS(device_id),
94 STRING_UNSIGNED_ARGS(""),
95 _nx_azure_iot_tls_supported_crypto,
96 _nx_azure_iot_tls_supported_crypto_size,
97 _nx_azure_iot_tls_ciphersuite_map,
98 _nx_azure_iot_tls_ciphersuite_map_size,
99 metadata_buffer, sizeof(metadata_buffer),
100 &root_ca_cert),
101 NX_AZURE_IOT_SUCCESS);
102
103 /* FAIL: hub_client_ptr is NULL. */
104 assert_int_not_equal(nx_azure_iot_hub_client_trusted_cert_add(NX_NULL, &root_ca_cert_2),
105 NX_AZURE_IOT_SUCCESS);
106
107 /* FAIL: trusted_certificate is NULL. */
108 assert_int_not_equal(nx_azure_iot_hub_client_trusted_cert_add(&iot_client, NX_NULL),
109 NX_AZURE_IOT_SUCCESS);
110
111 #if (NX_AZURE_IOT_MAX_NUM_OF_TRUSTED_CERTS == 3)
112 /* SUCCESS: set trusted certificate again. */
113 assert_int_equal(nx_azure_iot_hub_client_trusted_cert_add(&iot_client, &root_ca_cert_2),
114 NX_AZURE_IOT_SUCCESS);
115 assert_int_equal(nx_azure_iot_hub_client_trusted_cert_add(&iot_client, &root_ca_cert_3),
116 NX_AZURE_IOT_SUCCESS);
117
118 /* FAIL: no more entry for trusted cert. */
119 assert_int_not_equal(nx_azure_iot_hub_client_trusted_cert_add(&iot_client, &root_ca_cert_4),
120 NX_AZURE_IOT_SUCCESS);
121 #endif
122
123 /* Deinitialize IoT hub client. */
124 assert_int_equal(nx_azure_iot_hub_client_deinitialize(&iot_client),
125 NX_AZURE_IOT_SUCCESS);
126
127
128 /* Initialize provisioning client. */
129 assert_int_equal(nx_azure_iot_provisioning_client_initialize(&iot_prov_client, &iot,
130 endpoint, sizeof(endpoint) - 1,
131 id_scope, sizeof(id_scope) - 1,
132 reg_id, sizeof(reg_id) - 1,
133 _nx_azure_iot_tls_supported_crypto,
134 _nx_azure_iot_tls_supported_crypto_size,
135 _nx_azure_iot_tls_ciphersuite_map,
136 _nx_azure_iot_tls_ciphersuite_map_size,
137 metadata_buffer, sizeof(metadata_buffer),
138 &root_ca_cert),
139 NX_AZURE_IOT_SUCCESS);
140
141 /* FAIL: iot_prov_client is NULL. */
142 assert_int_not_equal(nx_azure_iot_provisioning_client_trusted_cert_add(NX_NULL, &root_ca_cert_2),
143 NX_AZURE_IOT_SUCCESS);
144
145 /* FAIL: trusted_certificate is NULL. */
146 assert_int_not_equal(nx_azure_iot_provisioning_client_trusted_cert_add(&iot_prov_client, NX_NULL),
147 NX_AZURE_IOT_SUCCESS);
148
149 #if (NX_AZURE_IOT_MAX_NUM_OF_TRUSTED_CERTS == 3)
150 /* SUCCESS: set trusted certificate again. */
151 assert_int_equal(nx_azure_iot_provisioning_client_trusted_cert_add(&iot_prov_client, &root_ca_cert_2),
152 NX_AZURE_IOT_SUCCESS);
153 assert_int_equal(nx_azure_iot_provisioning_client_trusted_cert_add(&iot_prov_client, &root_ca_cert_3),
154 NX_AZURE_IOT_SUCCESS);
155
156 /* FAIL: no more entry for trusted cert. */
157 assert_int_not_equal(nx_azure_iot_provisioning_client_trusted_cert_add(&iot_prov_client, &root_ca_cert_4),
158 NX_AZURE_IOT_SUCCESS);
159 #endif
160
161 /* Deinitialize IoT provisioning client. */
162 assert_int_equal(nx_azure_iot_provisioning_client_deinitialize(&iot_prov_client),
163 NX_AZURE_IOT_SUCCESS);
164
165
166 /* SUCCESS: iot is deleted. */
167 assert_int_equal(nx_azure_iot_delete(&iot), NX_AZURE_IOT_SUCCESS);
168 }
169
170