/*
* 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.servlet;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import org.apache.shindig.auth.SecurityToken;
import org.apache.shindig.auth.SecurityTokenCodec;
import org.apache.shindig.auth.SecurityTokenException;
import org.apache.shindig.common.EasyMockTestCase;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.gadgets.features.FeatureRegistry;
import org.apache.shindig.gadgets.process.ProcessingException;
import org.apache.shindig.protocol.conversion.BeanDelegator;
import org.apache.shindig.protocol.conversion.BeanFilter;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import java.util.List;
import java.util.Map;
public class GadgetHandlerServiceTest extends EasyMockTestCase {
private static final String TOKEN = "<token data>";
private static final String OWNER = "<owner>";
private static final String VIEWER = "<viewer>";
private static final String CONTAINER = "container";
private final BeanDelegator delegator = new BeanDelegator(
GadgetsHandlerService.apiClasses, GadgetsHandlerService.enumConversionMap);
private final FeatureRegistry mockRegistry = mock(FeatureRegistry.class);
private final FakeProcessor processor = new FakeProcessor(mockRegistry);
private final FakeIframeUriManager urlGenerator = new FakeIframeUriManager();
private FakeSecurityTokenCodec tokenCodec;
private GadgetsHandlerService gadgetHandler;
@Before
public void setUp() {
tokenCodec = new FakeSecurityTokenCodec();
gadgetHandler = new GadgetsHandlerService(processor, urlGenerator,
tokenCodec, new BeanFilter());
}
// Next test verify that the API data classes are configured correctly.
// The mapping is done using reflection in runtime, so this test verify mapping is complete
// this test will prevent from not intended change to the API.
// DO NOT REMOVE TEST
@Test
public void testHandlerDataDelegation() throws Exception {
delegator.validate();
}
@Test
public void testGetMetadata() throws Exception {
GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
FakeProcessor.SPEC_URL, CONTAINER, "view",
createTokenData(null, null), ImmutableList.of("*"));
EasyMock.expect(mockRegistry.getFeatures(EasyMock.isA(List.class)))
.andReturn(Lists.newArrayList("auth-refresh"));
replay();
GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
assertEquals(FakeIframeUriManager.DEFAULT_IFRAME_URI.toString(), response.getIframeUrl());
assertEquals(1, response.getViews().size());
assertEquals(FakeProcessor.SPEC_TITLE, response.getModulePrefs().getTitle());
assertEquals(FakeProcessor.LINK_HREF,
response.getModulePrefs().getLinks().get(FakeProcessor.LINK_REL).getHref().toString());
assertEquals(FakeProcessor.LINK_REL,
response.getModulePrefs().getLinks().get(FakeProcessor.LINK_REL).getRel());
assertEquals(1, response.getUserPrefs().size());
assertEquals("up_one", response.getUserPrefs().get("up_one").getDisplayName());
assertEquals(4, response.getUserPrefs().get("up_one").getEnumValues().size());
verify();
}
@Test
public void testGetMetadataOnlyView() throws Exception {
GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
FakeProcessor.SPEC_URL, CONTAINER, null,
createTokenData(null, null), ImmutableList.of("views.*"));
replay();
GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
assertNull(response.getIframeUrl());
assertNull(response.getUserPrefs());
assertNull(response.getModulePrefs());
assertEquals(FakeProcessor.SPEC_URL, response.getUrl());
assertEquals(1, response.getViews().size());
verify();
}
@Test(expected = ProcessingException.class)
public void testGetMetadataNoContainer() throws Exception {
GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
FakeProcessor.SPEC_URL, null, null,
createTokenData(null, null), ImmutableList.of("*"));
replay();
GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
}
@Test(expected = ProcessingException.class)
public void testGetMetadataNoUrl() throws Exception {
GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
null, CONTAINER, null,
createTokenData(null, null), ImmutableList.of("*"));
replay();
GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
}
@Test(expected = ProcessingException.class)
public void testGetMetadataNoFields() throws Exception {
GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
FakeProcessor.SPEC_URL, CONTAINER, null,
createTokenData(null, null), null);
replay();
GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
}
@Test(expected = ProcessingException.class)
public void testGetMetadataBadGadget() throws Exception {
GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
Uri.parse("unknown"), CONTAINER, null,
createTokenData(null, null), null);
replay();
GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
}
@Test
public void testGetMetadataNoToken() throws Exception {
GadgetsHandlerApi.MetadataRequest request = createMetadataRequest(
FakeProcessor.SPEC_URL, CONTAINER, "view", null, ImmutableList.of("*"));
EasyMock.expect(mockRegistry.getFeatures(EasyMock.isA(List.class)))
.andReturn(Lists.newArrayList("auth-refresh"));
replay();
GadgetsHandlerApi.MetadataResponse response = gadgetHandler.getMetadata(request);
assertEquals(FakeIframeUriManager.DEFAULT_IFRAME_URI.toString(), response.getIframeUrl());
verify();
}
@Test
public void testGetToken() throws Exception {
GadgetsHandlerApi.TokenRequest request = createTokenRequest(
FakeProcessor.SPEC_URL, CONTAINER,
createTokenData(OWNER, VIEWER), ImmutableList.of("*"));
replay();
tokenCodec.encodedToken = TOKEN;
GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
assertEquals(TOKEN, response.getToken());
assertEquals(OWNER, tokenCodec.tokenData.getOwnerId());
assertEquals(VIEWER, tokenCodec.tokenData.getViewerId());
assertEquals(CONTAINER, tokenCodec.tokenData.getContainer());
verify();
}
@Test(expected = ProcessingException.class)
public void testGetTokenNoContainer() throws Exception {
GadgetsHandlerApi.TokenRequest request = createTokenRequest(
FakeProcessor.SPEC_URL, null,
createTokenData(OWNER, VIEWER), ImmutableList.of("*"));
replay();
GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
}
@Test(expected = ProcessingException.class)
public void testGetTokenNoUrl() throws Exception {
GadgetsHandlerApi.TokenRequest request = createTokenRequest(
null, CONTAINER,
createTokenData(OWNER, VIEWER), ImmutableList.of("*"));
replay();
GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
}
@Test(expected = ProcessingException.class)
public void testGetTokenNoFields() throws Exception {
GadgetsHandlerApi.TokenRequest request = createTokenRequest(
FakeProcessor.SPEC_URL, CONTAINER,
createTokenData(OWNER, VIEWER), null);
replay();
GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
}
@Test(expected = SecurityTokenException.class)
public void testGetTokenException() throws Exception {
GadgetsHandlerApi.TokenRequest request = createTokenRequest(
FakeProcessor.SPEC_URL, CONTAINER,
createTokenData(OWNER, VIEWER), ImmutableList.of("*"));
replay();
tokenCodec.exc = new SecurityTokenException("bad data");
GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
}
@Test
public void testGetTokenNoToken() throws Exception {
GadgetsHandlerApi.TokenRequest request = createTokenRequest(
FakeProcessor.SPEC_URL, CONTAINER,
null, ImmutableList.of("*"));
replay();
tokenCodec.encodedToken = TOKEN;
GadgetsHandlerApi.TokenResponse response = gadgetHandler.getToken(request);
assertEquals(TOKEN, response.getToken());
assertNull(CONTAINER, tokenCodec.tokenData);
verify();
}
private GadgetsHandlerApi.TokenData createTokenData(String ownerId, String viewerId) {
GadgetsHandlerApi.TokenData token = mock(GadgetsHandlerApi.TokenData.class);
if (ownerId != null) {
EasyMock.expect(token.getOwnerId()).andReturn(ownerId).once();
}
if (viewerId != null) {
EasyMock.expect(token.getViewerId()).andReturn(viewerId).once();
}
return token;
}
private GadgetsHandlerApi.MetadataRequest createMetadataRequest(Uri url, String container,
String view, GadgetsHandlerApi.TokenData token, List<String> fields) {
GadgetsHandlerApi.MetadataRequest request = mock(GadgetsHandlerApi.MetadataRequest.class);
EasyMock.expect(request.getFields()).andReturn(fields).anyTimes();
EasyMock.expect(request.getView()).andReturn(view).once();
EasyMock.expect(request.getUrl()).andReturn(url).anyTimes();
EasyMock.expect(request.getContainer()).andReturn(container).anyTimes();
EasyMock.expect(request.getToken()).andReturn(token).once();
return request;
}
private GadgetsHandlerApi.TokenRequest createTokenRequest(Uri url, String container,
GadgetsHandlerApi.TokenData token, List<String> fields) {
GadgetsHandlerApi.TokenRequest request = mock(GadgetsHandlerApi.TokenRequest.class);
EasyMock.expect(request.getFields()).andReturn(fields).anyTimes();
EasyMock.expect(request.getUrl()).andReturn(url).anyTimes();
EasyMock.expect(request.getContainer()).andReturn(container).anyTimes();
EasyMock.expect(request.getToken()).andReturn(token).once();
return request;
}
private class FakeSecurityTokenCodec implements SecurityTokenCodec {
public SecurityTokenException exc = null;
public SecurityToken tokenData = null;
public String encodedToken = null;
public String encodeToken(SecurityToken token) throws SecurityTokenException {
tokenData = token;
if (exc != null) {
throw exc;
}
return encodedToken;
}
public SecurityToken createToken(Map<String, String> tokenParameters)
throws SecurityTokenException {
if (exc != null) {
throw exc;
}
return tokenData;
}
}
}