package org.limewire.core.impl.friend;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashSet;
import java.util.Set;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.lib.legacy.ClassImposteriser;
import org.limewire.io.GUID;
import org.limewire.net.address.AddressFactory;
import org.limewire.net.address.AddressSerializer;
import org.limewire.util.BaseTestCase;
import org.limewire.util.StringUtils;
import org.limewire.core.impl.friend.CoreGlueFriendService;
import org.limewire.core.impl.friend.FriendRemoteFileDesc;
import org.limewire.friend.api.Friend;
import org.limewire.friend.api.FriendPresence;
import org.limewire.friend.api.Network;
import org.limewire.friend.api.feature.AuthToken;
import org.limewire.friend.api.feature.AuthTokenFeature;
import org.limewire.friend.impl.address.FriendAddress;
import org.limewire.friend.impl.address.FriendAddressResolver;
import org.limewire.friend.impl.feature.AuthTokenImpl;
import com.limegroup.gnutella.URN;
import com.limegroup.gnutella.downloader.serial.RemoteHostMemento;
public class FriendRemoteFileDescTest extends BaseTestCase{
public FriendRemoteFileDescTest(String name) {
super(name);
}
/**
* Tests the various conditions of XMPPRemoteFileDesc.equals().
*/
public void testEquals() {
Mockery context = new Mockery() {
{ setImposteriser(ClassImposteriser.INSTANCE);
}
};
FriendAddress address = context.mock(FriendAddress.class);
FriendAddress otherAddress = context.mock(FriendAddress.class);
FriendRemoteFileDesc rfd = createRFD(address, null, null);
FriendRemoteFileDesc otherRfd = context.mock(FriendRemoteFileDesc.class);
assertEquals(rfd, rfd);
// TODO: must put backwards to get equals invoked on rfd?
assertNotEquals(new Integer(-5), rfd);
assertNotEquals(rfd, otherRfd);
// address not equal
assertNotEquals(rfd, createRFD(otherAddress, null, null));
// client guid not equal
assertNotEquals(rfd, createRFD2(address, null, null));
// size not equal
assertNotEquals(rfd, createRFD3(address, null, null));
// URNs not equal
assertNotEquals(rfd, createRFD4(address, null, null));
// filename not equal - should this be true?
assertEquals(rfd, createRFD5(address, null, null));
}
/**
* Tests the hash function for uniqueness and consistency.
*/
public void testHashCode() {
Mockery context = new Mockery() {
{ setImposteriser(ClassImposteriser.INSTANCE);
}
};
FriendAddress sharedAddress = context.mock(FriendAddress.class);
FriendAddress otherAddress = context.mock(FriendAddress.class);
FriendRemoteFileDesc rfdA = createRFDwithGUID1(sharedAddress, null, null);
FriendRemoteFileDesc rfdB = createRFDwithGUID1(sharedAddress, null, null);
FriendRemoteFileDesc rfdC = createRFDwithGUID1(otherAddress, null, null);
FriendRemoteFileDesc rfdD = createRFDwithGUID2(sharedAddress, null, null);
assertEquals(rfdA.hashCode(), rfdA.hashCode());
assertEquals(rfdA.hashCode(), rfdB.hashCode());
assertNotEquals(rfdA.hashCode(), rfdC.hashCode());
assertNotEquals(rfdA.hashCode(), rfdD.hashCode());
}
/**
* Tests getCredentials() across multiple successful and unsuccessful invocations.
*/
public void testGetCredentials() {
Mockery context = new Mockery() {
{ setImposteriser(ClassImposteriser.INSTANCE);
}
};
final FriendAddressResolver addressResolver = context.mock(FriendAddressResolver.class);
final FriendAddress addressNullResolve = context.mock(FriendAddress.class);
final FriendAddress addressNullFeature = context.mock(FriendAddress.class);
final FriendAddress addressGood = context.mock(FriendAddress.class);
final FriendPresence presenceNullFeature = context.mock(FriendPresence.class);
final FriendPresence presenceGood = context.mock(FriendPresence.class);
final AuthTokenFeature featureGood = context.mock(AuthTokenFeature.class);
final AuthToken featureFeatureFeatureGood = new AuthTokenImpl(new byte[] {'a','u','t','h'});
final Friend friendGood = context.mock(Friend.class);
final Network networkGood = context.mock(Network.class);
final String idGood = "fakeNetWorkepID";
final FriendRemoteFileDesc rfdNullResolve = createRFD(addressNullResolve, null, addressResolver);
final FriendRemoteFileDesc rfdNullFeature = createRFD(addressNullFeature, null, addressResolver);
final FriendRemoteFileDesc rfdGood = createRFD(addressGood, null, addressResolver);
context.checking(new Expectations() {
{ allowing(addressResolver).getPresence(addressNullResolve);
will(returnValue(null));
allowing(addressResolver).getPresence(addressNullFeature);
will(returnValue(presenceNullFeature));
allowing(presenceNullFeature).getFeature(AuthTokenFeature.ID);
will(returnValue(null));
allowing(addressResolver).getPresence(addressGood);
will(returnValue(presenceGood));
allowing(presenceGood).getFeature(AuthTokenFeature.ID);
will(returnValue(featureGood));
allowing(featureGood).getFeature();
will(returnValue(featureFeatureFeatureGood));
allowing(presenceGood).getFriend();
will(returnValue(friendGood));
allowing(friendGood).getNetwork();
will(returnValue(networkGood));
allowing(networkGood).getCanonicalizedLocalID();
will(returnValue(idGood));
}});
assertNull(rfdNullResolve.getCredentials());
assertNull(rfdNullFeature.getCredentials());
Credentials credentials = rfdGood.getCredentials();
assertInstanceof(UsernamePasswordCredentials.class, credentials);
UsernamePasswordCredentials userCredentials = (UsernamePasswordCredentials) credentials;
assertEquals(idGood, userCredentials.getUserName());
assertEquals(StringUtils.getUTF8String(featureFeatureFeatureGood.getToken()), userCredentials.getPassword());
context.assertIsSatisfied();
}
public void testGetUrlPath() {
Mockery context = new Mockery() {
{ setImposteriser(ClassImposteriser.INSTANCE);
}
};
final FriendAddressResolver addressResolver = context.mock(FriendAddressResolver.class);
final FriendAddress addressFriendOffline = context.mock(FriendAddress.class);
final FriendAddress addressGood = context.mock(FriendAddress.class);
final FriendAddress addressException = context.mock(FriendAddress.class);
final FriendPresence presenceGood = context.mock(FriendPresence.class);
final FriendPresence presenceException = context.mock(FriendPresence.class);
final Friend friendGood = context.mock(Friend.class);
final Network networkGood = context.mock(Network.class);
final String idGood = "fakeNetWorkepID";
final String sha1 = "urn:sha1:NETZHKEJKTCM74ZQQALJWSLWQHQJ7N6Q";
final FriendRemoteFileDesc rfdFriendOffline = createRFDwithSHA1Custom(addressFriendOffline, null, addressResolver, sha1);
final FriendRemoteFileDesc rfdGood = createRFDwithSHA1Custom(addressGood, null, addressResolver, sha1);
final FriendRemoteFileDesc rfdException = createRFDwithSHA1Custom(addressException, null, addressResolver, sha1);
context.checking(new Expectations() {
{ allowing(addressResolver).getPresence(addressFriendOffline);
will(returnValue(null));
allowing(addressResolver).getPresence(addressGood);
will(returnValue(presenceGood));
allowing(presenceGood).getFriend();
will(returnValue(friendGood));
allowing(friendGood).getNetwork();
will(returnValue(networkGood));
allowing(networkGood).getCanonicalizedLocalID();
will(returnValue(idGood));
allowing(addressResolver).getPresence(addressException);
will(returnValue(presenceException));
allowing(presenceException).getFriend();
// TODO: Do not need this at the moment
// This is a hack to force the exception to be thrown in the same location
// to the encoding call.
will(throwException(new UnsupportedEncodingException()));
}});
String pathFriendOffline = rfdFriendOffline.getUrlPath();
assertNotNull(pathFriendOffline);
assertNotSame(pathFriendOffline, "");
String pathGood = rfdGood.getUrlPath();
assertGreaterThan(-1, pathGood.indexOf(sha1));
assertGreaterThan(-1, pathGood.indexOf(CoreGlueFriendService.FRIEND_DOWNLOAD_PREFIX));
try {
rfdException.getUrlPath();
fail("A bad \"encoding\" should have thrown an exception");
} catch (RuntimeException e) {
}
context.assertIsSatisfied();
}
public void testIsMe() {
Mockery context = new Mockery() {
{ setImposteriser(ClassImposteriser.INSTANCE);
}
};
byte[] guid1 = new byte[0];
final FriendAddress address1 = context.mock(FriendAddress.class);
FriendRemoteFileDesc rfd1 = createRFDwithGUIDCustom(address1, null, null, guid1);
byte[] guid2 = new byte[] {1};
final FriendAddress address2 = context.mock(FriendAddress.class);
FriendRemoteFileDesc rfd2 = createRFDwithGUIDCustom(address2, null, null, guid2);
byte[] guid3 = new byte[] {1,2,3,4};
final FriendAddress address3 = context.mock(FriendAddress.class);
FriendRemoteFileDesc rfd3 = createRFDwithGUIDCustom(address3, null, null, guid3);
byte[] guid4 = new byte[] {5,6,9,'n',10};
final FriendAddress address4 = context.mock(FriendAddress.class);
FriendRemoteFileDesc rfd4 = createRFDwithGUIDCustom(address4, null, null, guid4);
byte[] guid5 = new byte[] {1,2,3,4};
final FriendAddress address5 = context.mock(FriendAddress.class);
FriendRemoteFileDesc rfd5 = createRFDwithGUIDCustom(address5, null, null, guid3);
assertTrue(rfd1.isMe(guid1));
assertFalse(rfd1.isMe(guid2));
assertFalse(rfd1.isMe(guid3));
assertFalse(rfd1.isMe(guid4));
assertFalse(rfd1.isMe(guid5));
assertFalse(rfd2.isMe(guid1));
assertTrue(rfd2.isMe(guid2));
assertFalse(rfd2.isMe(guid3));
assertFalse(rfd2.isMe(guid4));
assertFalse(rfd2.isMe(guid5));
assertFalse(rfd3.isMe(guid1));
assertFalse(rfd3.isMe(guid2));
assertTrue(rfd3.isMe(guid3));
assertFalse(rfd3.isMe(guid4));
assertTrue(rfd3.isMe(guid5));
assertFalse(rfd4.isMe(guid1));
assertFalse(rfd4.isMe(guid2));
assertFalse(rfd4.isMe(guid3));
assertTrue(rfd4.isMe(guid4));
assertFalse(rfd4.isMe(guid5));
assertFalse(rfd5.isMe(guid1));
assertFalse(rfd5.isMe(guid2));
assertTrue(rfd5.isMe(guid3));
assertFalse(rfd5.isMe(guid4));
assertTrue(rfd5.isMe(guid5));
}
public void testGetSHA1Urn() {
Mockery context = new Mockery() {
{ setImposteriser(ClassImposteriser.INSTANCE);
}
};
final FriendAddress address = context.mock(FriendAddress.class);
String sha1A = "urn:sha1:NETZHKEJKTCM74ZQQALJWSLWQHQJ7N6Q";
String sha1B = "urn:sha1:NETZHKEJKTCM74ZQ6LJWSLWQHQJ7N6Q1";
String sha1C = "urn:sha1:NETZHKEJK345SDF7N6Q2312321321321";
String sha1D = "urn:sha1:NETZHKEJKSNEAKYSHA1LWQHQJ7N4Q222";
Set<URN> urnsAllNonSHA1 = new HashSet<URN>();
urnsAllNonSHA1.add(URN.createGUIDUrn(new GUID(new byte[] {'x', '1', '2', '3', '4', 5, 6, 7, 8, 9,10, 11,12,13,14,15})));
urnsAllNonSHA1.add(URN.createGUIDUrn(new GUID(new byte[] {'x', '1', '2', '3', '4', 5, 6, 7, 8, 9,10, 11,12,13,14,15})));
urnsAllNonSHA1.add(URN.createGUIDUrn(new GUID(new byte[] {'x', '1', '2', '3', 'x', 5, 6, 7, 8, 9,10, 11,12,13,14,15})));
Set<URN> urnsB = new HashSet<URN>();
urnsB.add(URN.createGUIDUrn(new GUID(new byte[] {'x', '1', '2', '3', '4', 5, 6, 7, 8, 9,10, 11,12,13,14,15})));
urnsB.add(URN.createGUIDUrn(new GUID(new byte[] {'x', '1', '2', '3', '4', 5, 6, 7, 8, 9,10, 11,12,13,14,15})));
try {
urnsB.add(URN.createSHA1Urn(sha1D));
}
catch (IOException e) {
fail("Could not create a sha1 urn for test");
}
urnsB.add(URN.createGUIDUrn(new GUID(new byte[] {'x', '1', '2', '3', 'x', 5, 6, 7, 8, 9,10, 11,12,13,14,15})));
FriendRemoteFileDesc rfdNoSHA1 = createRFD(address, null, null);
FriendRemoteFileDesc rfdSingle = createRFDwithSHA1Custom(address, null, null, sha1A);
FriendRemoteFileDesc rfdMultipleSHA1 = createRFDwithSHA1Custom(address, null, null, sha1A, sha1C, sha1B);
FriendRemoteFileDesc rfdAllNonSHA1 = createRFDwithUrnsCustom(address, null, null, urnsAllNonSHA1);
FriendRemoteFileDesc rfdSomeNonSHA1 = createRFDwithUrnsCustom(address, null, null, urnsB);
try {
rfdNoSHA1.getSHA1Urn();
fail("Should have thrown an exception since there were no SHA1 urns in the RFD");
}
catch (IllegalArgumentException e) {
}
assertEquals(sha1A.toString(), rfdSingle.getSHA1Urn().toString());
assertContains(rfdSingle.getUrns(), rfdSingle.getSHA1Urn());
assertContains(rfdMultipleSHA1.getUrns(), rfdMultipleSHA1.getSHA1Urn());
try {
rfdAllNonSHA1.getSHA1Urn();
fail("Should have thrown an exception since there were no SHA1 urns in the RFD");
}
catch (IllegalArgumentException e) {
}
assertEquals(sha1D.toString(), rfdSomeNonSHA1.getSHA1Urn().toString());
}
public void testToMemento() {
Mockery context = new Mockery() {
{ setImposteriser(ClassImposteriser.INSTANCE);
}
};
final String filename = "test";
final FriendAddress address = context.mock(FriendAddress.class);
final AddressFactory addressFactory = context.mock(AddressFactory.class);
final AddressSerializer serialer = context.mock(AddressSerializer.class);
FriendRemoteFileDesc rfd = createRFDwithFilenameCustom(address, addressFactory, null, filename);
try {
context.checking(new Expectations() {
{
allowing(addressFactory).getSerializer(address);
will(returnValue(serialer));
allowing(serialer).getAddressType();
will(returnValue("memento"));
allowing(serialer).serialize(address);
will(returnValue(new byte[] {'m','o','r','i'}));
}});
}
catch (IOException e) {
}
RemoteHostMemento memento = rfd.toMemento();
assertEquals(filename, memento.getFileName());
context.assertIsSatisfied();
}
public FriendRemoteFileDesc createRFD(FriendAddress address, AddressFactory addressFactory, FriendAddressResolver addressResolver) {
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, null, Long.MAX_VALUE, new byte[] {'x'}, Integer.MIN_VALUE, Integer.MAX_VALUE, null,
new HashSet<URN>(), null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFD2(FriendAddress address, AddressFactory addressFactory, FriendAddressResolver addressResolver) {
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, null, Long.MAX_VALUE, new byte[] {'y'}, Integer.MIN_VALUE, Integer.MAX_VALUE, null,
new HashSet<URN>(), null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFD3(FriendAddress address, AddressFactory addressFactory, FriendAddressResolver addressResolver) {
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, null, -1, new byte[] {'x'}, Integer.MIN_VALUE, Integer.MAX_VALUE, null,
new HashSet<URN>(), null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFD4(FriendAddress address, AddressFactory addressFactory, FriendAddressResolver addressResolver) {
HashSet<URN> urns = new HashSet<URN>();
try {
urns.add(URN.createUrnFromString("urn:sha1:NETZHKEJKTCM74ZQQALJWSLWQHQJ7N6Q"));
} catch (IOException e) {
}
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, null, Long.MAX_VALUE, new byte[] {'x'}, Integer.MIN_VALUE, Integer.MAX_VALUE, null,
urns, null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFD5(FriendAddress address, AddressFactory addressFactory, FriendAddressResolver addressResolver) {
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, "huh", Long.MAX_VALUE, new byte[] {'x'}, Integer.MIN_VALUE, Integer.MAX_VALUE, null,
new HashSet<URN>(), null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFDwithGUID1(FriendAddress address, AddressFactory addressFactory, FriendAddressResolver addressResolver) {
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, null, Long.MAX_VALUE,
new byte[] {'0', '1', '2', '3', '4', 5, 6, 7, 8, 9,10, 11,12,13,14,15},
Integer.MIN_VALUE, Integer.MAX_VALUE, null,
new HashSet<URN>(), null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFDwithGUID2(FriendAddress address, AddressFactory addressFactory, FriendAddressResolver addressResolver) {
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, null, Long.MAX_VALUE,
new byte[] {'x', '1', '2', '3', '4', 5, 6, 7, 8, 9,10, 11,12,13,14,15},
Integer.MIN_VALUE, Integer.MAX_VALUE, null,
new HashSet<URN>(), null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFDwithSHA1Custom(FriendAddress address, AddressFactory addressFactory,
FriendAddressResolver addressResolver, String... sha1) {
HashSet<URN> urns = new HashSet<URN>();
try {
for (String s : sha1 ) {
urns.add(URN.createUrnFromString(s));
}
} catch (IOException e) {
fail("Could not create a sha1 urn for test");
}
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, null, Long.MAX_VALUE,
new byte[] {'x', '1', '2', '3', '4', 5, 6, 7, 8, 9,10, 11,12,13,14,15},
Integer.MIN_VALUE, Integer.MAX_VALUE, null,
urns, null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFDwithUrnsCustom(FriendAddress address, AddressFactory addressFactory,
FriendAddressResolver addressResolver, Set<URN> urns) {
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, null, Long.MAX_VALUE,
new byte[] {'x', '1', '2', '3', '4', 5, 6, 7, 8, 9,10, 11,12,13,14,15},
Integer.MIN_VALUE, Integer.MAX_VALUE, null,
urns, null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFDwithGUIDCustom(FriendAddress address, AddressFactory addressFactory, FriendAddressResolver addressResolver, byte[] guid) {
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, null, Long.MAX_VALUE,
guid,
Integer.MIN_VALUE, Integer.MAX_VALUE, null,
new HashSet<URN>(), null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
public FriendRemoteFileDesc createRFDwithFilenameCustom(FriendAddress address, AddressFactory addressFactory, FriendAddressResolver addressResolver, String filename) {
return new FriendRemoteFileDesc(address, Long.MAX_VALUE, filename, Long.MAX_VALUE,
new byte[] {'x', '1', '2', '3', '4', 5, 6, 7, 8, 9,10, 11,12,13,14,15},
Integer.MIN_VALUE, Integer.MAX_VALUE, null,
new HashSet<URN>(), null, Long.MIN_VALUE, false, addressFactory, addressResolver);
}
}