/*
* Copyright 2004 - 2008 Christian Sprajc. All rights reserved.
*
* This file is part of PowerFolder.
*
* PowerFolder is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation.
*
* PowerFolder is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PowerFolder. If not, see <http://www.gnu.org/licenses/>.
*
* $Id: AddLicenseHeader.java 4282 2008-06-16 03:25:09Z tot $
*/
package de.dal33t.powerfolder.test.message;
import java.net.InetSocketAddress;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import de.dal33t.powerfolder.Constants;
import de.dal33t.powerfolder.Member;
import de.dal33t.powerfolder.light.MemberInfo;
import de.dal33t.powerfolder.net.NodeSearcher;
import de.dal33t.powerfolder.util.IdGenerator;
import de.dal33t.powerfolder.util.test.ConditionWithMessage;
import de.dal33t.powerfolder.util.test.TestHelper;
import de.dal33t.powerfolder.util.test.TwoControllerTestCase;
/**
* Tests the NodeSearcher. This test fails because there are also other users in
* the net ... running this test on "art" finds: Member 'Art' (-disco.-, recon.
* at 185.74.205.68.cfl.res.rr.com/68.205.74.185:1337) Member 'Eef en Martha'
* (-disco.-, recon. at fia62-17-100.dsl.hccnet.nl/80.100.17.62:1337) Member
* 'Bart' (localhost/127.0.0.1:52574) Member 'martin' (-disco.-, recon. at
* wayhome.ath.cx/82.83.194.183:1337) Member 'Melissa Garth' (-disco.-, recon.
* at c-24-125-41-64.hsd1.va.comcast.net/24.125.41.64:1337)
*
* @author <a href="mailto:totmacher@powerfolder.com">Christian Sprajc</a>
* @version $Revision: 1.5 $
*/
public class NodeSearcherTest extends TwoControllerTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
connectBartAndLisa();
// Add some users to our protagonists
MemberInfo maggi = new MemberInfo("Maggi", IdGenerator.makeId(), null);
maggi.setLastConnectTime(new Date());
// Marge is very long offline
MemberInfo marge = new MemberInfo("Marge", IdGenerator.makeId(), null);
marge.setLastConnectTime(new Date(System.currentTimeMillis()
- Constants.NODE_TIME_TO_INVALIDATE - 10000));
getContollerLisa().getNodeManager().addNode(maggi);
getContollerLisa().getNodeManager().addNode(marge);
MemberInfo homer = new MemberInfo("Homer", IdGenerator.makeId(), null);
homer.setLastConnectTime(new Date());
homer.setConnectAddress(new InetSocketAddress("127.0.0.1", 234));
MemberInfo flenders = new MemberInfo("Ned Flenders",
IdGenerator.makeId(), null);
flenders.setLastConnectTime(new Date());
flenders.setConnectAddress(new InetSocketAddress("127.0.0.1", 2314));
MemberInfo moe = new MemberInfo("Moe", IdGenerator.makeId(), null);
moe.setLastConnectTime(new Date(System.currentTimeMillis()
- Constants.NODE_TIME_TO_INVALIDATE - 10000));
moe.setConnectAddress(new InetSocketAddress("127.0.0.1", 333));
getContollerBart().getNodeManager().addNode(homer);
getContollerBart().getNodeManager().addNode(flenders);
getContollerBart().getNodeManager().addNode(moe);
assertTrue(getContollerBart().getMySelf().isSupernode());
Member bartAtLisa = getContollerLisa().getNodeManager()
.getConnectedNodes().iterator().next();
assertEquals(getContollerBart().getMySelf(), bartAtLisa);
// assertTrue("Bart is not known as supernode @ Lisa", bartAtLisa
// .isSupernode());
}
/**
* Tests the search on local node database without the need of sending
* search requests to supernodes.
*/
public void testLocalSearch() {
List<Member> searchResultModel = new ArrayList<Member>();
// Search for a node, which cannot be found
NodeSearcher searcher = new NodeSearcher(getContollerLisa(), "xxx",
searchResultModel, true, false);
searcher.start();
TestHelper.waitMilliSeconds(1000);
searcher.cancelSearch();
assertTrue(searchResultModel.isEmpty());
// Search for "Bart" by nick
searcher = new NodeSearcher(getContollerLisa(), "art",
searchResultModel, true, false);
searcher.start();
TestHelper.waitMilliSeconds(1000);
searcher.cancelSearch();
assertFalse(searchResultModel.isEmpty());
System.out.println("members found: ");
for (Member member : searchResultModel) {
System.out.println(member);
}
assertEquals(1, searchResultModel.size());
assertEquals(getContollerBart().getMySelf(), searchResultModel.get(0));
// Search for "Maggi" by nick
searcher = new NodeSearcher(getContollerLisa(), "MAGGI",
searchResultModel, true, false);
searcher.start();
TestHelper.waitMilliSeconds(1000);
searcher.cancelSearch();
// assertFalse(searchResultModel.toString(),
// searchResultModel.isEmpty());
assertEquals(searchResultModel.toString(), 1, searchResultModel.size());
assertEquals("Maggi", searchResultModel.get(0).getNick());
// Search for "Marge" by nick. Is invalid, but on local database = found
searcher = new NodeSearcher(getContollerLisa(), "marge",
searchResultModel, true, false);
searcher.start();
TestHelper.waitMilliSeconds(1000);
searcher.cancelSearch();
assertFalse(searchResultModel.isEmpty());
assertEquals(1, searchResultModel.size());
assertEquals("Marge", searchResultModel.get(0).getNick());
}
/**
* Tests the search on with the need of sending search requests to
* supernodes.
*/
public void testSupernodeSearch() {
List<Member> searchResultModel = new ArrayList<Member>();
// Search for "Homer" by nick
NodeSearcher searcher = new NodeSearcher(getContollerLisa(), "homer",
searchResultModel, true, false);
searcher.start();
TestHelper.waitMilliSeconds(1000);
searcher.cancelSearch();
assertFalse(searchResultModel.isEmpty());
assertEquals(1, searchResultModel.size());
assertEquals("Homer", searchResultModel.get(0).getNick());
// Search for "moe" by nick. Should not be found since he is invalid
searcher = new NodeSearcher(getContollerLisa(), "MOE",
searchResultModel, true, false);
searcher.start();
TestHelper.waitMilliSeconds(1000);
searcher.cancelSearch();
assertTrue(searchResultModel.isEmpty());
}
public void testMixedSearchMultiple() throws Exception {
for (int i = 0; i < 100; i++) {
testMixedSearch();
tearDown();
setUp();
}
}
/**
* Both cases with multiple search results.
*/
public void testMixedSearch() {
final List<Member> searchResultModel = new ArrayList<Member>();
// Search for "r"
NodeSearcher searcher = new NodeSearcher(getContollerLisa(), "r",
searchResultModel, true, false);
searcher.start();
TestHelper.waitForCondition(10, new ConditionWithMessage() {
public boolean reached() {
return searchResultModel.size() == 5;
}
public String message() {
return searchResultModel.toString();
}
});
searcher.cancelSearch();
assertFalse(searchResultModel.isEmpty());
// baRt, homeR and maRge, ned flendeRs, Online StoRage
assertEquals(searchResultModel.toString(), 5, searchResultModel.size());
// Search for "127.0.0.1"
searcher = new NodeSearcher(getContollerLisa(), "127.0.0.1",
searchResultModel, true, false);
searcher.start();
TestHelper.waitMilliSeconds(1000);
searcher.cancelSearch();
assertFalse(searchResultModel.isEmpty());
// Bart, Homer, Ned Flenders
assertEquals(3, searchResultModel.size());
// Search for hostname (NO LONGER SUPPORTED)
searcher = new NodeSearcher(getContollerLisa(), "localhost",
searchResultModel, true, false);
searcher.start();
TestHelper.waitMilliSeconds(1000);
searcher.cancelSearch();
assertTrue(searchResultModel.isEmpty());
// None found = not really searched
assertEquals(0, searchResultModel.size());
}
}