/******************************************************************************* * Copyright (c) 2008, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VMware Inc. - initial contribution *******************************************************************************/ package org.eclipse.virgo.snaps; import static org.easymock.EasyMock.createMock; import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.ArrayList; import java.util.Dictionary; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import org.eclipse.virgo.snaps.Snap; import org.eclipse.virgo.snaps.SnapsTag; import org.junit.Before; import org.junit.Test; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import org.springframework.mock.web.MockPageContext; import org.eclipse.gemini.web.core.WebContainer; /** * TODO Document SnapsTagTests * <p /> * * <strong>Concurrent Semantics</strong><br /> * * TODO Document concurrent semantics of SnapsTagTests * */ public class SnapsTagTests { private final SnapsTag snapsTag = new SnapsTag(); private final ServletContext servletContext = createMock(ServletContext.class); private final BundleContext bundleContext = createMock(BundleContext.class); private final PageContext pageContext = new MockPageContext(servletContext); @Before public void setup() { snapsTag.setPageContext(pageContext); } @Test public void noSnapsFromServiceRegistry() throws JspException, InvalidSyntaxException { Bundle bundle = createMock(Bundle.class); expect(bundleContext.getBundle()).andReturn(bundle); expect(bundle.getBundleId()).andReturn(5L); expect(bundleContext.getServiceReferences("org.eclipse.virgo.snaps.core.internal.Snap", "(snap.host.id=5)")).andReturn(null); expect(servletContext.getAttribute(WebContainer.ATTRIBUTE_BUNDLE_CONTEXT)).andReturn(bundleContext); replay(servletContext, bundleContext, bundle); snapsTag.doStartTag(); verify(servletContext, bundleContext, bundle); @SuppressWarnings("unchecked") List<Snap> snaps = (List<Snap>)pageContext.getAttribute(SnapsTag.SNAPS_ATTRIBUTE_NAME); assertNotNull(snaps); assertEquals(0, snaps.size()); } @Test public void snapsFromServiceRegistry() throws JspException, InvalidSyntaxException { Dictionary<String, Object> properties1 = new Hashtable<String, Object>(); properties1.put("a", "b"); properties1.put("c", new Integer(6)); ServiceReference<?> serviceReference1 = createServiceReference(properties1); Dictionary<String, Object> properties2 = new Hashtable<String, Object>(); properties2.put("d", "e"); properties2.put("f", Boolean.TRUE); ServiceReference<?> serviceReference2 = createServiceReference(properties2); expect(servletContext.getAttribute(WebContainer.ATTRIBUTE_BUNDLE_CONTEXT)).andReturn(bundleContext); Bundle bundle = createMock(Bundle.class); expect(bundleContext.getBundle()).andReturn(bundle); expect(bundle.getBundleId()).andReturn(27L); expect(bundleContext.getServiceReferences("org.eclipse.virgo.snaps.core.internal.Snap", "(snap.host.id=27)")).andReturn(new ServiceReference[] {serviceReference1, serviceReference2}); expect(serviceReference1.compareTo(serviceReference2)).andReturn(1).anyTimes(); expect(serviceReference2.compareTo(serviceReference1)).andReturn(-1).anyTimes(); replay(servletContext, bundleContext, serviceReference1, serviceReference2, bundle); snapsTag.doStartTag(); verify(servletContext, bundleContext, serviceReference1, serviceReference2, bundle); @SuppressWarnings("unchecked") List<Snap> snaps = (List<Snap>)pageContext.getAttribute(SnapsTag.SNAPS_ATTRIBUTE_NAME); assertNotNull(snaps); assertEquals(2, snaps.size()); Snap snap = snaps.get(1); assertEquals("b", snap.getProperties().get("a")); assertEquals(new Integer(6), snap.getProperties().get("c")); snap = snaps.get(0); assertEquals("e", snap.getProperties().get("d")); assertEquals(Boolean.TRUE, snap.getProperties().get("f")); } private static ServiceReference<?> createServiceReference(Dictionary<?, ?> properties) { ServiceReference<?> serviceReference = createMock(ServiceReference.class); String[] keys = toArray(properties.keys()); expect(serviceReference.getPropertyKeys()).andReturn(keys); for (String key : keys) { expect(serviceReference.getProperty(key)).andReturn(properties.get(key)); } return serviceReference; } private static final String[] toArray(Enumeration<?> enumeration) { List<String> list = new ArrayList<String>(); while(enumeration.hasMoreElements()) { String element = enumeration.nextElement().toString(); list.add(element); } return list.toArray(new String[list.size()]); } }