/****************************************************************************
* Copyright (c) 2004, 2015 Composent, Inc. and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Composent, Inc. - initial API and implementation
*****************************************************************************/
package org.eclipse.ecf.tests.provider.filetransfer.xmpp;
import java.io.File;
import java.io.FileOutputStream;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDCreateException;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.filetransfer.IFileTransferListener;
import org.eclipse.ecf.filetransfer.IIncomingFileTransferRequestListener;
import org.eclipse.ecf.filetransfer.IOutgoingFileTransfer;
import org.eclipse.ecf.filetransfer.ISendFileTransferContainerAdapter;
import org.eclipse.ecf.filetransfer.events.IFileTransferEvent;
import org.eclipse.ecf.filetransfer.events.IFileTransferRequestEvent;
import org.eclipse.ecf.filetransfer.events.IOutgoingFileTransferResponseEvent;
import org.eclipse.ecf.filetransfer.events.IOutgoingFileTransferSendDoneEvent;
import org.eclipse.ecf.filetransfer.identity.FileCreateException;
import org.eclipse.ecf.filetransfer.identity.FileIDFactory;
import org.eclipse.ecf.filetransfer.identity.IFileID;
import org.eclipse.ecf.tests.ContainerAbstractTestCase;
/**
*
*/
public class XMPPOutgoingTest extends ContainerAbstractTestCase {
private static final String TESTSRCPATH = "test.src";
private static final String TESTSRCFILE = TESTSRCPATH + "/test.txt";
private static final String TESTTARGETPATH = "test.target";
static final String XMPP_CONTAINER = "ecf.xmpps.smack";
ISendFileTransferContainerAdapter adapter0, adapter1 = null;
IOutgoingFileTransfer outgoing;
File incomingDirectory;
File incomingFile;
IFileID targetID;
boolean requestAccepted;
class IncomingFileTransferRequestListener implements
IIncomingFileTransferRequestListener {
private final boolean accept;
public IncomingFileTransferRequestListener(boolean accept) {
this.accept = accept;
}
public void handleFileTransferRequest(IFileTransferRequestEvent event) {
System.out.println("receiver.handleFileTransferRequest(" + event
+ ")");
incomingDirectory = new File(TESTTARGETPATH);
incomingDirectory.mkdirs();
incomingFile = new File(incomingDirectory, event
.getFileTransferInfo().getFile().getName());
try {
if (accept)
event.accept(new FileOutputStream(incomingFile),
receiverTransferListener);
else
event.reject();
} catch (Exception e) {
e.printStackTrace(System.err);
fail("exception calling accept for receive file transfer");
}
}
}
private IFileTransferListener receiverTransferListener = new IFileTransferListener() {
public void handleTransferEvent(IFileTransferEvent event) {
// System.out.println("receiver.handleTransferEvent(" + event +
// ")");
}
};
private IFileTransferListener senderTransferListener = new IFileTransferListener() {
public void handleTransferEvent(IFileTransferEvent event) {
System.out.println("sender.handleTransferEvent=" + event);
if (event instanceof IOutgoingFileTransferResponseEvent) {
final IOutgoingFileTransferResponseEvent revent = (IOutgoingFileTransferResponseEvent) event;
outgoing = revent.getSource();
requestAccepted = revent.requestAccepted();
if (!requestAccepted)
System.out
.println("sender. File transfer request REJECTED");
} else if (event instanceof IOutgoingFileTransferSendDoneEvent) {
syncNotify();
}
}
};
protected void setUp() throws Exception {
super.setUp();
setClientCount(2);
// Create two clients
clients = createClients();
// Connect clients
for (int i = 0; i < 2; i++)
connectClient(i);
adapter0 = getOutgoingFileTransfer(0);
// 0 is the receiver, so has to listen for
// 1 is the sender
adapter1 = getOutgoingFileTransfer(1);
// Target ID is client 0's connectedID (includes resource name now that
// connected)
targetID = createFileID(adapter1, getClient(0).getConnectedID(),
TESTSRCFILE);
}
protected void tearDown() throws Exception {
super.tearDown();
disconnectClients();
if (incomingFile != null)
incomingFile.delete();
incomingFile = null;
if (incomingDirectory != null)
incomingDirectory.delete();
incomingDirectory = null;
outgoing = null;
targetID = null;
}
public void testReceiverAccept() throws Exception {
// setup receiver to accept the request
// file transfer requests
adapter0.addListener(new IncomingFileTransferRequestListener(true));
// Initiate send request
adapter1.sendOutgoingRequest(targetID, new File(TESTSRCFILE),
senderTransferListener, null);
syncWaitForNotify(20000);
assertNotNull(outgoing);
assertNull(outgoing.getException());
assertTrue(requestAccepted);
assertNotNull(incomingFile);
assertTrue(incomingFile.exists());
}
public void testReceiverReject() throws Exception {
// setup receiver to accept the request
// file transfer requests
adapter0.addListener(new IncomingFileTransferRequestListener(false));
// Initiate send request
adapter1.sendOutgoingRequest(targetID, new File(TESTSRCFILE),
senderTransferListener, null);
syncWaitForNotify(3000);
assertNotNull(outgoing);
assertFalse(requestAccepted);
}
protected String getClientContainerName() {
return XMPP_CONTAINER;
}
private ISendFileTransferContainerAdapter getOutgoingFileTransfer(int client) {
return (ISendFileTransferContainerAdapter) getClient(client)
.getAdapter(ISendFileTransferContainerAdapter.class);
}
protected IFileID createFileID(ISendFileTransferContainerAdapter adapter,
ID clientID, String filename) throws FileCreateException {
return FileIDFactory.getDefault().createFileID(
adapter.getOutgoingNamespace(),
new Object[] { clientID, filename });
}
protected ID getServerConnectID(int client) {
try {
return IDFactory.getDefault().createID(
getClient(client).getConnectNamespace(),
getUsername(client));
} catch (final IDCreateException e) {
e.printStackTrace(System.err);
fail("Could not create server connect ID");
return null;
}
}
}