Package net.grinder.engine.process

Source Code of net.grinder.engine.process.JUnitThreadContextInitializer

/*
* 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 net.grinder.engine.process;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import net.grinder.common.GrinderProperties;
import net.grinder.common.SkeletonThreadLifeCycleListener;
import net.grinder.engine.common.EngineException;
import net.grinder.engine.process.GrinderProcess.ThreadContexts;
import net.grinder.engine.process.GrinderProcess.Times;
import net.grinder.engine.process.dcr.DCRContextImplementation;
import net.grinder.script.Grinder;
import net.grinder.script.InternalScriptContext;
import net.grinder.script.Statistics;
import net.grinder.scriptengine.Instrumenter;
import net.grinder.statistics.StatisticsServices;
import net.grinder.statistics.StatisticsServicesImplementation;
import net.grinder.util.Sleeper;
import net.grinder.util.SleeperImplementation;
import net.grinder.util.weave.agent.ExposeInstrumentation;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* ThreadContext initializer in JUnit context.
*
* This class is responsible to setup the Grinder thread context when it's not executed in the
* Grinder agent.
*
* @author JunHo Yoon
* @since 3.2
*/
public class JUnitThreadContextInitializer {
  private static final Logger LOGGER = LoggerFactory.getLogger(JUnitThreadContextInitializer.class);
  private ThreadContexts m_threadContexts = new ThreadContexts();
  private StatisticsServices m_statisticsServices;
  private Times m_times = new Times();

  /**
   * Constructor.
   */
  public JUnitThreadContextInitializer() {
  }

  /**
   * Initialize thread context. This method is subject to be executed once in the total execution
   * context.
   */
  public void initialize() {
    m_statisticsServices = StatisticsServicesImplementation.getInstance();
    List<Instrumenter> list = new ArrayList<Instrumenter>();

    DCRContextImplementation context = DCRContextImplementation.create(LOGGER);
    if (context == null) {
      String file = ExposeInstrumentation.class.getProtectionDomain().getCodeSource().getLocation().getPath();
      file = new File(file).getAbsolutePath();
      throw new RuntimeException("Please add \r\n-javaagent:" + file + "\r\nin 'Run As JUnit' vm argument.");
    }
    list.add(new JavaDCRInstrumenterEx(context));
    final Instrumenter instrumenter = new MasterInstrumenter(list);

    TestStatisticsHelperImplementation m_testStatisticsHelper = new TestStatisticsHelperImplementation(m_statisticsServices.getStatisticsIndexMap());

    TestRegistryImplementation m_testRegistryImplementation = new TestRegistryImplementation(m_threadContexts,
        m_statisticsServices.getStatisticsSetFactory(), m_testStatisticsHelper,
        m_times.getTimeAuthority());

    m_testRegistryImplementation.setInstrumenter(instrumenter);

    final Logger externalLogger = new ExternalLogger(LOGGER, m_threadContexts);

    Sleeper m_sleeper = new SleeperImplementation(m_times.getTimeAuthority(), externalLogger, 1.0d, 0.2d);

    final Statistics scriptStatistics = new ScriptStatisticsImplementation(m_threadContexts, m_statisticsServices,
        new NullSender());

    final InternalScriptContext scriptContext = new ScriptContextImplementation(new SimpleWorkerIdentity(
        "unit-test", 0), new SimpleWorkerIdentity("unit-test", 0), m_threadContexts, null,
        externalLogger, m_sleeper, new SSLControlImplementation(m_threadContexts), scriptStatistics,
        m_testRegistryImplementation, null, null, null, null);
    Grinder.grinder = scriptContext;

    new PluginRegistryImplementation(externalLogger, scriptContext, m_threadContexts, m_statisticsServices,
        m_times.getTimeAuthority());

  }

  /**
   * Register the worker thread context.
   */
  public void attachWorkerThreadContext() {
    try {
      if (m_threadContexts.get() == null) {
        GrinderProperties properties = new GrinderProperties();
        properties.setInt("grinder.agents", 1);
        properties.setInt("grinder.processes", 1);
        properties.setInt("grinder.threads", 1);
        properties.setBoolean("grinder.logData", false);
        final ThreadContextImplementation threadContext = new ThreadContextImplementation(properties,
            m_statisticsServices, 0, LOGGER);
        m_threadContexts.threadCreated(threadContext);
        m_threadContexts.threadStarted(threadContext);
        threadContext.registerThreadLifeCycleListener(new SkeletonThreadLifeCycleListener() {
          @Override
          public void endThread() {
            threadContext.reportPendingDispatchContext();
          }

          @Override
          public void endRun() {
          }
        });
      }
    } catch (EngineException e) {
      LOGGER.error("Error while initiating thread context", e);
    }
  }

  /**
   * Detach the worker thread context.
   */
  public void detachWorkerThreadContext() {
    ThreadContext threadContext = m_threadContexts.get();
    if (threadContext != null) {
      threadContext.fireEndThreadEvent();
      m_threadContexts.threadStarted(null);
    }
  }

  /**
   * Get thread context updater.
   *
   * @return JUnitThreadContextUpdater
   */
  public JUnitThreadContextUpdater getThreadContextUpdater() {
    return new JUnitThreadContextUpdater(m_threadContexts);
  }
}
TOP

Related Classes of net.grinder.engine.process.JUnitThreadContextInitializer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.