org.nuxeo.connect.update.standalone.PackageTestCase.java Source code

Java tutorial

Introduction

Here is the source code for org.nuxeo.connect.update.standalone.PackageTestCase.java

Source

/*
 * (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());
    }

}