/*
* (C) Copyright 2012-2015 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed 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.
*
* Contributors:
* jcarsique
*/
package org.nuxeo.connect.update.standalone;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.nuxeo.common.Environment;
import org.nuxeo.connect.update.PackageException;
import org.nuxeo.connect.update.PackageUpdateService;
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.RuntimeFeature;
@RunWith(FeaturesRunner.class)
@Features(RuntimeFeature.class)
public abstract class PackageTestCase {
protected static final Log log = LogFactory.getLog(PackageTestCase.class);
public static final String TEST_PACKAGES_PREFIX = "packages/";
protected PackageUpdateService service;
/**
* Calls {@link #setupService()} to setup the service
*
* @see #setupService()
*/
@Before
public void setUp() throws Exception {
setupService();
}
@After
public void tearDown() throws Exception {
if (service instanceof StandaloneUpdateService) {
tearDownStandaloneUpdateService();
}
}
protected File getTestPackageZip(String name) throws IOException, URISyntaxException {
File zip = Framework.createTempFile("nuxeo-" + name + "-", ".zip");
Framework.trackFile(zip, zip);
URI uri = getResource(TEST_PACKAGES_PREFIX + name).toURI();
if (uri.getScheme().equals("jar")) {
String part = uri.getSchemeSpecificPart(); // file:/foo/bar.jar!/a/b
String basePath = part.substring(part.lastIndexOf("!") + 1);
try (FileSystem fs = FileSystems.newFileSystem(uri, Collections.emptyMap())) {
createZip(zip, fs.getPath(basePath));
}
} else { // file: scheme
createZip(zip, new File(uri).toPath());
}
return zip;
}
protected URL getResource(String name) {
return getClass().getClassLoader().getResource(name);
}
/** Zips a directory into the given ZIP file. */
protected void createZip(File zip, Path basePath) throws IOException {
try (ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zip)))) {
Files.walkFileTree(basePath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
if (attrs.isDirectory()) {
return FileVisitResult.CONTINUE;
}
String rel = basePath.relativize(path).toString();
if (rel.startsWith(".")) {
return FileVisitResult.CONTINUE;
}
zout.putNextEntry(new ZipEntry(rel));
try (InputStream in = Files.newInputStream(path)) {
org.apache.commons.io.IOUtils.copy(in, zout);
}
zout.closeEntry();
return FileVisitResult.CONTINUE;
}
});
zout.flush();
}
}
/**
* Default implementation sets a {@link StandaloneUpdateService}
*
* @throws IOException
* @throws PackageException
*/
protected void setupService() throws IOException, PackageException {
File tmpHome = Framework.createTempFile("tmphome", null);
Framework.trackFile(tmpHome, tmpHome);
FileUtils.forceDelete(tmpHome);
tmpHome.mkdirs();
Environment env = new Environment(tmpHome);
Environment.setDefault(env);
env.setServerHome(tmpHome);
env.init();
service = new StandaloneUpdateService(env);
service.initialize();
File storeDir = ((StandaloneUpdateService) service).getPersistence().getStore();
File junkPackageFile = File.createTempFile("junk", null, storeDir);
junkPackageFile.deleteOnExit();
}
protected void tearDownStandaloneUpdateService() {
FileUtils.deleteQuietly(Environment.getDefault().getHome());
}
}