995
|
1 /* |
|
2 * main.cpp -- test joke plugin |
|
3 * |
|
4 * Copyright (c) 2013-2021 David Demelier <markand@malikania.fr> |
|
5 * |
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
|
7 * purpose with or without fee is hereby granted, provided that the above |
|
8 * copyright notice and this permission notice appear in all copies. |
|
9 * |
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
|
17 */ |
|
18 |
|
19 #include <err.h> |
|
20 |
|
21 #define GREATEST_USE_ABBREVS 0 |
|
22 #include <greatest.h> |
|
23 |
|
24 #include <irccd/compat.h> |
|
25 #include <irccd/js-plugin.h> |
|
26 #include <irccd/plugin.h> |
|
27 #include <irccd/server.h> |
|
28 |
|
29 #define CALL() do { \ |
|
30 memset(server->conn.out, 0, sizeof (server->conn.out)); \ |
|
31 irc_plugin_handle(plugin, &(const struct irc_event) { \ |
|
32 .type = IRC_EVENT_COMMAND, \ |
|
33 .server = server, \ |
|
34 .message = { \ |
|
35 .origin = "jean!jean@localhost", \ |
|
36 .channel = "#joke", \ |
|
37 .message = "" \ |
|
38 } \ |
|
39 }); \ |
|
40 } while (0) |
|
41 |
|
42 static struct irc_server *server; |
|
43 static struct irc_plugin *plugin; |
|
44 |
|
45 static void |
|
46 setup(void *udata) |
|
47 { |
|
48 (void)udata; |
|
49 |
|
50 server = irc_server_new("test", "t", "t", "t", "127.0.0.1", 6667); |
|
51 plugin = js_plugin_open("joke", CMAKE_SOURCE_DIR "/plugins/joke/joke.js"); |
|
52 |
|
53 if (!plugin) |
|
54 errx(1, "could not load plugin"); |
|
55 |
|
56 irc_server_incref(server); |
|
57 irc_plugin_set_template(plugin, "error", "error=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}"); |
|
58 |
|
59 irc_plugin_set_option(plugin, "file", SOURCE "/data/joke/jokes.json"); |
|
60 irc_plugin_load(plugin); |
|
61 |
|
62 /* Fake server connected to send data. */ |
|
63 server->state = IRC_SERVER_STATE_CONNECTED; |
|
64 } |
|
65 |
|
66 static void |
|
67 teardown(void *udata) |
|
68 { |
|
69 (void)udata; |
|
70 |
|
71 irc_plugin_finish(plugin); |
|
72 irc_server_decref(server); |
|
73 } |
|
74 |
|
75 GREATEST_TEST |
|
76 basics_simple(void) |
|
77 { |
|
78 /* |
|
79 * jokes.json have two jokes. |
|
80 * |
|
81 * aaa |
|
82 * |
|
83 * And |
|
84 * |
|
85 * bbbb |
|
86 * bbbb |
|
87 */ |
|
88 int aaa = 0, bbbb = 0; |
|
89 |
|
90 for (int i = 0; i < 2; ++i) { |
|
91 CALL(); |
|
92 |
|
93 if (strcmp(server->conn.out, "PRIVMSG #joke :aaa\r\n") == 0) |
|
94 aaa = 1; |
|
95 else if (strcmp(server->conn.out, "PRIVMSG #joke :bbbb\r\nPRIVMSG #joke :bbbb\r\n") == 0) |
|
96 bbbb = 1; |
|
97 } |
|
98 |
|
99 GREATEST_ASSERT(aaa); |
|
100 GREATEST_ASSERT(bbbb); |
|
101 |
|
102 GREATEST_PASS(); |
|
103 } |
|
104 |
|
105 GREATEST_TEST |
|
106 errors_toobig(void) |
|
107 { |
|
108 /* |
|
109 * The jokes "xxx" and "yyy" are both 3-lines which we disallow. only a |
|
110 * must be said. |
|
111 */ |
|
112 irc_plugin_set_option(plugin, "file", SOURCE "/data/joke/error-toobig.json"); |
|
113 irc_plugin_set_option(plugin, "max-list-lines", "2"); |
|
114 |
|
115 for (int i = 0; i < 64; ++i) { |
|
116 CALL(); |
|
117 GREATEST_ASSERT_STR_EQ("PRIVMSG #joke :a\r\n", server->conn.out); |
|
118 } |
|
119 |
|
120 GREATEST_PASS(); |
|
121 } |
|
122 |
|
123 GREATEST_TEST |
|
124 errors_invalid(void) |
|
125 { |
|
126 /* Only a is the valid joke in this file. */ |
|
127 irc_plugin_set_option(plugin, "file", SOURCE "/data/joke/error-invalid.json"); |
|
128 irc_plugin_set_option(plugin, "max-list-lines", "2"); |
|
129 |
|
130 for (int i = 0; i < 64; ++i) { |
|
131 CALL(); |
|
132 GREATEST_ASSERT_STR_EQ("PRIVMSG #joke :a\r\n", server->conn.out); |
|
133 } |
|
134 |
|
135 GREATEST_PASS(); |
|
136 } |
|
137 |
|
138 GREATEST_TEST |
|
139 errors_not_found(void) |
|
140 { |
|
141 irc_plugin_set_option(plugin, "file", "doesnotexist.json"); |
|
142 |
|
143 CALL(); |
|
144 GREATEST_ASSERT_STR_EQ("PRIVMSG #joke :error=joke:!joke:test:#joke:jean!jean@localhost:jean\r\n", server->conn.out); |
|
145 |
|
146 GREATEST_PASS(); |
|
147 } |
|
148 |
|
149 GREATEST_TEST |
|
150 errors_not_array(void) |
|
151 { |
|
152 irc_plugin_set_option(plugin, "file", SOURCE "/data/joke/error-not-array.json"); |
|
153 |
|
154 CALL(); |
|
155 GREATEST_ASSERT_STR_EQ("PRIVMSG #joke :error=joke:!joke:test:#joke:jean!jean@localhost:jean\r\n", server->conn.out); |
|
156 |
|
157 GREATEST_PASS(); |
|
158 } |
|
159 |
|
160 GREATEST_TEST |
|
161 errors_empty(void) |
|
162 { |
|
163 irc_plugin_set_option(plugin, "file", SOURCE "/data/joke/error-empty.json"); |
|
164 |
|
165 CALL(); |
|
166 GREATEST_ASSERT_STR_EQ("PRIVMSG #joke :error=joke:!joke:test:#joke:jean!jean@localhost:jean\r\n", server->conn.out); |
|
167 |
|
168 GREATEST_PASS(); |
|
169 } |
|
170 |
|
171 GREATEST_SUITE(suite_basics) |
|
172 { |
|
173 GREATEST_SET_SETUP_CB(setup, NULL); |
|
174 GREATEST_SET_TEARDOWN_CB(teardown, NULL); |
|
175 GREATEST_RUN_TEST(basics_simple); |
|
176 } |
|
177 |
|
178 GREATEST_SUITE(suite_errors) |
|
179 { |
|
180 GREATEST_SET_SETUP_CB(setup, NULL); |
|
181 GREATEST_SET_TEARDOWN_CB(teardown, NULL); |
|
182 GREATEST_RUN_TEST(errors_toobig); |
|
183 GREATEST_RUN_TEST(errors_invalid); |
|
184 GREATEST_RUN_TEST(errors_not_found); |
|
185 GREATEST_RUN_TEST(errors_not_array); |
|
186 GREATEST_RUN_TEST(errors_empty); |
|
187 } |
|
188 |
|
189 GREATEST_MAIN_DEFS(); |
|
190 |
|
191 int |
|
192 main(int argc, char **argv) |
|
193 { |
|
194 GREATEST_MAIN_BEGIN(); |
|
195 GREATEST_RUN_SUITE(suite_basics); |
|
196 GREATEST_RUN_SUITE(suite_errors); |
|
197 GREATEST_MAIN_END(); |
|
198 |
|
199 return 0; |
|
200 } |