Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of MQTTPacket by
test/test1.txt@12:cd99ac9cb25a, 2014-08-01 (annotated)
- Committer:
- Ian Craggs
- Date:
- Fri Aug 01 13:03:52 2014 +0100
- Revision:
- 12:cd99ac9cb25a
- Parent:
- 2:bc3bc0e3b764
Change boolean fields to char size, for C++ integration
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Ian Craggs |
12:cd99ac9cb25a | 1 | /******************************************************************************* |
Ian Craggs |
12:cd99ac9cb25a | 2 | * Copyright (c) 2014 IBM Corp. |
Ian Craggs |
12:cd99ac9cb25a | 3 | * |
Ian Craggs |
12:cd99ac9cb25a | 4 | * All rights reserved. This program and the accompanying materials |
Ian Craggs |
12:cd99ac9cb25a | 5 | * are made available under the terms of the Eclipse Public License v1.0 |
Ian Craggs |
12:cd99ac9cb25a | 6 | * and Eclipse Distribution License v1.0 which accompany this distribution. |
Ian Craggs |
12:cd99ac9cb25a | 7 | * |
Ian Craggs |
12:cd99ac9cb25a | 8 | * The Eclipse Public License is available at |
Ian Craggs |
12:cd99ac9cb25a | 9 | * http://www.eclipse.org/legal/epl-v10.html |
Ian Craggs |
12:cd99ac9cb25a | 10 | * and the Eclipse Distribution License is available at |
Ian Craggs |
12:cd99ac9cb25a | 11 | * http://www.eclipse.org/org/documents/edl-v10.php. |
Ian Craggs |
12:cd99ac9cb25a | 12 | * |
Ian Craggs |
12:cd99ac9cb25a | 13 | * Contributors: |
Ian Craggs |
12:cd99ac9cb25a | 14 | * Ian Craggs - initial API and implementation and/or initial documentation |
Ian Craggs |
12:cd99ac9cb25a | 15 | *******************************************************************************/ |
Ian Craggs |
12:cd99ac9cb25a | 16 | |
Ian Craggs |
12:cd99ac9cb25a | 17 | |
Ian Craggs |
12:cd99ac9cb25a | 18 | #include "MQTTPacket.h" |
Ian Craggs |
12:cd99ac9cb25a | 19 | #include <string.h> |
Ian Craggs |
12:cd99ac9cb25a | 20 | #include <stdlib.h> |
Ian Craggs |
12:cd99ac9cb25a | 21 | #include <stdio.h> |
Ian Craggs |
12:cd99ac9cb25a | 22 | |
Ian Craggs |
12:cd99ac9cb25a | 23 | #if !defined(_WINDOWS) |
Ian Craggs |
12:cd99ac9cb25a | 24 | #include <sys/time.h> |
Ian Craggs |
12:cd99ac9cb25a | 25 | #include <sys/socket.h> |
Ian Craggs |
12:cd99ac9cb25a | 26 | #include <unistd.h> |
Ian Craggs |
12:cd99ac9cb25a | 27 | #include <errno.h> |
Ian Craggs |
12:cd99ac9cb25a | 28 | #else |
Ian Craggs |
12:cd99ac9cb25a | 29 | #include <winsock2.h> |
Ian Craggs |
12:cd99ac9cb25a | 30 | #include <ws2tcpip.h> |
Ian Craggs |
12:cd99ac9cb25a | 31 | #define MAXHOSTNAMELEN 256 |
Ian Craggs |
12:cd99ac9cb25a | 32 | #define EAGAIN WSAEWOULDBLOCK |
Ian Craggs |
12:cd99ac9cb25a | 33 | #define EINTR WSAEINTR |
Ian Craggs |
12:cd99ac9cb25a | 34 | #define EINPROGRESS WSAEINPROGRESS |
Ian Craggs |
12:cd99ac9cb25a | 35 | #define EWOULDBLOCK WSAEWOULDBLOCK |
Ian Craggs |
12:cd99ac9cb25a | 36 | #define ENOTCONN WSAENOTCONN |
Ian Craggs |
12:cd99ac9cb25a | 37 | #define ECONNRESET WSAECONNRESET |
Ian Craggs |
12:cd99ac9cb25a | 38 | #endif |
Ian Craggs |
12:cd99ac9cb25a | 39 | |
Ian Craggs |
12:cd99ac9cb25a | 40 | #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0])) |
Ian Craggs |
12:cd99ac9cb25a | 41 | |
Ian Craggs |
12:cd99ac9cb25a | 42 | struct Options |
Ian Craggs |
12:cd99ac9cb25a | 43 | { |
Ian Craggs |
12:cd99ac9cb25a | 44 | char* connection; /**< connection to system under test. */ |
Ian Craggs |
12:cd99ac9cb25a | 45 | char** haconnections; |
Ian Craggs |
12:cd99ac9cb25a | 46 | int hacount; |
Ian Craggs |
12:cd99ac9cb25a | 47 | int verbose; |
Ian Craggs |
12:cd99ac9cb25a | 48 | int test_no; |
Ian Craggs |
12:cd99ac9cb25a | 49 | } options = |
Ian Craggs |
12:cd99ac9cb25a | 50 | { |
Ian Craggs |
12:cd99ac9cb25a | 51 | "tcp://m2m.eclipse.org:1883", |
Ian Craggs |
12:cd99ac9cb25a | 52 | NULL, |
Ian Craggs |
12:cd99ac9cb25a | 53 | 0, |
Ian Craggs |
12:cd99ac9cb25a | 54 | 0, |
Ian Craggs |
12:cd99ac9cb25a | 55 | 0, |
Ian Craggs |
12:cd99ac9cb25a | 56 | }; |
Ian Craggs |
12:cd99ac9cb25a | 57 | |
Ian Craggs |
12:cd99ac9cb25a | 58 | void usage() |
Ian Craggs |
12:cd99ac9cb25a | 59 | { |
Ian Craggs |
12:cd99ac9cb25a | 60 | |
Ian Craggs |
12:cd99ac9cb25a | 61 | } |
Ian Craggs |
12:cd99ac9cb25a | 62 | |
Ian Craggs |
12:cd99ac9cb25a | 63 | void getopts(int argc, char** argv) |
Ian Craggs |
12:cd99ac9cb25a | 64 | { |
Ian Craggs |
12:cd99ac9cb25a | 65 | int count = 1; |
Ian Craggs |
12:cd99ac9cb25a | 66 | |
Ian Craggs |
12:cd99ac9cb25a | 67 | while (count < argc) |
Ian Craggs |
12:cd99ac9cb25a | 68 | { |
Ian Craggs |
12:cd99ac9cb25a | 69 | if (strcmp(argv[count], "--test_no") == 0) |
Ian Craggs |
12:cd99ac9cb25a | 70 | { |
Ian Craggs |
12:cd99ac9cb25a | 71 | if (++count < argc) |
Ian Craggs |
12:cd99ac9cb25a | 72 | options.test_no = atoi(argv[count]); |
Ian Craggs |
12:cd99ac9cb25a | 73 | else |
Ian Craggs |
12:cd99ac9cb25a | 74 | usage(); |
Ian Craggs |
12:cd99ac9cb25a | 75 | } |
Ian Craggs |
12:cd99ac9cb25a | 76 | else if (strcmp(argv[count], "--connection") == 0) |
Ian Craggs |
12:cd99ac9cb25a | 77 | { |
Ian Craggs |
12:cd99ac9cb25a | 78 | if (++count < argc) |
Ian Craggs |
12:cd99ac9cb25a | 79 | { |
Ian Craggs |
12:cd99ac9cb25a | 80 | options.connection = argv[count]; |
Ian Craggs |
12:cd99ac9cb25a | 81 | printf("\nSetting connection to %s\n", options.connection); |
Ian Craggs |
12:cd99ac9cb25a | 82 | } |
Ian Craggs |
12:cd99ac9cb25a | 83 | else |
Ian Craggs |
12:cd99ac9cb25a | 84 | usage(); |
Ian Craggs |
12:cd99ac9cb25a | 85 | } |
Ian Craggs |
12:cd99ac9cb25a | 86 | else if (strcmp(argv[count], "--haconnections") == 0) |
Ian Craggs |
12:cd99ac9cb25a | 87 | { |
Ian Craggs |
12:cd99ac9cb25a | 88 | if (++count < argc) |
Ian Craggs |
12:cd99ac9cb25a | 89 | { |
Ian Craggs |
12:cd99ac9cb25a | 90 | char* tok = strtok(argv[count], " "); |
Ian Craggs |
12:cd99ac9cb25a | 91 | options.hacount = 0; |
Ian Craggs |
12:cd99ac9cb25a | 92 | options.haconnections = malloc(sizeof(char*) * 5); |
Ian Craggs |
12:cd99ac9cb25a | 93 | while (tok) |
Ian Craggs |
12:cd99ac9cb25a | 94 | { |
Ian Craggs |
12:cd99ac9cb25a | 95 | options.haconnections[options.hacount] = malloc(strlen(tok) + 1); |
Ian Craggs |
12:cd99ac9cb25a | 96 | strcpy(options.haconnections[options.hacount], tok); |
Ian Craggs |
12:cd99ac9cb25a | 97 | options.hacount++; |
Ian Craggs |
12:cd99ac9cb25a | 98 | tok = strtok(NULL, " "); |
Ian Craggs |
12:cd99ac9cb25a | 99 | } |
Ian Craggs |
12:cd99ac9cb25a | 100 | } |
Ian Craggs |
12:cd99ac9cb25a | 101 | else |
Ian Craggs |
12:cd99ac9cb25a | 102 | usage(); |
Ian Craggs |
12:cd99ac9cb25a | 103 | } |
Ian Craggs |
12:cd99ac9cb25a | 104 | else if (strcmp(argv[count], "--verbose") == 0) |
Ian Craggs |
12:cd99ac9cb25a | 105 | { |
Ian Craggs |
12:cd99ac9cb25a | 106 | options.verbose = 1; |
Ian Craggs |
12:cd99ac9cb25a | 107 | printf("\nSetting verbose on\n"); |
Ian Craggs |
12:cd99ac9cb25a | 108 | } |
Ian Craggs |
12:cd99ac9cb25a | 109 | count++; |
Ian Craggs |
12:cd99ac9cb25a | 110 | } |
Ian Craggs |
12:cd99ac9cb25a | 111 | } |
Ian Craggs |
12:cd99ac9cb25a | 112 | |
Ian Craggs |
12:cd99ac9cb25a | 113 | |
Ian Craggs |
12:cd99ac9cb25a | 114 | #define LOGA_DEBUG 0 |
Ian Craggs |
12:cd99ac9cb25a | 115 | #define LOGA_INFO 1 |
Ian Craggs |
12:cd99ac9cb25a | 116 | #include <stdarg.h> |
Ian Craggs |
12:cd99ac9cb25a | 117 | #include <time.h> |
Ian Craggs |
12:cd99ac9cb25a | 118 | #include <sys/timeb.h> |
Ian Craggs |
12:cd99ac9cb25a | 119 | void MyLog(int LOGA_level, char* format, ...) |
Ian Craggs |
12:cd99ac9cb25a | 120 | { |
Ian Craggs |
12:cd99ac9cb25a | 121 | static char msg_buf[256]; |
Ian Craggs |
12:cd99ac9cb25a | 122 | va_list args; |
Ian Craggs |
12:cd99ac9cb25a | 123 | struct timeb ts; |
Ian Craggs |
12:cd99ac9cb25a | 124 | |
Ian Craggs |
12:cd99ac9cb25a | 125 | struct tm *timeinfo; |
Ian Craggs |
12:cd99ac9cb25a | 126 | |
Ian Craggs |
12:cd99ac9cb25a | 127 | if (LOGA_level == LOGA_DEBUG && options.verbose == 0) |
Ian Craggs |
12:cd99ac9cb25a | 128 | return; |
Ian Craggs |
12:cd99ac9cb25a | 129 | |
Ian Craggs |
12:cd99ac9cb25a | 130 | ftime(&ts); |
Ian Craggs |
12:cd99ac9cb25a | 131 | timeinfo = localtime(&ts.time); |
Ian Craggs |
12:cd99ac9cb25a | 132 | strftime(msg_buf, 80, "%Y%m%d %H%M%S", timeinfo); |
Ian Craggs |
12:cd99ac9cb25a | 133 | |
Ian Craggs |
12:cd99ac9cb25a | 134 | sprintf(&msg_buf[strlen(msg_buf)], ".%.3hu ", ts.millitm); |
Ian Craggs |
12:cd99ac9cb25a | 135 | |
Ian Craggs |
12:cd99ac9cb25a | 136 | va_start(args, format); |
Ian Craggs |
12:cd99ac9cb25a | 137 | vsnprintf(&msg_buf[strlen(msg_buf)], sizeof(msg_buf) - strlen(msg_buf), format, args); |
Ian Craggs |
12:cd99ac9cb25a | 138 | va_end(args); |
Ian Craggs |
12:cd99ac9cb25a | 139 | |
Ian Craggs |
12:cd99ac9cb25a | 140 | printf("%s\n", msg_buf); |
Ian Craggs |
12:cd99ac9cb25a | 141 | fflush(stdout); |
Ian Craggs |
12:cd99ac9cb25a | 142 | } |
Ian Craggs |
12:cd99ac9cb25a | 143 | |
Ian Craggs |
12:cd99ac9cb25a | 144 | |
Ian Craggs |
12:cd99ac9cb25a | 145 | #if defined(WIN32) || defined(_WINDOWS) |
Ian Craggs |
12:cd99ac9cb25a | 146 | #define mqsleep(A) Sleep(1000*A) |
Ian Craggs |
12:cd99ac9cb25a | 147 | #define START_TIME_TYPE DWORD |
Ian Craggs |
12:cd99ac9cb25a | 148 | static DWORD start_time = 0; |
Ian Craggs |
12:cd99ac9cb25a | 149 | START_TIME_TYPE start_clock(void) |
Ian Craggs |
12:cd99ac9cb25a | 150 | { |
Ian Craggs |
12:cd99ac9cb25a | 151 | return GetTickCount(); |
Ian Craggs |
12:cd99ac9cb25a | 152 | } |
Ian Craggs |
12:cd99ac9cb25a | 153 | #elif defined(AIX) |
Ian Craggs |
12:cd99ac9cb25a | 154 | #define mqsleep sleep |
Ian Craggs |
12:cd99ac9cb25a | 155 | #define START_TIME_TYPE struct timespec |
Ian Craggs |
12:cd99ac9cb25a | 156 | START_TIME_TYPE start_clock(void) |
Ian Craggs |
12:cd99ac9cb25a | 157 | { |
Ian Craggs |
12:cd99ac9cb25a | 158 | static struct timespec start; |
Ian Craggs |
12:cd99ac9cb25a | 159 | clock_gettime(CLOCK_REALTIME, &start); |
Ian Craggs |
12:cd99ac9cb25a | 160 | return start; |
Ian Craggs |
12:cd99ac9cb25a | 161 | } |
Ian Craggs |
12:cd99ac9cb25a | 162 | #else |
Ian Craggs |
12:cd99ac9cb25a | 163 | #define mqsleep sleep |
Ian Craggs |
12:cd99ac9cb25a | 164 | #define START_TIME_TYPE struct timeval |
Ian Craggs |
12:cd99ac9cb25a | 165 | /* TODO - unused - remove? static struct timeval start_time; */ |
Ian Craggs |
12:cd99ac9cb25a | 166 | START_TIME_TYPE start_clock(void) |
Ian Craggs |
12:cd99ac9cb25a | 167 | { |
Ian Craggs |
12:cd99ac9cb25a | 168 | struct timeval start_time; |
Ian Craggs |
12:cd99ac9cb25a | 169 | gettimeofday(&start_time, NULL); |
Ian Craggs |
12:cd99ac9cb25a | 170 | return start_time; |
Ian Craggs |
12:cd99ac9cb25a | 171 | } |
Ian Craggs |
12:cd99ac9cb25a | 172 | #endif |
Ian Craggs |
12:cd99ac9cb25a | 173 | |
Ian Craggs |
12:cd99ac9cb25a | 174 | |
Ian Craggs |
12:cd99ac9cb25a | 175 | #if defined(WIN32) |
Ian Craggs |
12:cd99ac9cb25a | 176 | long elapsed(START_TIME_TYPE start_time) |
Ian Craggs |
12:cd99ac9cb25a | 177 | { |
Ian Craggs |
12:cd99ac9cb25a | 178 | return GetTickCount() - start_time; |
Ian Craggs |
12:cd99ac9cb25a | 179 | } |
Ian Craggs |
12:cd99ac9cb25a | 180 | #elif defined(AIX) |
Ian Craggs |
12:cd99ac9cb25a | 181 | #define assert(a) |
Ian Craggs |
12:cd99ac9cb25a | 182 | long elapsed(struct timespec start) |
Ian Craggs |
12:cd99ac9cb25a | 183 | { |
Ian Craggs |
12:cd99ac9cb25a | 184 | struct timespec now, res; |
Ian Craggs |
12:cd99ac9cb25a | 185 | |
Ian Craggs |
12:cd99ac9cb25a | 186 | clock_gettime(CLOCK_REALTIME, &now); |
Ian Craggs |
12:cd99ac9cb25a | 187 | ntimersub(now, start, res); |
Ian Craggs |
12:cd99ac9cb25a | 188 | return (res.tv_sec)*1000L + (res.tv_nsec)/1000000L; |
Ian Craggs |
12:cd99ac9cb25a | 189 | } |
Ian Craggs |
12:cd99ac9cb25a | 190 | #else |
Ian Craggs |
12:cd99ac9cb25a | 191 | long elapsed(START_TIME_TYPE start_time) |
Ian Craggs |
12:cd99ac9cb25a | 192 | { |
Ian Craggs |
12:cd99ac9cb25a | 193 | struct timeval now, res; |
Ian Craggs |
12:cd99ac9cb25a | 194 | |
Ian Craggs |
12:cd99ac9cb25a | 195 | gettimeofday(&now, NULL); |
Ian Craggs |
12:cd99ac9cb25a | 196 | timersub(&now, &start_time, &res); |
Ian Craggs |
12:cd99ac9cb25a | 197 | return (res.tv_sec)*1000 + (res.tv_usec)/1000; |
Ian Craggs |
12:cd99ac9cb25a | 198 | } |
Ian Craggs |
12:cd99ac9cb25a | 199 | #endif |
Ian Craggs |
12:cd99ac9cb25a | 200 | |
Ian Craggs |
12:cd99ac9cb25a | 201 | |
Ian Craggs |
12:cd99ac9cb25a | 202 | #define assert(a, b, c, d) myassert(__FILE__, __LINE__, a, b, c, d) |
Ian Craggs |
12:cd99ac9cb25a | 203 | #define assert1(a, b, c, d, e) myassert(__FILE__, __LINE__, a, b, c, d, e) |
Ian Craggs |
12:cd99ac9cb25a | 204 | |
Ian Craggs |
12:cd99ac9cb25a | 205 | int tests = 0; |
Ian Craggs |
12:cd99ac9cb25a | 206 | int failures = 0; |
Ian Craggs |
12:cd99ac9cb25a | 207 | FILE* xml; |
Ian Craggs |
12:cd99ac9cb25a | 208 | START_TIME_TYPE global_start_time; |
Ian Craggs |
12:cd99ac9cb25a | 209 | char output[3000]; |
Ian Craggs |
12:cd99ac9cb25a | 210 | char* cur_output = output; |
Ian Craggs |
12:cd99ac9cb25a | 211 | |
Ian Craggs |
12:cd99ac9cb25a | 212 | |
Ian Craggs |
12:cd99ac9cb25a | 213 | void write_test_result() |
Ian Craggs |
12:cd99ac9cb25a | 214 | { |
Ian Craggs |
12:cd99ac9cb25a | 215 | long duration = elapsed(global_start_time); |
Ian Craggs |
12:cd99ac9cb25a | 216 | |
Ian Craggs |
12:cd99ac9cb25a | 217 | fprintf(xml, " time=\"%ld.%.3ld\" >\n", duration / 1000, duration % 1000); |
Ian Craggs |
12:cd99ac9cb25a | 218 | if (cur_output != output) |
Ian Craggs |
12:cd99ac9cb25a | 219 | { |
Ian Craggs |
12:cd99ac9cb25a | 220 | fprintf(xml, "%s", output); |
Ian Craggs |
12:cd99ac9cb25a | 221 | cur_output = output; |
Ian Craggs |
12:cd99ac9cb25a | 222 | } |
Ian Craggs |
12:cd99ac9cb25a | 223 | fprintf(xml, "</testcase>\n"); |
Ian Craggs |
12:cd99ac9cb25a | 224 | } |
Ian Craggs |
12:cd99ac9cb25a | 225 | |
Ian Craggs |
12:cd99ac9cb25a | 226 | |
Ian Craggs |
12:cd99ac9cb25a | 227 | void myassert(char* filename, int lineno, char* description, int value, char* format, ...) |
Ian Craggs |
12:cd99ac9cb25a | 228 | { |
Ian Craggs |
12:cd99ac9cb25a | 229 | ++tests; |
Ian Craggs |
12:cd99ac9cb25a | 230 | if (!value) |
Ian Craggs |
12:cd99ac9cb25a | 231 | { |
Ian Craggs |
12:cd99ac9cb25a | 232 | va_list args; |
Ian Craggs |
12:cd99ac9cb25a | 233 | |
Ian Craggs |
12:cd99ac9cb25a | 234 | ++failures; |
Ian Craggs |
12:cd99ac9cb25a | 235 | printf("Assertion failed, file %s, line %d, description: %s\n", filename, lineno, description); |
Ian Craggs |
12:cd99ac9cb25a | 236 | |
Ian Craggs |
12:cd99ac9cb25a | 237 | va_start(args, format); |
Ian Craggs |
12:cd99ac9cb25a | 238 | vprintf(format, args); |
Ian Craggs |
12:cd99ac9cb25a | 239 | va_end(args); |
Ian Craggs |
12:cd99ac9cb25a | 240 | |
Ian Craggs |
12:cd99ac9cb25a | 241 | cur_output += sprintf(cur_output, "<failure type=\"%s\">file %s, line %d </failure>\n", |
Ian Craggs |
12:cd99ac9cb25a | 242 | description, filename, lineno); |
Ian Craggs |
12:cd99ac9cb25a | 243 | } |
Ian Craggs |
12:cd99ac9cb25a | 244 | else |
Ian Craggs |
12:cd99ac9cb25a | 245 | MyLog(LOGA_DEBUG, "Assertion succeeded, file %s, line %d, description: %s", filename, lineno, description); |
Ian Craggs |
12:cd99ac9cb25a | 246 | } |
Ian Craggs |
12:cd99ac9cb25a | 247 | |
Ian Craggs |
12:cd99ac9cb25a | 248 | #define min(a, b) ((a < b) ? a : b) |
Ian Craggs |
12:cd99ac9cb25a | 249 | |
Ian Craggs |
12:cd99ac9cb25a | 250 | int checkMQTTStrings(MQTTString a, MQTTString b) |
Ian Craggs |
12:cd99ac9cb25a | 251 | { |
Ian Craggs |
12:cd99ac9cb25a | 252 | if (!a.lenstring.data) |
Ian Craggs |
12:cd99ac9cb25a | 253 | { |
Ian Craggs |
12:cd99ac9cb25a | 254 | a.lenstring.data = a.cstring; |
Ian Craggs |
12:cd99ac9cb25a | 255 | if (a.cstring) |
Ian Craggs |
12:cd99ac9cb25a | 256 | a.lenstring.len = strlen(a.cstring); |
Ian Craggs |
12:cd99ac9cb25a | 257 | } |
Ian Craggs |
12:cd99ac9cb25a | 258 | if (!b.lenstring.data) |
Ian Craggs |
12:cd99ac9cb25a | 259 | { |
Ian Craggs |
12:cd99ac9cb25a | 260 | b.lenstring.data = b.cstring; |
Ian Craggs |
12:cd99ac9cb25a | 261 | if (b.cstring) |
Ian Craggs |
12:cd99ac9cb25a | 262 | b.lenstring.len = strlen(b.cstring); |
Ian Craggs |
12:cd99ac9cb25a | 263 | } |
Ian Craggs |
12:cd99ac9cb25a | 264 | return memcmp(a.lenstring.data, b.lenstring.data, min(a.lenstring.len, b.lenstring.len)) == 0; |
Ian Craggs |
12:cd99ac9cb25a | 265 | } |
Ian Craggs |
12:cd99ac9cb25a | 266 | |
Ian Craggs |
12:cd99ac9cb25a | 267 | |
Ian Craggs |
12:cd99ac9cb25a | 268 | int checkConnectPackets(MQTTPacket_connectData* before, MQTTPacket_connectData* after) |
Ian Craggs |
12:cd99ac9cb25a | 269 | { |
Ian Craggs |
12:cd99ac9cb25a | 270 | int rc = 0; |
Ian Craggs |
12:cd99ac9cb25a | 271 | int start_failures = failures; |
Ian Craggs |
12:cd99ac9cb25a | 272 | |
Ian Craggs |
12:cd99ac9cb25a | 273 | assert("struct_ids should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 274 | memcmp(before->struct_id, after->struct_id, 4) == 0, "struct_ids were different %.4s\n", after->struct_id); |
Ian Craggs |
12:cd99ac9cb25a | 275 | |
Ian Craggs |
12:cd99ac9cb25a | 276 | assert("struct_versions should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 277 | before->struct_version == after->struct_version, "struct_versions were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 278 | |
Ian Craggs |
12:cd99ac9cb25a | 279 | assert("MQTT versions should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 280 | before->MQTTVersion == after->MQTTVersion, "MQTT versions were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 281 | |
Ian Craggs |
12:cd99ac9cb25a | 282 | assert("ClientIDs should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 283 | checkMQTTStrings(before->clientID, after->clientID), "ClientIDs were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 284 | |
Ian Craggs |
12:cd99ac9cb25a | 285 | assert("keepAliveIntervals should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 286 | before->keepAliveInterval == after->keepAliveInterval, "keepAliveIntervals were different %d\n", after->keepAliveInterval); |
Ian Craggs |
12:cd99ac9cb25a | 287 | |
Ian Craggs |
12:cd99ac9cb25a | 288 | assert("cleansessions should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 289 | before->cleansession == after->cleansession, "cleansessions were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 290 | |
Ian Craggs |
12:cd99ac9cb25a | 291 | assert("willFlags should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 292 | before->willFlag == after->willFlag, "willFlags were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 293 | |
Ian Craggs |
12:cd99ac9cb25a | 294 | if (before->willFlag) |
Ian Craggs |
12:cd99ac9cb25a | 295 | { |
Ian Craggs |
12:cd99ac9cb25a | 296 | assert("will struct_ids should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 297 | memcmp(before->will.struct_id, after->will.struct_id, 4) == 0, "will struct_ids were different %.4s\n", after->struct_id); |
Ian Craggs |
12:cd99ac9cb25a | 298 | |
Ian Craggs |
12:cd99ac9cb25a | 299 | assert("will struct_versions should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 300 | before->will.struct_version == after->will.struct_version, "will struct_versions were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 301 | |
Ian Craggs |
12:cd99ac9cb25a | 302 | assert("topic names should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 303 | checkMQTTStrings(before->will.topicName, after->will.topicName), "topic names were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 304 | |
Ian Craggs |
12:cd99ac9cb25a | 305 | assert("messages should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 306 | checkMQTTStrings(before->will.message, after->will.message), "messages were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 307 | |
Ian Craggs |
12:cd99ac9cb25a | 308 | assert("retained flags should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 309 | before->will.retained == after->will.retained, "retained flags were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 310 | |
Ian Craggs |
12:cd99ac9cb25a | 311 | assert("will qos should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 312 | before->will.qos == after->will.qos, "will qos were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 313 | } |
Ian Craggs |
12:cd99ac9cb25a | 314 | |
Ian Craggs |
12:cd99ac9cb25a | 315 | assert("usernames should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 316 | checkMQTTStrings(before->clientID, after->clientID), "usernames were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 317 | assert("passwords should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 318 | checkMQTTStrings(before->password, after->password), "passwords were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 319 | return failures == start_failures; |
Ian Craggs |
12:cd99ac9cb25a | 320 | } |
Ian Craggs |
12:cd99ac9cb25a | 321 | |
Ian Craggs |
12:cd99ac9cb25a | 322 | int test1(struct Options options) |
Ian Craggs |
12:cd99ac9cb25a | 323 | { |
Ian Craggs |
12:cd99ac9cb25a | 324 | MQTTPacket_connectData data = MQTTPacket_connectData_initializer; |
Ian Craggs |
12:cd99ac9cb25a | 325 | MQTTPacket_connectData data_after = MQTTPacket_connectData_initializer; |
Ian Craggs |
12:cd99ac9cb25a | 326 | int rc = 0; |
Ian Craggs |
12:cd99ac9cb25a | 327 | char buf[100]; |
Ian Craggs |
12:cd99ac9cb25a | 328 | int buflen = sizeof(buf); |
Ian Craggs |
12:cd99ac9cb25a | 329 | |
Ian Craggs |
12:cd99ac9cb25a | 330 | fprintf(xml, "<testcase classname=\"test1\" name=\"de/serialization\""); |
Ian Craggs |
12:cd99ac9cb25a | 331 | global_start_time = start_clock(); |
Ian Craggs |
12:cd99ac9cb25a | 332 | failures = 0; |
Ian Craggs |
12:cd99ac9cb25a | 333 | MyLog(LOGA_INFO, "Starting test 1 - serialization of connect and back"); |
Ian Craggs |
12:cd99ac9cb25a | 334 | |
Ian Craggs |
12:cd99ac9cb25a | 335 | data.clientID.cstring = "me"; |
Ian Craggs |
12:cd99ac9cb25a | 336 | |
Ian Craggs |
12:cd99ac9cb25a | 337 | data.keepAliveInterval = 20; |
Ian Craggs |
12:cd99ac9cb25a | 338 | data.cleansession = 1; |
Ian Craggs |
12:cd99ac9cb25a | 339 | data.username.cstring = "testuser"; |
Ian Craggs |
12:cd99ac9cb25a | 340 | data.password.cstring = "testpassword"; |
Ian Craggs |
12:cd99ac9cb25a | 341 | |
Ian Craggs |
12:cd99ac9cb25a | 342 | data.willFlag = 1; |
Ian Craggs |
12:cd99ac9cb25a | 343 | data.will.message.cstring = "will message"; |
Ian Craggs |
12:cd99ac9cb25a | 344 | data.will.qos = 1; |
Ian Craggs |
12:cd99ac9cb25a | 345 | data.will.retained = 0; |
Ian Craggs |
12:cd99ac9cb25a | 346 | data.will.topicName.cstring = "will topic"; |
Ian Craggs |
12:cd99ac9cb25a | 347 | |
Ian Craggs |
12:cd99ac9cb25a | 348 | rc = MQTTSerialize_connect(buf, buflen, &data); |
Ian Craggs |
12:cd99ac9cb25a | 349 | assert("good rc from serialize connect", rc > 0, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 350 | |
Ian Craggs |
12:cd99ac9cb25a | 351 | rc = MQTTDeserialize_connect(&data_after, buf, buflen); |
Ian Craggs |
12:cd99ac9cb25a | 352 | assert("good rc from deserialize connect", rc == 1, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 353 | |
Ian Craggs |
12:cd99ac9cb25a | 354 | /* data after should be the same as data before */ |
Ian Craggs |
12:cd99ac9cb25a | 355 | rc = checkConnectPackets(&data, &data_after); |
Ian Craggs |
12:cd99ac9cb25a | 356 | assert("packets should be the same", rc == 1, "packets were different\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 357 | |
Ian Craggs |
12:cd99ac9cb25a | 358 | /* exit: */ |
Ian Craggs |
12:cd99ac9cb25a | 359 | MyLog(LOGA_INFO, "TEST1: test %s. %d tests run, %d failures.", |
Ian Craggs |
12:cd99ac9cb25a | 360 | (failures == 0) ? "passed" : "failed", tests, failures); |
Ian Craggs |
12:cd99ac9cb25a | 361 | write_test_result(); |
Ian Craggs |
12:cd99ac9cb25a | 362 | return failures; |
Ian Craggs |
12:cd99ac9cb25a | 363 | } |
Ian Craggs |
12:cd99ac9cb25a | 364 | |
Ian Craggs |
12:cd99ac9cb25a | 365 | |
Ian Craggs |
12:cd99ac9cb25a | 366 | int test2(struct Options options) |
Ian Craggs |
12:cd99ac9cb25a | 367 | { |
Ian Craggs |
12:cd99ac9cb25a | 368 | int rc = 0; |
Ian Craggs |
12:cd99ac9cb25a | 369 | char buf[100]; |
Ian Craggs |
12:cd99ac9cb25a | 370 | int buflen = sizeof(buf); |
Ian Craggs |
12:cd99ac9cb25a | 371 | |
Ian Craggs |
12:cd99ac9cb25a | 372 | unsigned char dup = 0; |
Ian Craggs |
12:cd99ac9cb25a | 373 | int qos = 2; |
Ian Craggs |
12:cd99ac9cb25a | 374 | unsigned char retained = 0; |
Ian Craggs |
12:cd99ac9cb25a | 375 | int msgid = 23; |
Ian Craggs |
12:cd99ac9cb25a | 376 | MQTTString topicString = MQTTString_initializer; |
Ian Craggs |
12:cd99ac9cb25a | 377 | char *payload = "kkhkhkjkj jkjjk jk jk "; |
Ian Craggs |
12:cd99ac9cb25a | 378 | int payloadlen = strlen(payload); |
Ian Craggs |
12:cd99ac9cb25a | 379 | |
Ian Craggs |
12:cd99ac9cb25a | 380 | unsigned char dup2 = 1; |
Ian Craggs |
12:cd99ac9cb25a | 381 | int qos2 = 1; |
Ian Craggs |
12:cd99ac9cb25a | 382 | unsigned char retained2 = 1; |
Ian Craggs |
12:cd99ac9cb25a | 383 | int msgid2 = 3243; |
Ian Craggs |
12:cd99ac9cb25a | 384 | MQTTString topicString2 = MQTTString_initializer; |
Ian Craggs |
12:cd99ac9cb25a | 385 | char *payload2 = NULL; |
Ian Craggs |
12:cd99ac9cb25a | 386 | int payloadlen2 = 0; |
Ian Craggs |
12:cd99ac9cb25a | 387 | |
Ian Craggs |
12:cd99ac9cb25a | 388 | fprintf(xml, "<testcase classname=\"test1\" name=\"de/serialization\""); |
Ian Craggs |
12:cd99ac9cb25a | 389 | global_start_time = start_clock(); |
Ian Craggs |
12:cd99ac9cb25a | 390 | failures = 0; |
Ian Craggs |
12:cd99ac9cb25a | 391 | MyLog(LOGA_INFO, "Starting test 2 - serialization of publish and back"); |
Ian Craggs |
12:cd99ac9cb25a | 392 | |
Ian Craggs |
12:cd99ac9cb25a | 393 | topicString.cstring = "mytopic"; |
Ian Craggs |
12:cd99ac9cb25a | 394 | rc = MQTTSerialize_publish(buf, buflen, dup, qos, retained, msgid, topicString, |
Ian Craggs |
12:cd99ac9cb25a | 395 | payload, payloadlen); |
Ian Craggs |
12:cd99ac9cb25a | 396 | assert("good rc from serialize publish", rc > 0, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 397 | |
Ian Craggs |
12:cd99ac9cb25a | 398 | rc = MQTTDeserialize_publish(&dup2, &qos2, &retained2, &msgid2, &topicString2, |
Ian Craggs |
12:cd99ac9cb25a | 399 | &payload2, &payloadlen2, buf, buflen); |
Ian Craggs |
12:cd99ac9cb25a | 400 | assert("good rc from deserialize publish", rc == 1, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 401 | |
Ian Craggs |
12:cd99ac9cb25a | 402 | /* data after should be the same as data before */ |
Ian Craggs |
12:cd99ac9cb25a | 403 | assert("dups should be the same", dup == dup2, "dups were different %d\n", dup2); |
Ian Craggs |
12:cd99ac9cb25a | 404 | assert("qoss should be the same", qos == qos2, "qoss were different %d\n", qos2); |
Ian Craggs |
12:cd99ac9cb25a | 405 | assert("retaineds should be the same", retained == retained2, "retaineds were different %d\n", retained2); |
Ian Craggs |
12:cd99ac9cb25a | 406 | assert("msgids should be the same", msgid == msgid2, "msgids were different %d\n", msgid2); |
Ian Craggs |
12:cd99ac9cb25a | 407 | |
Ian Craggs |
12:cd99ac9cb25a | 408 | assert("topics should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 409 | checkMQTTStrings(topicString, topicString2), "topics were different %s\n", ""); //topicString2); |
Ian Craggs |
12:cd99ac9cb25a | 410 | |
Ian Craggs |
12:cd99ac9cb25a | 411 | assert("payload lengths should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 412 | payloadlen == payloadlen2, "payload lengths were different %d\n", payloadlen2); |
Ian Craggs |
12:cd99ac9cb25a | 413 | |
Ian Craggs |
12:cd99ac9cb25a | 414 | assert("payloads should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 415 | memcmp(payload, payload2, payloadlen) == 0, "payloads were different %s\n", ""); |
Ian Craggs |
12:cd99ac9cb25a | 416 | |
Ian Craggs |
12:cd99ac9cb25a | 417 | /*exit:*/ |
Ian Craggs |
12:cd99ac9cb25a | 418 | MyLog(LOGA_INFO, "TEST2: test %s. %d tests run, %d failures.", |
Ian Craggs |
12:cd99ac9cb25a | 419 | (failures == 0) ? "passed" : "failed", tests, failures); |
Ian Craggs |
12:cd99ac9cb25a | 420 | write_test_result(); |
Ian Craggs |
12:cd99ac9cb25a | 421 | return failures; |
Ian Craggs |
12:cd99ac9cb25a | 422 | } |
Ian Craggs |
12:cd99ac9cb25a | 423 | |
Ian Craggs |
12:cd99ac9cb25a | 424 | |
Ian Craggs |
12:cd99ac9cb25a | 425 | |
Ian Craggs |
12:cd99ac9cb25a | 426 | int test3(struct Options options) |
Ian Craggs |
12:cd99ac9cb25a | 427 | { |
Ian Craggs |
12:cd99ac9cb25a | 428 | int i = 0; |
Ian Craggs |
12:cd99ac9cb25a | 429 | int rc = 0; |
Ian Craggs |
12:cd99ac9cb25a | 430 | char buf[100]; |
Ian Craggs |
12:cd99ac9cb25a | 431 | int buflen = sizeof(buf); |
Ian Craggs |
12:cd99ac9cb25a | 432 | #define TOPIC_COUNT 2 |
Ian Craggs |
12:cd99ac9cb25a | 433 | |
Ian Craggs |
12:cd99ac9cb25a | 434 | int dup = 0; |
Ian Craggs |
12:cd99ac9cb25a | 435 | int msgid = 23; |
Ian Craggs |
12:cd99ac9cb25a | 436 | int count = TOPIC_COUNT; |
Ian Craggs |
12:cd99ac9cb25a | 437 | MQTTString topicStrings[TOPIC_COUNT] = { MQTTString_initializer, MQTTString_initializer }; |
Ian Craggs |
12:cd99ac9cb25a | 438 | int req_qoss[TOPIC_COUNT] = {2, 1}; |
Ian Craggs |
12:cd99ac9cb25a | 439 | |
Ian Craggs |
12:cd99ac9cb25a | 440 | int dup2 = 1; |
Ian Craggs |
12:cd99ac9cb25a | 441 | int msgid2 = 2223; |
Ian Craggs |
12:cd99ac9cb25a | 442 | int count2 = 0; |
Ian Craggs |
12:cd99ac9cb25a | 443 | MQTTString topicStrings2[TOPIC_COUNT] = { MQTTString_initializer, MQTTString_initializer }; |
Ian Craggs |
12:cd99ac9cb25a | 444 | int req_qoss2[TOPIC_COUNT] = {0, 0}; |
Ian Craggs |
12:cd99ac9cb25a | 445 | |
Ian Craggs |
12:cd99ac9cb25a | 446 | fprintf(xml, "<testcase classname=\"test1\" name=\"de/serialization\""); |
Ian Craggs |
12:cd99ac9cb25a | 447 | global_start_time = start_clock(); |
Ian Craggs |
12:cd99ac9cb25a | 448 | failures = 0; |
Ian Craggs |
12:cd99ac9cb25a | 449 | MyLog(LOGA_INFO, "Starting test 2 - serialization of subscribe and back"); |
Ian Craggs |
12:cd99ac9cb25a | 450 | |
Ian Craggs |
12:cd99ac9cb25a | 451 | topicStrings[0].cstring = "mytopic"; |
Ian Craggs |
12:cd99ac9cb25a | 452 | topicStrings[1].cstring = "mytopic2"; |
Ian Craggs |
12:cd99ac9cb25a | 453 | rc = MQTTSerialize_subscribe(buf, buflen, dup, msgid, count, topicStrings, req_qoss); |
Ian Craggs |
12:cd99ac9cb25a | 454 | assert("good rc from serialize subscribe", rc > 0, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 455 | |
Ian Craggs |
12:cd99ac9cb25a | 456 | rc = MQTTDeserialize_subscribe(&dup2, &msgid2, 2, &count2, topicStrings2, req_qoss2, buf, buflen); |
Ian Craggs |
12:cd99ac9cb25a | 457 | assert("good rc from deserialize subscribe", rc == 1, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 458 | |
Ian Craggs |
12:cd99ac9cb25a | 459 | /* data after should be the same as data before */ |
Ian Craggs |
12:cd99ac9cb25a | 460 | assert("dups should be the same", dup == dup2, "dups were different %d\n", dup2); |
Ian Craggs |
12:cd99ac9cb25a | 461 | assert("msgids should be the same", msgid == msgid2, "msgids were different %d\n", msgid2); |
Ian Craggs |
12:cd99ac9cb25a | 462 | |
Ian Craggs |
12:cd99ac9cb25a | 463 | assert("count should be the same", count == count2, "counts were different %d\n", count2); |
Ian Craggs |
12:cd99ac9cb25a | 464 | |
Ian Craggs |
12:cd99ac9cb25a | 465 | for (i = 0; i < count2; ++i) |
Ian Craggs |
12:cd99ac9cb25a | 466 | { |
Ian Craggs |
12:cd99ac9cb25a | 467 | assert("topics should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 468 | checkMQTTStrings(topicStrings[i], topicStrings2[i]), "topics were different %s\n", ""); |
Ian Craggs |
12:cd99ac9cb25a | 469 | |
Ian Craggs |
12:cd99ac9cb25a | 470 | assert("qoss should be the same", req_qoss[i] == req_qoss2[i], "qoss were different %d\n", req_qoss2[i]); |
Ian Craggs |
12:cd99ac9cb25a | 471 | } |
Ian Craggs |
12:cd99ac9cb25a | 472 | |
Ian Craggs |
12:cd99ac9cb25a | 473 | /*exit:*/ |
Ian Craggs |
12:cd99ac9cb25a | 474 | MyLog(LOGA_INFO, "TEST3: test %s. %d tests run, %d failures.", |
Ian Craggs |
12:cd99ac9cb25a | 475 | (failures == 0) ? "passed" : "failed", tests, failures); |
Ian Craggs |
12:cd99ac9cb25a | 476 | write_test_result(); |
Ian Craggs |
12:cd99ac9cb25a | 477 | return failures; |
Ian Craggs |
12:cd99ac9cb25a | 478 | } |
Ian Craggs |
12:cd99ac9cb25a | 479 | |
Ian Craggs |
12:cd99ac9cb25a | 480 | |
Ian Craggs |
12:cd99ac9cb25a | 481 | int test4(struct Options options) |
Ian Craggs |
12:cd99ac9cb25a | 482 | { |
Ian Craggs |
12:cd99ac9cb25a | 483 | int i = 0; |
Ian Craggs |
12:cd99ac9cb25a | 484 | int rc = 0; |
Ian Craggs |
12:cd99ac9cb25a | 485 | char buf[100]; |
Ian Craggs |
12:cd99ac9cb25a | 486 | int buflen = sizeof(buf); |
Ian Craggs |
12:cd99ac9cb25a | 487 | #define TOPIC_COUNT 2 |
Ian Craggs |
12:cd99ac9cb25a | 488 | |
Ian Craggs |
12:cd99ac9cb25a | 489 | int msgid = 23; |
Ian Craggs |
12:cd99ac9cb25a | 490 | int count = TOPIC_COUNT; |
Ian Craggs |
12:cd99ac9cb25a | 491 | int granted_qoss[TOPIC_COUNT] = {2, 1}; |
Ian Craggs |
12:cd99ac9cb25a | 492 | ; |
Ian Craggs |
12:cd99ac9cb25a | 493 | int msgid2 = 2223; |
Ian Craggs |
12:cd99ac9cb25a | 494 | int count2 = 0; |
Ian Craggs |
12:cd99ac9cb25a | 495 | int granted_qoss2[TOPIC_COUNT] = {0, 0}; |
Ian Craggs |
12:cd99ac9cb25a | 496 | |
Ian Craggs |
12:cd99ac9cb25a | 497 | fprintf(xml, "<testcase classname=\"test1\" name=\"de/serialization\""); |
Ian Craggs |
12:cd99ac9cb25a | 498 | global_start_time = start_clock(); |
Ian Craggs |
12:cd99ac9cb25a | 499 | failures = 0; |
Ian Craggs |
12:cd99ac9cb25a | 500 | MyLog(LOGA_INFO, "Starting test 4 - serialization of suback and back"); |
Ian Craggs |
12:cd99ac9cb25a | 501 | |
Ian Craggs |
12:cd99ac9cb25a | 502 | rc = MQTTSerialize_suback(buf, buflen, msgid, count, granted_qoss); |
Ian Craggs |
12:cd99ac9cb25a | 503 | assert("good rc from serialize suback", rc > 0, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 504 | |
Ian Craggs |
12:cd99ac9cb25a | 505 | rc = MQTTDeserialize_suback(&msgid2, 2, &count2, granted_qoss2, buf, buflen); |
Ian Craggs |
12:cd99ac9cb25a | 506 | assert("good rc from deserialize suback", rc == 1, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 507 | |
Ian Craggs |
12:cd99ac9cb25a | 508 | /* data after should be the same as data before */ |
Ian Craggs |
12:cd99ac9cb25a | 509 | assert("msgids should be the same", msgid == msgid2, "msgids were different %d\n", msgid2); |
Ian Craggs |
12:cd99ac9cb25a | 510 | |
Ian Craggs |
12:cd99ac9cb25a | 511 | assert("count should be the same", count == count2, "counts were different %d\n", count2); |
Ian Craggs |
12:cd99ac9cb25a | 512 | |
Ian Craggs |
12:cd99ac9cb25a | 513 | for (i = 0; i < count2; ++i) |
Ian Craggs |
12:cd99ac9cb25a | 514 | assert("qoss should be the same", granted_qoss[i] == granted_qoss2[i], "qoss were different %d\n", granted_qoss2[i]); |
Ian Craggs |
12:cd99ac9cb25a | 515 | |
Ian Craggs |
12:cd99ac9cb25a | 516 | /* exit: */ |
Ian Craggs |
12:cd99ac9cb25a | 517 | MyLog(LOGA_INFO, "TEST4: test %s. %d tests run, %d failures.", |
Ian Craggs |
12:cd99ac9cb25a | 518 | (failures == 0) ? "passed" : "failed", tests, failures); |
Ian Craggs |
12:cd99ac9cb25a | 519 | write_test_result(); |
Ian Craggs |
12:cd99ac9cb25a | 520 | return failures; |
Ian Craggs |
12:cd99ac9cb25a | 521 | } |
Ian Craggs |
12:cd99ac9cb25a | 522 | |
Ian Craggs |
12:cd99ac9cb25a | 523 | |
Ian Craggs |
12:cd99ac9cb25a | 524 | int test5(struct Options options) |
Ian Craggs |
12:cd99ac9cb25a | 525 | { |
Ian Craggs |
12:cd99ac9cb25a | 526 | int i = 0; |
Ian Craggs |
12:cd99ac9cb25a | 527 | int rc = 0; |
Ian Craggs |
12:cd99ac9cb25a | 528 | char buf[100]; |
Ian Craggs |
12:cd99ac9cb25a | 529 | int buflen = sizeof(buf); |
Ian Craggs |
12:cd99ac9cb25a | 530 | #define TOPIC_COUNT 2 |
Ian Craggs |
12:cd99ac9cb25a | 531 | |
Ian Craggs |
12:cd99ac9cb25a | 532 | int dup = 0; |
Ian Craggs |
12:cd99ac9cb25a | 533 | int msgid = 23; |
Ian Craggs |
12:cd99ac9cb25a | 534 | int count = TOPIC_COUNT; |
Ian Craggs |
12:cd99ac9cb25a | 535 | MQTTString topicStrings[TOPIC_COUNT] = { MQTTString_initializer, MQTTString_initializer }; |
Ian Craggs |
12:cd99ac9cb25a | 536 | |
Ian Craggs |
12:cd99ac9cb25a | 537 | int dup2 = 1; |
Ian Craggs |
12:cd99ac9cb25a | 538 | int msgid2 = 2223; |
Ian Craggs |
12:cd99ac9cb25a | 539 | int count2 = 0; |
Ian Craggs |
12:cd99ac9cb25a | 540 | MQTTString topicStrings2[TOPIC_COUNT] = { MQTTString_initializer, MQTTString_initializer }; |
Ian Craggs |
12:cd99ac9cb25a | 541 | |
Ian Craggs |
12:cd99ac9cb25a | 542 | fprintf(xml, "<testcase classname=\"test1\" name=\"de/serialization\""); |
Ian Craggs |
12:cd99ac9cb25a | 543 | global_start_time = start_clock(); |
Ian Craggs |
12:cd99ac9cb25a | 544 | failures = 0; |
Ian Craggs |
12:cd99ac9cb25a | 545 | MyLog(LOGA_INFO, "Starting test 2 - serialization of unsubscribe and back"); |
Ian Craggs |
12:cd99ac9cb25a | 546 | |
Ian Craggs |
12:cd99ac9cb25a | 547 | topicStrings[0].cstring = "mytopic"; |
Ian Craggs |
12:cd99ac9cb25a | 548 | topicStrings[1].cstring = "mytopic2"; |
Ian Craggs |
12:cd99ac9cb25a | 549 | rc = MQTTSerialize_unsubscribe(buf, buflen, dup, msgid, count, topicStrings); |
Ian Craggs |
12:cd99ac9cb25a | 550 | assert("good rc from serialize unsubscribe", rc > 0, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 551 | |
Ian Craggs |
12:cd99ac9cb25a | 552 | rc = MQTTDeserialize_unsubscribe(&dup2, &msgid2, 2, &count2, topicStrings2, buf, buflen); |
Ian Craggs |
12:cd99ac9cb25a | 553 | assert("good rc from deserialize unsubscribe", rc == 1, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 554 | |
Ian Craggs |
12:cd99ac9cb25a | 555 | /* data after should be the same as data before */ |
Ian Craggs |
12:cd99ac9cb25a | 556 | assert("dups should be the same", dup == dup2, "dups were different %d\n", dup2); |
Ian Craggs |
12:cd99ac9cb25a | 557 | assert("msgids should be the same", msgid == msgid2, "msgids were different %d\n", msgid2); |
Ian Craggs |
12:cd99ac9cb25a | 558 | |
Ian Craggs |
12:cd99ac9cb25a | 559 | assert("count should be the same", count == count2, "counts were different %d\n", count2); |
Ian Craggs |
12:cd99ac9cb25a | 560 | |
Ian Craggs |
12:cd99ac9cb25a | 561 | for (i = 0; i < count2; ++i) |
Ian Craggs |
12:cd99ac9cb25a | 562 | assert("topics should be the same", |
Ian Craggs |
12:cd99ac9cb25a | 563 | checkMQTTStrings(topicStrings[i], topicStrings2[i]), "topics were different %s\n", ""); |
Ian Craggs |
12:cd99ac9cb25a | 564 | |
Ian Craggs |
12:cd99ac9cb25a | 565 | /* exit: */ |
Ian Craggs |
12:cd99ac9cb25a | 566 | MyLog(LOGA_INFO, "TEST5: test %s. %d tests run, %d failures.", |
Ian Craggs |
12:cd99ac9cb25a | 567 | (failures == 0) ? "passed" : "failed", tests, failures); |
Ian Craggs |
12:cd99ac9cb25a | 568 | write_test_result(); |
Ian Craggs |
12:cd99ac9cb25a | 569 | return failures; |
Ian Craggs |
12:cd99ac9cb25a | 570 | } |
Ian Craggs |
12:cd99ac9cb25a | 571 | |
Ian Craggs |
12:cd99ac9cb25a | 572 | |
Ian Craggs |
12:cd99ac9cb25a | 573 | int test6(struct Options options) |
Ian Craggs |
12:cd99ac9cb25a | 574 | { |
Ian Craggs |
12:cd99ac9cb25a | 575 | int rc = 0; |
Ian Craggs |
12:cd99ac9cb25a | 576 | char buf[100]; |
Ian Craggs |
12:cd99ac9cb25a | 577 | int buflen = sizeof(buf); |
Ian Craggs |
12:cd99ac9cb25a | 578 | |
Ian Craggs |
12:cd99ac9cb25a | 579 | int connack_rc = 77; |
Ian Craggs |
12:cd99ac9cb25a | 580 | |
Ian Craggs |
12:cd99ac9cb25a | 581 | int connack_rc2 = 0; |
Ian Craggs |
12:cd99ac9cb25a | 582 | |
Ian Craggs |
12:cd99ac9cb25a | 583 | fprintf(xml, "<testcase classname=\"test1\" name=\"de/serialization\""); |
Ian Craggs |
12:cd99ac9cb25a | 584 | global_start_time = start_clock(); |
Ian Craggs |
12:cd99ac9cb25a | 585 | failures = 0; |
Ian Craggs |
12:cd99ac9cb25a | 586 | MyLog(LOGA_INFO, "Starting test 2 - serialization of connack and back"); |
Ian Craggs |
12:cd99ac9cb25a | 587 | |
Ian Craggs |
12:cd99ac9cb25a | 588 | rc = MQTTSerialize_connack(buf, buflen, connack_rc); |
Ian Craggs |
12:cd99ac9cb25a | 589 | assert("good rc from serialize connack", rc > 0, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 590 | |
Ian Craggs |
12:cd99ac9cb25a | 591 | rc = MQTTDeserialize_connack(&connack_rc2, buf, buflen); |
Ian Craggs |
12:cd99ac9cb25a | 592 | assert("good rc from deserialize connack", rc == 1, "rc was %d\n", rc); |
Ian Craggs |
12:cd99ac9cb25a | 593 | |
Ian Craggs |
12:cd99ac9cb25a | 594 | /* data after should be the same as data before */ |
Ian Craggs |
12:cd99ac9cb25a | 595 | assert("dups should be the same", connack_rc == connack_rc2, "dups were different %d\n", connack_rc2); |
Ian Craggs |
12:cd99ac9cb25a | 596 | |
Ian Craggs |
12:cd99ac9cb25a | 597 | /* exit: */ |
Ian Craggs |
12:cd99ac9cb25a | 598 | MyLog(LOGA_INFO, "TEST6: test %s. %d tests run, %d failures.", |
Ian Craggs |
12:cd99ac9cb25a | 599 | (failures == 0) ? "passed" : "failed", tests, failures); |
Ian Craggs |
12:cd99ac9cb25a | 600 | write_test_result(); |
Ian Craggs |
12:cd99ac9cb25a | 601 | return failures; |
Ian Craggs |
12:cd99ac9cb25a | 602 | } |
Ian Craggs |
12:cd99ac9cb25a | 603 | |
Ian Craggs |
12:cd99ac9cb25a | 604 | |
Ian Craggs |
12:cd99ac9cb25a | 605 | int main(int argc, char** argv) |
Ian Craggs |
12:cd99ac9cb25a | 606 | { |
Ian Craggs |
12:cd99ac9cb25a | 607 | int rc = 0; |
Ian Craggs |
12:cd99ac9cb25a | 608 | int (*tests[])() = {NULL, test1, test2, test3, test4, test5, test6}; |
Ian Craggs |
12:cd99ac9cb25a | 609 | |
Ian Craggs |
12:cd99ac9cb25a | 610 | xml = fopen("TEST-test1.xml", "w"); |
Ian Craggs |
12:cd99ac9cb25a | 611 | fprintf(xml, "<testsuite name=\"test1\" tests=\"%d\">\n", (int)(ARRAY_SIZE(tests) - 1)); |
Ian Craggs |
12:cd99ac9cb25a | 612 | |
Ian Craggs |
12:cd99ac9cb25a | 613 | getopts(argc, argv); |
Ian Craggs |
12:cd99ac9cb25a | 614 | |
Ian Craggs |
12:cd99ac9cb25a | 615 | if (options.test_no == 0) |
Ian Craggs |
12:cd99ac9cb25a | 616 | { /* run all the tests */ |
Ian Craggs |
12:cd99ac9cb25a | 617 | for (options.test_no = 1; options.test_no < ARRAY_SIZE(tests); ++options.test_no) |
Ian Craggs |
12:cd99ac9cb25a | 618 | rc += tests[options.test_no](options); /* return number of failures. 0 = test succeeded */ |
Ian Craggs |
12:cd99ac9cb25a | 619 | } |
Ian Craggs |
12:cd99ac9cb25a | 620 | else |
Ian Craggs |
12:cd99ac9cb25a | 621 | rc = tests[options.test_no](options); /* run just the selected test */ |
Ian Craggs |
12:cd99ac9cb25a | 622 | |
Ian Craggs |
12:cd99ac9cb25a | 623 | if (rc == 0) |
Ian Craggs |
12:cd99ac9cb25a | 624 | MyLog(LOGA_INFO, "verdict pass"); |
Ian Craggs |
12:cd99ac9cb25a | 625 | else |
Ian Craggs |
12:cd99ac9cb25a | 626 | MyLog(LOGA_INFO, "verdict fail"); |
Ian Craggs |
12:cd99ac9cb25a | 627 | |
Ian Craggs |
12:cd99ac9cb25a | 628 | fprintf(xml, "</testsuite>\n"); |
Ian Craggs |
12:cd99ac9cb25a | 629 | fclose(xml); |
Ian Craggs |
12:cd99ac9cb25a | 630 | return rc; |
Ian Craggs |
12:cd99ac9cb25a | 631 | } |