package com.google.bitcoin.core;

import static org.junit.Assert.assertTrue;

import java.net.InetSocketAddress;

import org.jboss.netty.bootstrap.ClientBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.ChannelSink;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.channel.Channels;
import org.junit.Before;

import com.google.bitcoin.store.BlockStore;

/**
 * Utility class that makes it easy to work with mock NetworkConnections in PeerGroups.
 */
public class TestWithPeerGroup extends TestWithNetworkConnections {
    protected PeerGroup peerGroup;

    protected VersionMessage remoteVersionMessage;

    public void setUp(BlockStore blockStore) throws Exception {
        super.setUp(blockStore);

        remoteVersionMessage = new VersionMessage(unitTestParams, 1);
        
        ClientBootstrap bootstrap = new ClientBootstrap(new ChannelFactory() {
            public void releaseExternalResources() {}
            public Channel newChannel(ChannelPipeline pipeline) {
                ChannelSink sink = new FakeChannelSink();
                return new FakeChannel(this, pipeline, sink);
            }
        });
        bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
            public ChannelPipeline getPipeline() throws Exception {
                VersionMessage ver = new VersionMessage(unitTestParams, 1);
                ChannelPipeline p = Channels.pipeline();
                
                Peer peer = new Peer(unitTestParams, blockChain, ver);
                peer.addLifecycleListener(peerGroup.startupListener);
                p.addLast("peer", peer.getHandler());
                return p;
            }

        });
        peerGroup = new PeerGroup(unitTestParams, blockChain, bootstrap);
        peerGroup.setPingIntervalMsec(0);  // Disable the pings as they just get in the way of most tests.
    }
    
    protected FakeChannel connectPeer(int id) {
        return connectPeer(id, remoteVersionMessage);
    }

    protected FakeChannel connectPeer(int id, VersionMessage versionMessage) {
        InetSocketAddress remoteAddress = new InetSocketAddress("127.0.0.1", 2000 + id);
        FakeChannel p = (FakeChannel) peerGroup.connectTo(remoteAddress).getChannel();
        assertTrue(p.nextEvent() instanceof ChannelStateEvent);
        inbound(p, versionMessage);
        return p;
    }
}

@@ -1,560 +1,840 @@
-package com.google.bitcoin.core;%0A%0Aimport static org.junit.Assert.assertTrue;%0A%0Aimport java.net.InetSocketAddress;%0A%0Aimport org.jboss.netty.bootstrap.ClientBootstrap;%0Aimport org.jboss.netty.channel.Channel;%0Aimport org.jboss.netty.channel.ChannelFactory;%0Aimport org.jboss.netty.channel.ChannelPipeline;%0Aimport org.jboss.netty.channel.ChannelPipelineFactory
+/*%0A * Copyright 2012 Matt Corallo.%0A *%0A * Licensed under the Apache License, Version 2.0 (the %22License%22);%0A * you may not use this file except in compliance with the License.%0A * You may obtain a copy of the License at%0A *%0A *    http://www.apache.org/licenses/LICENSE-2.0%0A *%0A * Unless required by applicable law or agreed to in writing, software%0A * distributed under the License is distributed on an %22AS IS%22 BASIS,%0A * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.%0A * See the License for the specific language governing permissions and%0A * limitations under the License.%0A */%0A%0Apackage com.google.bitcoin.core
 ;%0A
+%0A
 import 
-org.jboss.netty.channel.ChannelSink;%0Aimport org.jboss.netty.channel.ChannelStateEvent;%0Aimport org.jboss.netty.channel.Channels;%0Aimport org.junit.Before;%0A%0Aimport com.google.bitcoin.store.BlockStor
+com.google.bitcoin.store.BlockStore;%0Aimport org.jboss.netty.bootstrap.ClientBootstrap;%0Aimport org.jboss.netty.channel.*;%0A%0Aimport java.net.InetSocketAddress;%0A%0Aimport static org.junit.Assert.assertTru
 e;%0A%0A

Add Matts copyright notice to TestWithPeerGroup