/*
 * Copyright (c) 2008-2012 Eike Stepper (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Andre Dietisheim - initial API and implementation
 *    Eike Stepper - maintenance
 */
package org.eclipse.net4j.tests.defs;

import org.eclipse.net4j.Net4jUtil;
import org.eclipse.net4j.buffer.IBufferPool;
import org.eclipse.net4j.defs.JVMAcceptorDef;
import org.eclipse.net4j.defs.Net4jDefsFactory;
import org.eclipse.net4j.internal.jvm.JVMClientConnector;
import org.eclipse.net4j.jvm.IJVMAcceptor;
import org.eclipse.net4j.jvm.IJVMConnector;
import org.eclipse.net4j.util.concurrent.ThreadPool;
import org.eclipse.net4j.util.defs.Net4jUtilDefsFactory;
import org.eclipse.net4j.util.lifecycle.LifecycleUtil;
import org.eclipse.net4j.util.tests.AbstractOMTest;

import java.util.concurrent.ExecutorService;

/**
 * @author Andre Dietisheim
 */
public class JVMAcceptorDefImplTest extends AbstractOMTest
{
  private static final String NAME = "JVMConnector1"; //$NON-NLS-1$

  private static final long TIMEOUT = 10000l;

  private static final long DELAY = 500l;

  private IJVMConnector jvmConnector;

  @Override
  protected void doSetUp() throws Exception
  {
    jvmConnector = createJVMClientConnector();
  }

  @Override
  protected void doTearDown() throws Exception
  {
    LifecycleUtil.deactivate(jvmConnector);
  }

  public void testAcceptorDefOpensConnection()
  {
    JVMAcceptorDef jvmAcceptorDef = Net4jDefsFactory.eINSTANCE.createJVMAcceptorDef();
    jvmAcceptorDef.setBufferProvider(Net4jDefsFactory.eINSTANCE.createBufferPoolDef());
    jvmAcceptorDef.setExecutorService(Net4jUtilDefsFactory.eINSTANCE.createThreadPoolDef());
    jvmAcceptorDef.setName(NAME);

    IJVMAcceptor jvmAcceptor = (IJVMAcceptor)jvmAcceptorDef.getInstance();

    assertEquals(true, LifecycleUtil.isActive(jvmAcceptor));

    LifecycleUtil.activate(jvmConnector);
    jvmConnector.waitForConnection(DELAY + TIMEOUT);

    assertEquals(true, LifecycleUtil.isActive(jvmConnector));

    LifecycleUtil.deactivate(jvmAcceptor);
  }

  protected IJVMConnector createJVMClientConnector()
  {
    JVMClientConnector jvmClientConnector = new JVMClientConnector();
    jvmClientConnector.getConfig().setBufferProvider(createBufferPool());
    jvmClientConnector.getConfig().setReceiveExecutor(createThreadPool());
    jvmClientConnector.setName(NAME);

    return jvmClientConnector;
  }

  private IBufferPool createBufferPool()
  {
    IBufferPool bufferPool = Net4jUtil.createBufferPool();
    LifecycleUtil.activate(bufferPool);
    return bufferPool;
  }

  private ExecutorService createThreadPool()
  {
    return ThreadPool.create();
  }
}
