org.cicomponents.test.GitEmitterTest.java Source code

Java tutorial

Introduction

Here is the source code for org.cicomponents.test.GitEmitterTest.java

Source

/**
 * Copyright (c) 2016, All Contributors (see CONTRIBUTORS file)
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
package org.cicomponents.test;

import com.cicomponents.test.ContainerConfiguration;
import lombok.Getter;
import lombok.SneakyThrows;
import org.cicomponents.ResourceEmitter;
import org.cicomponents.ResourceHolder;
import org.cicomponents.ResourceListener;
import org.cicomponents.fs.WorkingDirectory;
import org.cicomponents.fs.WorkingDirectoryProvider;
import org.cicomponents.git.GitRevision;
import org.cicomponents.git.GitRevisionEmitter;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Configuration;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.PaxExam;
import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
import org.ops4j.pax.exam.spi.reactors.PerMethod;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;

import javax.inject.Inject;
import java.io.File;
import java.util.Collection;
import java.util.Hashtable;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

import static junit.framework.TestCase.assertFalse;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

@RunWith(PaxExam.class)
@ExamReactorStrategy(PerMethod.class)
public class GitEmitterTest {

    @Inject
    private BundleContext bundleContext;

    @Configuration
    public Option[] config() {
        return ContainerConfiguration.withDefaultConfig();
    }

    @Test
    @SneakyThrows
    public void noListeners() {
        Collection<ServiceReference<GitRevisionEmitter>> references = bundleContext.getServiceReferences(
                GitRevisionEmitter.class, "(objectClass=" + GitRevisionEmitter.class.getName() + ")");
        assertTrue(references.isEmpty());
    }

    static class Listener implements ResourceListener<GitRevision> {
        @Getter
        private CompletableFuture<ObjectId> future = new CompletableFuture<>();

        @Override
        public void onEmittedResource(ResourceHolder<GitRevision> holder, ResourceEmitter<GitRevision> emitter) {
            try (GitRevision resource = holder.acquire()) {
                future.complete(resource.getRef());
            }
        }

        void reset() {
            future = new CompletableFuture<>();
        }
    }

    @Inject
    private WorkingDirectoryProvider workingDirectoryProvider;

    @Test
    @SneakyThrows
    public void listenerDiscovery() {
        try (WorkingDirectory directory = workingDirectoryProvider.getDirectory()) {
            Git git = Git.init().setDirectory(new File(directory.getDirectory())).call();
            RevCommit commit = git.commit().setAllowEmpty(true).setMessage("Test").call();

            Hashtable<String, Object> properties = new Hashtable<>();
            properties.put("repository", "file://" + git.getRepository().getDirectory().getAbsolutePath());
            properties.put("type", "latest");
            Listener listener = new Listener();
            ServiceRegistration<ResourceListener> registration = bundleContext
                    .registerService(ResourceListener.class, listener, properties);

            Collection<ServiceReference<GitRevisionEmitter>> references = bundleContext.getServiceReferences(
                    GitRevisionEmitter.class, "(objectClass=" + GitRevisionEmitter.class.getName() + ")");
            assertFalse(references.isEmpty());

            registration.unregister();

            git.close();
        }
    }

    @Test
    @SneakyThrows
    public void listenerRemoval() {
        try (WorkingDirectory directory = workingDirectoryProvider.getDirectory()) {
            Git git = Git.init().setDirectory(new File(directory.getDirectory())).call();
            RevCommit commit = git.commit().setAllowEmpty(true).setMessage("Test").call();

            Hashtable<String, Object> properties = new Hashtable<>();
            properties.put("repository", "file://" + git.getRepository().getDirectory().getAbsolutePath());
            properties.put("type", "latest");
            Listener listener = new Listener();
            ServiceRegistration<ResourceListener> registration = bundleContext
                    .registerService(ResourceListener.class, listener, properties);

            Collection<ServiceReference<GitRevisionEmitter>> references = bundleContext.getServiceReferences(
                    GitRevisionEmitter.class, "(objectClass=" + GitRevisionEmitter.class.getName() + ")");
            assertFalse(references.isEmpty());

            ObjectId objectId = listener.getFuture().get();
            assertEquals(commit.toObjectId(), objectId);
            listener.reset();

            registration.unregister();

            git.commit().setAllowEmpty(true).setMessage("Test #1").call();

            try {
                listener.getFuture().get(11, TimeUnit.SECONDS);
                fail("Listener was not removed");
            } catch (TimeoutException e) {
                // this is what should happen
            }

            git.close();
        }
    }

    @Test
    @SneakyThrows
    public void listener() {
        try (WorkingDirectory directory = workingDirectoryProvider.getDirectory()) {
            Git git = Git.init().setDirectory(new File(directory.getDirectory())).call();
            RevCommit commit = git.commit().setAllowEmpty(true).setMessage("Test").call();

            Hashtable<String, Object> properties = new Hashtable<>();
            properties.put("repository", "file://" + git.getRepository().getDirectory().getAbsolutePath());
            properties.put("type", "latest");
            Listener listener = new Listener();
            ServiceRegistration<ResourceListener> registration = bundleContext
                    .registerService(ResourceListener.class, listener, properties);

            Collection<ServiceReference<GitRevisionEmitter>> references = bundleContext.getServiceReferences(
                    GitRevisionEmitter.class, "(objectClass=" + GitRevisionEmitter.class.getName() + ")");

            ObjectId objectId = listener.getFuture().get();
            assertEquals(commit.toObjectId(), objectId);
            listener.reset();

            // Test ongoing commits
            commit = git.commit().setAllowEmpty(true).setMessage("Test #1").call();

            objectId = listener.getFuture().get();
            assertEquals(commit.toObjectId(), objectId);

            git.close();
            registration.unregister();
        }
    }
}