/*
* Copyright 1998-2009 University Corporation for Atmospheric Research/Unidata
*
* Portions of this software were developed by the Unidata Program at the
* University Corporation for Atmospheric Research.
*
* Access and use of this software shall impose the following obligations
* and understandings on the user. The user is granted the right, without
* any fee or cost, to use, copy, modify, alter, enhance and distribute
* this software, and any derivative works thereof, and its supporting
* documentation for any purpose whatsoever, provided that this entire
* notice appears in all copies of the software, derivative works and
* supporting documentation. Further, UCAR requests that the user credit
* UCAR/Unidata in any publications that result from the use of this
* software or in any product that includes this software. The names UCAR
* and/or Unidata, however, may not be used in any advertising or publicity
* to endorse or promote any products or commercial entity unless specific
* written permission is obtained from UCAR/Unidata. The user also
* understands that UCAR/Unidata is not obligated to provide the user with
* any support, consulting, training or assistance of any kind with regard
* to the use, operation and performance of this software nor to provide
* the user with any updates, revisions, new versions or "bug fixes."
*
* THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE.
*/
package thredds.server.catalogservice;
import junit.framework.TestCase;
import org.junit.experimental.categories.Category;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.validation.BindingResult;
import ucar.unidata.util.test.category.NeedsExternalResource;
import ucar.unidata.util.test.TestDir;
/**
* _more_
*
* @author edavis
* @since 4.0
*/
@Category(NeedsExternalResource.class)
public class TestRemoteCatalogRequest extends TestCase
{
private String parameterNameCatalog = "catalog";
private String parameterNameCommand = "command";
private String parameterNameDatasetId = "dataset";
private String parameterNameVerbose = "verbose";
private String parameterNameHtmlView = "htmlView";
private MockHttpServletRequest req;
private BindingResult bindingResult;
private String bindResultMsg;
private RemoteCatalogRequest rcr;
private String catUriString = "http://"+TestDir.threddsTestServer+"/thredds/catalog.xml";
private String cmdShow = "show";
private String cmdSubset = "subset";
private String cmdValidate = "validate";
private String datasetId = "my/cool/dataset";
public TestRemoteCatalogRequest( String name )
{
super(name);
}
public void testCommandDefaultValues()
{
// Command defaults to SHOW when dataset ID not given:
// check that [url=http://**/*.xml, command=null, dataset=null] is
// valid and becomes [url, command=SHOW, dataset=null]
req = basicSetup( catUriString, null, null, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdShow ) );
assertEquals( rcr.getDataset(), "" );
// Command defaults to SUBSET when dataset ID is given:
// check that [/catalog/**/*.xml, command=null, dataset=ID, htmlView=null] is
// valid and becomes [**/*.xml, command=SUBSET, dataset=ID, htmlView=true]
req = basicSetup( catUriString, null, datasetId, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdSubset ) );
assertEquals( rcr.getDataset(), datasetId );
assertTrue( rcr.isHtmlView());
// Command defaults to SUBSET when dataset ID is given:
// check that [/catalog/**/*.xml, command=null, dataset=ID, htmlView=true] is
// valid and becomes [**/*.xml, command=SUBSET, dataset=ID, htmlView=true]
req = basicSetup( catUriString, null, datasetId, "true", null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdSubset ) );
assertEquals( rcr.getDataset(), datasetId );
assertTrue( rcr.isHtmlView());
// Command defaults to SUBSET when dataset ID is given:
// check that [/catalog/**/*.xml, command=null, dataset=ID, htmlView=false] is
// valid and becomes [**/*.xml, command=SUBSET, dataset=ID, htmlView=false]
req = basicSetup( catUriString, null, datasetId, "false", null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdSubset ) );
assertEquals( rcr.getDataset(), datasetId );
assertFalse( rcr.isHtmlView());
}
public void testGoodRequests()
{
// Test that valid when "command"==null
req = basicSetup( catUriString, null, null, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdShow ) ); // default
assertEquals( rcr.getDataset(), "" ); //default
assertFalse( rcr.isVerbose()); //default
assertTrue( rcr.isHtmlView()); // default
// Test that valid when "command"==SHOW
req = basicSetup( catUriString, cmdShow, null, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdShow ) );
assertEquals( rcr.getDataset(), "" );
assertFalse( rcr.isVerbose() );
assertTrue( rcr.isHtmlView() );
// Test that valid when "command"==SHOW, "htmlView"=true
req = basicSetup( catUriString, cmdShow, null, "true", null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdShow ) );
assertEquals( rcr.getDataset(), "" ); // default
assertFalse( rcr.isVerbose() ); // default
assertTrue( rcr.isHtmlView() );
// Test that valid when "command"==SUBSET, "dataset"=dsId
req = basicSetup( catUriString, cmdSubset, datasetId, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdSubset ) );
assertEquals( rcr.getDataset(), datasetId );
assertFalse( rcr.isVerbose() ); // default
assertTrue( rcr.isHtmlView() ); // default
// Test that valid when "command"==SUBSET, "dataset"=dsId "htmlView"=false
req = basicSetup( catUriString, cmdSubset, datasetId, "false", null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdSubset ) );
assertEquals( rcr.getDataset(), datasetId );
assertFalse( rcr.isVerbose() ); // default
assertFalse( rcr.isHtmlView() );
// Test that valid when "command"==SUBSET, "dataset"=dsId "htmlView"=true
req = basicSetup( catUriString, cmdSubset, datasetId, "true", null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdSubset ) );
assertEquals( rcr.getDataset(), datasetId );
assertFalse( rcr.isVerbose() ); // default
assertTrue( rcr.isHtmlView() );
// Test that valid when "command"==VALIDATE, "dataset"=dsId
req = basicSetup( catUriString, cmdValidate, datasetId, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdValidate ) );
assertEquals( rcr.getDataset(), datasetId );
assertFalse( rcr.isVerbose() ); // default
assertTrue( rcr.isHtmlView() ); // default
// Test that valid when "command"==VALIDATE, "dataset"=dsId, "verbose"=true
req = basicSetup( catUriString, cmdValidate, datasetId, null, "true" );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdValidate ) );
assertEquals( rcr.getDataset(), datasetId );
assertTrue( rcr.isVerbose() );
assertTrue( rcr.isHtmlView() ); // default
// Test that valid when "command"==VALIDATE, "dataset"=dsId, "verbose"=false
req = basicSetup( catUriString, cmdValidate, datasetId, null, "false" );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg != null )
fail( bindResultMsg );
rcr = (RemoteCatalogRequest) bindingResult.getTarget();
assertEquals( rcr.getCatalogUri().toString(), catUriString );
assertTrue( rcr.getCommand().toString().equalsIgnoreCase( cmdValidate ) );
assertEquals( rcr.getDataset(), datasetId );
assertFalse( rcr.isVerbose() );
assertTrue( rcr.isHtmlView() ); // default
}
public void testBadRequests()
{
// Test that invalid when "catalog"==null
req = basicSetup( null, cmdShow, null, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg == null )
fail( "No binding error for catalog=null" );
System.out.println( "As expected, catalog=null got binding error: " + bindResultMsg );
// Test that invalid when catalog URI is not absolute
req = basicSetup( "/thredds/catalog.xml", cmdShow, null, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg == null )
fail( "No binding error for catalog URI not absolute" );
System.out.println( "As expected, catalog URI not absolute got binding error: " + bindResultMsg );
// Test that invalid when catalog URI is not HTTP
req = basicSetup( "ftp://ftp.unidata.ucar.edu/pub/thredds/", cmdShow, null, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg == null )
fail( "No binding error for catalog URI not HTTP" );
System.out.println( "As expected, catalog URI not HTTP got binding error: " + bindResultMsg );
// Test that invalid when "command"==SHOW, "htmlView"=false
req = basicSetup( catUriString, cmdShow, null, "false", null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg == null )
fail( "No binding error for command=SHOW&htmlView==false" );
System.out.println( "As expected, command=SHOW&htmlView==false got binding error: " + bindResultMsg );
// Test that invalid when "command"==SUBSET, "dataset"==null
req = basicSetup( catUriString, cmdSubset, null, null, null );
bindingResult = CatalogServiceUtils.bindAndValidateRemoteCatalogRequest( req );
bindResultMsg = TestLocalCatalogRequest.checkBindingResults( bindingResult );
if ( bindResultMsg == null )
fail( "No binding error for command=SUBSET&dataset==null" );
System.out.println( "As expected, command=SUBSET&dataset==null got binding error: " + bindResultMsg );
}
public MockHttpServletRequest basicSetup( String catUriString, String command,
String datasetId, String htmlView,
String verbose )
{
MockHttpServletRequest req = new MockHttpServletRequest();
req.setMethod( "GET" );
req.setContextPath( "/thredds" );
req.setServletPath( "/remoteCatalogService" );
req.setParameter( parameterNameCatalog, catUriString );
req.setParameter( parameterNameCommand, command );
req.setParameter( parameterNameDatasetId, datasetId );
req.setParameter( parameterNameHtmlView, htmlView );
req.setParameter( parameterNameVerbose, verbose );
return req;
}
}