diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2017-02-19 00:32:05 +0200 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2017-02-19 00:32:05 +0200 |
| commit | 56b14eb55d3078d38e07bc22aae73e73017b1257 (patch) | |
| tree | 82260e91c808ce05903749a3e0d571efc2a4c470 /test | |
| parent | 751480833388b1e56bbe7c24b523bf98d9d04383 (diff) | |
| download | mqtt-56b14eb55d3078d38e07bc22aae73e73017b1257.tar.gz mqtt-56b14eb55d3078d38e07bc22aae73e73017b1257.zip | |
Add more interop tests
Diffstat (limited to 'test')
| -rw-r--r-- | test/interop/CMakeLists.txt | 6 | ||||
| -rw-r--r-- | test/interop/basic_test.c | 15 | ||||
| -rw-r--r-- | test/interop/cleanup.c | 39 | ||||
| -rw-r--r-- | test/interop/keepalive_test.c | 39 | ||||
| -rw-r--r-- | test/interop/offline_message_queueing_test.c | 49 | ||||
| -rw-r--r-- | test/interop/overlapping_subscriptions_test.c | 48 | ||||
| -rw-r--r-- | test/interop/retained_message_test.c | 45 | ||||
| -rw-r--r-- | test/interop/topics.c | 9 | ||||
| -rw-r--r-- | test/interop/will_message_test.c | 42 | ||||
| -rw-r--r-- | test/interop/zero_length_clientid_test.c | 29 |
10 files changed, 315 insertions, 6 deletions
diff --git a/test/interop/CMakeLists.txt b/test/interop/CMakeLists.txt index f4d71e8..041727e 100644 --- a/test/interop/CMakeLists.txt +++ b/test/interop/CMakeLists.txt @@ -8,3 +8,9 @@ FUNCTION(ADD_INTEROP_TEST NAME) ENDFUNCTION() ADD_INTEROP_TEST(basic_test) +ADD_INTEROP_TEST(retained_message_test) +ADD_INTEROP_TEST(will_message_test) +ADD_INTEROP_TEST(zero_length_clientid_test) +ADD_INTEROP_TEST(offline_message_queueing_test) +ADD_INTEROP_TEST(overlapping_subscriptions_test) +ADD_INTEROP_TEST(keepalive_test) diff --git a/test/interop/basic_test.c b/test/interop/basic_test.c index 76ddaec..90e2c65 100644 --- a/test/interop/basic_test.c +++ b/test/interop/basic_test.c @@ -1,21 +1,23 @@ #include "greatest.h" #include "testclient.h" +#include "cleanup.c" +#include "topics.c" TEST basic_test() { TestClient *client; - client = TestClientNew("basic_test"); + client = TestClientNew("clienta"); ASSERT(TestClientConnect(client, "localhost", 1883, 60, 1)); TestClientDisconnect(client); TestClientFree(client); - client = TestClientNew("basic_test"); + client = TestClientNew("clienta"); ASSERT(TestClientConnect(client, "localhost", 1883, 60, 1)); - ASSERT(TestClientSubscribe(client, "basic_test/basic_test", 2)); - ASSERT(TestClientPublish(client, 0, 0, "basic_test/basic_test", "msg0")); - ASSERT(TestClientPublish(client, 1, 0, "basic_test/basic_test", "msg1")); - ASSERT(TestClientPublish(client, 2, 0, "basic_test/basic_test", "msg2")); + ASSERT(TestClientSubscribe(client, topics[0], 2)); + ASSERT(TestClientPublish(client, 0, 0, topics[0], "msg0")); + ASSERT(TestClientPublish(client, 1, 0, topics[0], "msg1")); + ASSERT(TestClientPublish(client, 2, 0, topics[0], "msg2")); ASSERT(TestClientWait(client, 2000)); ASSERT_EQ(3, TestClientMessageCount(client)); TestClientDisconnect(client); @@ -29,6 +31,7 @@ GREATEST_MAIN_DEFS(); int main(int argc, char **argv) { GREATEST_MAIN_BEGIN(); + cleanup(); RUN_TEST(basic_test); GREATEST_MAIN_END(); } diff --git a/test/interop/cleanup.c b/test/interop/cleanup.c new file mode 100644 index 0000000..30e4684 --- /dev/null +++ b/test/interop/cleanup.c @@ -0,0 +1,39 @@ +static void cleanup() +{ + TestClient *client; + Message *msg; + + /* Clean client state */ + + client = TestClientNew("clienta"); + TestClientConnect(client, "localhost", 1883, 60, 1); + TestClientWait(client, 100); + TestClientDisconnect(client); + TestClientFree(client); + + client = TestClientNew("clientb"); + TestClientConnect(client, "localhost", 1883, 60, 1); + TestClientWait(client, 100); + TestClientDisconnect(client); + TestClientFree(client); + + /* Clean retained messages */ + + client = TestClientNew("clean-retained"); + TestClientConnect(client, "localhost", 1883, 60, 1); + TestClientSubscribe(client, "#", 0); + TestClientWait(client, 2000); + + SIMPLEQ_FOREACH(msg, &client->messages, chain) + { + if (msg->retain) + { + printf("deleting retained message for topic %s\n", msg->topic); + TestClientPublish(client, 0, 1, msg->topic, ""); + } + } + + TestClientDisconnect(client); + + TestClientFree(client); +} diff --git a/test/interop/keepalive_test.c b/test/interop/keepalive_test.c new file mode 100644 index 0000000..aec72a4 --- /dev/null +++ b/test/interop/keepalive_test.c @@ -0,0 +1,39 @@ +#include "greatest.h" +#include "testclient.h" +#include "cleanup.c" +#include "topics.c" + +TEST keepalive_test() +{ + TestClient *clienta, *clientb; + + clienta = TestClientNew("clienta"); + ASSERT_EQ(0, MqttClientSetWill(clienta->client, topics[4], + "client disconnected", 19, 0, 0)); + ASSERT(TestClientConnect(clienta, "localhost", 1883, 2, 1)); + + clientb = TestClientNew("clientb"); + ASSERT(TestClientConnect(clientb, "localhost", 1883, 0, 1)); + ASSERT(TestClientSubscribe(clientb, topics[4], 2)); + + ASSERT(TestClientWait(clientb, 15000)); + + TestClientDisconnect(clientb); + + ASSERT_EQ(1, TestClientMessageCount(clientb)); + + TestClientFree(clienta); + TestClientFree(clientb); + + PASS(); +} + +GREATEST_MAIN_DEFS(); + +int main(int argc, char **argv) +{ + GREATEST_MAIN_BEGIN(); + cleanup(); + RUN_TEST(keepalive_test); + GREATEST_MAIN_END(); +} diff --git a/test/interop/offline_message_queueing_test.c b/test/interop/offline_message_queueing_test.c new file mode 100644 index 0000000..0386a47 --- /dev/null +++ b/test/interop/offline_message_queueing_test.c @@ -0,0 +1,49 @@ +#include "greatest.h" +#include "testclient.h" +#include "cleanup.c" +#include "topics.c" + +TEST offline_message_queueing_test() +{ + TestClient *client; + int count; + + client = TestClientNew("clienta"); + ASSERT(TestClientConnect(client, "localhost", 1883, 60, 0)); + ASSERT(TestClientSubscribe(client, wildtopics[5], 2)); + TestClientDisconnect(client); + TestClientFree(client); + + client = TestClientNew("clientb"); + ASSERT(TestClientConnect(client, "localhost", 1883, 60, 1)); + ASSERT(TestClientPublish(client, 0, 0, topics[1], "qos0")); + ASSERT(TestClientPublish(client, 1, 0, topics[2], "qos1")); + ASSERT(TestClientPublish(client, 2, 0, topics[3], "qos2")); + ASSERT(TestClientWait(client, 1000)); + TestClientDisconnect(client); + TestClientFree(client); + + client = TestClientNew("clienta"); + ASSERT(TestClientConnect(client, "localhost", 1883, 60, 0)); + ASSERT(TestClientWait(client, 2000)); + TestClientDisconnect(client); + count = TestClientMessageCount(client); + TestClientFree(client); + + ASSERT(count == 2 || count == 3); + + printf("this server %s queueing QoS 0 messages for offline clients\n", + count == 2 ? "is not" : "is"); + + PASS(); +} + +GREATEST_MAIN_DEFS(); + +int main(int argc, char **argv) +{ + GREATEST_MAIN_BEGIN(); + cleanup(); + RUN_TEST(offline_message_queueing_test); + GREATEST_MAIN_END(); +} diff --git a/test/interop/overlapping_subscriptions_test.c b/test/interop/overlapping_subscriptions_test.c new file mode 100644 index 0000000..c6e5da0 --- /dev/null +++ b/test/interop/overlapping_subscriptions_test.c @@ -0,0 +1,48 @@ +#include "greatest.h" +#include "testclient.h" +#include "cleanup.c" +#include "topics.c" + +TEST overlapping_subscriptions_test() +{ + TestClient *client; + int count; + + client = TestClientNew("clienta"); + ASSERT(TestClientConnect(client, "localhost", 1883, 60, 1)); + ASSERT(TestClientSubscribe(client, wildtopics[6], 2)); + ASSERT(TestClientSubscribe(client, wildtopics[0], 1)); + ASSERT(TestClientPublish(client, 2, 0, topics[3], + "overlapping topic filters")); + ASSERT(TestClientWait(client, 1000)); + TestClientDisconnect(client); + count = TestClientMessageCount(client); + ASSERT(count == 1 || count == 2); + if (count == 1) + { + printf("this server sends one message for for all matching " + "overlapping subscriptions, not one for each\n"); + ASSERT_EQ(2, SIMPLEQ_FIRST(&client->messages)->qos); + } + else + { + printf("this server sends one message per each matching overlapping " + "subscription\n"); + int qos1 = SIMPLEQ_FIRST(&client->messages)->qos; + int qos2 = SIMPLEQ_NEXT(SIMPLEQ_FIRST(&client->messages), chain)->qos; + ASSERT((qos1 == 1 && qos2 == 2) || (qos1 == 2 && qos2 == 1)); + } + TestClientFree(client); + + PASS(); +} + +GREATEST_MAIN_DEFS(); + +int main(int argc, char **argv) +{ + GREATEST_MAIN_BEGIN(); + cleanup(); + RUN_TEST(overlapping_subscriptions_test); + GREATEST_MAIN_END(); +} diff --git a/test/interop/retained_message_test.c b/test/interop/retained_message_test.c new file mode 100644 index 0000000..f710c60 --- /dev/null +++ b/test/interop/retained_message_test.c @@ -0,0 +1,45 @@ +#include "greatest.h" +#include "testclient.h" +#include "cleanup.c" +#include "topics.c" + +TEST retained_message_test() +{ + TestClient *client; + + client = TestClientNew("retained_message_test"); + ASSERT(TestClientConnect(client, "localhost", 1883, 60, 1)); + ASSERT(TestClientPublish(client, 0, 1, topics[1], "qos0")); + ASSERT(TestClientPublish(client, 1, 1, topics[2], "qos1")); + ASSERT(TestClientPublish(client, 2, 1, topics[3], "qos2")); + ASSERT(TestClientWait(client, 1000)); + ASSERT(TestClientSubscribe(client, wildtopics[5], 2)); + ASSERT(TestClientWait(client, 1000)); + ASSERT_EQ(3, TestClientMessageCount(client)); + TestClientDisconnect(client); + TestClientFree(client); + + client = TestClientNew("retained_message_test"); + ASSERT(TestClientConnect(client, "localhost", 1883, 60, 1)); + ASSERT(TestClientPublish(client, 0, 1, topics[1], "")); + ASSERT(TestClientPublish(client, 1, 1, topics[2], "")); + ASSERT(TestClientPublish(client, 2, 1, topics[3], "")); + ASSERT(TestClientWait(client, 1000)); + ASSERT(TestClientSubscribe(client, wildtopics[5], 2)); + ASSERT(TestClientWait(client, 1000)); + ASSERT_EQ(0, TestClientMessageCount(client)); + TestClientDisconnect(client); + TestClientFree(client); + + PASS(); +} + +GREATEST_MAIN_DEFS(); + +int main(int argc, char **argv) +{ + GREATEST_MAIN_BEGIN(); + cleanup(); + RUN_TEST(retained_message_test); + GREATEST_MAIN_END(); +} diff --git a/test/interop/topics.c b/test/interop/topics.c new file mode 100644 index 0000000..3c75e92 --- /dev/null +++ b/test/interop/topics.c @@ -0,0 +1,9 @@ +const char *topics[] = +{ + "TopicA", "TopicA/B", "Topic/C", "TopicA/C", "/TopicA" +}; + +const char *wildtopics[] = +{ + "TopicA/+", "+/C", "#", "/#", "/+", "+/+", "TopicA/#" +}; diff --git a/test/interop/will_message_test.c b/test/interop/will_message_test.c new file mode 100644 index 0000000..73b64b4 --- /dev/null +++ b/test/interop/will_message_test.c @@ -0,0 +1,42 @@ +#include "greatest.h" +#include "testclient.h" +#include "cleanup.c" +#include "topics.c" + +TEST will_message_test() +{ + TestClient *clienta, *clientb; + + clienta = TestClientNew("clienta"); + ASSERT_EQ(0, MqttClientSetWill(clienta->client, topics[2], + "client disconnected", 19, 0, 0)); + ASSERT(TestClientConnect(clienta, "localhost", 1883, 2, 1)); + + clientb = TestClientNew("clientb"); + ASSERT(TestClientConnect(clientb, "localhost", 1883, 60, 0)); + ASSERT(TestClientSubscribe(clientb, topics[2], 2)); + + ASSERT(TestClientWait(clientb, 500)); + + TestClientFree(clienta); + + ASSERT(TestClientWait(clientb, 5000)); + + TestClientDisconnect(clientb); + + ASSERT_EQ(1, TestClientMessageCount(clientb)); + + TestClientFree(clientb); + + PASS(); +} + +GREATEST_MAIN_DEFS(); + +int main(int argc, char **argv) +{ + GREATEST_MAIN_BEGIN(); + cleanup(); + RUN_TEST(will_message_test); + GREATEST_MAIN_END(); +} diff --git a/test/interop/zero_length_clientid_test.c b/test/interop/zero_length_clientid_test.c new file mode 100644 index 0000000..7d4b369 --- /dev/null +++ b/test/interop/zero_length_clientid_test.c @@ -0,0 +1,29 @@ +#include "greatest.h" +#include "testclient.h" +#include "cleanup.c" + +TEST zero_length_clientid_test() +{ + TestClient *client; + + client = TestClientNew(""); + ASSERT_FALSE(TestClientConnect(client, "localhost", 1883, 60, 0)); + TestClientFree(client); + + client = TestClientNew(""); + ASSERT(TestClientConnect(client, "localhost", 1883, 60, 1)); + TestClientDisconnect(client); + TestClientFree(client); + + PASS(); +} + +GREATEST_MAIN_DEFS(); + +int main(int argc, char **argv) +{ + GREATEST_MAIN_BEGIN(); + cleanup(); + RUN_TEST(zero_length_clientid_test); + GREATEST_MAIN_END(); +} |
