/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* See LICENSE.txt included in this distribution for the specific
* language governing permissions and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
*/
package org.opensolaris.opengrok.configuration;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.regex.PatternSyntaxException;
import org.apache.tools.ant.filters.StringInputStream;
import org.json.simple.parser.ParseException;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.opensolaris.opengrok.analysis.plain.PlainXref;
import org.opensolaris.opengrok.authorization.AuthorizationPlugin;
import org.opensolaris.opengrok.authorization.AuthorizationStack;
import org.opensolaris.opengrok.configuration.messages.Message;
import org.opensolaris.opengrok.configuration.messages.NormalMessage;
import org.opensolaris.opengrok.history.RepositoryInfo;
import org.opensolaris.opengrok.web.DummyHttpServletRequest;
import org.opensolaris.opengrok.web.Statistics;
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.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/**
* Test the RuntimeEnvironment class
*
* @author Trond Norbye
*/
public class RuntimeEnvironmentTest {
private static File originalConfig;
public RuntimeEnvironmentTest() {
}
@BeforeClass
public static void setUpClass() throws Exception {
// preserve the original
originalConfig = File.createTempFile("config", ".xml");
RuntimeEnvironment.getInstance().writeConfiguration(originalConfig);
}
@AfterClass
public static void tearDownClass() throws Exception {
// restore the configuration
RuntimeEnvironment.getInstance().readConfiguration(originalConfig);
RuntimeEnvironment.getInstance().register();
originalConfig.delete();
}
@Before
public void setUp() throws IOException {
// Create a default configuration
Configuration config = new Configuration();
RuntimeEnvironment.getInstance().setConfiguration(config);
}
@After
public void tearDown() throws IOException {
}
@Test
public void testDataRoot() throws IOException {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertNull(instance.getDataRootFile());
assertNull(instance.getDataRootPath());
File f = File.createTempFile("dataroot", null);
String path = f.getCanonicalPath();
assertTrue(f.delete());
assertFalse(f.exists());
instance.setDataRoot(path);
// setDataRoot() used to create path if it didn't exist, but that
// logic has been moved. Verify that it is so.
assertFalse(f.exists());
assertTrue(f.mkdirs());
assertEquals(path, instance.getDataRootPath());
assertEquals(path, instance.getDataRootFile().getCanonicalPath());
}
@Test
public void testSourceRoot() throws IOException {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertNull(instance.getSourceRootFile());
assertNull(instance.getSourceRootPath());
File f = File.createTempFile("sourceroot", null);
String path = f.getCanonicalPath();
assertTrue(f.delete());
instance.setSourceRoot(path);
assertEquals(path, instance.getSourceRootPath());
assertEquals(path, instance.getSourceRootFile().getCanonicalPath());
}
@Test
public void testProjects() throws IOException {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertFalse(instance.hasProjects());
assertNotNull(instance.getProjects());
assertEquals(0, instance.getProjects().size());
assertNull(instance.getDefaultProjects());
File file = new File("/opengrok_automatic_test/foo/bar");
instance.setSourceRoot("/opengrok_automatic_test/foo");
Project p = new Project("bar");
p.setPath("/bar");
assertEquals("/bar", p.getId());
instance.getProjects().put(p.getName(), p);
assertEquals(p, Project.getProject(file));
instance.setProjects(null);
assertNull(instance.getProjects());
}
@Test
public void testGroups() throws IOException {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertFalse(instance.hasGroups());
assertNotNull(instance.getGroups());
assertEquals(0, instance.getGroups().size());
Group g = new Group();
g.setName("Random");
g.setPattern("xyz.*");
instance.getGroups().add(g);
assertEquals(1, instance.getGroups().size());
assertEquals(g, instance.getGroups().iterator().next());
assertEquals("Random", instance.getGroups().iterator().next().getName());
instance.setGroups(null);
assertNull(instance.getGroups());
}
@Test
public void testRegister() throws InterruptedException, IOException {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
String path = "/tmp/dataroot";
instance.setDataRoot(path);
instance.register();
Thread t = new Thread(new Runnable() {
public void run() {
Configuration c = new Configuration();
RuntimeEnvironment.getInstance().setConfiguration(c);
}
});
t.start();
t.join();
assertEquals(new File(path), new File(instance.getDataRootPath()));
}
@Test
public void testUrlPrefix() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertEquals("/source/s?", instance.getUrlPrefix());
String prefix = "/opengrok/s?";
instance.setUrlPrefix(prefix);
assertEquals(prefix, instance.getUrlPrefix());
}
@Test
public void testCtags() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertEquals("ctags", instance.getCtags());
String path = "/usr/bin/ctags";
instance.setCtags(path);
assertEquals(path, instance.getCtags());
}
@Test
public void testHistoryReaderTimeLimit() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertEquals(30, instance.getHistoryReaderTimeLimit());
instance.setHistoryReaderTimeLimit(50);
assertEquals(50, instance.getHistoryReaderTimeLimit());
}
@Test
public void testFetchHistoryWhenNotInCache() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertEquals(true, instance.isFetchHistoryWhenNotInCache());
instance.setFetchHistoryWhenNotInCache(false);
assertEquals(false, instance.isFetchHistoryWhenNotInCache());
}
@Test
public void testUseHistoryCache() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertEquals(true, instance.useHistoryCache());
instance.setUseHistoryCache(false);
assertEquals(false, instance.useHistoryCache());
}
@Test
public void testGenerateHtml() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertTrue(instance.isGenerateHtml());
instance.setGenerateHtml(false);
assertFalse(instance.isGenerateHtml());
}
@Test
public void testCompressXref() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertTrue(instance.isCompressXref());
instance.setCompressXref(false);
assertFalse(instance.isCompressXref());
}
@Test
public void testQuickContextScan() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertTrue(instance.isQuickContextScan());
instance.setQuickContextScan(false);
assertFalse(instance.isQuickContextScan());
}
@Test
public void testRepositories() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertNotNull(instance.getRepositories());
instance.setRepositories(null);
assertNull(instance.getRepositories());
List<RepositoryInfo> reps = new ArrayList<>();
instance.setRepositories(reps);
assertSame(reps, instance.getRepositories());
}
@Test
public void testRamBufferSize() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertEquals(16, instance.getRamBufferSize(), 0); //default is 16
instance.setRamBufferSize(256);
assertEquals(256, instance.getRamBufferSize(), 0);
}
@Test
public void testVerbose() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertFalse(instance.isVerbose());
instance.setVerbose(true);
assertTrue(instance.isVerbose());
}
@Test
public void testAllowLeadingWildcard() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertFalse(instance.isAllowLeadingWildcard());
instance.setAllowLeadingWildcard(true);
assertTrue(instance.isAllowLeadingWildcard());
}
@Test
public void testIgnoredNames() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertNotNull(instance.getIgnoredNames());
instance.setIgnoredNames(null);
assertNull(instance.getIgnoredNames());
}
@Test
public void testUserPage() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
String page = "http://www.myserver.org/viewProfile.jspa?username=";
assertEquals(page, instance.getUserPage());
instance.setUserPage(page.substring(5));
assertEquals(page.substring(5), instance.getUserPage());
}
@Test
public void testBugPage() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
String page = "http://bugs.myserver.org/bugdatabase/view_bug.do?bug_id=";
assertEquals(page, instance.getBugPage());
instance.setBugPage(page.substring(5));
assertEquals(page.substring(5), instance.getBugPage());
}
@Test
public void testBugPattern() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
String[] tests = new String[]{
"\\b([12456789][0-9]{6})\\b",
"\\b(#\\d+)\\b",
"(BUG123)",
"\\sbug=(\\d+[a-t])*(\\W*)"
};
for (String test : tests) {
try {
instance.setBugPattern(test);
assertEquals(test, instance.getBugPattern());
} catch (PatternSyntaxException ex) {
fail("The pattern '" + test + "' should not throw an exception");
}
}
}
@Test
public void testInvalidBugPattern() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
String[] tests = new String[]{
"\\b([",
"\\b({,6})\\b",
"\\b6)\\b",
"*buggy",
"BUG123", // does not contain a group
"\\b[a-z]+\\b" // does not contain a group
};
for (String test : tests) {
try {
instance.setBugPattern(test);
fail("The pattern '" + test + "' should throw an exception");
} catch (PatternSyntaxException ex) {
}
}
}
@Test
public void testReviewPage() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
String page = "http://arc.myserver.org/caselog/PSARC/";
assertEquals(page, instance.getReviewPage());
instance.setReviewPage(page.substring(5));
assertEquals(page.substring(5), instance.getReviewPage());
}
@Test
public void testReviewPattern() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
String[] tests = new String[]{
"\\b(\\d{4}/\\d{3})\\b",
"\\b(#PSARC\\d+)\\b",
"(REVIEW 123)",
"\\sreview=(\\d+[a-t])*(\\W*)"
};
for (String test : tests) {
try {
instance.setBugPattern(test);
assertEquals(test, instance.getBugPattern());
} catch (PatternSyntaxException ex) {
fail("The pattern '" + test + "' should not throw an exception");
}
}
}
@Test
public void testInvalidReviewPattern() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
String[] tests = new String[]{
"\\b([",
"\\b({,6})\\b",
"\\b6)\\b",
"*reviewy",
"REVIEW 123", // does not contain a group
"\\b[a-z]+\\b" // does not contain a group
};
for (String test : tests) {
try {
instance.setBugPattern(test);
fail("The pattern '" + test + "' should throw an exception");
} catch (PatternSyntaxException ex) {
}
}
}
@Test
public void testWebappLAF() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertEquals("default", instance.getWebappLAF());
instance.setWebappLAF("foo");
assertEquals("foo", instance.getWebappLAF());
}
@Test
public void testRemoteScmSupported() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertEquals(Configuration.RemoteSCM.OFF, instance.getRemoteScmSupported());
instance.setRemoteScmSupported(Configuration.RemoteSCM.ON);
assertEquals(Configuration.RemoteSCM.ON, instance.getRemoteScmSupported());
instance.setRemoteScmSupported(Configuration.RemoteSCM.DIRBASED);
assertEquals(Configuration.RemoteSCM.DIRBASED, instance.getRemoteScmSupported());
instance.setRemoteScmSupported(Configuration.RemoteSCM.UIONLY);
assertEquals(Configuration.RemoteSCM.UIONLY, instance.getRemoteScmSupported());
}
@Test
public void testOptimizeDatabase() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertTrue(instance.isOptimizeDatabase());
instance.setOptimizeDatabase(false);
assertFalse(instance.isOptimizeDatabase());
}
@Test
public void testUsingLuceneLocking() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertFalse(instance.isUsingLuceneLocking());
instance.setUsingLuceneLocking(true);
assertTrue(instance.isUsingLuceneLocking());
}
@Test
public void testIndexVersionedFilesOnly() {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
assertFalse(instance.isIndexVersionedFilesOnly());
instance.setIndexVersionedFilesOnly(true);
assertTrue(instance.isIndexVersionedFilesOnly());
}
@Test
public void testConfigListenerThread() throws IOException {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
SocketAddress addr = new InetSocketAddress(0);
assertTrue(instance.startConfigurationListenerThread(addr));
try {
Thread.sleep(1000);
} catch (InterruptedException exp) {
// do nothing
}
instance.writeConfiguration();
instance.stopConfigurationListenerThread();
}
@Test
public void testXMLencdec() throws IOException {
Configuration c = new Configuration();
String m = c.getXMLRepresentationAsString();
Configuration o = Configuration.makeXMLStringAsConfiguration(m);
assertNotNull(o);
m = m.replace('a', 'm');
try {
o = Configuration.makeXMLStringAsConfiguration(m);
fail("makeXmlStringsAsConfiguration should throw exception");
} catch (Throwable t) {
}
}
@Test
public void testAuthorizationFlagDecode() throws IOException {
String confString = "<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<java class=\"java.beans.XMLDecoder\" version=\"1.8.0_121\">\n"
+ " <object class=\"org.opensolaris.opengrok.configuration.Configuration\">\n"
+ " <void property=\"pluginStack\">\n"
+ " <void method=\"add\">\n"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>sufficient</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>Plugin</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>\n"
+ " <void method=\"add\">\n"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>required</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>OtherPlugin</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>\n"
+ " <void method=\"add\">\n"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>REQUISITE</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>AnotherPlugin</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>\n"
+ " <void method=\"add\">\n"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>reQuIrEd</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>DifferentPlugin</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>\n"
+ " </void>\n"
+ " </object>\n"
+ "</java>";
Configuration conf = Configuration.makeXMLStringAsConfiguration(confString);
assertNotNull(conf.getPluginStack());
AuthorizationStack pluginConfiguration = conf.getPluginStack();
assertEquals(4, pluginConfiguration.getStack().size());
assertTrue(pluginConfiguration.getStack().get(0).getFlag().isSufficient());
assertEquals("Plugin", pluginConfiguration.getStack().get(0).getName());
assertTrue(pluginConfiguration.getStack().get(1).getFlag().isRequired());
assertEquals("OtherPlugin", pluginConfiguration.getStack().get(1).getName());
assertTrue(pluginConfiguration.getStack().get(2).getFlag().isRequisite());
assertEquals("AnotherPlugin", pluginConfiguration.getStack().get(2).getName());
assertTrue(pluginConfiguration.getStack().get(3).getFlag().isRequired());
assertEquals("DifferentPlugin", pluginConfiguration.getStack().get(3).getName());
}
@Test
public void testAuthorizationStackDecode() throws IOException {
String confString = "<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<java class=\"java.beans.XMLDecoder\" version=\"1.8.0_121\">\n"
+ " <object class=\"org.opensolaris.opengrok.configuration.Configuration\">\n"
+ " <void property=\"pluginStack\">\n"
+ " <void method=\"add\">\n"
+ " <object id=\"first_plugin\" class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>sufficient</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>Plugin</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>\n"
+ " <void method=\"add\">\n"
+ " <object id=\"first_stack\" class=\"org.opensolaris.opengrok.authorization.AuthorizationStack\">\n"
+ " <void property=\"flag\">\n"
+ " <string>required</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>basic stack</string>\n"
+ " </void>\n"
+ " <void property=\"stack\">"
+ " <void method=\"add\">"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>required</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>NestedPlugin</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>"
+ " <void method=\"add\">"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>requisite</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>NestedPlugin</string>\n"
+ " </void>\n"
+ " <void property=\"setup\">"
+ " <void method=\"put\">"
+ " <string>key</string>"
+ " <string>value</string>"
+ " </void>"
+ " <void method=\"put\">"
+ " <string>plugin</string>"
+ " <object idref=\"first_plugin\" />"
+ " </void>"
+ " </void>"
+ " </object>\n"
+ " </void>"
+ " </void>"
+ " </object>\n"
+ " </void>\n"
+ " <void method=\"add\">\n"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>requisite</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>Requisite</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>\n"
+ " <void method=\"add\">\n"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationStack\">\n"
+ " <void property=\"flag\">\n"
+ " <string>required</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>advanced stack</string>\n"
+ " </void>\n"
+ " <void property=\"stack\">"
+ " <void method=\"add\">"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>required</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>NestedPlugin</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>"
+ " <void method=\"add\">"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>requisite</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>NestedPlugin</string>\n"
+ " </void>\n"
+ " <void property=\"setup\">"
+ " <void method=\"put\">"
+ " <string>key</string>"
+ " <string>other value</string>"
+ " </void>"
+ " <void method=\"put\">"
+ " <string>plugin</string>"
+ " <object idref=\"first_plugin\" />"
+ " </void>"
+ " </void>"
+ " </object>\n"
+ " </void>"
+ " </void>"
+ " </object>\n"
+ " </void>\n"
+ " <void method=\"add\">\n"
+ " <object idref=\"first_stack\" />"
+ " </void>\n"
+ " </void>\n"
+ " </object>\n"
+ "</java>";
Configuration conf = Configuration.makeXMLStringAsConfiguration(confString);
assertNotNull(conf.getPluginStack());
AuthorizationStack pluginConfiguration = conf.getPluginStack();
assertEquals(5, pluginConfiguration.getStack().size());
// single plugins
assertTrue(pluginConfiguration.getStack().get(0).getFlag().isSufficient());
assertEquals("Plugin", pluginConfiguration.getStack().get(0).getName());
assertTrue(pluginConfiguration.getStack().get(2).getFlag().isRequisite());
assertEquals("Requisite", pluginConfiguration.getStack().get(2).getName());
/**
* Third element is a stack which defines two nested plugins.
*/
assertTrue(pluginConfiguration.getStack().get(1) instanceof AuthorizationStack);
AuthorizationStack stack = (AuthorizationStack) pluginConfiguration.getStack().get(1);
assertTrue(stack.getFlag().isRequired());
assertEquals("basic stack", stack.getName());
assertEquals(2, stack.getStack().size());
assertTrue(stack.getStack().get(0) instanceof AuthorizationPlugin);
assertEquals("NestedPlugin", stack.getStack().get(0).getName());
assertTrue(stack.getStack().get(0).isRequired());
assertTrue(stack.getStack().get(1) instanceof AuthorizationPlugin);
assertEquals("NestedPlugin", stack.getStack().get(1).getName());
assertTrue(stack.getStack().get(1).isRequisite());
AuthorizationPlugin plugin = (AuthorizationPlugin) stack.getStack().get(1);
assertTrue(plugin.getSetup().containsKey("key"));
assertEquals("value", plugin.getSetup().get("key"));
assertTrue(plugin.getSetup().containsKey("plugin"));
assertTrue(plugin.getSetup().get("plugin") instanceof AuthorizationPlugin);
assertEquals(pluginConfiguration.getStack().get(0), plugin.getSetup().get("plugin"));
/**
* Fourth element is a stack slightly changed from the previous stack.
* Only the setup for the particular plugin is changed.
*/
assertTrue(pluginConfiguration.getStack().get(3) instanceof AuthorizationStack);
stack = (AuthorizationStack) pluginConfiguration.getStack().get(3);
assertTrue(stack.getFlag().isRequired());
assertEquals("advanced stack", stack.getName());
assertEquals(2, stack.getStack().size());
assertTrue(stack.getStack().get(0) instanceof AuthorizationPlugin);
assertEquals("NestedPlugin", stack.getStack().get(0).getName());
assertTrue(stack.getStack().get(0).isRequired());
assertTrue(stack.getStack().get(1) instanceof AuthorizationPlugin);
assertEquals("NestedPlugin", stack.getStack().get(1).getName());
assertTrue(stack.getStack().get(1).isRequisite());
plugin = (AuthorizationPlugin) stack.getStack().get(1);
assertTrue(plugin.getSetup().containsKey("key"));
assertEquals("other value", plugin.getSetup().get("key"));
assertTrue(plugin.getSetup().containsKey("plugin"));
assertTrue(plugin.getSetup().get("plugin") instanceof AuthorizationPlugin);
assertEquals(pluginConfiguration.getStack().get(0), plugin.getSetup().get("plugin"));
/**
* Fifth element is a direct copy of the first stack.
*/
assertTrue(pluginConfiguration.getStack().get(4) instanceof AuthorizationStack);
stack = (AuthorizationStack) pluginConfiguration.getStack().get(4);
assertTrue(stack.getFlag().isRequired());
assertEquals("basic stack", stack.getName());
assertEquals(2, stack.getStack().size());
assertTrue(stack.getStack().get(0) instanceof AuthorizationPlugin);
assertEquals("NestedPlugin", stack.getStack().get(0).getName());
assertTrue(stack.getStack().get(0).isRequired());
assertTrue(stack.getStack().get(1) instanceof AuthorizationPlugin);
assertEquals("NestedPlugin", stack.getStack().get(1).getName());
assertTrue(stack.getStack().get(1).isRequisite());
plugin = (AuthorizationPlugin) stack.getStack().get(1);
assertTrue(plugin.getSetup().containsKey("key"));
assertEquals("value", plugin.getSetup().get("key"));
assertTrue(plugin.getSetup().containsKey("plugin"));
assertTrue(plugin.getSetup().get("plugin") instanceof AuthorizationPlugin);
assertEquals(pluginConfiguration.getStack().get(0), plugin.getSetup().get("plugin"));
}
/**
* Testing invalid flag property.
*
* @throws IOException
*/
@Test(expected = IOException.class)
public void testAuthorizationFlagDecodeInvalid() throws IOException {
String confString = "<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<java class=\"java.beans.XMLDecoder\" version=\"1.8.0_121\">\n"
+ " <object class=\"org.opensolaris.opengrok.configuration.Configuration\">\n"
+ " <void property=\"pluginStack\">\n"
+ " <void method=\"add\">\n"
+ " <object class=\"org.opensolaris.opengrok.authorization.AuthorizationPlugin\">\n"
+ " <void property=\"flag\">\n"
+ " <string>noflag</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>Plugin</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>\n"
+ " </void>\n"
+ " </object>\n"
+ "</java>";
Configuration.makeXMLStringAsConfiguration(confString);
}
/**
* Testing invalid class names for authorization checks.
*
* @throws IOException
*/
@Test(expected = IOException.class)
public void testAuthorizationDecodeInvalid() throws IOException {
String confString = "<?xml version='1.0' encoding='UTF-8'?>\n"
+ "<java class=\"java.beans.XMLDecoder\" version=\"1.8.0_121\">\n"
+ " <object class=\"org.opensolaris.opengrok.configuration.Configuration\">\n"
+ " <void property=\"pluginStack\">\n"
+ " <void method=\"add\">\n"
+ " <object class=\"org.opensolaris.bad.package.authorization.NoCheck\">\n"
+ " <void property=\"flag\">\n"
+ " <string>sufficient</string>\n"
+ " </void>\n"
+ " <void property=\"name\">\n"
+ " <string>Plugin</string>\n"
+ " </void>\n"
+ " </object>\n"
+ " </void>\n"
+ " </void>\n"
+ " </object>\n"
+ "</java>";
Configuration.makeXMLStringAsConfiguration(confString);
}
@Test
public void testBug3095() throws IOException {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
File file = new File("foobar");
assertTrue(file.createNewFile());
assertFalse(file.isAbsolute());
instance.setDataRoot(file.getName());
File f = instance.getDataRootFile();
assertNotNull(f);
assertEquals("foobar", f.getName());
assertTrue(f.isAbsolute());
assertTrue(file.delete());
}
@Test
public void testBug3154() throws IOException {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
File file = File.createTempFile("dataroot", null);
assertTrue(file.delete());
assertFalse(file.exists());
instance.setDataRoot(file.getAbsolutePath());
// The point of this test was to verify that setDataRoot() created
// the directory, but that logic has been moved as of bug 16986, so
// expect that the file does not exist.
assertFalse(file.exists());
}
@Test
public void testObfuscateEMail() throws IOException {
RuntimeEnvironment env = RuntimeEnvironment.getInstance();
// By default, don't obfuscate.
assertObfuscated(false, env);
env.setObfuscatingEMailAddresses(true);
assertObfuscated(true, env);
env.setObfuscatingEMailAddresses(false);
assertObfuscated(false, env);
}
private void assertObfuscated(boolean expected, RuntimeEnvironment env)
throws IOException {
assertEquals(expected, env.isObfuscatingEMailAddresses());
String address = "discuss@opengrok.java.net";
PlainXref xref = new PlainXref(new StringReader(address));
StringWriter out = new StringWriter();
xref.write(out);
String expectedAddress = expected
? address.replace("@", " (at) ") : address;
String expectedOutput
= "<a class=\"l\" name=\"1\" href=\"#1\">1</a>"
+ expectedAddress;
assertEquals(expectedOutput, out.toString());
}
@Test
public void isChattyStatusPage() {
RuntimeEnvironment env = RuntimeEnvironment.getInstance();
// By default, status page should not be chatty.
assertFalse(env.isChattyStatusPage());
env.setChattyStatusPage(true);
assertTrue(env.isChattyStatusPage());
env.setChattyStatusPage(false);
assertFalse(env.isChattyStatusPage());
}
@Test
public void testCanAcceptMessage() throws Exception {
RuntimeEnvironment instance = RuntimeEnvironment.getInstance();
instance.removeAllMessages();
Message m1 = new NormalMessage();
m1.addTag("main");
m1.setExpiration(new Date(System.currentTimeMillis() - 3000));
Assert.assertFalse(instance.canAcceptMessage(m1));
m1.setExpiration(new Date(System.currentTimeMillis() - 2000));
Assert.assertFalse(instance.canAcceptMessage(m1));
m1.setExpiration(new Date(System.currentTimeMillis() - 1000));
Assert.assertFalse(instance.canAcceptMessage(m1));
m1.setExpiration(new Date(System.currentTimeMillis() - 1));
Assert.assertFalse(instance.canAcceptMessage(m1));
m1.setExpiration(new Date(System.currentTimeMillis() + 50));
Assert.assertTrue(instance.canAcceptMessage(m1));
m1.setExpiration(new Date(System.currentTimeMillis() + 100));
Assert.assertTrue(instance.canAcceptMessage(m1));
m1.setExpiration(new Date(System.currentTimeMillis() + 5000));
Assert.assertEquals(0, instance.getMessagesInTheSystem());
for (int i = 0; i < instance.getMessageLimit(); i++) {
Message m2 = new NormalMessage();
m2.addTag("main");
m2.setText("text");
m2.setExpiration(new Date(System.currentTimeMillis() + 5000));
m2.setCreated(new Date(System.currentTimeMillis() + i));
Assert.assertTrue(instance.canAcceptMessage(m2));
m2.apply(instance);
Assert.assertEquals(i + 1, instance.getMessagesInTheSystem());
}
Assert.assertEquals(instance.getMessageLimit(), instance.getMessagesInTheSystem());
for (int i = 0; i < instance.getMessageLimit() * 2; i++) {
Message m2 = new NormalMessage();
m2.addTag("main");
m2.setText("text");
m2.setExpiration(new Date(System.currentTimeMillis() + 5000));
m2.setCreated(new Date(System.currentTimeMillis() + i + instance.getMessageLimit()));
Assert.assertFalse(instance.canAcceptMessage(m2));
m2.apply(instance);
Assert.assertEquals(instance.getMessageLimit(), instance.getMessagesInTheSystem());
}
instance.removeAllMessages();
}
/**
* Creates a map of String key and Long values.
*
* @param input double array containing the pairs
* @return the map
*/
protected Map<String, Long> createMap(Object[][] input) {
Map<String, Long> map = new TreeMap<>();
for (int i = 0; i < input.length; i++) {
map.put((String) input[i][0], new Long((long) input[i][1]));
}
return map;
}
@Test
public void testLoadEmptyStatistics() throws IOException, ParseException {
RuntimeEnvironment env = RuntimeEnvironment.getInstance();
String json = "{}";
try (InputStream in = new StringInputStream(json)) {
env.loadStatistics(in);
}
Assert.assertEquals(new Statistics().toJson(), env.getStatistics().toJson());
}
@Test
public void testLoadStatistics() throws IOException, ParseException {
RuntimeEnvironment env = RuntimeEnvironment.getInstance();
String json = "{"
+ "\"requests_per_minute_max\":3,"
+ "\"timing\":{"
+ "\"*\":2288,"
+ "\"xref\":53,"
+ "\"root\":2235"
+ "},"
+ "\"minutes\":756,"
+ "\"timing_min\":{"
+ "\"*\":2,"
+ "\"xref\":2,"
+ "\"root\":2235"
+ "},"
+ "\"timing_avg\":{"
+ "\"*\":572.0,"
+ "\"xref\":17.666666666666668,"
+ "\"root\":2235.0"
+ "},"
+ "\"request_categories\":{"
+ "\"*\":4,"
+ "\"xref\":3,"
+ "\"root\":1"
+ "},"
+ "\"day_histogram\":[0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1],"
+ "\"requests\":4,"
+ "\"requests_per_minute_min\":1,"
+ "\"requests_per_minute\":3,"
+ "\"requests_per_minute_avg\":0.005291005291005291,"
+ "\"month_histogram\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,3,0],"
+ "\"timing_max\":{"
+ "\"*\":2235,"
+ "\"xref\":48,"
+ "\"root\":2235"
+ "}"
+ "}";
try (InputStream in = new StringInputStream(json)) {
env.loadStatistics(in);
}
Statistics stats = env.getStatistics();
Assert.assertNotNull(stats);
Assert.assertEquals(756, stats.getMinutes());
Assert.assertEquals(4, stats.getRequests());
Assert.assertEquals(3, stats.getRequestsPerMinute());
Assert.assertEquals(1, stats.getRequestsPerMinuteMin());
Assert.assertEquals(3, stats.getRequestsPerMinuteMax());
Assert.assertEquals(0.005291005291005291, stats.getRequestsPerMinuteAvg(), 0.00005);
Assert.assertArrayEquals(new long[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1}, stats.getDayHistogram());
Assert.assertArrayEquals(new long[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 3,
0}, stats.getMonthHistogram());
Assert.assertEquals(createMap(new Object[][]{{"*", 4L}, {"xref", 3L}, {"root", 1L}}), stats.getRequestCategories());
Assert.assertEquals(createMap(new Object[][]{{"*", 2288L}, {"xref", 53L}, {"root", 2235L}}), stats.getTiming());
Assert.assertEquals(createMap(new Object[][]{{"*", 2L}, {"xref", 2L}, {"root", 2235L}}), stats.getTimingMin());
Assert.assertEquals(createMap(new Object[][]{{"*", 2235L}, {"xref", 48L}, {"root", 2235L}}), stats.getTimingMax());
}
@Test(expected = ParseException.class)
public void testLoadInvalidStatistics() throws ParseException, IOException {
RuntimeEnvironment env = RuntimeEnvironment.getInstance();
String json = "{ malformed json with missing bracket";
try (InputStream in = new StringInputStream(json)) {
env.loadStatistics(in);
}
}
@Test
public void testSaveEmptyStatistics() throws IOException {
RuntimeEnvironment env = RuntimeEnvironment.getInstance();
env.setStatistics(new Statistics());
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
env.saveStatistics(out);
Assert.assertEquals("{}", out.toString());
}
}
@Test
public void testSaveStatistics() throws IOException {
RuntimeEnvironment env = RuntimeEnvironment.getInstance();
env.setStatistics(new Statistics());
env.getStatistics().addRequest(new DummyHttpServletRequest());
env.getStatistics().addRequest(new DummyHttpServletRequest(), "root");
env.getStatistics().addRequestTime(new DummyHttpServletRequest(), "root", 10L);
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
env.saveStatistics(out);
Assert.assertNotEquals("{}", out.toString());
Assert.assertEquals(env.getStatistics().toJson().toJSONString(), out.toString());
}
}
@Test(expected = IOException.class)
public void testSaveNullStatistics() throws IOException, ParseException {
RuntimeEnvironment.getInstance().getConfiguration().setStatisticsFilePath(null);
RuntimeEnvironment.getInstance().saveStatistics();
}
@Test(expected = IOException.class)
public void testSaveNullStatisticsFile() throws IOException, ParseException {
RuntimeEnvironment.getInstance().saveStatistics((File) null);
}
@Test(expected = IOException.class)
public void testLoadNullStatistics() throws IOException, ParseException {
RuntimeEnvironment.getInstance().getConfiguration().setStatisticsFilePath(null);
RuntimeEnvironment.getInstance().loadStatistics();
}
@Test(expected = IOException.class)
public void testLoadNullStatisticsFile() throws IOException, ParseException {
RuntimeEnvironment.getInstance().loadStatistics((File) null);
}
}