blob: 5c891c213219be611ce073b40b7431c1a438133a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013 IBM Corporation and others
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.coordinator.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.lang.ref.WeakReference;
import org.junit.Test;
import org.osgi.service.coordinator.Coordination;
import org.osgi.service.coordinator.CoordinationException;
public class BugTests extends CoordinatorTest {
@Test
public void testBug421487() throws Exception {
// Begin a thread coordination on this thread.
Coordination c1 = coordinator.begin("c1", 0); //$NON-NLS-1$
// Begin a second thread coordination on this thread.
Coordination c2 = coordinator.begin("c2", 0); //$NON-NLS-1$
// c2's enclosing coordination will be c1.
assertEquals("Wrong enclosing coordination", c1, c2.getEnclosingCoordination()); //$NON-NLS-1$
WeakReference<Coordination> reference = new WeakReference<Coordination>(c1);
// Set c1 to null so it will become weakly reachable and enqueued.
c1 = null;
// Ensure c1 becomes weakly reachable.
for (int i = 0; i < 100 && reference.get() != null; i++)
// Force garbage collection.
System.gc();
assertNull("The enclosing coordination never became weakly reachable", reference.get()); //$NON-NLS-1$
// For some reason, this delay is necessary to force the failure
// condition to occur when running "normally". The failure will occur
// without this delay when running in debug mode with or without
// breakpoints.
Thread.sleep(1000);
try {
// End the enclosed coordination.
c2.end();
} catch (CoordinationException e) {
// A CoordinationException of type ALREADY_ENDED is expected since
// the coordination was failed.
assertEquals("Wrong type", CoordinationException.ALREADY_ENDED, e.getType()); //$NON-NLS-1$
} catch (NullPointerException e) {
e.printStackTrace();
fail("Received NPE while ending the coordination"); //$NON-NLS-1$
}
}
}