Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

IRCParserTest.java 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. /*
  2. * Copyright (c) 2006-2008 Chris Smith, Shane Mc Cormack, Gregory Holmes
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy
  5. * of this software and associated documentation files (the "Software"), to deal
  6. * in the Software without restriction, including without limitation the rights
  7. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. * copies of the Software, and to permit persons to whom the Software is
  9. * furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  20. * SOFTWARE.
  21. */
  22. package com.dmdirc.parser;
  23. import com.dmdirc.harness.parser.TestIPrivateCTCP;
  24. import com.dmdirc.harness.parser.TestParser;
  25. import com.dmdirc.harness.parser.TestIChannelKick;
  26. import com.dmdirc.harness.parser.TestINoticeAuth;
  27. import com.dmdirc.harness.parser.TestINumeric;
  28. import com.dmdirc.harness.parser.TestIServerError;
  29. import com.dmdirc.harness.parser.TestIChannelSelfJoin;
  30. import com.dmdirc.harness.parser.TestIPost005;
  31. import com.dmdirc.harness.parser.TestIPrivateMessage;
  32. import com.dmdirc.harness.parser.TestIPrivateAction;
  33. import com.dmdirc.parser.callbacks.CallbackNotFoundException;
  34. import com.dmdirc.parser.callbacks.interfaces.IAwayState;
  35. import com.dmdirc.parser.callbacks.interfaces.IChannelKick;
  36. import com.dmdirc.parser.callbacks.interfaces.IChannelSelfJoin;
  37. import com.dmdirc.parser.callbacks.interfaces.INoticeAuth;
  38. import com.dmdirc.parser.callbacks.interfaces.INumeric;
  39. import com.dmdirc.parser.callbacks.interfaces.IPost005;
  40. import com.dmdirc.parser.callbacks.interfaces.IPrivateAction;
  41. import com.dmdirc.parser.callbacks.interfaces.IPrivateCTCP;
  42. import com.dmdirc.parser.callbacks.interfaces.IPrivateMessage;
  43. import com.dmdirc.parser.callbacks.interfaces.IServerError;
  44. import java.util.Arrays;
  45. import java.util.List;
  46. import javax.net.ssl.TrustManager;
  47. import org.junit.Test;
  48. import static org.junit.Assert.*;
  49. public class IRCParserTest extends junit.framework.TestCase {
  50. @Test
  51. public void testIssue042() {
  52. boolean res = false;
  53. try {
  54. final IRCParser myParser = new IRCParser();
  55. myParser.getCallbackManager().addCallback("non-existant",new IAwayState() {
  56. public void onAwayState(IRCParser tParser, boolean currentState,
  57. String reason) {
  58. throw new UnsupportedOperationException("Not supported yet.");
  59. }
  60. });
  61. } catch (CallbackNotFoundException ex) {
  62. res = true;
  63. }
  64. assertTrue("addCallback() should throw exception for non-existant callbacks", res);
  65. }
  66. @Test
  67. public void testTokeniser() {
  68. final IRCParser myParser = new IRCParser();
  69. final String line1 = "a b c d e";
  70. final String line2 = "a b c :d e";
  71. final String line3 = ":a b:c :d e";
  72. final String[] res1 = myParser.tokeniseLine(line1);
  73. final String[] res2 = myParser.tokeniseLine(line2);
  74. final String[] res3 = myParser.tokeniseLine(line3);
  75. assertTrue(Arrays.equals(res1, new String[]{"a", "b", "c", "d", "e"}));
  76. assertTrue(Arrays.equals(res2, new String[]{"a", "b", "c", "d e"}));
  77. assertTrue(Arrays.equals(res3, new String[]{":a", "b:c", "d e"}));
  78. }
  79. @Test
  80. public void testSendConnectionStrings1() {
  81. final ServerInfo serverInfo = new ServerInfo("irc.testing.dmdirc", 6667, "");
  82. final MyInfo myInfo = new MyInfo();
  83. myInfo.setNickname("Nickname");
  84. myInfo.setRealname("Real name");
  85. myInfo.setUsername("Username");
  86. final TestParser parser = new TestParser(myInfo, serverInfo);
  87. parser.sendConnectionStrings();
  88. assertEquals(2, parser.sentLines.size());
  89. assertTrue("Should send nickname line",
  90. Arrays.equals(parser.getLine(0), new String[]{"NICK", "Nickname"}));
  91. final String[] userParts = parser.getLine(1);
  92. assertEquals("First token should be USER", "USER", userParts[0]);
  93. assertEquals("USER should contain username", myInfo.getUsername().toLowerCase(),
  94. userParts[1].toLowerCase());
  95. assertEquals("USER should contain server name", serverInfo.getHost(), userParts[3]);
  96. assertEquals("USER should contain real name", "Real name", userParts[4]);
  97. }
  98. @Test
  99. public void testSendConnectionStrings2() {
  100. final ServerInfo serverInfo = new ServerInfo("irc.testing.dmdirc", 6667, "password");
  101. final MyInfo myInfo = new MyInfo();
  102. myInfo.setNickname("Nickname");
  103. myInfo.setRealname("Real name");
  104. myInfo.setUsername("Username");
  105. final TestParser parser = new TestParser(myInfo, serverInfo);
  106. parser.sendConnectionStrings();
  107. assertEquals(3, parser.sentLines.size());
  108. assertTrue("Should send password line",
  109. Arrays.equals(parser.getLine(0), new String[]{"PASS", "password"}));
  110. }
  111. @Test
  112. public void testPingPong() {
  113. final TestParser parser = new TestParser();
  114. parser.injectLine("PING :flubadee7291");
  115. assertTrue("Should reply to PINGs with PONGs",
  116. Arrays.equals(parser.getLine(0), new String[]{"PONG", "flubadee7291"}));
  117. }
  118. @Test
  119. public void testError() throws CallbackNotFoundException {
  120. final TestIServerError test = new TestIServerError();
  121. final TestParser parser = new TestParser();
  122. parser.getCallbackManager().addCallback("onServerError", test);
  123. parser.injectLine("ERROR :You smell of cheese");
  124. assertNotNull(test.message);
  125. assertEquals("ERROR message should be passed to callback",
  126. "You smell of cheese", test.message);
  127. }
  128. @Test
  129. public void testAuthNotices() throws CallbackNotFoundException {
  130. final TestINoticeAuth test = new TestINoticeAuth();
  131. final TestParser parser = new TestParser();
  132. parser.getCallbackManager().addCallback("onNoticeAuth", test);
  133. parser.sendConnectionStrings();
  134. parser.injectLine("NOTICE AUTH :Random auth notice?");
  135. assertNotNull(test.message);
  136. assertEquals("Random auth notice?", test.message);
  137. test.message = null;
  138. parser.injectLine(":us.ircnet.org 020 * :Stupid notice");
  139. assertNotNull(test.message);
  140. assertEquals("Stupid notice", test.message);
  141. }
  142. @Test
  143. public void testNumeric() throws CallbackNotFoundException {
  144. final TestINumeric test = new TestINumeric();
  145. final TestParser parser = new TestParser();
  146. parser.getCallbackManager().addCallback("onNumeric", test);
  147. parser.injectLine(":server 001 nick :Hi there, nick");
  148. assertEquals(1, test.numeric);
  149. assertTrue(Arrays.equals(new String[]{":server", "001", "nick", "Hi there, nick"},
  150. test.data));
  151. }
  152. @Test
  153. public void testPost005() throws CallbackNotFoundException {
  154. final TestIPost005 test = new TestIPost005();
  155. final TestParser parser = new TestParser();
  156. parser.getCallbackManager().addCallback("onPost005", test);
  157. final String[] strings = {
  158. "NOTICE AUTH :Blah, blah",
  159. ":server 020 * :Blah! Blah!",
  160. ":server 001 nick :Welcome to the Testing IRC Network, nick",
  161. ":server 002 nick :Your host is server.net, running version foo",
  162. "NOTICE AUTH :I'm a retarded server",
  163. ":server 003 nick :This server was created Sun Jan 6 2008 at 17:34:54 CET",
  164. ":server 004 nick server.net foo dioswkgxRXInP biklmnopstvrDcCNuMT bklov",
  165. ":server 005 nick WHOX WALLCHOPS WALLVOICES USERIP :are supported by this server",
  166. ":server 005 nick MAXNICKLEN=15 TOPICLEN=250 AWAYLEN=160 :are supported " +
  167. "by this server",
  168. ":server 375 nick :zomg, motd!",
  169. };
  170. for (String string : strings) {
  171. assertFalse("OnPost005 fired too early", test.done);
  172. parser.injectLine(string);
  173. }
  174. assertTrue("OnPost005 not fired", test.done);
  175. }
  176. @Test
  177. public void test005Parsing() {
  178. final TestParser parser = new TestParser();
  179. final String[] strings = {
  180. ":server 001 nick :Welcome to the Testing IRC Network, nick",
  181. ":server 002 nick :Your host is server.net, running version foo",
  182. ":server 003 nick :This server was created Sun Jan 6 2008 at 17:34:54 CET",
  183. ":server 004 nick server.net foo dioswkgxRXInP biklmnopstvrDcCNuMT bklov",
  184. ":server 005 nick WHOX WALLCHOPS WALLVOICES NETWORK=moo :are supported by" +
  185. " this server",
  186. ":server 005 nick MAXNICKLEN=15 MAXLIST=b:10,e:22,I:45 :are supported by" +
  187. " this server",
  188. ":server 375 nick :zomg, motd!",
  189. };
  190. for (String string : strings) {
  191. parser.injectLine(string);
  192. }
  193. assertEquals(10, parser.getMaxListModes('b'));
  194. assertEquals(22, parser.getMaxListModes('e'));
  195. assertEquals(45, parser.getMaxListModes('I'));
  196. assertEquals("getMaxListModes should return 0 for unknowns;", 0,
  197. parser.getMaxListModes('z'));
  198. assertEquals("moo", parser.getNetworkName());
  199. assertEquals("server", parser.getServerName());
  200. }
  201. @Test
  202. public void testBindIP() {
  203. final TestParser parser = new TestParser();
  204. parser.setBindIP("abc.def.ghi.123");
  205. assertEquals("abc.def.ghi.123", parser.getBindIP());
  206. }
  207. @Test
  208. public void testCreateFake() {
  209. final TestParser parser = new TestParser();
  210. parser.setCreateFake(false);
  211. assertFalse(parser.getCreateFake());
  212. parser.setCreateFake(true);
  213. assertTrue(parser.getCreateFake());
  214. }
  215. @Test
  216. public void testAutoListMode() {
  217. final TestParser parser = new TestParser();
  218. parser.setAutoListMode(false);
  219. assertFalse(parser.getAutoListMode());
  220. parser.setAutoListMode(true);
  221. assertTrue(parser.getAutoListMode());
  222. }
  223. @Test
  224. public void testRemoveAfterCallback() {
  225. final TestParser parser = new TestParser();
  226. parser.setRemoveAfterCallback(false);
  227. assertFalse(parser.getRemoveAfterCallback());
  228. parser.setRemoveAfterCallback(true);
  229. assertTrue(parser.getRemoveAfterCallback());
  230. }
  231. @Test
  232. public void testAddLastLine() {
  233. final TestParser parser = new TestParser();
  234. parser.setAddLastLine(false);
  235. assertFalse(parser.getAddLastLine());
  236. parser.setAddLastLine(true);
  237. assertTrue(parser.getAddLastLine());
  238. }
  239. @Test
  240. public void testDisconnectOnFatal() {
  241. final TestParser parser = new TestParser();
  242. parser.setDisconnectOnFatal(false);
  243. assertFalse(parser.getDisconnectOnFatal());
  244. parser.setDisconnectOnFatal(true);
  245. assertTrue(parser.getDisconnectOnFatal());
  246. }
  247. @Test
  248. public void testTrustManager() {
  249. final TestParser parser = new TestParser();
  250. assertTrue(Arrays.equals(parser.getDefaultTrustManager(), parser.getTrustManager()));
  251. parser.setTrustManager(new TrustManager[0]);
  252. assertTrue(Arrays.equals(new TrustManager[0], parser.getTrustManager()));
  253. }
  254. @Test
  255. public void testJoinChannel() throws CallbackNotFoundException {
  256. final TestParser parser = new TestParser();
  257. final TestIChannelSelfJoin test = new TestIChannelSelfJoin();
  258. parser.injectConnectionStrings();
  259. parser.getCallbackManager().addCallback("onChannelSelfJoin", test);
  260. parser.injectLine(":nick JOIN #DMDirc_testing");
  261. assertNotNull(test.channel);
  262. assertEquals("#DMDirc_testing", test.channel.getName());
  263. assertEquals("#DMDirc_testing", test.channel.toString());
  264. assertEquals(parser, test.channel.getParser());
  265. assertEquals(1, parser.getChannels().size());
  266. assertTrue(parser.getChannels().contains(test.channel));
  267. assertEquals(test.channel, parser.getChannelInfo("#DMDirc_testing"));
  268. }
  269. @Test
  270. public void testPrivateMessages() throws CallbackNotFoundException {
  271. final TestParser parser = new TestParser();
  272. final TestIPrivateMessage ipmtest = new TestIPrivateMessage();
  273. final TestIPrivateAction ipatest = new TestIPrivateAction();
  274. final TestIPrivateCTCP ipctest = new TestIPrivateCTCP();
  275. parser.injectConnectionStrings();
  276. parser.getCallbackManager().addCallback("onPrivateMessage", ipmtest);
  277. parser.getCallbackManager().addCallback("onPrivateAction", ipatest);
  278. parser.getCallbackManager().addCallback("onPrivateCTCP", ipctest);
  279. parser.injectLine(":a!b@c PRIVMSG nick :Hello!");
  280. assertNotNull(ipmtest.host);
  281. assertNull(ipatest.host);
  282. assertNull(ipctest.host);
  283. assertEquals("a!b@c", ipmtest.host);
  284. assertEquals("Hello!", ipmtest.message);
  285. ipmtest.host = null;
  286. ipmtest.message = null;
  287. parser.injectLine(":a!b@c PRIVMSG nick :" + ((char) 1) + "ACTION meep" + ((char) 1));
  288. assertNull(ipmtest.host);
  289. assertNotNull(ipatest.host);
  290. assertNull(ipctest.host);
  291. assertEquals("a!b@c", ipatest.host);
  292. assertEquals("meep", ipatest.message);
  293. ipatest.host = null;
  294. ipatest.message = null;
  295. parser.injectLine(":a!b@c PRIVMSG nick :" + ((char) 1) + "FOO meep" + ((char) 1));
  296. assertNull(ipmtest.host);
  297. assertNull(ipatest.host);
  298. assertNotNull(ipctest.host);
  299. assertEquals("a!b@c", ipctest.host);
  300. assertEquals("FOO", ipctest.type);
  301. assertEquals("meep", ipctest.message);
  302. }
  303. private void testListModes(String numeric1, String numeric2, char mode) {
  304. final TestParser parser = new TestParser();
  305. parser.injectConnectionStrings();
  306. parser.injectLine(":nick JOIN #D");
  307. parser.injectLine(":server " + numeric1 + " nick #D ban1!ident@.host bansetter1 1001");
  308. parser.injectLine(":server " + numeric1 + " nick #D ban2!*@.host bansetter2 1002");
  309. parser.injectLine(":server " + numeric1 + " nick #D ban3!ident@* bansetter3 1003");
  310. parser.injectLine(":server " + numeric2 + " nick #D :End of Channel Something List");
  311. final List<ChannelListModeItem> items
  312. = parser.getChannelInfo("#D").getListModeParam(mode);
  313. assertEquals(3, items.size());
  314. boolean gotOne = false, gotTwo = false, gotThree = false;
  315. for (ChannelListModeItem item : items) {
  316. if (item.getItem().equals("ban1!ident@.host")) {
  317. assertEquals("bansetter1", item.getOwner());
  318. assertEquals(1001, item.getTime());
  319. assertFalse(gotOne);
  320. gotOne = true;
  321. } else if (item.getItem().equals("ban2!*@.host")) {
  322. assertEquals("bansetter2", item.getOwner());
  323. assertEquals(1002, item.getTime());
  324. assertFalse(gotTwo);
  325. gotTwo = true;
  326. } else if (item.toString().equals("ban3!ident@*")) {
  327. assertEquals("bansetter3", item.getOwner());
  328. assertEquals(1003, item.getTime());
  329. assertFalse(gotThree);
  330. gotThree = true;
  331. }
  332. }
  333. assertTrue(gotOne);
  334. assertTrue(gotTwo);
  335. assertTrue(gotThree);
  336. }
  337. @Test
  338. public void testNormalBans() {
  339. testListModes("367", "368", 'b');
  340. }
  341. @Test
  342. public void testInvexList() {
  343. testListModes("346", "347", 'I');
  344. }
  345. @Test
  346. public void testExemptList() {
  347. testListModes("348", "349", 'e');
  348. }
  349. @Test
  350. public void testReopList() {
  351. testListModes("344", "345", 'R');
  352. }
  353. @Test
  354. public void testGetParam() {
  355. assertEquals("abc def", TestParser.getParam("foo :abc def"));
  356. assertEquals("bar :abc def", TestParser.getParam("foo :bar :abc def"));
  357. assertEquals("abc def", TestParser.getParam("abc def"));
  358. }
  359. @Test
  360. public void testKick() throws CallbackNotFoundException {
  361. final TestParser parser = new TestParser();
  362. final TestIChannelKick ick = new TestIChannelKick();
  363. parser.injectConnectionStrings();
  364. parser.injectLine(":nick JOIN #D");
  365. parser.getCallbackManager().addCallback("onChannelKick", ick, "#D");
  366. parser.injectLine(":bar!me@moo KICK #D nick :Bye!");
  367. assertTrue("onChannelKick must be called", ick.called);
  368. assertNotNull("cKickedClient must not be null", ick.cKickedClient);
  369. }
  370. @Test
  371. public void testIRCds() {
  372. doIRCdTest("u2.10.12.10+snircd(1.3.4)", "snircd");
  373. doIRCdTest("u2.10.12.12", "ircu");
  374. doIRCdTest("hyperion-1.0.2b", "hyperion");
  375. doIRCdTest("hybrid-7.2.3", "hybrid");
  376. doIRCdTest("Unreal3.2.6", "unreal");
  377. doIRCdTest("bahamut-1.8(04)", "bahamut");
  378. }
  379. private void doIRCdTest(final String ircd, final String expected) {
  380. final TestParser parser = new TestParser();
  381. String[] strings = {
  382. ":server 001 nick :Welcome to the Testing IRC Network, nick",
  383. ":server 002 nick :Your host is server.net, running version %s",
  384. ":server 003 nick :This server was created Sun Jan 6 2008 at 17:34:54 CET",
  385. ":server 004 nick server.net %s dioswkgxRXInP biklmnopstvrDcCNuMT bklov"
  386. };
  387. for (String line : strings) {
  388. parser.injectLine(String.format(line, ircd));
  389. }
  390. assertEquals(ircd, parser.getIRCD(false));
  391. assertEquals(expected.toLowerCase(), parser.getIRCD(true).toLowerCase());
  392. }
  393. }