Skip to content

Commit

Permalink
Merge pull request #7 from byteground/master
Browse files Browse the repository at this point in the history
don't use a default port, find a free one
  • Loading branch information
thiloplanz committed Feb 25, 2013
2 parents 15d4574 + afa7b37 commit 48c7f57
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 19 deletions.
47 changes: 36 additions & 11 deletions src/main/java/jmockmongo/MockMongo.java
Expand Up @@ -19,8 +19,10 @@
package jmockmongo;

import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.io.IOException;

import jmockmongo.commands.Count;
import jmockmongo.commands.DbStats;
Expand Down Expand Up @@ -48,25 +50,46 @@
public class MockMongo {

/**
* the port JMockMongo listens to by default. This is different from the
* real MongoDB default port to reduce the risk of accidentally connecting
* test code to real databases.
*
* Utility method to find a free port
*/
public static final int DEFAULT_PORT = 2307;
public static int anyPort() {
try {
ServerSocket socket = new ServerSocket(0);
int port = socket.getLocalPort();
socket.close();
return port;
} catch (IOException e) {
return 2307;
}
}

/**
* The MongoURI to connect to the default JMockMongo port (on localhost)
*/
public static final MongoURI DEFAULT_URI = new MongoURI(
"mongodb://0.0.0.0:" + DEFAULT_PORT);
private int port;

private MongoURI uri;

private ChannelGroup channels;

private ServerBootstrap bootstrap;

private ConcurrentHashMap<String, MockDB> data;

MockMongo() {
this(MockMongo.anyPort());
}

MockMongo(int port) {
this.port = port;
this.uri = new MongoURI("mongodb://0.0.0.0:" + port);
}

int getPort() {
return port;
}

MongoURI getMongoURI() {
return uri;
}

MockDB getDB(String database) {
return data.get(database);
}
Expand Down Expand Up @@ -99,6 +122,8 @@ MockDBCollection getCollection(String database, String collectionName) {
return db.getCollection(collectionName);
}



public void start() {
data = new ConcurrentHashMap<String, MockDB>();
final ChannelFactory factory = new NioServerSocketChannelFactory(
Expand Down Expand Up @@ -144,7 +169,7 @@ public void channelOpen(ChannelHandlerContext ctx,
}
});

channels.add(bootstrap.bind(new InetSocketAddress(DEFAULT_PORT)));
channels.add(bootstrap.bind(new InetSocketAddress(port)));
}

public void stop() {
Expand Down
10 changes: 6 additions & 4 deletions src/main/java/jmockmongo/MockMongoTestCaseSupport.java
Expand Up @@ -39,16 +39,18 @@ public abstract class MockMongoTestCaseSupport extends TestCase {
protected void setUp() throws Exception {
// make sure we cannot connect before this
// (this could mean a real server is running on our port)

mockMongo = new MockMongo();

try {
new DBPort(new ServerAddress("0.0.0.0", MockMongo.DEFAULT_PORT))
new DBPort(new ServerAddress("0.0.0.0", mockMongo.getPort()))
.ensureOpen();
fail("something is already listening at the Mongo port! Is a real mongo process running?");
} catch (IOException e) {
}

mockMongo = new MockMongo();
mockMongo.start();
mongo = new Mongo(MockMongo.DEFAULT_URI);

mongo = new Mongo(mockMongo.getMongoURI());
}

@Override
Expand Down
9 changes: 5 additions & 4 deletions src/test/java/jmockmongo/MockMongoTest.java
Expand Up @@ -36,10 +36,10 @@ public void testStartStop() throws UnknownHostException, MongoException,

MockMongo mongo = new MockMongo();
mongo.start();
new Mongo(MockMongo.DEFAULT_URI).getDatabaseNames();
new Mongo(mongo.getMongoURI()).getDatabaseNames();
mongo.stop();
try {
new Mongo(MockMongo.DEFAULT_URI).getDatabaseNames();
new Mongo(mongo.getMongoURI()).getDatabaseNames();
fail("should have stopped");
} catch (MongoException e) {
}
Expand All @@ -48,10 +48,11 @@ public void testStartStop() throws UnknownHostException, MongoException,
public void testCannotBind() throws MongoException, InterruptedException,
IOException {

ServerSocket socket = new ServerSocket(MockMongo.DEFAULT_PORT);
int port = MockMongo.anyPort();
ServerSocket socket = new ServerSocket(port);
try {

MockMongo mongo = new MockMongo();
MockMongo mongo = new MockMongo(port);
mongo.start();
fail("should have failed to start, because the server port is not available");
} catch (ChannelException e) {
Expand Down

0 comments on commit 48c7f57

Please sign in to comment.