// BlogBridge -- RSS feed reader, manager, and web based service
// Copyright (C) 2002-2006 by R. Pito Salas
//
// This program 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;
// either version 2 of the License, or (at your option) any later version.
//
// This program 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 this program;
// if not, write to the Free Software Foundation, Inc., 59 Temple Place,
// Suite 330, Boston, MA 02111-1307 USA
//
// Contact: R. Pito Salas
// mailto:pitosalas@users.sourceforge.net
// More information: about BlogBridge
// http://www.blogbridge.com
// http://sourceforge.net/projects/blogbridge
//
// $Id: TestMDDiscoveryLogic.java,v 1.4 2006/01/08 05:28:16 kyank Exp $
//
package com.salas.bb.discovery;
import junit.framework.TestCase;
import java.util.Map;
import java.util.HashMap;
import java.net.URL;
import java.net.MalformedURLException;
import com.salas.bb.domain.FeedMetaDataHolder;
/**
* This suite contains tests for <code>MDDiscoveryLogic</code> unit.
*/
public class TestMDDiscoveryLogic extends TestCase
{
/**
* Tests handling of processing response from service.
* The response is PROCESSING. We are discovering something NEW.
*/
public void testProcessServiceResultsProcessingNew()
{
Map results = createServiceResults(MDDiscoveryLogic.STATUS_PROCESSING);
FeedMetaDataHolder newHolder = new FeedMetaDataHolder();
MDDiscoveryRequest request = new MDDiscoveryRequest(null, newHolder);
MDDiscoveryLogic.processServiceResults(results, request);
assertFalse("Discovery is incomplete. Service is processing request.",
newHolder.isComplete());
}
/**
* Tests handling of processing response from service.
* The response is PROCESSING. We are updating some meta-data.
*/
public void testProcessServiceResultsProcessingUpdate()
{
Map results = createServiceResults(MDDiscoveryLogic.STATUS_PROCESSING);
FeedMetaDataHolder holder = new FeedMetaDataHolder();
holder.setComplete(false);
MDDiscoveryRequest request = new MDDiscoveryRequest(null, holder);
MDDiscoveryLogic.processServiceResults(results, request);
assertFalse("Discovery is incomplete. Service is processing request.",
holder.isComplete());
}
/**
* Tests filling the holder with information on valid discovery.
*/
public void testProcessServiceResultsValid()
{
Map results = createServiceResults(MDDiscoveryLogic.STATUS_VALID);
results.put(MDDiscoveryLogic.KEY_DATA_URL, "http://data");
results.put(MDDiscoveryLogic.KEY_HTML_URL, "http://html");
results.put(MDDiscoveryLogic.KEY_TITLE, "title");
results.put(MDDiscoveryLogic.KEY_AUTHOR, "author");
results.put(MDDiscoveryLogic.KEY_DESCRIPTION, "description");
results.put(MDDiscoveryLogic.KEY_INBOUND_LINKS, new Integer(1));
FeedMetaDataHolder holder = new FeedMetaDataHolder();
MDDiscoveryRequest request = new MDDiscoveryRequest(null, holder);
MDDiscoveryLogic.processServiceResults(results, request);
assertTrue("Discovery has finished with VALID status.",
request.isServiceDiscoveryComplete());
assertFalse("Information is valid.", holder.isInvalid().booleanValue());
assertEquals("http://data", holder.getXmlURL().toString());
assertEquals("http://html", holder.getHtmlURL().toString());
assertEquals("title", holder.getTitle());
assertEquals("description", holder.getDescription());
assertEquals("author", holder.getAuthor());
assertEquals(new Integer(1), holder.getInboundLinks());
}
/**
* Tests marking holder as complete and invalid on INVALID response from service.
*/
public void testProcessServiceResultsInvalid()
{
Map results = createServiceResults(MDDiscoveryLogic.STATUS_INVALID);
FeedMetaDataHolder holder = new FeedMetaDataHolder();
MDDiscoveryRequest request = new MDDiscoveryRequest(null, holder);
MDDiscoveryLogic.processServiceResults(results, request);
assertTrue("Discovery has finished with INVALID status.",
request.isServiceDiscoveryComplete());
assertTrue("Information is valid.", holder.isInvalid().booleanValue());
}
/**
* Tests detecting URL's to local resourses.
*/
public void testIsLocalResource()
throws MalformedURLException
{
assertTrue(MDDiscoveryRequest.isLocalURL(new URL("file://a")));
assertTrue(MDDiscoveryRequest.isLocalURL(new URL("http://localhost/test")));
assertTrue(MDDiscoveryRequest.isLocalURL(new URL("http://127.0.0.1:5585/test")));
assertFalse(MDDiscoveryRequest.isLocalURL(new URL("http://www.google.com/")));
}
/**
* Verifies resolving the state of discovery when both discoveries are incomplete.
*/
public void testUpdateHolderStatusBothIncomplete()
{
MDDiscoveryRequest request = prepareRequest(false, false, null);
// Invalidness state is undiscovered (i.e. holder.isInvalid() == null)
// We don't mark meta-data as invalid after direct discovery failure as
// we can count only on positive results -- it's not really reliable, but fast.
MDDiscoveryLogic.updateHolderStatus(request);
assertFalse("Discovery is incomplete by both methods.", request.getHolder().isComplete());
assertEquals(-1, request.getHolder().getLastUpdateTime());
}
/**
* Verifies resolving the state of discovery when service discovery is
* incomplete, but direct query failed.
*/
public void testUpdateHolderStatusServiceIncompleteDirectInvalid()
{
MDDiscoveryRequest request = prepareRequest(false, true, null);
// Invalidness state is undiscovered (i.e. holder.isInvalid() == null)
// We don't mark meta-data as invalid after direct discovery failure as
// we can count only on positive results -- it's not really reliable, but fast.
MDDiscoveryLogic.updateHolderStatus(request);
assertFalse("Discovery is incomplete by service and direct hasn't reported success.",
request.getHolder().isComplete());
assertEquals(-1, request.getHolder().getLastUpdateTime());
}
/**
* Verifies resolving the state of discovery when service discovery is
* incomplete, but direct query succeed.
*/
public void testUpdateHolderStatusServiceIncompleteDirectValid()
{
MDDiscoveryRequest request = prepareRequest(false, true, Boolean.FALSE);
MDDiscoveryLogic.updateHolderStatus(request);
assertTrue("Discovery is incomplete by service, but direct discoverer reported success.",
request.getHolder().isComplete());
assertFalse(request.getHolder().getLastUpdateTime() == -1);
}
/**
* Verifies resolving the state of discovery when direct discovery is
* incomplete, but service query failed.
*/
public void testUpdateHolderStatusDirectIncompleteServiceInvalid()
{
MDDiscoveryRequest request = prepareRequest(true, false, Boolean.TRUE);
MDDiscoveryLogic.updateHolderStatus(request);
assertFalse("Discovery is incomplete by direct query, but service reported failure.",
request.getHolder().isComplete());
assertTrue(request.getHolder().getLastUpdateTime() == -1);
}
/**
* Verifies resolving the state of discovery when direct discovery is
* incomplete, but service query succeed.
*/
public void testUpdateHolderStatusDirectIncompleteServiceValid()
{
MDDiscoveryRequest request = prepareRequest(true, false, Boolean.FALSE);
MDDiscoveryLogic.updateHolderStatus(request);
assertTrue("Discovery is incomplete by direct query, but service reported success.",
request.getHolder().isComplete());
assertFalse(request.getHolder().getLastUpdateTime() == -1);
}
/**
* Verifies resolving the state of discovery when both discoveries
* has finished with failure.
*/
public void testUpdateHolderStatusBothCompleteInvalid()
{
MDDiscoveryRequest request = prepareRequest(true, true, Boolean.TRUE);
MDDiscoveryLogic.updateHolderStatus(request);
assertTrue("Both queries complete and invalid.", request.getHolder().isComplete());
assertFalse(request.getHolder().getLastUpdateTime() == -1);
}
/**
* Verifies resolving the state of discovery when both discoveries
* has finished with success.
*/
public void testUpdateHolderStatusBothCompleteValid()
{
MDDiscoveryRequest request = prepareRequest(true, true, Boolean.FALSE);
MDDiscoveryLogic.updateHolderStatus(request);
assertTrue("Both queries complete and invalid.", request.getHolder().isComplete());
assertFalse(request.getHolder().getLastUpdateTime() == -1);
}
/**
* Prepares the request object.
*
* @param serviceComplete <code>TRUE</code> to mark request as processed with service.
* @param directComplete <code>TRUE</code> to mark request as processed by direct discovery.
* @param isInvalid <code>NULL</code> to leave in undetermined state and
* <code>TRUE</code> to mark as invalid.
*
* @return request object.
*/
private static MDDiscoveryRequest prepareRequest(boolean serviceComplete,
boolean directComplete, Boolean isInvalid)
{
FeedMetaDataHolder holder = new FeedMetaDataHolder();
MDDiscoveryRequest request = new MDDiscoveryRequest(null, holder);
request.setServiceDiscoveryComplete(serviceComplete);
request.setDirectDiscoveryComplete(directComplete);
if (isInvalid != null) holder.setInvalid(isInvalid.booleanValue());
return request;
}
/**
* Creates service results.
*
* @param statusCode status code.
*
* @return results map.
*/
private static Map createServiceResults(int statusCode)
{
Map results = new HashMap();
results.put(MDDiscoveryLogic.KEY_STATUS_CODE, new Integer(statusCode));
return results;
}
}