/*
* 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.karaf.instance.core.internal;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.apache.karaf.instance.core.Instance;
import org.apache.karaf.instance.core.InstanceSettings;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.TestName;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
public class InstanceServiceImplTest {
@Rule
public TestName name = new TestName();
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
@BeforeClass
public static void setUpClass() throws Exception {
String buildDirectory = ClassLoader.getSystemResource("etc/startup.properties").getFile()
.replace("startup.properties", "");
System.setProperty("karaf.etc", buildDirectory);
}
@Test
public void testHandleFeatures() throws Exception {
InstanceServiceImpl as = new InstanceServiceImpl();
File f = tempFolder.newFile(getName() + ".test");
Properties p = new Properties();
p.put("featuresBoot", "abc,def ");
p.put("featuresRepositories", "somescheme://xyz");
OutputStream os = new FileOutputStream(f);
try {
p.store(os, "Test comment");
} finally {
os.close();
}
InstanceSettings s = new InstanceSettings(8122, 1122, 44444, null, null, null, Arrays.asList("test"));
as.addFeaturesFromSettings(f, s);
Properties p2 = new Properties();
InputStream is = new FileInputStream(f);
try {
p2.load(is);
} finally {
is.close();
}
assertEquals(2, p2.size());
assertEquals("abc,def,test", p2.get("featuresBoot"));
assertEquals("somescheme://xyz", p2.get("featuresRepositories"));
}
@Test
public void testConfigurationFiles() throws Exception {
InstanceServiceImpl service = new InstanceServiceImpl();
service.setStorageLocation(tempFolder.newFolder("instances"));
InstanceSettings settings = new InstanceSettings(8122, 1122, 44444, getName(), null, null, null);
Instance instance = service.createInstance(getName(), settings, true);
assertFileExists(instance.getLocation(), "etc/config.properties");
assertFileExists(instance.getLocation(), "etc/users.properties");
assertFileExists(instance.getLocation(), "etc/startup.properties");
assertFileExists(instance.getLocation(), "etc/java.util.logging.properties");
assertFileExists(instance.getLocation(), "etc/org.apache.karaf.features.cfg");
assertFileExists(instance.getLocation(), "etc/org.apache.felix.fileinstall-deploy.cfg");
assertFileExists(instance.getLocation(), "etc/org.apache.karaf.log.cfg");
assertFileExists(instance.getLocation(), "etc/org.apache.karaf.management.cfg");
assertFileExists(instance.getLocation(), "etc/org.ops4j.pax.logging.cfg");
assertFileExists(instance.getLocation(), "etc/org.ops4j.pax.url.mvn.cfg");
}
public void testTextResources() throws Exception {
InstanceServiceImpl service = new InstanceServiceImpl();
service.setStorageLocation(new File("target/instances/" + System.currentTimeMillis()));
Map<String, URL> textResources = new HashMap<String, URL>();
textResources.put("etc/myresource", getClass().getClassLoader().getResource("myresource"));
InstanceSettings settings = new InstanceSettings(8122, 1122, 44444, getName(), null, null, null, null, textResources, new HashMap<String, URL>());
Instance instance = service.createInstance(getName(), settings, false);
assertFileExists(instance.getLocation(), "etc/myresource");
}
/**
* <p>
* Test the renaming of an existing instance.
* </p>
*/
@Test
public void testRenameInstance() throws Exception {
InstanceServiceImpl service = new InstanceServiceImpl();
service.setStorageLocation(tempFolder.newFolder("instances"));
InstanceSettings settings = new InstanceSettings(8122, 1122, 44444, getName(), null, null, null);
service.createInstance(getName(), settings, true);
service.renameInstance(getName(), getName() + "b", true);
assertNotNull(service.getInstance(getName() + "b"));
}
/**
* <p>
* Test the renaming of an existing instance.
* </p>
*/
@Test
public void testToSimulateRenameInstanceByExternalProcess() throws Exception {
InstanceServiceImpl service = new InstanceServiceImpl();
File storageLocation = tempFolder.newFolder("instances");
service.setStorageLocation(storageLocation);
InstanceSettings settings = new InstanceSettings(8122, 1122, 44444, getName(), null, null, null);
service.createInstance(getName(), settings, true);
//to simulate the scenario that the instance name get changed by
//external process, likely the admin command CLI tool, which cause
//the instance storage file get updated, the AdminService should be
//able to reload the storage file before check any status for the
//instance
File storageFile = new File(storageLocation, InstanceServiceImpl.STORAGE_FILE);
assertTrue(storageFile.isFile());
Properties storage = loadStorage(storageFile);
storage.setProperty("item.0.name", getName() + "b");
saveStorage(storage, storageFile, "testToSimulateRenameInstanceByExternalProcess");
assertNotNull(service.getInstance(getName() + "b"));
}
private String getName() {
return name.getMethodName();
}
private void saveStorage(Properties props, File location, String comment) throws IOException {
OutputStream os = null;
try {
os = new FileOutputStream(location);
props.store(os, comment);
} finally {
if (os != null) {
os.close();
}
}
}
private Properties loadStorage(File location) throws IOException {
InputStream is = null;
try {
is = new FileInputStream(location);
Properties props = new Properties();
props.load(is);
return props;
} finally {
if (is != null) {
is.close();
}
}
}
private void assertFileExists(String path, String name) throws IOException {
File file = new File(path, name);
assertTrue("Expected " + file.getCanonicalPath() + " to exist",
file.exists());
}
}