You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

IRCParserTest.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350
  1. /*
  2. * Copyright (c) 2006-2013 DMDirc Developers
  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.irc;
  23. import com.dmdirc.parser.common.MyInfo;
  24. import com.dmdirc.parser.common.ParserError;
  25. import com.dmdirc.harness.parser.TestParser;
  26. import com.dmdirc.parser.interfaces.Parser;
  27. import com.dmdirc.parser.interfaces.callbacks.AuthNoticeListener;
  28. import com.dmdirc.parser.common.CallbackNotFoundException;
  29. import com.dmdirc.parser.interfaces.callbacks.CallbackInterface;
  30. import com.dmdirc.parser.interfaces.callbacks.ChannelKickListener;
  31. import com.dmdirc.parser.interfaces.callbacks.ConnectErrorListener;
  32. import com.dmdirc.parser.interfaces.callbacks.ErrorInfoListener;
  33. import com.dmdirc.parser.interfaces.callbacks.NumericListener;
  34. import com.dmdirc.parser.interfaces.callbacks.ServerErrorListener;
  35. import com.dmdirc.parser.interfaces.callbacks.ServerReadyListener;
  36. import java.net.URI;
  37. import java.net.URISyntaxException;
  38. import java.util.Arrays;
  39. import java.util.Date;
  40. import javax.net.ssl.TrustManager;
  41. import org.junit.Test;
  42. import static org.junit.Assert.*;
  43. import static org.mockito.Mockito.*;
  44. public class IRCParserTest {
  45. private static interface TestCallback extends CallbackInterface { }
  46. @Test(expected=CallbackNotFoundException.class)
  47. public void testIssue42() {
  48. // Invalid callback names are silently ignored instead of raising exceptions
  49. final IRCParser myParser = new IRCParser();
  50. myParser.getCallbackManager().addCallback(TestCallback.class, mock(TestCallback.class));
  51. }
  52. @Test
  53. public void testIssue1674() {
  54. // parser nick change error with dual 001
  55. final ErrorInfoListener error = mock(ErrorInfoListener.class);
  56. final TestParser myParser = new TestParser();
  57. myParser.getCallbackManager().addCallback(ErrorInfoListener.class, error);
  58. myParser.injectConnectionStrings();
  59. myParser.nick = "nick2";
  60. myParser.injectConnectionStrings();
  61. myParser.injectLine(":nick2!ident@host NICK :nick");
  62. verify(error, never()).onErrorInfo(same(myParser), (Date) anyObject(),
  63. (ParserError) anyObject());
  64. }
  65. @Test
  66. public void testTokeniser() {
  67. final String line1 = "a b c d e";
  68. final String line2 = "a b c :d e";
  69. final String line3 = ":a b:c :d e";
  70. final String line4 = null;
  71. final String[] res1 = IRCParser.tokeniseLine(line1);
  72. final String[] res2 = IRCParser.tokeniseLine(line2);
  73. final String[] res3 = IRCParser.tokeniseLine(line3);
  74. final String[] res4 = IRCParser.tokeniseLine(line4);
  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. assertTrue(Arrays.equals(res4, new String[]{""}));
  79. }
  80. @Test
  81. public void testSendConnectionStrings1() throws URISyntaxException {
  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, new URI("irc://irc.testing.dmdirc:6667/"));
  87. parser.sendConnectionStrings();
  88. assertEquals(3, parser.sentLines.size());
  89. assertTrue("Should send CAP LS line",
  90. Arrays.equals(parser.getLine(0), new String[]{"CAP", "LS"}));
  91. assertTrue("Should send nickname line",
  92. Arrays.equals(parser.getLine(1), new String[]{"NICK", "Nickname"}));
  93. final String[] userParts = parser.getLine(2);
  94. assertEquals("First token should be USER", "USER", userParts[0]);
  95. assertEquals("USER should contain username", myInfo.getUsername().toLowerCase(),
  96. userParts[1].toLowerCase());
  97. assertEquals("USER should contain server name", "irc.testing.dmdirc", userParts[3]);
  98. assertEquals("USER should contain real name", "Real name", userParts[4]);
  99. }
  100. @Test
  101. public void testSendConnectionStrings2() throws URISyntaxException {
  102. final MyInfo myInfo = new MyInfo();
  103. myInfo.setNickname("Nickname");
  104. myInfo.setRealname("Real name");
  105. myInfo.setUsername("Username");
  106. final TestParser parser = new TestParser(myInfo, new URI("irc://password@irc.testing.dmdirc:6667/"));
  107. parser.sendConnectionStrings();
  108. assertEquals(4, parser.sentLines.size());
  109. assertTrue("Should send password line",
  110. Arrays.equals(parser.getLine(1), new String[]{"PASS", "password"}));
  111. }
  112. @Test
  113. public void testPingPong() {
  114. final TestParser parser = new TestParser();
  115. parser.injectLine("PING :flubadee7291");
  116. assertTrue("Should reply to PINGs with PONGs",
  117. Arrays.equals(parser.getLine(0), new String[]{"PONG", "flubadee7291"}));
  118. }
  119. @Test
  120. public void testError() throws CallbackNotFoundException {
  121. final ServerErrorListener test = mock(ServerErrorListener.class);
  122. final TestParser parser = new TestParser();
  123. parser.getCallbackManager().addCallback(ServerErrorListener.class, test);
  124. parser.injectLine("ERROR :You smell of cheese");
  125. verify(test).onServerError(same(parser), (Date) anyObject(), eq("You smell of cheese"));
  126. }
  127. @Test
  128. public void testAuthNotice() throws CallbackNotFoundException {
  129. final AuthNoticeListener test = mock(AuthNoticeListener.class);
  130. final TestParser parser = new TestParser();
  131. parser.getCallbackManager().addCallback(AuthNoticeListener.class, test);
  132. parser.sendConnectionStrings();
  133. parser.injectLine("NOTICE AUTH :Random auth notice?");
  134. verify(test).onNoticeAuth(same(parser), (Date) anyObject(), eq("Random auth notice?"));
  135. }
  136. @Test
  137. public void testAuthNoticeTwenty() throws CallbackNotFoundException {
  138. final AuthNoticeListener test = mock(AuthNoticeListener.class);
  139. final TestParser parser = new TestParser();
  140. parser.getCallbackManager().addCallback(AuthNoticeListener.class, test);
  141. parser.sendConnectionStrings();
  142. parser.injectLine(":us.ircnet.org 020 * :Stupid notice");
  143. verify(test).onNoticeAuth(same(parser), (Date) anyObject(), eq("Stupid notice"));
  144. }
  145. @Test
  146. public void testPre001NickChange() throws CallbackNotFoundException {
  147. final AuthNoticeListener test = mock(AuthNoticeListener.class);
  148. final TestParser parser = new TestParser();
  149. parser.getCallbackManager().addCallback(AuthNoticeListener.class, test);
  150. parser.sendConnectionStrings();
  151. parser.injectLine(":chris!@ NICK :user2");
  152. verify(test, never()).onNoticeAuth((Parser) anyObject(), (Date) anyObject(), anyString());
  153. }
  154. @Test
  155. public void testNumeric() throws CallbackNotFoundException {
  156. final NumericListener test = mock(NumericListener.class);
  157. final TestParser parser = new TestParser();
  158. parser.getCallbackManager().addCallback(NumericListener.class, test);
  159. parser.injectLine(":server 001 nick :Hi there, nick");
  160. verify(test).onNumeric(same(parser), (Date) anyObject(), eq(1),
  161. eq(new String[]{":server", "001", "nick", "Hi there, nick"}));
  162. }
  163. @Test
  164. public void testServerReady() throws CallbackNotFoundException {
  165. final ServerReadyListener test = mock(ServerReadyListener.class);
  166. final TestParser parser = new TestParser();
  167. parser.getCallbackManager().addCallback(ServerReadyListener.class, test);
  168. final String[] strings = {
  169. "NOTICE AUTH :Blah, blah",
  170. ":server 020 * :Blah! Blah!",
  171. ":server 001 nick :Welcome to the Testing IRC Network, nick",
  172. ":server 002 nick :Your host is server.net, running version foo",
  173. "NOTICE AUTH :I'm a retarded server",
  174. ":server 003 nick :This server was created Sun Jan 6 2008 at 17:34:54 CET",
  175. ":server 004 nick server.net foo dioswkgxRXInP biklmnopstvrDcCNuMT bklov",
  176. ":server 005 nick WHOX WALLCHOPS WALLVOICES USERIP :are supported by this server",
  177. ":server 005 nick MAXNICKLEN=15 TOPICLEN=250 AWAYLEN=160 :are supported " +
  178. "by this server",
  179. ":server 375 nick :zomg, motd!",
  180. };
  181. for (String string : strings) {
  182. verify(test, never()).onServerReady((Parser) anyObject(), (Date) anyObject());
  183. parser.injectLine(string);
  184. }
  185. verify(test).onServerReady(same(parser), (Date) anyObject());
  186. }
  187. @Test
  188. public void test005Parsing() {
  189. final TestParser parser = new TestParser();
  190. final String[] strings = {
  191. ":server 001 nick :Welcome to the Testing IRC Network, nick",
  192. ":server 002 nick :Your host is server.net, running version foo",
  193. ":server 003 nick :This server was created Sun Jan 6 2008 at 17:34:54 CET",
  194. ":server 004 nick server.net foo dioswkgxRXInP biklmnopstvrDcCNuMT bklov",
  195. ":server 005 nick WHOX WALLCHOPS WALLVOICES NETWORK=moo :are supported by" +
  196. " this server",
  197. ":server 005 nick MAXNICKLEN=15 MAXLIST=b:10,e:22,I:45 :are supported by" +
  198. " this server",
  199. ":server 375 nick :zomg, motd!",
  200. };
  201. for (String string : strings) {
  202. parser.injectLine(string);
  203. }
  204. assertEquals(10, parser.getMaxListModes('b'));
  205. assertEquals(22, parser.getMaxListModes('e'));
  206. assertEquals(45, parser.getMaxListModes('I'));
  207. assertEquals("getMaxListModes should return 0 for unknowns;", 0,
  208. parser.getMaxListModes('z'));
  209. assertEquals("moo", parser.getNetworkName());
  210. assertEquals("server", parser.getServerName());
  211. }
  212. @Test
  213. public void testBindIP() {
  214. final TestParser parser = new TestParser();
  215. parser.setBindIP("abc.def.ghi.123");
  216. assertEquals("abc.def.ghi.123", parser.getBindIP());
  217. }
  218. @Test
  219. public void testAutoListMode() {
  220. final TestParser parser = new TestParser();
  221. parser.setAutoListMode(false);
  222. assertFalse(parser.getAutoListMode());
  223. parser.setAutoListMode(true);
  224. assertTrue(parser.getAutoListMode());
  225. }
  226. @Test
  227. public void testRemoveAfterCallback() {
  228. final TestParser parser = new TestParser();
  229. parser.setRemoveAfterCallback(false);
  230. assertFalse(parser.getRemoveAfterCallback());
  231. parser.setRemoveAfterCallback(true);
  232. assertTrue(parser.getRemoveAfterCallback());
  233. }
  234. @Test
  235. public void testAddLastLine() {
  236. final TestParser parser = new TestParser();
  237. parser.setAddLastLine(false);
  238. assertFalse(parser.getAddLastLine());
  239. parser.setAddLastLine(true);
  240. assertTrue(parser.getAddLastLine());
  241. }
  242. @Test
  243. public void testDisconnectOnFatal() {
  244. final TestParser parser = new TestParser();
  245. parser.setDisconnectOnFatal(false);
  246. assertFalse(parser.getDisconnectOnFatal());
  247. parser.setDisconnectOnFatal(true);
  248. assertTrue(parser.getDisconnectOnFatal());
  249. }
  250. @Test
  251. public void testTrustManager() {
  252. final TestParser parser = new TestParser();
  253. assertTrue(Arrays.equals(parser.getDefaultTrustManager(), parser.getTrustManager()));
  254. parser.setTrustManagers(new TrustManager[0]);
  255. assertTrue(Arrays.equals(new TrustManager[0], parser.getTrustManager()));
  256. }
  257. @Test
  258. public void testGetParam() {
  259. assertEquals("abc def", TestParser.getParam("foo :abc def"));
  260. assertEquals("bar :abc def", TestParser.getParam("foo :bar :abc def"));
  261. assertEquals("abc def", TestParser.getParam("abc def"));
  262. }
  263. @Test
  264. public void testKick() throws CallbackNotFoundException {
  265. final TestParser parser = new TestParser();
  266. final ChannelKickListener ick = mock(ChannelKickListener.class);
  267. parser.injectConnectionStrings();
  268. parser.injectLine(":nick JOIN #D");
  269. parser.getCallbackManager().addCallback(ChannelKickListener.class, ick, "#D");
  270. parser.injectLine(":bar!me@moo KICK #D nick :Bye!");
  271. verify(ick).onChannelKick(same(parser), (Date) anyObject(), (IRCChannelInfo) anyObject(),
  272. (IRCChannelClientInfo) anyObject(), (IRCChannelClientInfo) anyObject(),
  273. anyString(), anyString());
  274. }
  275. @Test
  276. public void testIllegalPort2() throws URISyntaxException {
  277. final TestParser tp = new TestParser(new MyInfo(), new URI("irc://127.0.0.1:65570/"));
  278. final ConnectErrorListener tiei = mock(ConnectErrorListener.class);
  279. tp.getCallbackManager().addCallback(ConnectErrorListener.class, tiei);
  280. tp.runSuper();
  281. verify(tiei).onConnectError(same(tp), (Date) anyObject(), (ParserError) anyObject());
  282. }
  283. }