Package org.apache.shindig.gadgets.uri

Source Code of org.apache.shindig.gadgets.uri.DefaultIframeUriManagerTest

/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.shindig.gadgets.uri;

import static org.apache.shindig.gadgets.uri.DefaultIframeUriManager.IFRAME_BASE_PATH_KEY;
import static org.apache.shindig.gadgets.uri.DefaultIframeUriManager.LOCKED_DOMAIN_FEATURE_NAME;
import static org.apache.shindig.gadgets.uri.DefaultIframeUriManager.LOCKED_DOMAIN_REQUIRED_KEY;
import static org.apache.shindig.gadgets.uri.DefaultIframeUriManager.LOCKED_DOMAIN_SUFFIX_KEY;
import static org.apache.shindig.gadgets.uri.DefaultIframeUriManager.SECURITY_TOKEN_ALWAYS_KEY;
import static org.apache.shindig.gadgets.uri.DefaultIframeUriManager.SECURITY_TOKEN_FEATURE_NAME;
import static org.apache.shindig.gadgets.uri.DefaultIframeUriManager.UNLOCKED_DOMAIN_KEY;
import static org.apache.shindig.gadgets.uri.DefaultIframeUriManager.tplKey;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.isA;
import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;

import java.util.List;
import java.util.Map;

import org.apache.shindig.auth.BasicSecurityTokenCodec;
import org.apache.shindig.auth.SecurityTokenCodec;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.common.uri.UriBuilder;
import org.apache.shindig.config.BasicContainerConfig;
import org.apache.shindig.config.ContainerConfig;
import org.apache.shindig.config.ContainerConfigException;
import org.apache.shindig.gadgets.Gadget;
import org.apache.shindig.gadgets.HashLockedDomainService;
import org.apache.shindig.gadgets.LockedDomainService;
import org.apache.shindig.gadgets.uri.UriCommon.Param;
import org.junit.Test;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

public class DefaultIframeUriManagerTest extends UriManagerTestBase {
  private static final String LD_PREFIX = "locked";
  private static final String IFRAME_PATH = "/gadgets/ifr";
  private static final String JS_HOST = "//server.com";
  private static final String JS_PATH = "/gadgets/js";
  private static final String LD_SUFFIX = ".lockeddomain.com";
  private static final String LD_SUFFIX_ALT = ".altld.com";
  private static final String UNLOCKED_DOMAIN = "unlockeddomain.com";
  private static final String UNLOCKED_DOMAIN_CONFIG_VALUE = UNLOCKED_DOMAIN;
  private static final int TYPE_URL_NUM_BASE_PARAMS = 8;
  private static final int TYPE_HTML_NUM_BASE_PARAMS = 8;

  private static final LockedDomainPrefixGenerator prefixGen = new LockedDomainPrefixGenerator() {
    public String getLockedDomainPrefix(Uri gadgetUri) {
      return LD_PREFIX;
    }

    public String getLockedDomainPrefix(String token) {
      // TODO Auto-generated method stub
      return LD_PREFIX;
    }
  };

  private static final SecurityTokenCodec tokenCodec = new BasicSecurityTokenCodec();

  @Test
  public void typeHtmlBasicOptions() throws Exception {
    String prefKey = "prefKey";
    String prefVal = "prefVal";
    Map<String, String> prefs = Maps.newHashMap();
    prefs.put(prefKey, prefVal);
    List<String> features = Lists.newArrayList();

    // Make the gadget.
    Gadget gadget = mockGadget(
        SPEC_URI.toString(),
        false,  // not type=url
        false,  // isDebug
        false,  // ignoreCache
        false,  // sanitize
        false,  // cajoled
        prefs,  // spec-contained prefs
        prefs,  // prefs supplied by the requester, same k/v as spec w/ default val for simplicity
        false,  // no pref substitution needed, ergo prefs in fragment
        features);

    // Generate a default-option manager
    TestDefaultIframeUriManager manager = makeManager(
        false,   // security token beacon not required
        false)// locked domain not required

    // Generate URI, turn into UriBuilder for validation
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);

    UriBuilder uri = new UriBuilder(result);
    assertEquals("", uri.getScheme());
    assertEquals(UNLOCKED_DOMAIN, uri.getAuthority());
    assertEquals(IFRAME_PATH, uri.getPath());
    assertEquals(SPEC_URI.toString(), uri.getQueryParameter(Param.URL.getKey()));
    assertEquals(CONTAINER, uri.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals(VIEW, uri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(LANG, uri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(COUNTRY, uri.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals("0", uri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals("0", uri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals("0", uri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals(prefVal, uri.getFragmentParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, uri.getQueryParameters().size());
    assertEquals(1, uri.getFragmentParameters().size());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals("", htmlGadgetUri.getScheme());
    assertEquals(UNLOCKED_DOMAIN, htmlGadgetUri.getAuthority());
    assertEquals(IFRAME_PATH, htmlGadgetUri.getPath());
    assertEquals(SPEC_URI.toString(), htmlGadgetUri.getQueryParameter(Param.URL.getKey()));
    assertEquals(CONTAINER, htmlGadgetUri.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals(VIEW, htmlGadgetUri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(LANG, htmlGadgetUri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(COUNTRY, htmlGadgetUri.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals("0", htmlGadgetUri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals("0", htmlGadgetUri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals("0", htmlGadgetUri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals(prefVal, htmlGadgetUri.getFragmentParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, htmlGadgetUri.getQueryParameters().size());
    assertEquals(1, htmlGadgetUri.getFragmentParameters().size());

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals("http", urlGadgetUri.getScheme());
    assertEquals("example.com", urlGadgetUri.getAuthority());
    assertEquals("/gadget.xml", urlGadgetUri.getPath());
    assertNull(urlGadgetUri.getQueryParameter(Param.URL.getKey()));
    assertEquals(CONTAINER, urlGadgetUri.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals(ANOTHER_VIEW, urlGadgetUri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(LANG, urlGadgetUri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(COUNTRY, urlGadgetUri.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals("0", urlGadgetUri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals("0", urlGadgetUri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals("0", urlGadgetUri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals(prefVal, urlGadgetUri.getQueryParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_URL_NUM_BASE_PARAMS + 1, urlGadgetUri.getQueryParameters().size());
    assertEquals(0, urlGadgetUri.getFragmentParameters().size());

    assertFalse(manager.tokenForRenderingCalled());
    assertTrue(manager.schemeCalled());
    assertTrue(manager.addExtrasCalled());
  }

  @Test
  public void typeHtmlCajoled() throws Exception {
    String prefKey = "prefKey";
    String prefVal = "prefVal";
    Map<String, String> prefs = Maps.newHashMap();
    prefs.put(prefKey, prefVal);
    List<String> features = Lists.newArrayList();

    // Make the gadget.
    Gadget gadget = mockGadget(
        SPEC_URI.toString(),
        false,  // not type=url
        false,  // isDebug
        false,  // ignoreCache
        false,  // sanitize
        true,  // cajoled
        prefs,  // spec-contained prefs
        prefs,  // prefs supplied by the requester, same k/v as spec w/ default val for simplicity
        false,  // no pref substitution needed, ergo prefs in fragment
        features);

    // Generate a default-option manager
    TestDefaultIframeUriManager manager = makeManager(
        false,   // security token beacon not required
        false)// locked domain not required

    // Generate URI, turn into UriBuilder for validation
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);

    UriBuilder uri = new UriBuilder(result);
    assertEquals("0", uri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals("1", uri.getQueryParameter(Param.CAJOLE.getKey()));
    assertEquals(prefVal, uri.getFragmentParameter("up_" + prefKey));

    // Cajoled is and added param
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 1, uri.getQueryParameters().size());
    assertEquals(1, uri.getFragmentParameters().size());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals("0", htmlGadgetUri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals("1", htmlGadgetUri.getQueryParameter(Param.CAJOLE.getKey()));
    assertEquals(prefVal, htmlGadgetUri.getFragmentParameter("up_" + prefKey));

    // Cajoled is and added param
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 1, htmlGadgetUri.getQueryParameters().size());
    assertEquals(1, htmlGadgetUri.getFragmentParameters().size());

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals("0", urlGadgetUri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals("1", urlGadgetUri.getQueryParameter(Param.CAJOLE.getKey()));
    assertEquals(prefVal, urlGadgetUri.getQueryParameter("up_" + prefKey));

    // Cajoled is and added param
    assertEquals(TYPE_URL_NUM_BASE_PARAMS + 2, urlGadgetUri.getQueryParameters().size());
    assertEquals(0, urlGadgetUri.getFragmentParameters().size());

    assertFalse(manager.tokenForRenderingCalled());
    assertTrue(manager.schemeCalled());
    assertTrue(manager.addExtrasCalled());
  }

  @Test
  public void typeHtmlBasicOptionsTpl() throws Exception {
    String prefKey = "prefKey";
    String prefVal = "prefVal";
    Map<String, String> prefs = Maps.newHashMap();
    prefs.put(prefKey, prefVal);
    List<String> features = Lists.newArrayList();

    // Make the gadget.
    Gadget gadget = mockGadget(
        SPEC_URI.toString(),
        false,  // not type=url
        false,  // isDebug
        false,  // ignoreCache
        false,  // sanitize
        false,  // cajoled
        prefs,  // spec-contained prefs
        prefs,  // prefs supplied by the requester, same k/v as spec w/ default val for simplicity
        false,  // no pref substitution needed, ergo prefs in fragment
        features);

    // Create another manager, this time templatized.
    TestDefaultIframeUriManager managerTpl = makeManager(
        false,   // security token beacon not required
        false)// locked domain not required
    managerTpl.setTemplatingSignal(tplSignal(true));

    // Templatized results.
    Uri resultTpl = managerTpl.makeRenderingUri(gadget);
    assertNotNull(resultTpl);

    UriBuilder uriTpl = new UriBuilder(resultTpl);
    assertEquals("", uriTpl.getScheme());
    assertEquals(UNLOCKED_DOMAIN, uriTpl.getAuthority());
    assertEquals(IFRAME_PATH, uriTpl.getPath());
    assertEquals(SPEC_URI.toString(), uriTpl.getQueryParameter(Param.URL.getKey()));
    assertEquals(CONTAINER, uriTpl.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals(tplKey(Param.VIEW.getKey()), uriTpl.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(tplKey(Param.LANG.getKey()), uriTpl.getQueryParameter(Param.LANG.getKey()));
    assertEquals(tplKey(Param.COUNTRY.getKey()), uriTpl.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals(tplKey(Param.DEBUG.getKey()), uriTpl.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals(tplKey(Param.NO_CACHE.getKey()),
        uriTpl.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals(tplKey(Param.SANITIZE.getKey()),
        uriTpl.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals(tplKey("up_" + prefKey), uriTpl.getFragmentParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, uriTpl.getQueryParameters().size());
    assertEquals(1, uriTpl.getFragmentParameters().size());

    Map<String, Uri> uris = managerTpl.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals("", htmlGadgetUri.getScheme());
    assertEquals(UNLOCKED_DOMAIN, htmlGadgetUri.getAuthority());
    assertEquals(IFRAME_PATH, htmlGadgetUri.getPath());
    assertEquals(SPEC_URI.toString(), htmlGadgetUri.getQueryParameter(Param.URL.getKey()));
    assertEquals(CONTAINER, htmlGadgetUri.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals(tplKey(Param.VIEW.getKey()), htmlGadgetUri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(tplKey(Param.LANG.getKey()), htmlGadgetUri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(tplKey(Param.COUNTRY.getKey()), htmlGadgetUri.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals(tplKey(Param.DEBUG.getKey()), htmlGadgetUri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals(tplKey(Param.NO_CACHE.getKey()),
            htmlGadgetUri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals(tplKey(Param.SANITIZE.getKey()),
            htmlGadgetUri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals(tplKey("up_" + prefKey), htmlGadgetUri.getFragmentParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, htmlGadgetUri.getQueryParameters().size());
    assertEquals(1, htmlGadgetUri.getFragmentParameters().size());

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals("http", urlGadgetUri.getScheme());
    assertEquals("example.com", urlGadgetUri.getAuthority());
    assertEquals("/gadget.xml", urlGadgetUri.getPath());
    assertNull(urlGadgetUri.getQueryParameter(Param.URL.getKey()));
    assertEquals(CONTAINER, urlGadgetUri.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals(tplKey(Param.VIEW.getKey()), urlGadgetUri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(tplKey(Param.LANG.getKey()), urlGadgetUri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(tplKey(Param.COUNTRY.getKey()), urlGadgetUri.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals(tplKey(Param.DEBUG.getKey()), urlGadgetUri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals(tplKey(Param.NO_CACHE.getKey()),
            urlGadgetUri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals(tplKey(Param.SANITIZE.getKey()),
            urlGadgetUri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals(tplKey("up_" + prefKey), urlGadgetUri.getQueryParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_URL_NUM_BASE_PARAMS + 1, urlGadgetUri.getQueryParameters().size());
    assertEquals(0, urlGadgetUri.getFragmentParameters().size());

    assertFalse(managerTpl.tokenForRenderingCalled());
    assertTrue(managerTpl.schemeCalled());
    assertTrue(managerTpl.addExtrasCalled());
  }

  @Test
  public void typeUrlDefaultOptions() throws Exception {
    String gadgetSite = "http://example.com/gadget";
    String prefKey = "prefKey";
    String prefVal = "prefVal";
    Map<String, String> prefs = Maps.newHashMap();
    prefs.put(prefKey, prefVal);
    List<String> features = Lists.newArrayList("rpc", "setprefs");

    // Make the gadget.
    Gadget gadget = mockGadget(
        gadgetSite,
        true,   // type=url
        true,   // isDebug
        true,   // ignoreCache
        true,   // sanitize
        false,  // cajoled
        prefs,  // spec-contained prefs
        prefs,  // prefs supplied by the requester, same k/v as spec w/ default val for simplicity
        false,  // no pref substitution needed, ergo prefs in fragment
        features);

    // Generate a default-option manager
    TestDefaultIframeUriManager manager = makeManager(
        false,   // security token beacon not required
        false)// locked domain not required

    // Generate URI, turn into UriBuilder for validation
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);

    UriBuilder uri = new UriBuilder(result);
    assertEquals("http", uri.getScheme());
    assertEquals("example.com", uri.getAuthority());
    assertEquals("/gadget", uri.getPath());
    assertEquals(CONTAINER, uri.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals(VIEW, uri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(LANG, uri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(COUNTRY, uri.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals(JS_HOST + JS_PATH + "/rpc:setprefs" + DefaultJsUriManager.JS_SUFFIX, uri.getQueryParameter(Param.LIBS.getKey()));
    assertEquals("1", uri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals("1", uri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals("1", uri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals(prefVal, uri.getFragmentParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, uri.getQueryParameters().size());
    assertEquals(1, uri.getFragmentParameters().size());

    assertFalse(manager.tokenForRenderingCalled());
    assertFalse(manager.schemeCalled());
    assertTrue(manager.addExtrasCalled());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals("http", urlGadgetUri.getScheme());
    assertEquals("example.com", urlGadgetUri.getAuthority());
    assertEquals("/gadget", urlGadgetUri.getPath());
    assertEquals(CONTAINER, urlGadgetUri.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals(VIEW, urlGadgetUri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(LANG, urlGadgetUri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(COUNTRY, urlGadgetUri.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals(JS_HOST + JS_PATH + "/rpc:setprefs" + DefaultJsUriManager.JS_SUFFIX, urlGadgetUri.getQueryParameter(Param.LIBS.getKey()));
    assertEquals("1", urlGadgetUri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals("1", urlGadgetUri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals("1", urlGadgetUri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals(prefVal, urlGadgetUri.getFragmentParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, urlGadgetUri.getQueryParameters().size());
    assertEquals(1, urlGadgetUri.getFragmentParameters().size());

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals("", htmlGadgetUri.getScheme());
    assertEquals(UNLOCKED_DOMAIN, htmlGadgetUri.getAuthority());
    assertEquals(IFRAME_PATH, htmlGadgetUri.getPath());
    assertEquals(CONTAINER, htmlGadgetUri.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals(ANOTHER_VIEW, htmlGadgetUri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(LANG, htmlGadgetUri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(COUNTRY, htmlGadgetUri.getQueryParameter(Param.COUNTRY.getKey()));
    assertNull(htmlGadgetUri.getQueryParameter(Param.LIBS.getKey()));
    assertEquals("1", htmlGadgetUri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals("1", htmlGadgetUri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals("1", htmlGadgetUri.getQueryParameter(Param.SANITIZE.getKey()));
    assertEquals(prefVal, htmlGadgetUri.getQueryParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 1, htmlGadgetUri.getQueryParameters().size());
    assertEquals(0, htmlGadgetUri.getFragmentParameters().size());

    assertFalse(manager.tokenForRenderingCalled());
    assertTrue(manager.schemeCalled());
    assertTrue(manager.addExtrasCalled());
  }

  @Test
  public void typeUrlDefaultOptionsTpl() throws Exception {
    String gadgetSite = "http://example.com/gadget";
    String prefKey = "prefKey";
    String prefVal = "prefVal";
    Map<String, String> prefs = Maps.newHashMap();
    prefs.put(prefKey, prefVal);
    List<String> features = Lists.newArrayList();

    // Make the gadget.
    Gadget gadget = mockGadget(
        gadgetSite,
        true,   // type=url
        true,   // isDebug
        true,   // ignoreCache
        true,   // sanitize
        false,  // cajoled
        prefs,  // spec-contained prefs
        prefs,  // prefs supplied by the requester, same k/v as spec w/ default val for simplicity
        false,  // no pref substitution needed, ergo prefs in fragment
        features);

    // Generate a default-option manager
    TestDefaultIframeUriManager managerTpl = makeManager(
        false,   // security token beacon not required
        false)// locked domain not required
    managerTpl.setTemplatingSignal(tplSignal(true));

    // Generate URI, turn into UriBuilder for validation
    Uri resultTpl = managerTpl.makeRenderingUri(gadget);
    assertNotNull(resultTpl);

    UriBuilder uriTpl = new UriBuilder(resultTpl);
    assertEquals("http", uriTpl.getScheme());
    assertEquals("example.com", uriTpl.getAuthority());
    assertEquals("/gadget", uriTpl.getPath());
    assertEquals(CONTAINER, uriTpl.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals("", uriTpl.getQueryParameter(Param.LIBS.getKey()));
    assertEquals(tplKey(Param.VIEW.getKey()), uriTpl.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(tplKey(Param.LANG.getKey()), uriTpl.getQueryParameter(Param.LANG.getKey()));
    assertEquals(tplKey(Param.COUNTRY.getKey()), uriTpl.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals(tplKey(Param.DEBUG.getKey()), uriTpl.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals(tplKey(Param.NO_CACHE.getKey()),
        uriTpl.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals(tplKey("up_" + prefKey), uriTpl.getFragmentParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, uriTpl.getQueryParameters().size());
    assertEquals(1, uriTpl.getFragmentParameters().size());

    assertFalse(managerTpl.tokenForRenderingCalled());
    assertFalse(managerTpl.schemeCalled());
    assertTrue(managerTpl.addExtrasCalled());

    Map<String, Uri> uris = managerTpl.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals("http", urlGadgetUri.getScheme());
    assertEquals("example.com", urlGadgetUri.getAuthority());
    assertEquals("/gadget", urlGadgetUri.getPath());
    assertEquals(CONTAINER, urlGadgetUri.getQueryParameter(Param.CONTAINER.getKey()));
    assertEquals("", urlGadgetUri.getQueryParameter(Param.LIBS.getKey()));
    assertEquals(tplKey(Param.VIEW.getKey()), urlGadgetUri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(tplKey(Param.LANG.getKey()), urlGadgetUri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(tplKey(Param.COUNTRY.getKey()), urlGadgetUri.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals(tplKey(Param.DEBUG.getKey()), urlGadgetUri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals(tplKey(Param.NO_CACHE.getKey()),
            urlGadgetUri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals(tplKey("up_" + prefKey), urlGadgetUri.getFragmentParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, urlGadgetUri.getQueryParameters().size());
    assertEquals(1, urlGadgetUri.getFragmentParameters().size());

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals("", htmlGadgetUri.getScheme());
    assertEquals(UNLOCKED_DOMAIN, htmlGadgetUri.getAuthority());
    assertEquals(IFRAME_PATH, htmlGadgetUri.getPath());
    assertEquals(CONTAINER, htmlGadgetUri.getQueryParameter(Param.CONTAINER.getKey()));
    assertNull(htmlGadgetUri.getQueryParameter(Param.LIBS.getKey()));
    assertEquals(tplKey(Param.VIEW.getKey()), htmlGadgetUri.getQueryParameter(Param.VIEW.getKey()));
    assertEquals(tplKey(Param.LANG.getKey()), htmlGadgetUri.getQueryParameter(Param.LANG.getKey()));
    assertEquals(tplKey(Param.COUNTRY.getKey()), htmlGadgetUri.getQueryParameter(Param.COUNTRY.getKey()));
    assertEquals(tplKey(Param.DEBUG.getKey()), htmlGadgetUri.getQueryParameter(Param.DEBUG.getKey()));
    assertEquals(tplKey(Param.NO_CACHE.getKey()),
            htmlGadgetUri.getQueryParameter(Param.NO_CACHE.getKey()));
    assertEquals(tplKey("up_" + prefKey), htmlGadgetUri.getQueryParameter("up_" + prefKey));

    // Only the params that are needed.
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 1, htmlGadgetUri.getQueryParameters().size());
    assertEquals(0, htmlGadgetUri.getFragmentParameters().size());

    assertFalse(managerTpl.tokenForRenderingCalled());
    assertTrue(managerTpl.schemeCalled());
    assertTrue(managerTpl.addExtrasCalled());
  }

  @Test
  public void securityTokenAddedWhenGadgetNeedsItFragment() throws Exception {
    Gadget gadget = mockGadget(SECURITY_TOKEN_FEATURE_NAME);
    TestDefaultIframeUriManager manager = makeManager(false, false);
    manager.setTokenForRendering(false);
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);
    UriBuilder uri = new UriBuilder(result);
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, uri.getQueryParameters().size());
    assertEquals(1, uri.getFragmentParameters().size());
    assertEquals(tplKey(Param.SECURITY_TOKEN.getKey()),
        uri.getFragmentParameter(Param.SECURITY_TOKEN.getKey()));
    assertTrue(manager.tokenForRenderingCalled());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, htmlGadgetUri.getQueryParameters().size());
    assertEquals(1, htmlGadgetUri.getFragmentParameters().size());
    assertEquals(tplKey(Param.SECURITY_TOKEN.getKey()),
            htmlGadgetUri.getFragmentParameter(Param.SECURITY_TOKEN.getKey()));

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, urlGadgetUri.getQueryParameters().size());
    assertEquals(1, urlGadgetUri.getFragmentParameters().size());
    assertEquals(tplKey(Param.SECURITY_TOKEN.getKey()),
            urlGadgetUri.getFragmentParameter(Param.SECURITY_TOKEN.getKey()));

    assertTrue(manager.tokenForRenderingCalled());
  }

  @Test
  public void securityTokenAddedWhenGadgetNeedsItQuery() throws Exception {
    Gadget gadget = mockGadget(SECURITY_TOKEN_FEATURE_NAME);
    TestDefaultIframeUriManager manager = makeManager(false, false);
    manager.setTokenForRendering(true);
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);
    UriBuilder uri = new UriBuilder(result);
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 1, uri.getQueryParameters().size());
    assertEquals(0, uri.getFragmentParameters().size());
    assertEquals(tplKey(Param.SECURITY_TOKEN.getKey()),
        uri.getQueryParameter(Param.SECURITY_TOKEN.getKey()));
    assertTrue(manager.tokenForRenderingCalled());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 1, htmlGadgetUri.getQueryParameters().size());
    assertEquals(0, htmlGadgetUri.getFragmentParameters().size());
    assertEquals(tplKey(Param.SECURITY_TOKEN.getKey()),
            htmlGadgetUri.getQueryParameter(Param.SECURITY_TOKEN.getKey()));

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals(TYPE_URL_NUM_BASE_PARAMS + 1, urlGadgetUri.getQueryParameters().size());
    assertEquals(0, urlGadgetUri.getFragmentParameters().size());
    assertEquals(tplKey(Param.SECURITY_TOKEN.getKey()),
            urlGadgetUri.getQueryParameter(Param.SECURITY_TOKEN.getKey()));

    assertTrue(manager.tokenForRenderingCalled());
  }

  @Test
  public void securityTokenAddedWhenForced() throws Exception {
    Gadget gadget = mockGadget("foo", "bar");
    TestDefaultIframeUriManager manager = makeManager(true, false)// security token forced
    manager.setTokenForRendering(false);
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);
    UriBuilder uri = new UriBuilder(result);
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, uri.getQueryParameters().size());
    assertEquals(1, uri.getFragmentParameters().size());
    assertEquals(tplKey(Param.SECURITY_TOKEN.getKey()),
        uri.getFragmentParameter(Param.SECURITY_TOKEN.getKey()));
    assertTrue(manager.tokenForRenderingCalled());

    manager.setTokenForRendering(false);
    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, htmlGadgetUri.getQueryParameters().size());
    assertEquals(1, htmlGadgetUri.getFragmentParameters().size());
    assertEquals(tplKey(Param.SECURITY_TOKEN.getKey()),
            htmlGadgetUri.getFragmentParameter(Param.SECURITY_TOKEN.getKey()));

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, urlGadgetUri.getQueryParameters().size());
    assertEquals(1, urlGadgetUri.getFragmentParameters().size());
    assertEquals(tplKey(Param.SECURITY_TOKEN.getKey()),
            urlGadgetUri.getFragmentParameter(Param.SECURITY_TOKEN.getKey()));

    assertTrue(manager.tokenForRenderingCalled());

  }

  @Test
  public void ldAddedGadgetRequests() throws Exception {
    Gadget gadget = mockGadget(LOCKED_DOMAIN_FEATURE_NAME);

    TestDefaultIframeUriManager manager = makeManager(
        false,   // security token beacon not required
        false,   // locked domain not (always) required
        true);

    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);

    UriBuilder uri = new UriBuilder(result);
    assertEquals("", uri.getScheme());
    assertEquals(LD_PREFIX + LD_SUFFIX, uri.getAuthority());
    assertEquals(IFRAME_PATH, uri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, uri.getQueryParameters().size());
    assertEquals(0, uri.getFragmentParameters().size());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals("", htmlGadgetUri.getScheme());
    assertEquals(LD_PREFIX + LD_SUFFIX, htmlGadgetUri.getAuthority());
    assertEquals(IFRAME_PATH, htmlGadgetUri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, htmlGadgetUri.getQueryParameters().size());
    assertEquals(0, htmlGadgetUri.getFragmentParameters().size());

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals("http", urlGadgetUri.getScheme());
    assertEquals("example.com", urlGadgetUri.getAuthority());
    assertEquals("/gadget.xml", urlGadgetUri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, urlGadgetUri.getQueryParameters().size());
    assertEquals(0, urlGadgetUri.getFragmentParameters().size());
  }

  @Test
  public void ldAddedForcedAlways() throws Exception {
    Gadget gadget = mockGadget();

    TestDefaultIframeUriManager manager = makeManager(
        false,   // security token beacon not required
        true);   // locked domain always required

    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);

    UriBuilder uri = new UriBuilder(result);
    assertEquals("", uri.getScheme());
    assertEquals(LD_PREFIX + LD_SUFFIX, uri.getAuthority());
    assertEquals(IFRAME_PATH, uri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, uri.getQueryParameters().size());
    assertEquals(0, uri.getFragmentParameters().size());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals("", htmlGadgetUri.getScheme());
    assertEquals(LD_PREFIX + LD_SUFFIX, htmlGadgetUri.getAuthority());
    assertEquals(IFRAME_PATH, htmlGadgetUri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, htmlGadgetUri.getQueryParameters().size());
    assertEquals(0, htmlGadgetUri.getFragmentParameters().size());

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals("http", urlGadgetUri.getScheme());
    assertEquals("example.com", urlGadgetUri.getAuthority());
    assertEquals("/gadget.xml", urlGadgetUri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, urlGadgetUri.getQueryParameters().size());
    assertEquals(0, urlGadgetUri.getFragmentParameters().size());
  }

  @Test
  public void ldNotAddedIfDisabled() throws Exception {
    Gadget gadget = mockGadget(LOCKED_DOMAIN_FEATURE_NAME);

    TestDefaultIframeUriManager manager = makeManager(
        false,   // security token beacon not required
        false);   // locked domain always required

    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);

    UriBuilder uri = new UriBuilder(result);
    assertEquals("", uri.getScheme());
    assertEquals(UNLOCKED_DOMAIN, uri.getAuthority());
    assertEquals(IFRAME_PATH, uri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, uri.getQueryParameters().size());
    assertEquals(0, uri.getFragmentParameters().size());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals("", htmlGadgetUri.getScheme());
    assertEquals(UNLOCKED_DOMAIN, htmlGadgetUri.getAuthority());
    assertEquals(IFRAME_PATH, htmlGadgetUri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, htmlGadgetUri.getQueryParameters().size());
    assertEquals(0, htmlGadgetUri.getFragmentParameters().size());

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals("http", urlGadgetUri.getScheme());
    assertEquals("example.com", urlGadgetUri.getAuthority());
    assertEquals("/gadget.xml", urlGadgetUri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, urlGadgetUri.getQueryParameters().size());
    assertEquals(0, urlGadgetUri.getFragmentParameters().size());
  }

  @Test
  public void versionAddedWithVersioner() throws Exception {
    String version = "abcdlkjwef";
    Gadget gadget = mockGadget();
    TestDefaultIframeUriManager manager = makeManager(false, false);
    manager.setVersioner(this.mockVersioner(version, true));
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);
    UriBuilder uri = new UriBuilder(result);
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 1, uri.getQueryParameters().size());
    assertEquals(version, uri.getQueryParameter(Param.VERSION.getKey()));

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 1, htmlGadgetUri.getQueryParameters().size());
    assertEquals(version, htmlGadgetUri.getQueryParameter(Param.VERSION.getKey()));

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals(TYPE_URL_NUM_BASE_PARAMS + 1, urlGadgetUri.getQueryParameters().size());
    assertEquals(version, urlGadgetUri.getQueryParameter(Param.VERSION.getKey()));
  }

  @Test
  public void userPrefsAddedQuery() throws Exception {
    // Scenario exercises all prefs cases: overridden/known key, unknown key, missing key
    Map<String, String> specPrefs = Maps.newHashMap();
    specPrefs.put("specKey1", "specDefault1");
    specPrefs.put("specKey2", "specDefault2");
    Map<String, String> inPrefs = Maps.newHashMap();
    inPrefs.put("specKey1", "inVal1");
    inPrefs.put("otherKey1", "inVal2");

    Gadget gadget = mockGadget(true, specPrefs, inPrefs);
    TestDefaultIframeUriManager manager = makeManager(false, false);
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);
    UriBuilder uri = new UriBuilder(result);

    // otherKey1/inVal2 pair ignored; not known by the gadget
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 2, uri.getQueryParameters().size());
    assertEquals(0, uri.getFragmentParameters().size());
    assertEquals("inVal1", uri.getQueryParameter("up_specKey1"));
    assertEquals("specDefault2", uri.getQueryParameter("up_specKey2"));

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS + 2, htmlGadgetUri.getQueryParameters().size());
    assertEquals(0, htmlGadgetUri.getFragmentParameters().size());
    assertEquals("inVal1", htmlGadgetUri.getQueryParameter("up_specKey1"));
    assertEquals("specDefault2", htmlGadgetUri.getQueryParameter("up_specKey2"));

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, urlGadgetUri.getQueryParameters().size());
    assertEquals(2, urlGadgetUri.getFragmentParameters().size());
    assertEquals("inVal1", urlGadgetUri.getFragmentParameter("up_specKey1"));
    assertEquals("specDefault2", urlGadgetUri.getFragmentParameter("up_specKey2"));
  }

  @Test
  public void userPrefsAddedFragment() throws Exception {
    // Scenario exercises all prefs cases: overridden/known key, unknown key, missing key
    Map<String, String> specPrefs = Maps.newHashMap();
    specPrefs.put("specKey1", "specDefault1");
    specPrefs.put("specKey2", "specDefault2");
    Map<String, String> inPrefs = Maps.newHashMap();
    inPrefs.put("specKey1", "inVal1");
    inPrefs.put("otherKey1", "inVal2");

    Gadget gadget = mockGadget(false, specPrefs, inPrefs);
    TestDefaultIframeUriManager manager = makeManager(false, false);
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);
    UriBuilder uri = new UriBuilder(result);

    // otherKey1/inVal2 pair ignored; not known by the gadget
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, uri.getQueryParameters().size());
    assertEquals(2, uri.getFragmentParameters().size());
    assertEquals("inVal1", uri.getFragmentParameter("up_specKey1"));
    assertEquals("specDefault2", uri.getFragmentParameter("up_specKey2"));

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, htmlGadgetUri.getQueryParameters().size());
    assertEquals(2, htmlGadgetUri.getFragmentParameters().size());
    assertEquals("inVal1", htmlGadgetUri.getFragmentParameter("up_specKey1"));
    assertEquals("specDefault2", htmlGadgetUri.getFragmentParameter("up_specKey2"));

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals(TYPE_URL_NUM_BASE_PARAMS + 2, urlGadgetUri.getQueryParameters().size());
    assertEquals(0, urlGadgetUri.getFragmentParameters().size());
    assertEquals("inVal1", urlGadgetUri.getQueryParameter("up_specKey1"));
    assertEquals("specDefault2", urlGadgetUri.getQueryParameter("up_specKey2"));
  }

  @Test
  public void honorSchemeOverride() throws Exception {
    String scheme = "file";
    Gadget gadget = mockGadget();
    TestDefaultIframeUriManager manager = makeManager(false, false);
    manager.setScheme(scheme);
    Uri result = manager.makeRenderingUri(gadget);
    assertNotNull(result);
    UriBuilder uri = new UriBuilder(result);
    assertEquals(scheme, uri.getScheme());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);
    assertEquals(scheme, new UriBuilder(uris.get(VIEW)).getScheme());
    assertFalse(scheme.equalsIgnoreCase(new UriBuilder(uris.get(ANOTHER_VIEW)).getScheme()));
  }

  @Test
  public void badUriValidatingUri() throws Exception {
    Uri uri = new UriBuilder().addQueryParameter(Param.URL.getKey(), "^':   bad:").toUri();
    TestDefaultIframeUriManager manager = makeManager(false, false);
    UriStatus status = manager.validateRenderingUri(uri);
    assertEquals(UriStatus.BAD_URI, status);
  }

  @Test
  public void validUnversionedNoVersioner() throws Exception {
    Uri uri = makeValidationTestUri(LD_PREFIX + LD_SUFFIX, "version");
    DefaultIframeUriManager manager = makeManager(false, false);
    assertEquals(UriStatus.VALID_UNVERSIONED, manager.validateRenderingUri(uri));
  }

  @Test
  public void validUnversionedNoVersion() throws Exception {
    Uri uri = makeValidationTestUri(LD_PREFIX + LD_SUFFIX, null);
    DefaultIframeUriManager manager = makeManager(false, false);
    manager.setVersioner(this.mockVersioner("version", false))// Invalid, if present.
    assertEquals(UriStatus.VALID_UNVERSIONED, manager.validateRenderingUri(uri));
  }

  @Test
  public void versionerVersionInvalid() throws Exception {
    Uri uri = makeValidationTestUri(LD_PREFIX + LD_SUFFIX, "in-version");
    DefaultIframeUriManager manager = makeManager(false, false);
    manager.setVersioner(mockVersioner("test-version", false))// Invalid, if present.
    assertEquals(UriStatus.INVALID_VERSION, manager.validateRenderingUri(uri));
  }

  @Test
  public void versionerVersionMatch() throws Exception {
    String version = "abcdefg";
    Uri uri = makeValidationTestUri(LD_PREFIX + LD_SUFFIX, version);
    DefaultIframeUriManager manager = makeManager(false, false);
    manager.setVersioner(mockVersioner(version, true));
    assertEquals(UriStatus.VALID_VERSIONED, manager.validateRenderingUri(uri));
  }

  @Test
  public void containerConfigurationChanges() throws Exception {
    ContainerConfig config = new BasicContainerConfig();
    config
        .newTransaction()
        .addContainer(ImmutableMap
            .<String, Object>builder()
            .put(ContainerConfig.CONTAINER_KEY, ContainerConfig.DEFAULT_CONTAINER)
            .put(LOCKED_DOMAIN_SUFFIX_KEY, LD_SUFFIX)
            .put(IFRAME_BASE_PATH_KEY, IFRAME_PATH)
            .put(LOCKED_DOMAIN_REQUIRED_KEY, true)
            .build())
        .commit();
    LockedDomainService ldService = new HashLockedDomainService(config, true, prefixGen);
    TestDefaultIframeUriManager manager = new TestDefaultIframeUriManager(config, ldService);

    Uri testUri = Uri.parse("http://foobar" + LD_SUFFIX + "/?url=http://example.com");

    config.newTransaction().addContainer(ImmutableMap
        .<String, Object>builder()
        .put(ContainerConfig.CONTAINER_KEY, ContainerConfig.DEFAULT_CONTAINER)
        .put(LOCKED_DOMAIN_SUFFIX_KEY, LD_SUFFIX_ALT)
        .build()).commit();
    assertEquals(UriStatus.VALID_UNVERSIONED, manager.validateRenderingUri(testUri));
  }

  @Test
  public void schemeLessUnlockedDomain() throws Exception {
    Gadget gadget = mockGadget();
    ContainerConfig config = new BasicContainerConfig();
    config
        .newTransaction()
        .addContainer(ImmutableMap.<String, Object>builder()
            .put(ContainerConfig.CONTAINER_KEY, ContainerConfig.DEFAULT_CONTAINER)
            .put(LOCKED_DOMAIN_SUFFIX_KEY, LD_SUFFIX)
            .build())
                .addContainer(ImmutableMap.<String, Object> builder()
                    .put(ContainerConfig.CONTAINER_KEY, CONTAINER)
                    .put(IFRAME_BASE_PATH_KEY, IFRAME_PATH)
                    .put(UNLOCKED_DOMAIN_KEY, UNLOCKED_DOMAIN)
                    .put(DefaultJsUriManager.JS_HOST_PARAM, JS_HOST)
                     .put(DefaultJsUriManager.JS_PATH_PARAM, JS_PATH)
                    .build())
                .commit();

    LockedDomainService ldService = new HashLockedDomainService(config, false, prefixGen);
    TestDefaultIframeUriManager manager = new TestDefaultIframeUriManager(config, ldService);

    Uri renderingUri = manager.makeRenderingUri(gadget);
    assertNotNull(renderingUri);

    UriBuilder uri = new UriBuilder(renderingUri);
    assertEquals("", uri.getScheme());
    assertEquals(UNLOCKED_DOMAIN, uri.getAuthority());
    assertEquals(IFRAME_PATH, uri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, uri.getQueryParameters().size());
    assertEquals(0, uri.getFragmentParameters().size());

    Map<String, Uri> uris = manager.makeAllRenderingUris(gadget);
    assertNotNull(uris);

    UriBuilder htmlGadgetUri = new UriBuilder(uris.get(VIEW));
    assertEquals("", htmlGadgetUri.getScheme());
    assertEquals(UNLOCKED_DOMAIN, htmlGadgetUri.getAuthority());
    assertEquals(IFRAME_PATH, htmlGadgetUri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_HTML_NUM_BASE_PARAMS, htmlGadgetUri.getQueryParameters().size());
    assertEquals(0, htmlGadgetUri.getFragmentParameters().size());

    UriBuilder urlGadgetUri = new UriBuilder(uris.get(ANOTHER_VIEW));
    assertEquals("http", urlGadgetUri.getScheme());
    assertEquals("example.com", urlGadgetUri.getAuthority());
    assertEquals("/gadget.xml", urlGadgetUri.getPath());

    // Basic sanity checks on params
    assertEquals(TYPE_URL_NUM_BASE_PARAMS, urlGadgetUri.getQueryParameters().size());
    assertEquals(0, urlGadgetUri.getFragmentParameters().size());
  }

  private Uri makeValidationTestUri(String domain, String version) {
    UriBuilder uri = new UriBuilder();
    uri.setAuthority(domain);
    uri.setPath(IFRAME_PATH);
    uri.addQueryParameter(Param.URL.getKey(), SPEC_URI.toString());
    uri.addQueryParameter(Param.CONTAINER.getKey(), CONTAINER);
    if (version != null) {
      uri.addQueryParameter(Param.VERSION.getKey(), version);
    }
    return uri.toUri();
  }

  private TestDefaultIframeUriManager makeManager(boolean alwaysToken, boolean ldRequired)
      throws ContainerConfigException {
    return makeManager(alwaysToken, ldRequired, ldRequired ? true: false);
  }
  private TestDefaultIframeUriManager makeManager(boolean alwaysToken, boolean ldRequired, boolean enabled)
      throws ContainerConfigException {
    String altContainer = CONTAINER + "-alt";
    ContainerConfig config = new BasicContainerConfig();
    config
        .newTransaction()
        .addContainer(ImmutableMap
            .<String, Object>builder()
            .put(ContainerConfig.CONTAINER_KEY, ContainerConfig.DEFAULT_CONTAINER)
            .put(LOCKED_DOMAIN_SUFFIX_KEY, LD_SUFFIX)
            .put(DefaultJsUriManager.JS_HOST_PARAM, JS_HOST)
            .put(DefaultJsUriManager.JS_PATH_PARAM, JS_PATH)
            .build())
        .addContainer(ImmutableMap
            .<String, Object>builder()
            .put(ContainerConfig.CONTAINER_KEY, CONTAINER)
            .put(IFRAME_BASE_PATH_KEY, IFRAME_PATH)
            .put(LOCKED_DOMAIN_SUFFIX_KEY, LD_SUFFIX)
            .put(UNLOCKED_DOMAIN_KEY, UNLOCKED_DOMAIN_CONFIG_VALUE)
            .put(SECURITY_TOKEN_ALWAYS_KEY, alwaysToken)
            .put(LOCKED_DOMAIN_REQUIRED_KEY, ldRequired)
            .put(DefaultJsUriManager.JS_HOST_PARAM, JS_HOST)
            .put(DefaultJsUriManager.JS_PATH_PARAM, JS_PATH)
            .build())
        .addContainer(ImmutableMap
            .<String, Object>builder()
            .put(ContainerConfig.CONTAINER_KEY, altContainer)
            .put(ContainerConfig.PARENT_KEY, CONTAINER)
            .put(LOCKED_DOMAIN_SUFFIX_KEY, LD_SUFFIX_ALT)
            .put(DefaultJsUriManager.JS_HOST_PARAM, JS_HOST)
            .put(DefaultJsUriManager.JS_PATH_PARAM, JS_PATH)
            .build())
        .commit();
    LockedDomainService ldService = new HashLockedDomainService(config, enabled, prefixGen);
    return new TestDefaultIframeUriManager(config, ldService);
  }

  private IframeUriManager.Versioner mockVersioner(String version, boolean valid) {
    IframeUriManager.Versioner versioner = createMock(IframeUriManager.Versioner.class);
    expect(versioner.version(isA(Uri.class), isA(String.class))).andReturn(version).anyTimes();
    expect(versioner.validate(isA(Uri.class), isA(String.class), isA(String.class))).andReturn(
        valid ? UriStatus.VALID_VERSIONED : UriStatus.INVALID_VERSION).anyTimes();
    replay(versioner);
    return versioner;
  }

  private DefaultIframeUriManager.TemplatingSignal tplSignal(boolean value) {
    DefaultIframeUriManager.DefaultTemplatingSignal tplSignal =
        new DefaultIframeUriManager.DefaultTemplatingSignal();
    tplSignal.setUseTemplates(value);
    return tplSignal;
  }

  private static final class TestDefaultIframeUriManager extends DefaultIframeUriManager {
    private String scheme = "";
    private boolean schemeCalled = false;
    private boolean tokenForRendering = true;
    private boolean tokenForRenderingCalled = false;
    private boolean addExtrasCalled = false;

    private TestDefaultIframeUriManager(ContainerConfig config, LockedDomainService ldService) {
      super(config, ldService, tokenCodec);
    }

    private TestDefaultIframeUriManager setScheme(String scheme) {
      this.scheme = scheme;
      return this;
    }

    private TestDefaultIframeUriManager setTokenForRendering(boolean tokenForRendering) {
      this.tokenForRendering = tokenForRendering;
      return this;
    }

    @Override
    protected String getScheme(Gadget gadget, String container) {
      this.schemeCalled = true;
      return scheme;
    }

    private boolean schemeCalled() {
      return schemeCalled;
    }

    @Override
    protected boolean isTokenNeededForRendering(Gadget gadget) {
      this.tokenForRenderingCalled = true;
      return tokenForRendering;
    }

    private boolean tokenForRenderingCalled() {
      return tokenForRenderingCalled;
    }

    @Override
    protected void addExtras(UriBuilder uri, Gadget gadget) {
      this.addExtrasCalled = true;
    }

    private boolean addExtrasCalled() {
      return addExtrasCalled;
    }
  }
}
TOP

Related Classes of org.apache.shindig.gadgets.uri.DefaultIframeUriManagerTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.