org.ebayopensource.turmeric.eclipse.test.util.FunctionalTestHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.ebayopensource.turmeric.eclipse.test.util.FunctionalTestHelper.java

Source

/*******************************************************************************
 * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved.
 * 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
 *******************************************************************************/
package org.ebayopensource.turmeric.eclipse.test.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Iterator;

import junit.framework.Assert;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;
import org.apache.commons.io.filefilter.NameFileFilter;
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.lang.StringUtils;
import org.ebayopensource.turmeric.eclipse.buildsystem.utils.BuildSystemUtil;
import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants;
import org.ebayopensource.turmeric.eclipse.functional.test.SoaTestConstants;
import org.ebayopensource.turmeric.eclipse.mavenapi.MavenApiPlugin;
import org.ebayopensource.turmeric.eclipse.repositorysystem.core.GlobalRepositorySystem;
import org.ebayopensource.turmeric.eclipse.resources.model.IAssetInfo;
import org.ebayopensource.turmeric.eclipse.resources.model.ISOAConsumerProject.SOAClientConfig;
import org.ebayopensource.turmeric.eclipse.resources.util.SOAClientConfigUtil;
import org.ebayopensource.turmeric.eclipse.resources.util.SOAConsumerUtil;
import org.ebayopensource.turmeric.eclipse.test.utils.WsdlUtilTest;
import org.ebayopensource.turmeric.eclipse.utils.plugin.ProgressUtil;
import org.ebayopensource.turmeric.eclipse.utils.plugin.WorkspaceUtil;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.IStreamListener;
import org.eclipse.debug.core.Launch;
import org.eclipse.debug.core.model.IProcess;
import org.eclipse.debug.core.model.IStreamMonitor;
import org.eclipse.debug.core.model.IStreamsProxy;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.launching.IVMInstall;
import org.eclipse.jdt.launching.IVMRunner;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jdt.launching.VMRunnerConfiguration;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;

public class FunctionalTestHelper {

    public static void consumeJunitModifiedTestSvcBeforeMod(String serviceName1, IProject consProject1)
            throws Exception {

        // change the Impl class
        changeServiceImplFile(serviceName1, "consume" + serviceName1);

        // copy the Consumer class file
        copyServiceConsumerFile(consProject1.getName(), serviceName1, "consume" + serviceName1);

        // modify the consumer transport settings to local
        modifyClientPrjTransport(consProject1, serviceName1, SOAProjectConstants.Binding.LOCAL);

        invokeConsumer(consProject1);

    }

    public static void ensureM2EcipseBeingInited() throws Exception {

        BundleContext context = MavenApiPlugin.getDefault().getBundle().getBundleContext();
        MavenApiPlugin.getDefault().start(context);
        int state = MavenApiPlugin.getDefault().getBundle().getState();

        while (state != Bundle.ACTIVE) {
            System.out.println("M2 Eclipse still not started.  Sleeping and trying again.");
            Thread.sleep(5000L);
            state = MavenApiPlugin.getDefault().getBundle().getState();
        }

    }

    /*
     * finds the Impl class and switches with another file in the
     * test-data/consume<serviceName> dir
     */
    @SuppressWarnings("unchecked")
    public static void changeServiceImplFile(String serviceName, String srcDirName) throws CoreException {

        final String implFileName = serviceName + "Impl.java";
        String implFileDir = WsdlUtilTest.getPluginOSPath(SoaTestConstants.PLUGIN_ID, "test-data/" + srcDirName);
        IProject serviceImplPrj = ProjectUtil.getProject(serviceName + "Impl");

        IPath implFilePath = new Path(implFileDir + "/" + implFileName);

        Assert.assertNotNull(implFilePath);

        System.out.println("The implFilePath that is being copied is " + implFilePath.toOSString());
        NameFileFilter fileFilter = new NameFileFilter(implFileName);

        Collection<File> files = FileUtils.listFiles(serviceImplPrj.getFullPath().toFile()
        /* .getLocation().toFile() */, fileFilter, TrueFileFilter.INSTANCE);

        File curImplFile = null;
        for (Iterator iterator = files.iterator(); iterator.hasNext();) {
            File file = (File) iterator.next();
            if (file.getAbsolutePath().indexOf("src") > 0) {
                curImplFile = file;
            }
            System.out.println("The file in collection is " + file.getAbsolutePath());
        }
        Assert.assertNotNull(files);
        Assert.assertTrue(files.size() > 0);

        try {
            FileUtils.forceDelete(curImplFile);
        } catch (IOException e1) {
            e1.printStackTrace();
            Assert.fail("deleteFile operation failed");
        }
        System.out.println("The implFilePath being overwritten is  " + curImplFile.getAbsolutePath());
        try {
            FileUtils.copyFile(implFilePath.toFile(), curImplFile, false);
        } catch (IOException e) {
            e.printStackTrace();
            Assert.fail("copyFile operation failed");
        }

        WorkspaceUtil.refresh(serviceImplPrj);
        serviceImplPrj.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, ProgressUtil.getDefaultMonitor(null));
    }

    /*
     * It copies the Consumer.java file from the srcFolder sub-dir in the
     * test-data area to the directory Base<cons>.java is located in
     */
    @SuppressWarnings("unchecked")
    public static void copyServiceConsumerFile(String consumerPrjName, String serviceName, String srcFolder)
            throws Exception {

        // final String baseConsumerFilename = "Base"
        // + StringUtils.capitalize(serviceName) + "Consumer.java";

        final String copyConsDir = WsdlUtilTest.getPluginOSPath(SoaTestConstants.PLUGIN_ID,
                "test-data/" + srcFolder);
        Assert.assertNotNull(copyConsDir);

        final String srcConsumerFile = copyConsDir.concat("/" + "Consumer.java");

        System.out.println("The srcConsumerFile that is being copied is " + srcConsumerFile);
        IProject consPrj = WorkspaceUtil.getProject(consumerPrjName);

        /*
         * NameFileFilter fileFilter = new NameFileFilter(baseConsumerFilename);
         * 
         * Collection<File> files = FileUtils.listFiles(consPrj.getLocation()
         * .toFile(), fileFilter, TrueFileFilter.INSTANCE);
         * 
         * Assert.assertNotNull(files); Assert.assertTrue(files.size() > 0);
         * 
         * File curBaseConsFile = null; for (Iterator iterator =
         * files.iterator(); iterator.hasNext();) { File file = (File)
         * iterator.next(); if (file.getAbsolutePath().indexOf("src") > 0 ) {
         * curBaseConsFile = file; }
         * System.out.println("The file in collection is " +
         * file.getAbsolutePath()); }
         * 
         * // File curBaseConsFile = files.iterator().next();
         * 
         * IPath baseConsDir = new Path(curBaseConsFile.getAbsolutePath())
         * .removeLastSegments(1);
         * 
         * System.out.println("The directory that consumer file is copied into is "
         * + baseConsDir.toOSString()); try { FileUtils.copyFileToDirectory(new
         * File(srcConsumerFile), baseConsDir.toFile(), false); } catch
         * (IOException e) { e.printStackTrace();
         * Assert.fail("Copying Consumer file to the Base Consumer Dir failed" +
         * baseConsDir.toOSString()); }
         * 
         * WorkspaceUtil.refresh(consPrj);
         * consPrj.build(IncrementalProjectBuilder.INCREMENTAL_BUILD,
         * ProgressUtil .getDefaultMonitor(null));
         */
        IPath srcDir = new Path(consPrj.getLocation().toString().concat("/" + "src"));
        try {
            FileUtils.copyFileToDirectory(new File(srcConsumerFile), srcDir.toFile());
        } catch (IOException e) {
            e.printStackTrace();
            Assert.fail("Copying Consumer file to the Src Dir failed" + srcDir.toOSString());
        }
        WorkspaceUtil.refresh(consPrj);
        consPrj.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, ProgressUtil.getDefaultMonitor(null));
    }

    /*
     * For now it sets Binding to LOCAL
     */

    public static void modifyClientPrjTransport(IProject consProject, String serviceName,
            SOAProjectConstants.Binding binding) {
        String environmentName = "production";

        try {
            final SOAClientConfig config = SOAConsumerUtil.loadClientConfig(consProject, environmentName,
                    serviceName);

            config.setServiceBinding("LOCAL");
            String protocalProcessorClassName = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem()
                    .getActiveOrganizationProvider().getSOAPProtocolProcessorClassName();
            SOAClientConfigUtil.save(config, protocalProcessorClassName);

            // When adding the local binding u might need to add the project as
            // dependency also..For that use the below code,

            GlobalRepositorySystem.instanceOf().getActiveRepositorySystem().getProjectConfigurer().addDependency(
                    consProject.getName(), serviceName + "Impl", IAssetInfo.TYPE_PROJECT, true,
                    ProgressUtil.getDefaultMonitor(null));

            GlobalRepositorySystem.instanceOf().getActiveRepositorySystem().getProjectConfigurer().addDependency(
                    consProject.getName(), "SOAServer", IAssetInfo.TYPE_LIBRARY, true,
                    ProgressUtil.getDefaultMonitor(null));

            WorkspaceUtil.refresh(consProject);

            BuildSystemUtil.updateSOAClasspathContainer(consProject);

            consProject.build(IncrementalProjectBuilder.FULL_BUILD, ProgressUtil.getDefaultMonitor(null));

        } catch (Exception e) {
            e.printStackTrace();
            Assert.fail("changing transport to LOCAL failed");
        }

    }

    /*
     * It executes the Consumer.java main() in the consProjet. Before executing,
     * the transport settings are changed to LOCAL It assumes that the Impl
     * project is in the workspace.
     */
    public static void invokeConsumer(IProject consProject) throws CoreException {
        IJavaProject clientJProj = JavaCore.create(consProject);

        String consumerClass = getConsumerFQN(consProject);

        Assert.assertNotNull(consumerClass);

        IVMInstall vm = JavaRuntime.getVMInstall(clientJProj);
        if (vm == null)
            vm = JavaRuntime.getDefaultVMInstall();
        IVMRunner vmr = vm.getVMRunner(ILaunchManager.RUN_MODE);
        String[] cp = JavaRuntime.computeDefaultRuntimeClassPath(clientJProj);
        VMRunnerConfiguration config = new VMRunnerConfiguration(consumerClass, cp);
        ILaunch launch = new Launch(null, ILaunchManager.RUN_MODE, null);
        vmr.run(config, launch, null);

        // This is the only one process we just fired off..so there will be only
        // process
        IProcess launchedProcess = launch.getProcesses()[0];
        IStreamsProxy streamProxy = launchedProcess.getStreamsProxy();

        final StringBuffer outSb = new StringBuffer(1024);
        final StringBuffer errSb = new StringBuffer(1024);
        streamProxy.getOutputStreamMonitor().addListener(new IStreamListener() {

            @Override
            public void streamAppended(String text, IStreamMonitor monitor) {
                outSb.append(text);

            }
        });
        streamProxy.getErrorStreamMonitor().addListener(new IStreamListener() {

            @Override
            public void streamAppended(String text, IStreamMonitor monitor) {
                errSb.append(text);

            }
        });

        int i = 0;
        while (i < 60 && !launchedProcess.isTerminated()) {
            i++;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        if (launchedProcess.isTerminated()) {
            System.out.println("The Stdout is -- " + outSb.toString());
            System.out.println("The Stderr is -- " + errSb.toString());
        } else {
            System.out.println("The launched process did not terminate");
        }

        Assert.assertTrue("The consumer invocation failed with errors",
                (outSb.toString().indexOf("EXCEPTION") < 0));
        Assert.assertTrue("The consumer invocation failed with errors",
                (outSb.toString().indexOf("Exception") < 0));
        Assert.assertTrue("The consumer invocation failed with errors", (outSb.toString().indexOf("ERROR") < 0));
        Assert.assertTrue("The consumer invocation failed with errors",
                (errSb.toString().indexOf("EXCEPTION") < 0));
        Assert.assertTrue("The consumer invocation failed with errors", (errSb.toString().indexOf("ERROR") < 0));
        Assert.assertTrue("The consumer invocation failed with errors",
                (errSb.toString().indexOf("Exception") < 0));
        Assert.assertTrue("The consumer invocation failed with errors",
                (errSb.toString().indexOf("The java class is not found") < 0));
    }

    @SuppressWarnings("unchecked")
    public static String getConsumerFQN(IProject prj) {

        // String className = null;
        String className = "Consumer";
        NameFileFilter fileFilter = new NameFileFilter("Consumer.java");

        Collection<File> files = FileUtils.listFiles(prj.getLocation().toFile(), fileFilter,
                TrueFileFilter.INSTANCE);

        Assert.assertNotNull(files);
        Assert.assertTrue(files.size() > 0);

        File consFile = files.iterator().next();

        InputStream input = null;
        try {
            input = new FileInputStream(consFile);

            LineIterator iter = IOUtils.lineIterator(input, null);
            while (iter.hasNext()) {
                String line = iter.nextLine();
                if (line.startsWith("package")) {
                    className = StringUtils.substringBetween(line, "package", ";").trim();
                    className = className + ".Consumer";
                    break;
                }
            }
            iter.close();
        } catch (Exception e) {
            e.printStackTrace();
            IOUtils.closeQuietly(input);
        }

        return className;

    }

    public static void modifyClientPrjServicePP(IProject consProject2, String serviceName2,
            String messageProtocol) {
        SOAClientConfig config = null;
        String environmentName = "production";
        try {
            config = SOAConsumerUtil.loadClientConfig(consProject2, environmentName, serviceName2);
        } catch (Exception e) {
            e.printStackTrace();
            Assert.fail("failed to load Client config");
        }

        config.setMessageProtocol(messageProtocol);
        try {
            String protocalProcessorClassName = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem()
                    .getActiveOrganizationProvider().getSOAPProtocolProcessorClassName();
            SOAClientConfigUtil.save(config, protocalProcessorClassName);
        } catch (Exception e) {
            e.printStackTrace();
            Assert.fail("failed to save Client config");
        }
    }

    public static void modifyClientPrjRespDataBinding(IProject consProject2, String serviceName2,
            String responseDataBinding) throws Exception {
        SOAClientConfig config = null;
        String environmentName = "production";
        try {
            config = SOAConsumerUtil.loadClientConfig(consProject2, environmentName, serviceName2);
        } catch (Exception e) {
            e.printStackTrace();
            Assert.fail("failed to load Client config");
        }

        config.setResponseDataBinding(responseDataBinding);
        try {
            String protocalProcessorClassName = GlobalRepositorySystem.instanceOf().getActiveRepositorySystem()
                    .getActiveOrganizationProvider().getSOAPProtocolProcessorClassName();
            SOAClientConfigUtil.save(config, protocalProcessorClassName);
        } catch (Exception e) {
            e.printStackTrace();
            Assert.fail("failed to save Client config");
        }

        WorkspaceUtil.refresh(consProject2);
        consProject2.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, ProgressUtil.getDefaultMonitor(null));

    }
}