public void setUp() throws Exception {
    super.setUp();
    // p1 <--> p2 <--> p3 peer 1 cannot reach peer 3
    myProtocolContainer1 = getProtocolContainer(-1, false, "1");
    myServer1 = getP2PServer(myProtocolContainer1, RoutingProtocol.START_PORT);
    RoutingProtocol theRoutingProtocol1 =
        (RoutingProtocol) myProtocolContainer1.getProtocol(RoutingProtocol.ID);
    myTransferProtocl1 =
        ((AsyncTransferProtocol) myProtocolContainer1.getProtocol(AsyncTransferProtocol.ID));

    myProtocolContainer2 = getProtocolContainer(-1, false, "2");
    myServer2 = getP2PServer(myProtocolContainer2, RoutingProtocol.START_PORT + 1);
    RoutingProtocol theRoutingProtocol2 =
        (RoutingProtocol) myProtocolContainer2.getProtocol(RoutingProtocol.ID);
    myTransferProtocol2 =
        ((AsyncTransferProtocol) myProtocolContainer2.getProtocol(AsyncTransferProtocol.ID));

    assertTrue(myServer1.start());
    assertTrue(myServer2.start());

    theRoutingProtocol1.scanLocalSystem();
    theRoutingProtocol2.scanLocalSystem();

    Thread.sleep(SLEEP_AFTER_SCAN);

    for (int i = 0; i < 5; i++) {
      theRoutingProtocol1.exchangeRoutingTable();
      theRoutingProtocol2.exchangeRoutingTable();
    }

    RoutingTable theRoutingTable1 =
        ((RoutingProtocol) myProtocolContainer1.getProtocol(RoutingProtocol.ID)).getRoutingTable();
    RoutingTable theRoutingTable2 =
        ((RoutingProtocol) myProtocolContainer2.getProtocol(RoutingProtocol.ID)).getRoutingTable();

    RoutingTableEntry thePeer2 =
        theRoutingTable1.getEntryForPeer(theRoutingTable2.getLocalPeerId());
    assertNotNull(thePeer2.getPeer());
    assertTrue(thePeer2.isReachable());
  }
  public void sendFile(File aFile, String aPeerid) throws FileTransferException {
    String theResponse = null;

    ProtocolContainer theProtocolContainer = findProtocolContainer();
    AbstractPeer thePeer = null;
    try {
      thePeer = getRoutingTable().getEntryForPeer(aPeerid).getPeer();
      MessageProtocol theMessageProtocol =
          (MessageProtocol) theProtocolContainer.getProtocol("MSG");
      Message theMessage = new Message();
      theMessage.setDestination(thePeer);
      theMessage.setMessage(createMessage(Command.FILE.name() + " " + aFile.getName()));
      theMessage.setProtocolMessage(true);
      theMessage.setMessageTimeoutInSeconds(-1);
      theResponse = theMessageProtocol.sendMessage(theMessage);
    } catch (ProtocolException e) {
      throw new FileTransferException(
          "Could not transfer file because message protocol is not known", e);
    } catch (MessageException e) {
      throw new FileTransferException(
          "Could not transfer file because message could not be delivered", e);
    } catch (UnknownPeerException e) {
      throw new FileTransferException(
          "Could not transfer file because given peer id is not known", e);
    }

    if (!theResponse.startsWith(Response.ACCEPTED.name())) {
      throw new FileTransferException(
          "The file: '"
              + aFile.getName()
              + "' was refused by peer: '"
              + thePeer.getPeerId()
              + "' with response '"
              + theResponse
              + "'");
    } else {
      String theFileId = theResponse.split(" ")[1];
      // TODO we probably should not just cast to SocketPeer
      Pipe thePipe = new Pipe((SocketPeer) thePeer);
      thePipe.setPipeDescription("FILE:" + theFileId + ":" + aFile.length());
      FileInputStream theInputStream = null;
      try {
        PipeProtocol thePipeProtocol = getPipeProtocol();
        thePipeProtocol.openPipe(thePipe);
        theInputStream = new FileInputStream(aFile);
        IOTools.copyStream(theInputStream, thePipe.getSocket().getOutputStream());
        thePipeProtocol.closePipe(thePipe);

        theResponse =
            getPeerSender()
                .send(
                    thePeer,
                    createMessage(
                        Command.WAIT_FOR_FILE.name() + " " + theFileId + " " + aFile.length()))
                .getReply();

        if (theResponse.equalsIgnoreCase(Response.BAD_FILE_SIZE.name())) {
          throw new FileTransferException("Received file had bad file size");
        }

        if (theResponse.equalsIgnoreCase(Response.FILE_NOK.name())) {
          throw new FileTransferException("Sending file failed");
        }
      } catch (Exception e) {
        throw new FileTransferException(
            "Transferring file to peer: '" + thePeer.getPeerId() + "' could not be initiated", e);
      } finally {
        if (theInputStream != null) {
          try {
            theInputStream.close();
          } catch (IOException e) {
          }
        }
      }
    }
  }