aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorOskari Timperi <oskari.timperi@iki.fi>2017-02-19 00:32:05 +0200
committerOskari Timperi <oskari.timperi@iki.fi>2017-02-19 00:32:05 +0200
commit56b14eb55d3078d38e07bc22aae73e73017b1257 (patch)
tree82260e91c808ce05903749a3e0d571efc2a4c470 /test
parent751480833388b1e56bbe7c24b523bf98d9d04383 (diff)
downloadmqtt-56b14eb55d3078d38e07bc22aae73e73017b1257.tar.gz
mqtt-56b14eb55d3078d38e07bc22aae73e73017b1257.zip
Add more interop tests
Diffstat (limited to 'test')
-rw-r--r--test/interop/CMakeLists.txt6
-rw-r--r--test/interop/basic_test.c15
-rw-r--r--test/interop/cleanup.c39
-rw-r--r--test/interop/keepalive_test.c39
-rw-r--r--test/interop/offline_message_queueing_test.c49
-rw-r--r--test/interop/overlapping_subscriptions_test.c48
-rw-r--r--test/interop/retained_message_test.c45
-rw-r--r--test/interop/topics.c9
-rw-r--r--test/interop/will_message_test.c42
-rw-r--r--test/interop/zero_length_clientid_test.c29
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();
+}