Skip to content

Commit a1fa3e4

Browse files
committed
TDD server
1 parent 6d3a997 commit a1fa3e4

File tree

5 files changed

+130
-5
lines changed

5 files changed

+130
-5
lines changed

src/main/java/httpserver/Server.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,30 @@
44
import java.net.ServerSocket;
55
import java.net.Socket;
66
import java.nio.file.Path;
7-
import java.util.concurrent.ExecutorService;
7+
import java.util.concurrent.Executor;
88

99
public class Server {
1010
private final Path logPath;
1111
private final Path root;
1212
private final ServerSocket serverSocket;
13+
private boolean running;
1314

1415
public Server(ServerSocket serverSocket, Path root, Path logPath) {
1516
this.serverSocket = serverSocket;
1617
this.root = root;
1718
this.logPath = logPath;
19+
this.running = false;
1820
}
1921

20-
public void start(ExecutorService threadPool, SocketHandlerFactory socketHandlerFactory) throws IOException {
21-
while (true) {
22+
public void start(Executor executor, SocketHandlerFactory socketHandlerFactory) throws IOException {
23+
//while (true) {
2224
Socket clientSocket = serverSocket.accept();
2325
SocketHandler socketHandler = socketHandlerFactory.newSocketHandler(root, logPath, clientSocket);
24-
threadPool.execute(socketHandler);
25-
}
26+
executor.execute(socketHandler);
27+
//}
28+
}
29+
30+
public void exit() {
31+
running = false;
2632
}
2733
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package httpserver;
2+
3+
import java.util.concurrent.Executor;
4+
5+
public class ExecutorSpy implements Executor {
6+
public Runnable executeArg;
7+
8+
@Override
9+
public void execute(Runnable command) {
10+
executeArg = command;
11+
return;
12+
}
13+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package httpserver;
2+
3+
import java.io.IOException;
4+
import java.net.ServerSocket;
5+
import java.net.Socket;
6+
7+
public class ServerSocketSpy extends ServerSocket {
8+
private final Socket socket;
9+
public boolean acceptCalled;
10+
11+
public ServerSocketSpy(Socket socket) throws IOException {
12+
this.acceptCalled = false;
13+
this.socket = socket;
14+
}
15+
16+
@Override
17+
public Socket accept() throws IOException {
18+
acceptCalled = true;
19+
return socket;
20+
}
21+
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package httpserver;
2+
3+
import org.junit.Test;
4+
5+
import java.io.IOException;
6+
import java.net.Socket;
7+
import java.nio.file.Path;
8+
import java.nio.file.Paths;
9+
10+
import static org.junit.Assert.*;
11+
12+
public class ServerTest {
13+
14+
private final Path root;
15+
private final Path logPath;
16+
private final SocketHandler socketHandler;
17+
private Socket acceptResultSocket;
18+
private ServerSocketSpy serverSocketSpy;
19+
private Server server;
20+
private SocketHandlerFactorySpy socketHandlerFactorySpy;
21+
private ExecutorSpy executorSpy;
22+
23+
public ServerTest() throws IOException {
24+
acceptResultSocket = new Socket();
25+
serverSocketSpy = new ServerSocketSpy(acceptResultSocket);
26+
root = Paths.get("root");
27+
logPath = Paths.get("root/logs");
28+
server = new Server(serverSocketSpy, root, logPath);
29+
30+
socketHandler = new SocketHandler(null, null, null, null);
31+
socketHandlerFactorySpy = new SocketHandlerFactorySpy(socketHandler);
32+
executorSpy = new ExecutorSpy();
33+
}
34+
35+
@Test
36+
public void callsAcceptOnServerSocket() throws Exception {
37+
server.start(executorSpy, socketHandlerFactorySpy);
38+
server.exit();
39+
40+
assertTrue(serverSocketSpy.acceptCalled);
41+
}
42+
43+
@Test
44+
public void callsNewSocketHandlerWithCorrectArgs() throws Exception {
45+
server.start(executorSpy, socketHandlerFactorySpy);
46+
server.exit();
47+
48+
assertEquals(root, socketHandlerFactorySpy.newSocketHandlerArg1);
49+
assertEquals(logPath, socketHandlerFactorySpy.newSocketHandlerArg2);
50+
assertEquals(acceptResultSocket, socketHandlerFactorySpy.newSocketHandlerArg3);
51+
}
52+
53+
@Test
54+
public void callsExecutorExecuteWithSocketHandler() throws Exception {
55+
server.start(executorSpy, socketHandlerFactorySpy);
56+
server.exit();
57+
58+
assertEquals(socketHandler, executorSpy.executeArg);
59+
}
60+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package httpserver;
2+
3+
import java.io.IOException;
4+
import java.net.Socket;
5+
import java.nio.file.Path;
6+
7+
public class SocketHandlerFactorySpy extends SocketHandlerFactory {
8+
public final SocketHandler newSocketHandlerResult;
9+
public Path newSocketHandlerArg1;
10+
public Path newSocketHandlerArg2;
11+
public Socket newSocketHandlerArg3;
12+
13+
public SocketHandlerFactorySpy(SocketHandler newSocketHandlerResult) {
14+
this.newSocketHandlerResult = newSocketHandlerResult;
15+
16+
}
17+
public SocketHandler newSocketHandler(Path root,
18+
Path logPath,
19+
Socket clientSocket) throws IOException {
20+
newSocketHandlerArg1 = root;
21+
newSocketHandlerArg2 = logPath;
22+
newSocketHandlerArg3 = clientSocket;
23+
return newSocketHandlerResult;
24+
}
25+
}

0 commit comments

Comments
 (0)