/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.devcoin.core;
import com.google.devcoin.params.UnitTestParams;
import com.google.devcoin.store.BlockStore;
import com.google.devcoin.store.MemoryBlockStore;
import com.google.devcoin.utils.BriefLogFormatter;
import org.easymock.EasyMock;
import org.easymock.IMocksControl;
import org.jboss.netty.channel.*;
import java.math.BigInteger;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.UnknownHostException;
import static org.easymock.EasyMock.createStrictControl;
import static org.easymock.EasyMock.expect;
/**
* Utility class that makes it easy to work with mock NetworkConnections.
*/
public class TestWithNetworkConnections {
protected IMocksControl control;
protected NetworkParameters unitTestParams;
protected BlockStore blockStore;
protected BlockChain blockChain;
protected Wallet wallet;
protected ECKey key;
protected Address address;
private static int fakePort;
protected ChannelHandlerContext ctx;
protected Channel channel;
protected SocketAddress socketAddress;
protected ChannelPipeline pipeline;
public void setUp() throws Exception {
setUp(new MemoryBlockStore(UnitTestParams.get()));
}
public void setUp(BlockStore blockStore) throws Exception {
BriefLogFormatter.init();
control = createStrictControl();
control.checkOrder(false);
unitTestParams = UnitTestParams.get();
Wallet.SendRequest.DEFAULT_FEE_PER_KB = BigInteger.ZERO;
this.blockStore = blockStore;
wallet = new Wallet(unitTestParams);
key = new ECKey();
address = key.toAddress(unitTestParams);
wallet.addKey(key);
blockChain = new BlockChain(unitTestParams, wallet, blockStore);
socketAddress = new InetSocketAddress("127.0.0.1", 1111);
ctx = createChannelHandlerContext();
channel = createChannel();
pipeline = createPipeline(channel);
}
public void tearDown() throws Exception {
Wallet.SendRequest.DEFAULT_FEE_PER_KB = Transaction.REFERENCE_DEFAULT_MIN_TX_FEE;
}
protected ChannelPipeline createPipeline(Channel channel) {
ChannelPipeline pipeline = control.createMock(ChannelPipeline.class);
expect(channel.getPipeline()).andStubReturn(pipeline);
return pipeline;
}
protected Channel createChannel() {
Channel channel = control.createMock(Channel.class);
expect(channel.getRemoteAddress()).andStubReturn(socketAddress);
return channel;
}
protected ChannelHandlerContext createChannelHandlerContext() {
ChannelHandlerContext ctx1 = control.createMock(ChannelHandlerContext.class);
ctx1.sendDownstream(EasyMock.anyObject(ChannelEvent.class));
EasyMock.expectLastCall().anyTimes();
ctx1.sendUpstream(EasyMock.anyObject(ChannelEvent.class));
EasyMock.expectLastCall().anyTimes();
return ctx1;
}
protected MockNetworkConnection createMockNetworkConnection() {
MockNetworkConnection conn = new MockNetworkConnection();
try {
conn.connect(new PeerAddress(InetAddress.getLocalHost(), fakePort++), 0);
} catch (UnknownHostException e) {
throw new RuntimeException(e); // Cannot happen
}
return conn;
}
protected void closePeer(Peer peer) throws Exception {
peer.getHandler().channelClosed(ctx,
new UpstreamChannelStateEvent(channel, ChannelState.CONNECTED, null));
}
protected void inbound(Peer peer, Message message) throws Exception {
peer.getHandler().messageReceived(ctx,
new UpstreamMessageEvent(channel, message, socketAddress));
}
protected void inbound(FakeChannel peerChannel, Message message) {
Channels.fireMessageReceived(peerChannel, message);
}
protected Object outbound(FakeChannel p1) {
ChannelEvent channelEvent = p1.nextEvent();
if (channelEvent != null && !(channelEvent instanceof MessageEvent))
throw new IllegalStateException("Expected message but got: " + channelEvent);
MessageEvent nextEvent = (MessageEvent) channelEvent;
if (nextEvent == null)
return null;
return nextEvent.getMessage();
}
protected Object waitForOutbound(FakeChannel ch) throws InterruptedException {
return ((MessageEvent)ch.nextEventBlocking()).getMessage();
}
protected Peer peerOf(Channel ch) {
return PeerGroup.peerFromChannel(ch);
}
}