/*
 * Copyright (c) 2014, 2015 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:
 *    Esteban Dugueperoux - initial API and implementation
 */
package org.eclipse.emf.cdo.tests.bugzilla;

import org.eclipse.emf.cdo.common.branch.CDOBranch;
import org.eclipse.emf.cdo.common.branch.CDOBranchChangedEvent;
import org.eclipse.emf.cdo.common.branch.CDOBranchChangedEvent.ChangeKind;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.AbstractCDOTest;
import org.eclipse.emf.cdo.tests.config.IRepositoryConfig;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.CleanRepositoriesBefore;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
import org.eclipse.emf.cdo.view.CDOView;

import org.eclipse.net4j.util.event.IEvent;
import org.eclipse.net4j.util.event.IListener;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * Test that when another client creates a branch, and we call {@link CDOBranch#getBranches()} for the first time, it calls all existing branches.
 *
 * @author Esteban Dugueperoux
 */
@Requires(IRepositoryConfig.CAPABILITY_BRANCHING)
@CleanRepositoriesBefore(reason = "Branching")
public class Bugzilla_447912_Test extends AbstractCDOTest
{
  public void testCDOBranch_getBranches() throws Exception
  {
    CDOSession session1 = openSession();
    CDOView view1 = session1.openView();
    CDOBranch mainBranchFromView1 = view1.getBranch();
    String branchB1Name = "b1";
    String branchB2Name = "b2";
    mainBranchFromView1.createBranch(branchB1Name);

    CDOSession session2 = openSession();
    CDOView view2 = session2.openView();
    CDOBranch mainBranchFromView2 = view2.getBranch();

    NewBranchNotificationListener listener = new NewBranchNotificationListener(session2);
    mainBranchFromView1.createBranch(branchB2Name);

    assertEquals("Timeout - No CDOBranchChangedEvent received.", true,
        listener.getLatch().await(DEFAULT_TIMEOUT, TimeUnit.MILLISECONDS));

    assertEquals(mainBranchFromView1.getBranches().length, mainBranchFromView2.getBranches().length);
    assertEquals(session1.getBranchManager().getMainBranch().getBranches().length, session2.getBranchManager()
        .getMainBranch().getBranches().length);
    assertEquals(2, mainBranchFromView1.getBranches().length);
    assertEquals(mainBranchFromView1.getBranches()[0].getID(), mainBranchFromView2.getBranches()[0].getID());
    assertEquals(mainBranchFromView1.getBranches()[1].getID(), mainBranchFromView2.getBranches()[1].getID());
    assertEquals(mainBranchFromView1.getBranches()[0].getName(), mainBranchFromView2.getBranches()[0].getName());
    assertEquals(mainBranchFromView1.getBranches()[1].getName(), mainBranchFromView2.getBranches()[1].getName());
    assertEquals(branchB1Name, mainBranchFromView2.getBranches()[0].getName());
    assertEquals(branchB2Name, mainBranchFromView2.getBranches()[1].getName());
  }

  /**
   * @author Esteban Dugueperoux
   */
  private static final class NewBranchNotificationListener implements IListener
  {
    private final CountDownLatch latch = new CountDownLatch(1);

    public NewBranchNotificationListener(CDOSession session)
    {
      session.getBranchManager().addListener(this);
    }

    public final CountDownLatch getLatch()
    {
      return latch;
    }

    public void notifyEvent(IEvent event)
    {
      if (event instanceof CDOBranchChangedEvent)
      {
        CDOBranchChangedEvent branchChangedEvent = (CDOBranchChangedEvent)event;
        if (branchChangedEvent.getChangeKind() == ChangeKind.CREATED)
        {
          latch.countDown();
        }
      }
    }
  }
}
