1   /*
2    * Created on 2004-12-09
3    *
4    * TODO To change the template for this generated file go to
5    * Window - Preferences - Java - Code Style - Code Templates
6    */
7   package org.sourceforge.jvb3d.Network;
8   
9   import java.net.InetAddress;
10  import java.net.InetSocketAddress;
11  
12  import junit.framework.TestCase;
13  
14  /***
15   * @author Develop
16   * 
17   * TODO To change the template for this generated type comment go to Window -
18   * Preferences - Java - Code Style - Code Templates
19   */
20  public class ClientManagerTest extends TestCase {
21  	ReceivedPacketBuffer packetBuffer;
22  
23  	ClientManager clientManager;
24  
25  	TestClientFactory clientFactory = null;
26  
27  	TestServerFacade serverFacade = null;
28  
29  	/*
30  	 * @see TestCase#setUp()
31  	 */
32  	protected void setUp() throws Exception {
33  		super.setUp();
34  		NetworkServerFacadeHolder.setNetworkFacade(new TestServerFacade());
35  		packetBuffer = new ReceivedPacketBuffer();
36  		clientManager = new ClientManager();
37  		serverFacade = (TestServerFacade) NetworkServerFacadeHolder
38  				.getNetworkFacade();
39  		clientFactory = (TestClientFactory) NetworkServerFacadeHolder
40  				.getNetworkFacade().getClientFactory();
41  	}
42  
43  	/*
44  	 * @see TestCase#tearDown()
45  	 */
46  	protected void tearDown() throws Exception {
47  		packetBuffer = null;
48  		clientManager = null;
49  		super.tearDown();
50  	}
51  
52  	/***
53  	 * testuje ClientManager.update TODO testy update
54  	 * 
55  	 * @throws Exception
56  	 */
57  	public void testUpdate() throws Exception {
58  		//sprawdzamy jak siê zachowa gdy dostanie pakiet "join" - powinien
59  		// dodaæ klienta
60  		packetBuffer.addObserver(clientManager); //³¹czymy observera z
61  		// observable
62  		JoinPacket testPacket = new JoinPacket();
63  		testPacket.setSourceAddress(new InetSocketAddress(InetAddress.getByName("localhost"), 2000));
64  		assertEquals(clientManager.getClientCount(), 0);
65  		packetBuffer.addPacket(testPacket); //dodajemy pakiet "join" z
66  		// localhosta
67  		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
68  
69  		assertEquals(clientManager.getClientCount(), 1); //sprawdzamy czy
70  		// dodano klienta
71  		
72  		//sprawdzamy co siê stanie jak dostanie pakiet "update"
73  
74  		//sprawdzamy co siê stanie jak dostanie pakiet "connect"
75  		ConnectPacket connectPacket = new ConnectPacket();
76  		connectPacket.setSourceAddress(new InetSocketAddress(InetAddress.getByName("localhost"), 2000));
77  		packetBuffer.addPacket(connectPacket); //dodajemy pakiet "join" z
78  		// localhosta
79  		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
80  
81  		assertEquals(clientManager.getClientCount(), 1); //sprawdzamy czy nie
82  		// dodano klienta
83  		
84  	}
85  
86  	/***
87  	 * sprawdza, jak zachowuje siê ClientManager, gdy otrzyma pakiet JoinPacket: -
88  	 * od klienta na localhost - 2 raz od tego samego klienta - od innego
89  	 * klienta
90  	 * 
91  	 * @throws Exception
92  	 *             jeœli coœ posz³o nie tak
93  	 */
94  	public void testProcessJoinPacket() throws Exception {
95  		TestClientData newClient;
96  		packetBuffer.addObserver(clientManager); //³¹czymy observera z
97  		// observable
98  		JoinPacket testPacket = new JoinPacket();
99  		testPacket.setSourceAddress(new InetSocketAddress(InetAddress.getByName("localhost"), 2000));
100 		assertEquals(clientManager.getClientCount(), 0);
101 		packetBuffer.addPacket(testPacket); //dodajemy pakiet "join" z
102 		// localhosta
103 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
104 
105 		assertEquals(clientManager.getClientCount(), 1); //sprawdzamy czy
106 		// dodano klienta
107 		newClient = clientFactory.getLastClient(); //sprawdzamy
108 		// czy
109 		// klient ma
110 		// dobry
111 		// adres
112 		assertEquals(newClient.getClientAddress(), new InetSocketAddress(InetAddress.getByName("localhost"), 2000));
113 
114 		packetBuffer.addPacket(testPacket); //dodajemy drugi taki sam pakiet
115 		packetBuffer.notifyObservers();
116 		assertEquals(clientManager.getClientCount(), 1); //i sprawdzamy czy
117 		// wyskoczy³ b³¹d
118 		
119 		testPacket.setSourceAddress(new InetSocketAddress(InetAddress.getByName("192.168.9.23"), 2000)); //nowy
120 		// pakiet
121 		// - z
122 		// innego
123 		// adresu
124 		packetBuffer.addPacket(testPacket);
125 		packetBuffer.notifyObservers();
126 		assertEquals(clientManager.getClientCount(), 2); //czy dodano klienta
127 		newClient = clientFactory.getLastClient();
128 		assertEquals(newClient.getClientAddress(), new InetSocketAddress(InetAddress.getByName("192.168.9.23"), 2000));
129 
130 		packetBuffer.addPacket(testPacket); //dodajemy drugi taki sam pakiet
131 		packetBuffer.notifyObservers();
132 		assertEquals(clientManager.getClientCount(), 2); //i sprawdzamy czy
133 		// wyskoczy³ b³¹d
134 		// wyj¹tek
135 		newClient = clientFactory.getLastClient();
136 		assertEquals(newClient.getClientAddress(),
137 				new InetSocketAddress(InetAddress.getByName("192.168.9.23"), 2000));
138 	}
139 
140 	/***
141 	 * sprawdza metodê update ClientManagera. - dodaje klienta na localhost -
142 	 * wysy³a mu dwa poprawne pakiety - wysy³a mu pakiet z ni¿szym numerem
143 	 * sekwencji - wysy³a pakiet od nieistniej¹cego klienta - dodaje drugiego
144 	 * klienta - wysy³a do drugiego klienta poprawny pakiet - wysy³a do drugiego
145 	 * klienta niepoprawny pakiet
146 	 * 
147 	 * @throws Exception
148 	 *             TODO ka¿de update inny tekst
149 	 */
150 	public void testProcessUpdatePacket() throws Exception {
151 		TestClientData clientData;
152 
153 		//dodajemy klienta na localhost
154 		packetBuffer.addObserver(clientManager); //³¹czymy observera z
155 		// observable
156 		JoinPacket joinPacket = new JoinPacket();
157 		joinPacket.setSourceAddress(new InetSocketAddress("localhost", 2000));
158 		assertEquals("Iloœæ klientów na starcie ró¿na od 0", clientManager
159 				.getClientCount(), 0);
160 		packetBuffer.addPacket(joinPacket); //dodajemy pakiet "join" z
161 		// localhosta
162 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
163 
164 		UpdatePacket updatePacket = new UpdatePacket();
165 		updatePacket.setSourceAddress(new InetSocketAddress("localhost", 2000));
166 		updatePacket.setUpdateData("update".getBytes());
167 		updatePacket.setSeqNumber(1);
168 		packetBuffer.addPacket(updatePacket); //dodajemy pakiet "update" z
169 		// localhosta
170 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
171 
172 		clientData = clientFactory.getClientAt(new InetSocketAddress("localhost", 2000));
173 		assertNotNull("Nie ma klienta na localhost", clientData);
174 
175 		assertEquals("Ró¿na zawartoœæ pola update przed i po wys³aniu",
176 				new String(clientData.getLastUpdate()), "update");
177 		assertEquals("B³edny pakiet przes³any przez fasadê", new String(serverFacade
178 				.getLastUpdate().getUpdateData()), "update");
179 
180 		//i wysy³amy drugi pakiet
181 		updatePacket.setSourceAddress(new InetSocketAddress("localhost", 2000));
182 		updatePacket.setUpdateData("update".getBytes());
183 		updatePacket.setSeqNumber(2);
184 		packetBuffer.addPacket(updatePacket); //dodajemy pakiet "update" z
185 		// localhosta
186 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
187 
188 		assertEquals(
189 				"Ró¿na zawartoœæ pola update przed i po wys³aniu 2 pakietu",
190 				new String(clientData.getLastUpdate()), "update");
191 		assertEquals("B³edny pakiet przes³any przez fasadê", new String(serverFacade
192 				.getLastUpdate().getUpdateData()), "update");
193 
194 		//trzeci pakiet dla localhosta - z mniejszym numerem seq ni¿ ostatni
195 		updatePacket.setSourceAddress(new InetSocketAddress("localhost", 2000));
196 		updatePacket.setUpdateData("update".getBytes());
197 		updatePacket.setSeqNumber(1);
198 		packetBuffer.addPacket(updatePacket); //dodajemy pakiet "update" z
199 		// localhosta
200 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
201 
202 		updatePacket.setSourceAddress(new InetSocketAddress("192.168.9.23", 2000));
203 		updatePacket.setUpdateData("update".getBytes());
204 		updatePacket.setSeqNumber(4);
205 		packetBuffer.addPacket(updatePacket); //dodajemy pakiet "update" z
206 		// localhosta
207 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
208 
209 		//dodajemy drugiego klienta
210 		joinPacket = new JoinPacket();
211 		joinPacket.setSourceAddress(new InetSocketAddress("192.168.9.23", 2000));
212 		assertEquals("Z³a iloœæ klientów", clientManager.getClientCount(), 1);
213 		packetBuffer.addPacket(joinPacket); //dodajemy pakiet "join" z
214 		// localhosta
215 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
216 
217 		clientData = clientFactory.getClientAt(new InetSocketAddress("192.168.9.23", 2000));
218 		assertNotNull("Nie ma klienta na localhost", clientData);
219 
220 		updatePacket.setSourceAddress(new InetSocketAddress("192.168.9.23", 2000));
221 		updatePacket.setUpdateData("update".getBytes());
222 		updatePacket.setSeqNumber(4);
223 		packetBuffer.addPacket(updatePacket); //dodajemy pakiet "update" z
224 		// localhosta
225 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
226 
227 		assertEquals("Ró¿na zawartoœæ pola update przed i po wys³aniu",
228 				new String(clientData.getLastUpdate()), "update");
229 		assertEquals("B³edny pakiet przes³any przez fasadê", new String(serverFacade
230 				.getLastUpdate().getUpdateData()), "update");
231 
232 		updatePacket.setSourceAddress(new InetSocketAddress("192.168.9.23", 2000));
233 		updatePacket.setUpdateData("update".getBytes());
234 		updatePacket.setSeqNumber(1);
235 		packetBuffer.addPacket(updatePacket); //dodajemy pakiet "update" z
236 		// localhosta
237 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
238 	}
239 
240 	/***
241 	 * sprawdza wysy³anie pakietu update przez ClientManagera. - wysy³a update
242 	 * gdy nie ma po³¹czonych klientów - dodaje klienta i wysy³a update - dodaje
243 	 * kolejnego klienta i wysy³a update - czeka a¿ minie czas timeoutu
244 	 * klientów, i wysy³a update - wysy³a update by sprawdziæ, czy klient
245 	 * zosta³ usuniêty - wysy³a update
246 	 * 
247 	 * @throws Exception
248 	 */
249 	public void testSendUpdate() throws Exception {
250 		packetBuffer.addObserver(clientManager); //³¹czymy observera z observable
251 		
252 		clientManager.sendUpdate("update".getBytes());
253 		
254 		JoinPacket joinPacket = new JoinPacket();
255 		joinPacket.setSourceAddress(new InetSocketAddress(InetAddress.getByName("localhost"), 2000));
256 		assertEquals("Iloœæ klientów na starcie ró¿na od 0", clientManager
257 				.getClientCount(), 0);
258 		packetBuffer.addPacket(joinPacket); //dodajemy pakiet "join" z localhosta
259 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
260 
261 		TestClientData client = clientFactory.getLastClient();
262 		clientManager.sendUpdate("update".getBytes());
263 		assertEquals("Niepoprawne dane wys³ane do klienta 1", new String(client.getLastUpdate()), "update");
264 		
265 		joinPacket = new JoinPacket();
266 		joinPacket.setSourceAddress(new InetSocketAddress("192.168.9.23", 2000));
267 		packetBuffer.addPacket(joinPacket); //dodajemy pakiet "join" z localhosta
268 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
269 
270 		clientManager.sendUpdate("update2".getBytes());
271 		
272 		assertEquals("Niepoprawne dane wys³ane do klienta 1", new String(clientFactory.getClientAt(new InetSocketAddress("localhost", 2000)).getLastUpdate()), "update2");
273 		assertEquals("Niepoprawne dane wys³ane do klienta 2", new String(clientFactory.getClientAt(new InetSocketAddress("192.168.9.23", 2000)).getLastUpdate()), "update2");
274 		
275 		Thread.sleep(1500);
276 		
277 		UpdatePacket updatePacket = new UpdatePacket();
278 		updatePacket.setSourceAddress(new InetSocketAddress(InetAddress.getByName("localhost"), 2000));
279 		updatePacket.setUpdateData("update".getBytes());
280 		updatePacket.setSeqNumber(1);
281 		packetBuffer.addPacket(updatePacket); //dodajemy pakiet "update" z localhosta
282 		packetBuffer.notifyObservers(); //i wysy³amy go do ClientManagera
283 
284 		clientManager.sendUpdate("update3".getBytes());
285 		
286 		assertEquals("Nie wykryto timeout klienta", serverFacade.lastDisconnectedAvatar, "avatar1");
287 				
288 		clientManager.sendUpdate("update3".getBytes());
289 		
290 		assertEquals("Niepoprawne dane wys³ane do klienta 1", new String(clientFactory.getClientAt(new InetSocketAddress("localhost", 2000)).getLastUpdate()), "update3");
291 		assertFalse("Wys³ano update do klienta który mia³ byc usuniêty", new String(clientFactory.getClientAt(new InetSocketAddress("192.168.9.23", 2000)).getLastUpdate()).equals("update3"));
292 	}
293 }