View Javadoc

1   /***
2    * Jetrix TetriNET Server
3    * Copyright (C) 2001-2003  Emmanuel Bourg
4    *
5    * This program is free software; you can redistribute it and/or
6    * modify it under the terms of the GNU General Public License
7    * as published by the Free Software Foundation; either version 2
8    * of the License, or (at your option) any later version.
9    *
10   * This program is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   *
15   * You should have received a copy of the GNU General Public License
16   * along with this program; if not, write to the Free Software
17   * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18   */
19  
20  package net.jetrix.protocols;
21  
22  import static net.jetrix.protocols.TetrinetProtocol.*;
23  
24  import java.io.*;
25  import java.util.*;
26  
27  import junit.framework.*;
28  import net.jetrix.*;
29  import net.jetrix.messages.channel.*;
30  
31  /***
32   * JUnit TestCase for the class net.jetrix.protocols.TetrinetProtocolTest
33   *
34   * @author Emmanuel Bourg
35   * @version $Revision: 863 $, $Date: 2010-08-20 12:26:25 +0200 (ven., 20 août 2010) $
36   */
37  public class TetrinetProtocolTest extends TestCase
38  {
39      private Protocol protocol;
40      private Locale locale;
41  
42      public void setUp()
43      {
44          protocol = new TetrinetProtocol();
45          locale = new Locale("fr");
46      }
47  
48      public void testTranslatePline()
49      {
50          PlineMessage message = new PlineMessage();
51          message.setSlot(1);
52          message.setText("Hello Jetrix!");
53          assertEquals("pline 1 Hello Jetrix!", protocol.translate(message, locale));
54      }
55  
56      public void testGetMessagePline()
57      {
58          String raw = "pline 1 hello world!";
59          Message message = protocol.getMessage(raw);
60  
61          assertNotNull("message not parsed", message);
62          assertEquals("message class", PlineMessage.class, message.getClass());
63  
64          PlineMessage pline = (PlineMessage) message;
65          assertEquals("slot", 1, pline.getSlot());
66          assertEquals("text", "hello world!", pline.getText(Locale.ENGLISH));
67      }
68  
69      public void testGetMessageCommand()
70      {
71          String raw = "pline 1 /move 1 2";
72          Message message = protocol.getMessage(raw);
73  
74          assertNotNull("message not parsed", message);
75          assertEquals("message class", CommandMessage.class, message.getClass());
76  
77          CommandMessage command = (CommandMessage) message;
78          assertEquals("slot", 1, command.getSlot());
79          assertEquals("command", "move", command.getCommand());
80          assertEquals("text", "1 2", command.getText(Locale.ENGLISH));
81          assertEquals("parameter count", 2, command.getParameterCount());
82          assertEquals("1st parameter", "1", command.getParameter(0));
83          assertEquals("2nd parameter", "2", command.getParameter(1));
84      }
85  
86      public void testTranslatePlineAct()
87      {
88          PlineActMessage message = new PlineActMessage();
89          message.setSlot(1);
90          message.setText("feels faster");
91          assertEquals("plineact 1 feels faster", protocol.translate(message, locale));
92      }
93  
94      public void testGetMessagePlineAct()
95      {
96          String raw = "plineact 1 says hello world!";
97          Message message = protocol.getMessage(raw);
98  
99          assertNotNull("message not parsed", message);
100         assertEquals("message class", PlineActMessage.class, message.getClass());
101 
102         PlineActMessage plineact = (PlineActMessage) message;
103         assertEquals("slot", 1, plineact.getSlot());
104         assertEquals("text", "says hello world!", plineact.getText(Locale.ENGLISH));
105     }
106 
107     public void testTranslateGmsg()
108     {
109         GmsgMessage message = new GmsgMessage();
110         message.setText("<Smanux> hello world!");
111         assertEquals("gmsg <Smanux> hello world!", protocol.translate(message, locale));
112     }
113 
114     public void testGetMessageGmsg()
115     {
116         String raw = "gmsg <Smanux> Hello world!";
117         Message message = protocol.getMessage(raw);
118 
119         assertNotNull("message not parsed", message);
120         assertEquals("message class", GmsgMessage.class, message.getClass());
121 
122         GmsgMessage gmsg = (GmsgMessage) message;
123         assertEquals("slot", 0, gmsg.getSlot());
124         assertEquals("text", "<Smanux> Hello world!", gmsg.getText(Locale.ENGLISH));
125     }
126 
127     public void testTranslatePlayerJoin()
128     {
129         JoinMessage message = new JoinMessage();
130         message.setSlot(1);
131         message.setName("Smanux");
132         assertEquals("playerjoin 1 Smanux", protocol.translate(message, locale));
133     }
134 
135     public void testGetMessagePlayerJoin()
136     {
137         String raw = "playerjoin 1 Smanux";
138         Message message = protocol.getMessage(raw);
139 
140         assertNotNull("message not parsed", message);
141         assertEquals("message class", JoinMessage.class, message.getClass());
142 
143         JoinMessage playerjoin = (JoinMessage) message;
144         assertEquals("slot", 1, playerjoin.getSlot());
145         assertEquals("name", "Smanux", playerjoin.getName());
146     }
147 
148     public void testTranslateTeam1()
149     {
150         TeamMessage msg1 = new TeamMessage();
151         msg1.setSlot(1);
152         msg1.setName("LFJR");
153         assertEquals("team 1 LFJR", protocol.translate(msg1, locale));
154     }
155 
156     public void testTranslateTeam2()
157     {
158         TeamMessage msg2 = new TeamMessage();
159         msg2.setSlot(1);
160         assertEquals("team 1 ", protocol.translate(msg2, locale));
161     }
162 
163     public void testGetMessageTeam1()
164     {
165         String raw = "team 1 LFJR";
166         Message message = protocol.getMessage(raw);
167 
168         assertNotNull("message not parsed", message);
169         assertEquals("message class", TeamMessage.class, message.getClass());
170 
171         TeamMessage team = (TeamMessage) message;
172         assertEquals("slot", 1, team.getSlot());
173         assertEquals("name", "LFJR", team.getName());
174     }
175 
176     public void testGetMessageTeam2()
177     {
178         String raw = "team 1";
179         Message message = protocol.getMessage(raw);
180 
181         assertNotNull("message not parsed", message);
182         assertEquals("message class", TeamMessage.class, message.getClass());
183 
184         TeamMessage team = (TeamMessage) message;
185         assertEquals("slot", 1, team.getSlot());
186         assertEquals("name", null, team.getName());
187     }
188 
189     public void testGetMessageTeam3()
190     {
191         // check the parsing of a team name containing a space character
192         String raw = "team 1 L F J R";
193         Message message = protocol.getMessage(raw);
194 
195         assertNotNull("message not parsed", message);
196         assertEquals("message class", TeamMessage.class, message.getClass());
197 
198         TeamMessage team = (TeamMessage) message;
199         assertEquals("slot", 1, team.getSlot());
200         assertEquals("name", "L F J R", team.getName());
201     }
202 
203     public void testGetMessageTeam4()
204     {
205         // check the parsing of a team name containing a leading and a trailing space character
206         String raw = "team 1  LFJR ";
207         Message message = protocol.getMessage(raw);
208 
209         assertNotNull("message not parsed", message);
210         assertEquals("message class", TeamMessage.class, message.getClass());
211 
212         TeamMessage team = (TeamMessage) message;
213         assertEquals("slot", 1, team.getSlot());
214         assertEquals("name", "LFJR", team.getName());
215     }
216 
217     public void testTranslatePlayerLeave()
218     {
219         LeaveMessage message = new LeaveMessage();
220         message.setSlot(1);
221         assertEquals("playerleave 1", protocol.translate(message, locale));
222     }
223 
224     public void testGetMessagePlayerLeave()
225     {
226         String raw = "playerleave 1";
227         Message message = protocol.getMessage(raw);
228 
229         assertNotNull("message not parsed", message);
230         assertEquals("message class", LeaveMessage.class, message.getClass());
231 
232         LeaveMessage leave = (LeaveMessage) message;
233         assertEquals("slot", 1, leave.getSlot());
234     }
235 
236     public void testTranslatePlayerNum()
237     {
238         PlayerNumMessage message = new PlayerNumMessage(1);
239         assertEquals("playernum 1", protocol.translate(message, locale));
240     }
241 
242     public void testTranslateEndGame()
243     {
244         EndGameMessage message = new EndGameMessage();
245         assertEquals("endgame", protocol.translate(message, locale));
246     }
247 
248     public void testTranslatePlayerLost()
249     {
250         PlayerLostMessage message = new PlayerLostMessage();
251         message.setSlot(1);
252         assertEquals("playerlost 1", protocol.translate(message, locale));
253     }
254 
255     public void testTranslateField()
256     {
257         FieldMessage message = new FieldMessage();
258         message.setSlot(1);
259         message.setField("XYZABCD");
260         assertEquals("f 1 XYZABCD", protocol.translate(message, locale));
261     }
262 
263     public void testGetMessageField()
264     {
265         String raw = "f 1 XYZABCD";
266         Message message = protocol.getMessage(raw);
267 
268         assertNotNull("message not parsed", message);
269         assertEquals("message class", FieldMessage.class, message.getClass());
270 
271         FieldMessage field = (FieldMessage) message;
272         assertEquals("slot", 1, field.getSlot());
273         assertEquals("field", "XYZABCD", field.getField());
274     }
275 
276     public void testTranslateLevel()
277     {
278         LevelMessage message = new LevelMessage();
279         message.setSlot(1);
280         message.setLevel(50);
281         assertEquals("lvl 1 50", protocol.translate(message, locale));
282     }
283 
284     public void testGetMessageLevel()
285     {
286         String raw = "lvl 1 50";
287         Message message = protocol.getMessage(raw);
288 
289         assertNotNull("message not parsed", message);
290         assertEquals("message class", LevelMessage.class, message.getClass());
291 
292         LevelMessage level = (LevelMessage) message;
293         assertEquals("slot", 1, level.getSlot());
294         assertEquals("level", 50, level.getLevel());
295     }
296 
297     public void testEncode()
298     {
299         byte[] ip = {127, 0, 0, 1};
300         String nickname = "Smanux";
301         String version = "1.13";
302 
303         assertEquals("80C210B3134A85CF71E46FD4C123A83D9E22A2F512769FE5", encode(nickname, version, ip, false));
304     }
305 
306     public void testDecode()
307     {
308         String init = "80C210B3134A85CF71E46FD4C123A83D9E22A2F512769FE5";
309 
310         assertEquals("decoded string", "tetrisstart Smanux 1.13", decode(init));
311     }
312 
313     public void testEncodeDecode()
314     {
315         byte[] ip = {(byte) 195, (byte) 139, (byte) 204, (byte) 206};
316 
317         String nickname = "Smanux";
318         String version = "1.13";
319 
320         String init = encode(nickname, version, ip, false);
321 
322         assertNotNull(init);
323 
324         assertEquals("decoded", "tetrisstart Smanux 1.13", decode(init));
325     }
326 
327     public void testLongMessage()
328     {
329         byte[] message = new byte[16 * 1024];
330         try
331         {
332             protocol.readLine(new ByteArrayInputStream(message, 0, message.length), "Cp1252");
333             fail("No exception raised on a 16K message");
334         }
335         catch (IOException e)
336         {
337             // expected
338         }
339     }
340 
341     public void testSlowClient()
342     {
343         try
344         {
345             protocol.readLine(new InputStream() {
346                 int i = 34;
347                 public int read() throws IOException
348                 {
349                     try
350                     {
351                         Thread.sleep(1000);
352                     }
353                     catch (InterruptedException e)
354                     {
355                     }
356                     return --i;
357                 }
358             }, "Cp1252");
359             fail("No exception raised on extremely slow input");
360         }
361         catch (IOException e)
362         {
363             // expected
364         }
365     }
366 }