/
PlayerSessionTest.java
154 lines (138 loc) · 4.31 KB
/
PlayerSessionTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package io.nadron.app.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import io.nadron.app.Game;
import io.nadron.app.GameRoom;
import io.nadron.app.PlayerSession;
import io.nadron.app.Session;
import io.nadron.app.impl.GameRoomSession;
import io.nadron.app.impl.SimpleGame;
import io.nadron.app.impl.GameRoomSession.GameRoomSessionBuilder;
import io.nadron.event.Event;
import io.nadron.event.Events;
import io.nadron.event.NetworkEvent;
import io.nadron.event.impl.DefaultSessionEventHandler;
import io.nadron.junitcategories.Performance;
import io.nadron.protocols.Protocol;
import io.nadron.protocols.impl.DummyProtocol;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
public class PlayerSessionTest
{
private static final Protocol DUMMY_PROTOCOL = new DummyProtocol();
private static final AtomicLong COUNTER = new AtomicLong(0l);
private static final int NUM_OF_GAME_ROOMS = 1000;
private static final int SESSIONS_PER_GAME_ROOM = 50;
private static final int EVENTS_PER_SESSION = 10;
private static final int LATCH_COUNT = ((NUM_OF_GAME_ROOMS * SESSIONS_PER_GAME_ROOM) * (EVENTS_PER_SESSION * SESSIONS_PER_GAME_ROOM))
+ (EVENTS_PER_SESSION * SESSIONS_PER_GAME_ROOM * NUM_OF_GAME_ROOMS);
private static final CountDownLatch LATCH = new CountDownLatch(LATCH_COUNT);
private Game game;
private List<GameRoom> gameRoomList;
private List<Session> sessionList;
@Before
public void setUp()
{
game = new SimpleGame(1, "Test");
gameRoomList = new ArrayList<GameRoom>(NUM_OF_GAME_ROOMS);
sessionList = new ArrayList<Session>(NUM_OF_GAME_ROOMS
* SESSIONS_PER_GAME_ROOM);
for (int i = 1; i <= NUM_OF_GAME_ROOMS; i++)
{
GameRoomSessionBuilder sessionBuilder = new GameRoomSessionBuilder();
sessionBuilder.parentGame(game).gameRoomName("Zombie_ROOM_" + i)
.protocol(DUMMY_PROTOCOL);
Session gameRoomSession = new TestGameRoom(sessionBuilder);
gameRoomSession.addHandler(new GameRoomSessionHandler(
gameRoomSession));
gameRoomList.add((GameRoom) gameRoomSession);
}
for (GameRoom gameRoom : gameRoomList)
{
for (int j = 1; j <= SESSIONS_PER_GAME_ROOM; j++)
{
PlayerSession playerSession = gameRoom.createPlayerSession(null);
gameRoom.connectSession(playerSession);
playerSession.addHandler(new SessionHandler(playerSession));
sessionList.add(playerSession);
}
}
}
@Test
@Category(Performance.class)
public void eventHandlingPerformance() throws InterruptedException
{
long start = System.nanoTime();
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
for (Session session : sessionList)
{
for (int i = 1; i <= EVENTS_PER_SESSION; i++)
{
Event event = Events.event(null,
Events.SESSION_MESSAGE);
session.onEvent(event);
}
}
}
},"Event-Injector");
t.start();
assertTrue(LATCH.await(20, TimeUnit.SECONDS));
assertEquals(LATCH_COUNT,COUNTER.get());
long time = System.nanoTime() - start;
System.out.printf(
"Took %.3f seconds to pass %d messages between sessions\n",
time / 1e9, COUNTER.get());
System.out.printf("Message passing rate was %.3f million messages/sec",
COUNTER.get() / ((time / 1e9) * 1000000));
}
private static class TestGameRoom extends GameRoomSession
{
protected TestGameRoom(GameRoomSessionBuilder gameRoomSessionBuilder)
{
super(gameRoomSessionBuilder);
}
@Override
public void onLogin(PlayerSession playerSession)
{
SessionHandler handler = new SessionHandler(playerSession);
playerSession.addHandler(handler);
}
}
private static class GameRoomSessionHandler extends
DefaultSessionEventHandler
{
public GameRoomSessionHandler(Session session)
{
super(session);
}
@Override
public void onNetworkMessage(NetworkEvent event)
{
COUNTER.incrementAndGet();
LATCH.countDown();
}
}
private static class SessionHandler extends DefaultSessionEventHandler
{
public SessionHandler(Session session)
{
super(session);
}
@Override
public void onNetworkMessage(NetworkEvent event)
{
COUNTER.incrementAndGet();
LATCH.countDown();
}
}
}