com.hp.alm.ali.idea.IntellijTest.java Source code

Java tutorial

Introduction

Here is the source code for com.hp.alm.ali.idea.IntellijTest.java

Source

/*
 * Copyright 2013 Hewlett-Packard Development Company, L.P
 *
 * 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.
 */

package com.hp.alm.ali.idea;

import com.hp.alm.ali.Handler;
import com.hp.alm.ali.Isolated;
import com.hp.alm.ali.ServerVersion;
import com.hp.alm.ali.idea.entity.EntityListener;
import com.hp.alm.ali.idea.rest.RestException;
import com.hp.alm.ali.idea.rest.ServerType;
import com.hp.alm.ali.idea.services.EntityService;
import com.hp.alm.ali.idea.services.ErrorService;
import com.hp.alm.ali.idea.services.MetadataService;
import com.hp.alm.ali.idea.services.MetadataSimpleService;
import com.hp.alm.ali.idea.services.TestMessages;
import com.hp.alm.ali.idea.util.ApplicationUtil;
import com.hp.alm.ali.idea.util.DetailUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.TestDialog;
import com.intellij.testFramework.fixtures.IdeaProjectTestFixture;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;

import java.util.LinkedList;
import java.util.List;

/**
 * To override the default Intellij logging configuration you need to:
 *
 * <pre>
 *   $ cd IDEA_HOME
 *   $ copy bin/log.xml test-log.xml
 * </pre>
 *
 * and edit test-log.xml to your liking.
 */
public abstract class IntellijTest {

    protected Handler handler;
    protected IdeaProjectTestFixture fixture;
    protected ServerVersion version;
    protected ErrorService errorService;
    protected EntityService entityService;
    private List<EntityListener> entityListeners;

    public IntellijTest(ServerVersion version) {
        this.version = version;
    }

    @Rule
    public TestName name = new TestName();

    @Rule
    public TestFailure failure = new TestFailure();

    protected TestMessages testMessages;
    protected TestApplication testApplication;

    @Before
    public void reset() throws Exception {
        if (isIsolated()) {
            fixture = FixtureFactory.createFixture(version);
            handler = FixtureFactory.createHandler(version, fixture);
        } else {
            fixture = FixtureFactory.ensureFixture(version);
            handler = FixtureFactory.ensureHandler(version, fixture);
            handler.clear();
        }

        errorService = getComponent(ErrorService.class);
        entityService = getComponent(EntityService.class);
        entityListeners = new LinkedList<EntityListener>();
        getComponent(MetadataService.class).connectedTo(ServerType.NONE);
        getComponent(MetadataSimpleService.class).connectedTo(ServerType.NONE);
        testMessages = new TestMessages();
        Messages.setTestDialog(testMessages);
        testApplication = new TestApplication();
        ApplicationUtil._setApplication(testApplication);
    }

    @After
    public void done() throws Throwable {
        testApplication.waitForBackgroundActivityToFinish();
        if (handler != null) {
            handler.finish();
        }
        Assert.assertTrue("Unhandled messages: " + testMessages.asString(), testMessages.isEmpty());
        Messages.setTestDialog(TestDialog.DEFAULT);
        List<Exception> ex = errorService._shiftErrors();
        Assert.assertTrue("Unhandled exceptions: " + ex.toString(), ex.isEmpty());
        for (EntityListener listener : entityListeners) {
            entityService.removeEntityListener(listener);
        }
        getComponent(DetailUtil.class)._restore();
        if (isIsolated()) {
            handler.getServer().stop();
        }
    }

    @AfterClass
    public static void stopJetty() throws Exception {
        FixtureFactory.stopHandlers();
    }

    protected Project getProject() {
        return fixture.getProject();
    }

    protected <E> E getComponent(Class<E> clazz) {
        return getProject().getComponent(clazz);
    }

    protected void addEntityListener(EntityListener listener) {
        entityService.addEntityListener(listener);
        entityListeners.add(listener);
    }

    protected void checkError(String message) {
        Exception ex = errorService._shiftError();
        Assert.assertTrue(ex instanceof RestException);
        Assert.assertEquals(message, ex.getMessage());
    }

    private boolean isIsolated() throws NoSuchMethodException {
        Isolated isolated = getClass().getMethod(name.getMethodName()).getAnnotation(Isolated.class);
        if (isolated == null) {
            isolated = getClass().getAnnotation(Isolated.class);
        }
        return (isolated != null);
    }

    /**
     * TestName provided with JUnit fails to parse the [VERSION] prefix.
     */
    private static class TestName extends TestWatcher {
        private String fName;

        @Override
        protected void starting(Description d) {
            fName = d.toString().replaceFirst("^(?:\\[.*\\] )?(.*?)\\(.*\\)$", "$1");
        }

        public String getMethodName() {
            return fName;
        }
    }

    private class TestFailure extends TestWatcher {

        @Override
        protected void failed(Throwable t, Description description) {
            try {
                FixtureFactory.removeFixture(version);
                FixtureFactory.removeHandler(version);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
}