blob: 57499e6bd1e7366f18d40c6c83087775ace8c5b9 [file] [log] [blame]
/*
* 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.sling.javax.activation.internal;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.osgi.framework.Bundle;
import org.osgi.framework.FrameworkUtil;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import javax.activation.CommandInfo;
import javax.activation.DataContentHandler;
import javax.activation.DataSource;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.powermock.api.mockito.PowerMockito.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest(FrameworkUtil.class)
public class OsgiMailcapCommandMapTest {
private OsgiMailcapCommandMap mailcapCommandMap;
private String mailCapString = "image/*; xv %s\n"
+ "test/subtype ;; x-java-view=Foo; x-java-edit=Bar";
@Mock
private Bundle bundle;
@Before
public void setup() throws IOException {
bundle = PowerMockito.mock(Bundle.class);
mockStatic(FrameworkUtil.class);
when(FrameworkUtil.getBundle(getClass())).thenReturn(bundle);
mailcapCommandMap = new OsgiMailcapCommandMap();
mailcapCommandMap.addMailcapEntries(new ByteArrayInputStream(mailCapString.getBytes()), bundle);
}
@Test
public void testAddMailcap() {
CommandInfo info = mailcapCommandMap.getCommand("foo/bar", "view");
assertEquals(null, info);
mailcapCommandMap.addMailcap("foo/bar ;; x-java-view=Foo; x-java-edit=Bar");
info = mailcapCommandMap.getCommand("foo/bar", "view");
assertEquals("view", info.getCommandName());
assertEquals("Foo", info.getCommandClass());
info = mailcapCommandMap.getCommand("foo/bar", "edit");
assertEquals("edit", info.getCommandName());
assertEquals("Bar", info.getCommandClass());
// Check previous commands are not deleted
info = mailcapCommandMap.getCommand("test/subtype", "view");
assertEquals("Foo", info.getCommandClass());
}
@Test
public void testAddMailcapEntries() throws IOException {
Bundle bundle2 = Mockito.mock(Bundle.class);
String mailCap = "foo/bar ;; x-java-view=Foo";
mailcapCommandMap.addMailcapEntries(new ByteArrayInputStream(mailCap.getBytes()), bundle2);
//check above command is present along with existing commands
CommandInfo info = mailcapCommandMap.getCommand("foo/bar", "view");
assertEquals("view", info.getCommandName());
assertEquals("Foo", info.getCommandClass());
info = mailcapCommandMap.getCommand("test/subtype", "view");
assertEquals("Foo", info.getCommandClass());
}
@Test
public void testRemoveMailcapEntriesForBundle() throws IOException {
Bundle bundle2 = Mockito.mock(Bundle.class);
String mailCap = "foo/bar ;; x-java-view=Foo";
mailcapCommandMap.addMailcapEntries(new ByteArrayInputStream(mailCap.getBytes()), bundle2);
//check above command is present
CommandInfo info = mailcapCommandMap.getCommand("foo/bar", "view");
assertEquals("view", info.getCommandName());
assertEquals("Foo", info.getCommandClass());
// Remove bundle mailcap entry
mailcapCommandMap.removeMailcapEntriesForBundle(bundle2);
info = mailcapCommandMap.getCommand("foo/bar", "view");
assertEquals(null, info);
}
@Test
public void testGetPreferredCommands() {
mailcapCommandMap.addMailcap("foo/bar ;; x-java-view=Foo");
// fallback entry
mailcapCommandMap.addMailcap("foo/* ;; x-java-fallback-entry=true; x-java-view=FBFoo; x-java-edit=Bar");
CommandInfo[] preferredCommands = mailcapCommandMap.getPreferredCommands("foo/bar");
assertEquals(2, preferredCommands.length);
assertEquals("view", preferredCommands[0].getCommandName());
assertEquals("Foo", preferredCommands[0].getCommandClass());
// command from fallback entry
assertEquals("edit", preferredCommands[1].getCommandName());
assertEquals("Bar", preferredCommands[1].getCommandClass());
}
@Test
public void testGetAllCommands() {
mailcapCommandMap.addMailcap("foo/bar ;; x-java-view=Foo");
// fallback entry
mailcapCommandMap.addMailcap("foo/* ;; x-java-fallback-entry=true; x-java-view=FBFoo; x-java-edit=Bar");
CommandInfo[] commands = mailcapCommandMap.getAllCommands("foo/bar");
assertEquals(3, commands.length);
assertEquals("view", commands[0].getCommandName());
assertEquals("Foo", commands[0].getCommandClass());
// command from fallback entry
assertEquals("view", commands[1].getCommandName());
assertEquals("FBFoo", commands[1].getCommandClass());
assertEquals("edit", commands[2].getCommandName());
assertEquals("Bar", commands[2].getCommandClass());
}
@Test
public void testGetCommand() {
mailcapCommandMap.addMailcap("foo/bar ;; x-java-view=Foo");
// fallback entry
mailcapCommandMap.addMailcap("foo/* ;; x-java-fallback-entry=true; x-java-edit=Bar");
CommandInfo info = mailcapCommandMap.getCommand("foo/bar", "view");
assertEquals("view", info.getCommandName());
assertEquals("Foo", info.getCommandClass());
// command from fallback entry
info = mailcapCommandMap.getCommand("foo/bar", "edit");
assertEquals("edit", info.getCommandName());
assertEquals("Bar", info.getCommandClass());
}
@Test
public void testCreateDataContentHandler() throws ClassNotFoundException {
doReturn(MockDataContentHandler.class).when(bundle).loadClass("Foo");
mailcapCommandMap.addMailcap("foo/bar ;; x-java-content-handler=Foo");
DataContentHandler dch = mailcapCommandMap.createDataContentHandler("foo/bar");
assertTrue(dch instanceof MockDataContentHandler);
verify(bundle, times(1)).loadClass("Foo");
}
@Test
public void testGetMimeTypes() {
mailcapCommandMap.addMailcap("foo/bar ;; x-java-view=Foo");
// fallback entry
mailcapCommandMap.addMailcap("foo/* ;; x-java-fallback-entry=true; x-java-edit=Bar");
Set<String> mimeTypes = new HashSet<>(Arrays.asList(mailcapCommandMap.getMimeTypes()));
assertEquals(4, mimeTypes.size());
// newly added mime types
assertTrue(mimeTypes.contains("foo/bar"));
assertTrue(mimeTypes.contains("foo/*"));
// mime types added in setup
assertTrue(mimeTypes.contains("test/subtype"));
assertTrue(mimeTypes.contains("image/*"));
}
@Test
public void testGetNativeCommands() {
mailcapCommandMap.addMailcap("foo/bar; fooNativeCommand %s; x-java-view=Foo");
String[] nativeCommands = mailcapCommandMap.getNativeCommands("foo/bar");
assertEquals(1, nativeCommands.length);
assertEquals("foo/bar; fooNativeCommand %s; x-java-view=Foo", nativeCommands[0]);
nativeCommands = mailcapCommandMap.getNativeCommands("image/*");
assertEquals(1, nativeCommands.length);
assertEquals("image/*; xv %s", nativeCommands[0]);
}
static class MockDataContentHandler implements DataContentHandler {
@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[0];
}
@Override
public Object getTransferData(DataFlavor df, DataSource ds) throws UnsupportedFlavorException, IOException {
return null;
}
@Override
public Object getContent(DataSource ds) throws IOException {
return null;
}
@Override
public void writeTo(Object obj, String mimeType, OutputStream os) throws IOException {
}
}
}