/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2010-2011 Oracle and/or its affiliates. All rights reserved. * * The contents of this file are subject to the terms of either the GNU * General Public License Version 2 only ("GPL") or the Common Development * and Distribution License("CDDL") (collectively, the "License"). You * may not use this file except in compliance with the License. You can * obtain a copy of the License at * http://glassfish.java.net/public/CDDL+GPL_1_1.html * or packager/legal/LICENSE.txt. See the License for the specific * language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each * file and include the License file at packager/legal/LICENSE.txt. * * GPL Classpath Exception: * Oracle designates this particular file as subject to the "Classpath" * exception as provided by Oracle in the GPL Version 2 section of the License * file that accompanied this code. * * Modifications: * If applicable, add the following below the License Header, with the fields * enclosed by brackets [] replaced by your own identifying information: * "Portions Copyright [year] [name of copyright owner]" * * Contributor(s): * If you wish your version of this file to be governed by only the CDDL or * only the GPL Version 2, indicate your decision by adding "[Contributor] * elects to include this software in this distribution under the [CDDL or GPL * Version 2] license." If you don't indicate a single choice of license, a * recipient has the option to distribute your version of this file under * either the CDDL, the GPL Version 2 or to extend the choice of license to * its licensees as provided above. However, if you add GPL Version 2 code * and therefore, elected the GPL Version 2 license, then the option applies * only if the new code is made subject to such option by the copyright * holder. */ package com.sun.jersey.atom.abdera.impl.provider.entity; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory; import com.sun.jersey.api.core.PackagesResourceConfig; import com.sun.jersey.api.core.ResourceConfig; import com.sun.jersey.atom.abdera.ContentHelper; import junit.framework.TestCase; import org.apache.abdera.i18n.iri.IRI; import org.apache.abdera.model.Categories; import org.apache.abdera.model.Category; import org.apache.abdera.model.Collection; import org.apache.abdera.model.Element; import org.apache.abdera.model.Entry; import org.apache.abdera.model.ExtensibleElement; import org.apache.abdera.model.Feed; import org.apache.abdera.model.Link; import org.apache.abdera.model.Person; import org.apache.abdera.model.Service; import org.apache.abdera.model.Workspace; import org.glassfish.grizzly.http.server.HttpServer; import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.Providers; import java.util.List; /** * <p>Unit tests for the <code>jersey-atom2</code> module.</p> */ public class ProvidersTest extends TestCase { public ProvidersTest(String testName) throws Exception { super(testName); } @Override protected void setUp() throws Exception { super.setUp(); ResourceConfig rc = new PackagesResourceConfig("com.sun.jersey.atom.abdera.impl.provider.entity"); System.out.println("Starting grizzly ..."); httpServer = GrizzlyServerFactory.createHttpServer(BASE_URI, rc); ClientConfig config = new DefaultClientConfig(); config.getClasses().add(ContentBeanProvider.class); client = Client.create(config); providers = client.getProviders(); } @Override protected void tearDown() throws Exception { providers = null; client = null; System.out.println("Stopping grizzly ..."); if (httpServer.isStarted()) { httpServer.stop(); } httpServer = null; super.tearDown(); } private Client client = null; private Providers providers = null; private HttpServer httpServer = null; private static final String BASE_URI = "http://localhost:9997/"; private static final String[] CATEGORIES_MEDIA_TYPES_JSON = { "application/atomcat+json", "application/json", }; private static final String[] CATEGORIES_MEDIA_TYPES_XML = { "application/atomcat+xml", "application/xml", "text/xml", }; private static final String[] ENTRY_MEDIA_TYPES_JSON = { "application/atom+json", "application/atom+json;type=entry", "application/json", }; private static final String[] ENTRY_MEDIA_TYPES_XML = { "application/atom+xml", "application/atom+xml;type=entry", "application/xml", "text/xml", }; private static final String[] FEED_MEDIA_TYPES_JSON = { "application/atom+json", "application/atom+json;type=feed", "application/json", }; private static final String[] FEED_MEDIA_TYPES_XML = { "application/atom+xml", "application/atom+xml;type=feed", "application/xml", "text/xml", }; private static final String[] SERVICE_MEDIA_TYPES_JSON = { "application/atomsvc+json", "application/json", }; private static final String[] SERVICE_MEDIA_TYPES_XML = { "application/atomsvc+xml", "application/xml", "text/xml", }; public void testGetCategoriesEntity() { // FIXME - Abdera does not support parsing of JSON representations for Categories instances Categories expected = AtomTestingFactory.createCategories(); for (String mediaType : CATEGORIES_MEDIA_TYPES_XML) { WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("categories").accept(mediaType); Categories actual = builder.get(Categories.class); checkCategories(mediaType, expected, actual); } } public void testGetCategoreisString() { for (String mediaType : CATEGORIES_MEDIA_TYPES_JSON) { // System.out.println("Trying " + mediaType); WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("categories").accept(mediaType); String result = builder.get(String.class); // System.out.println(mediaType + "=" + result); assertTrue("Categories for media type " + mediaType + " is JSON", result.startsWith("{")); } for (String mediaType : CATEGORIES_MEDIA_TYPES_XML) { // System.out.println("Trying " + mediaType); WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("categories").accept(mediaType); String result = builder.get(String.class); // System.out.println(mediaType + "=" + result); assertTrue("Categories for media type " + mediaType + " is XML", result.startsWith("<")); } } public void testGetContent() { WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("content").accept(MediaType.APPLICATION_XML_TYPE); Entry actual = builder.get(Entry.class); assertNotNull(actual); ContentHelper helper = new ContentHelper(providers); ContentBean bean = helper.getContentEntity(actual, MediaType.APPLICATION_XML_TYPE, ContentBean.class); assertNotNull(bean); assertEquals("foo value", bean.getFoo()); assertEquals("bar value", bean.getBar()); } public void testGetEntryEntity() { // FIXME - Abdera does not support parsing of JSON representations for Entry instances Entry expected = AtomTestingFactory.createEntry(); for (String mediaType : ENTRY_MEDIA_TYPES_XML) { WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("entry").accept(mediaType); Entry actual = builder.get(Entry.class); checkEntry(mediaType, expected, actual); } } public void testGetEntryString() { for (String mediaType : ENTRY_MEDIA_TYPES_JSON) { // System.out.println("Trying " + mediaType); WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("entry").accept(mediaType); String result = builder.get(String.class); // System.out.println(mediaType + "=" + result); assertTrue("Entry for media type " + mediaType + " is JSON", result.startsWith("{")); } for (String mediaType : ENTRY_MEDIA_TYPES_XML) { // System.out.println("Trying " + mediaType); WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("entry").accept(mediaType); String result = builder.get(String.class); // System.out.println(mediaType + "=" + result); assertTrue("Entry for media type " + mediaType + " is XML", result.startsWith("<")); } } public void testGetFeedEntity() { // FIXME - Abdera does not support parsing of JSON representations for Feed instances Feed expected = AtomTestingFactory.createFeed(); for (String mediaType : FEED_MEDIA_TYPES_XML) { WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("feed").accept(mediaType); Feed actual = builder.get(Feed.class); checkFeed(mediaType, expected, actual); } } public void testGetFeedString() { for (String mediaType : FEED_MEDIA_TYPES_JSON) { // System.out.println("Trying " + mediaType); WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("feed").accept(mediaType); String result = builder.get(String.class); // System.out.println(mediaType + "=" + result); assertTrue("Feed for media type " + mediaType + " is JSON", result.startsWith("{")); } for (String mediaType : FEED_MEDIA_TYPES_XML) { // System.out.println("Trying " + mediaType); WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("feed").accept(mediaType); String result = builder.get(String.class); // System.out.println(mediaType + "=" + result); assertTrue("Feed for media type " + mediaType + " is XML", result.startsWith("<")); } } public void testGetServiceEntity() { // FIXME - Abdera does not support parsing of JSON representations for Service instances Service expected = AtomTestingFactory.createService(); for (String mediaType : SERVICE_MEDIA_TYPES_XML) { WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("service").accept(mediaType); Service actual = builder.get(Service.class); checkService(mediaType, expected, actual); } } public void testGetServiceString() { for (String mediaType : SERVICE_MEDIA_TYPES_JSON) { // System.out.println("Trying " + mediaType); WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("service").accept(mediaType); String result = builder.get(String.class); // System.out.println(mediaType + "=" + result); assertTrue("Service for media type " + mediaType + " is JSON", result.startsWith("{")); } for (String mediaType : SERVICE_MEDIA_TYPES_XML) { // System.out.println("Trying " + mediaType); WebResource.Builder builder = client.resource(BASE_URI) .path("test").path("service").accept(mediaType); String result = builder.get(String.class); // System.out.println(mediaType + "=" + result); assertTrue("Service for media type " + mediaType + " is XML", result.startsWith("<")); } } private void checkCategories(String environment, Categories expected, Categories actual) { checkExtensibleElement(environment, expected, actual); assertEquals(environment + " categories size", expected.getCategories().size(), actual.getCategories().size()); for (Category category : expected.getCategories()) { Category actualCategory = actual.getCategories(category.getScheme().toString()).get(0); checkCategory(environment + " category scheme " + category.getScheme(), category, actualCategory); } // FIXME } private void checkCategory(String environment, Category expected, Category actual) { checkExtensibleElement(environment, expected, actual); assertEquals(environment + " label", expected.getLabel(), actual.getLabel()); if (expected.getScheme() == null) { assertNull(environment + " scheme is null", actual.getScheme()); } else { assertEquals(environment + " scheme", expected.getScheme().toString(), actual.getScheme().toString()); } assertEquals(environment + " term", expected.getTerm(), actual.getTerm()); } private void checkCollection(String environment, Collection expected, Collection actual) { checkExtensibleElement(environment, expected, actual); assertEquals(environment + " title", expected.getTitle(), actual.getTitle()); assertEquals(environment + " href", expected.getHref(), actual.getHref()); } private void checkElement(String environment, Element expected, Element actual) { // FIXME - add tests for Element } private void checkEntry(String environment, Entry expected, Entry actual) { checkExtensibleElement(environment, expected, actual); assertEquals(environment + " authors size", expected.getAuthors().size(), actual.getAuthors().size()); for (Person author : expected.getAuthors()) { Person actualAuthor = findPerson(actual.getAuthors(), author.getName()); assertNotNull(environment + " author " + author.getName() + " exists", actualAuthor); checkPerson(environment + " author " + author.getName(), author, actualAuthor); } assertEquals(environment + " categories size", expected.getCategories().size(), actual.getCategories().size()); for (Category category : expected.getCategories()) { Category actualCategory = findCategory(actual.getCategories(), category.getTerm()); assertNotNull(environment + " category " + category.getTerm() + " exists", actualCategory); checkCategory(environment + " category " + category.getTerm(), category, actualCategory); } // FIXME - test content, contentMimeType, contentSrc, contentType ??? assertEquals(environment + " contributors size", expected.getContributors().size(), actual.getContributors().size()); for (Person contributor : expected.getContributors()) { Person actualContributor = findPerson(actual.getContributors(), contributor.getName()); assertNotNull(environment + " contributor " + contributor.getName() + " exists", actualContributor); checkPerson(environment + " contributor " + contributor.getName(), contributor, actualContributor); } assertEquals(environment + " id", expected.getId(), actual.getId()); assertEquals(environment + " links size", expected.getLinks().size(), actual.getLinks().size()); for (Link link : expected.getLinks()) { Link actualLink = findLink(actual.getLinks(), link.getRel()); assertNotNull(environment + " link " + link.getRel() + " exists", actualLink); checkLink(environment + " link " + link.getRel(), link, actualLink); } } private void checkExtensibleElement(String environment, ExtensibleElement expected, ExtensibleElement actual) { checkElement(environment, expected, actual); // FIXME - add tests for ExtensibleElement } private void checkFeed(String environment, Feed expected, Feed actual) { checkExtensibleElement(environment, expected, actual); assertEquals(environment + " authors size", expected.getAuthors().size(), actual.getAuthors().size()); for (Person author : expected.getAuthors()) { Person actualAuthor = findPerson(actual.getAuthors(), author.getName()); assertNotNull(environment + " author " + author.getName() + " exists", actualAuthor); checkPerson(environment + " author " + author.getName(), author, actualAuthor); } assertEquals(environment + " categories size", expected.getCategories().size(), actual.getCategories().size()); for (Category category : expected.getCategories()) { Category actualCategory = findCategory(actual.getCategories(), category.getTerm()); assertNotNull(environment + " category " + category.getTerm() + " exists", actualCategory); checkCategory(environment + " category " + category.getTerm(), category, actualCategory); } assertEquals(environment + " contributors size", expected.getContributors().size(), actual.getContributors().size()); for (Person contributor : expected.getContributors()) { Person actualContributor = findPerson(actual.getContributors(), contributor.getName()); assertNotNull(environment + " contributor " + contributor.getName() + " exists", actualContributor); checkPerson(environment + " contributor " + contributor.getName(), contributor, actualContributor); } assertEquals(environment + " entries size", expected.getEntries().size(), actual.getEntries().size()); for (Entry entry : expected.getEntries()) { Entry actualEntry = findEntry(actual.getEntries(), entry.getId()); assertNotNull(environment + " entry " + entry.getId() + " exists", actualEntry); checkEntry(environment + " entry " + entry.getId(), entry, actualEntry); } assertEquals(environment + " id", expected.getId(), actual.getId()); assertEquals(environment + " links size", expected.getLinks().size(), actual.getLinks().size()); for (Link link : expected.getLinks()) { Link actualLink = findLink(actual.getLinks(), link.getRel()); assertNotNull(environment + " link " + link.getRel() + " exists", actualLink); checkLink(environment + " link " + link.getRel(), link, actualLink); } } private void checkLink(String environment, Link expected, Link actual) { checkExtensibleElement(environment, expected, actual); assertEquals(environment + " href", expected.getHref(), actual.getHref()); assertEquals(environment + " hrefLang", expected.getHrefLang(), actual.getHrefLang()); assertEquals(environment + " length", expected.getLength(), actual.getLength()); if (expected.getMimeType() == null) { assertNull(environment + " mimeType does not exist", actual.getMimeType()); } else { assertEquals(environment + " mimeType", expected.getMimeType().toString(), actual.getMimeType().toString()); } assertEquals(environment + " rel", expected.getRel(), actual.getRel()); assertEquals(environment + " title", expected.getTitle(), actual.getTitle()); } private void checkPerson(String environment, Person expected, Person actual) { checkExtensibleElement(environment, expected, actual); assertEquals(environment + " email", expected.getEmail(), actual.getEmail()); assertEquals(environment + " name", expected.getName(), actual.getName()); assertEquals(environment + " IRI", expected.getUri(), actual.getUri()); } private void checkService(String environment, Service expected, Service actual) { checkExtensibleElement(environment, expected, actual); assertEquals(environment + " workspaces size", expected.getWorkspaces().size(), actual.getWorkspaces().size()); for (Workspace workspace : expected.getWorkspaces()) { Workspace actualWorkspace = actual.getWorkspace(workspace.getTitle()); assertNotNull(environment + " workspace " + workspace.getTitle() + " exists", actualWorkspace); checkWorkspace(environment + " workspace " + workspace.getTitle(), workspace, actualWorkspace); } } private void checkWorkspace(String environment, Workspace expected, Workspace actual) { checkExtensibleElement(environment, expected, actual); assertEquals(environment + " title", expected.getTitle(), actual.getTitle()); assertEquals(environment + " collections size", expected.getCollections().size(), actual.getCollections().size()); for (Collection collection : expected.getCollections()) { Collection actualCollection = actual.getCollection(collection.getTitle()); assertNotNull(environment + " collection " + collection.getTitle() + " exists", actualCollection); checkCollection(environment + " collection " + collection.getTitle(), collection, actualCollection); } } private Category findCategory(List<Category> categories, String term) { for (Category category : categories) { if (term.equals(category.getTerm())) { return category; } } return null; } private Entry findEntry(List<Entry> entries, IRI id) { for (Entry entry : entries) { if (id.equals(entry.getId())) { return entry; } } return null; } private Link findLink(List<Link> links, String rel) { for (Link link : links) { if (rel.equals(link.getRel())) { return link; } } return null; } private Person findPerson(List<Person> persons, String name) { for (Person person : persons) { if (name.equals(person.getName())) { return person; } } return null; } }