blob: aabec5e33b806f926b4575189802a59ef0a9550a [file] [log] [blame]
using J2N.Threading;
using J2N.Threading.Atomic;
using Lucene.Net.Attributes;
using Lucene.Net.Support.Threading;
using Lucene.Net.Util;
using NUnit.Framework;
using RandomizedTesting.Generators;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Threading;
using System.Threading.Tasks;
using Assert = Lucene.Net.TestFramework.Assert;
namespace Lucene.Net.Support.Threading
{
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
[TestFixture]
public class ReentrantLockTest : JSR166TestCase
{
//public static void main(String[] args)
//{
// junit.textui.TestRunner.run(suite());
//}
//public static Test suite()
//{
// return new TestSuite(ReentrantLockTest.class);
//}
/**
* A runnable calling lockInterruptibly
*/
private class InterruptibleLockRunnable : ThreadJob
{
private readonly ReentrantLock @lock;
public InterruptibleLockRunnable(ReentrantLock l)
{
@lock = l;
}
public override void Run()
{
try
{
#pragma warning disable 612, 618
@lock.LockInterruptibly();
#pragma warning restore 612, 618
}
catch (System.Threading.ThreadInterruptedException)
{
// success
}
}
}
/**
* A runnable calling lockInterruptibly that expects to be
* interrupted
*/
private class InterruptedLockRunnable : ThreadJob
{
private readonly ReentrantLockTest outerInstance;
private readonly ReentrantLock @lock;
public InterruptedLockRunnable(ReentrantLockTest outerInstance, ReentrantLock l)
{
this.outerInstance = outerInstance;
@lock = l;
}
public override void Run()
{
try
{
#pragma warning disable 612, 618
@lock.LockInterruptibly();
#pragma warning restore 612, 618
outerInstance.threadShouldThrow();
}
catch (System.Threading.ThreadInterruptedException)
{
// success
}
}
}
///**
// * Subclass to expose protected methods
// */
//static class PublicReentrantLock extends ReentrantLock
//{
// PublicReentrantLock() { super(); }
// public Collection<Thread> getQueuedThreads()
// {
// return super.getQueuedThreads();
// }
// public Collection<Thread> getWaitingThreads(Condition c)
// {
// return super.getWaitingThreads(c);
// }
//}
///**
// * Constructor sets given fairness
// */
//public void testConstructor()
//{
// ReentrantLock rl = new ReentrantLock();
// assertFalse(rl.isFair());
// ReentrantLock r2 = new ReentrantLock(true);
// assertTrue(r2.isFair());
//}
///**
// * locking an unlocked lock succeeds
// */
//[Test]
//public void TestLock()
//{
// ReentrantLock rl = new ReentrantLock();
// rl.Lock();
// assertTrue(rl.IsLocked);
// rl.Unlock();
//}
///**
// * locking an unlocked fair lock succeeds
// */
//public void testFairLock()
//{
// ReentrantLock rl = new ReentrantLock(true);
// rl.lock () ;
// assertTrue(rl.isLocked());
// rl.unlock();
//}
/**
* Unlocking an unlocked lock throws IllegalMonitorStateException
*/
[Test]
public void TestUnlock_IllegalMonitorStateException()
{
ReentrantLock rl = new ReentrantLock();
try
{
rl.Unlock();
shouldThrow();
}
catch (SynchronizationLockException)
{
// success
}
}
///**
// * tryLock on an unlocked lock succeeds
// */
//[Test]
//public void TestTryLock()
//{
// ReentrantLock rl = new ReentrantLock();
// assertTrue(rl.TryLock());
// assertTrue(rl.IsLocked);
// rl.Unlock();
//}
///**
// * hasQueuedThreads reports whether there are waiting threads
// */
//[Test]
//[Ignore("Behavior differs from Java around interrupts, but Lucene.NET doesn't support interrupts or use this property.")]
//public void TesthasQueuedThreads()
//{
// ReentrantLock @lock = new ReentrantLock();
// ThreadJob t1 = new InterruptedLockRunnable(this, @lock);
// ThreadJob t2 = new InterruptibleLockRunnable(@lock);
// try
// {
// assertFalse(@lock.HasQueuedThreads);
// @lock.Lock();
// t1.Start();
// Thread.Sleep(SHORT_DELAY_MS);
// assertTrue(@lock.HasQueuedThreads);
// t2.Start();
// Thread.Sleep(SHORT_DELAY_MS);
// assertTrue(@lock.HasQueuedThreads);
// t1.Interrupt();
// Thread.Sleep(SHORT_DELAY_MS);
// assertTrue(@lock.HasQueuedThreads);
// @lock.Unlock();
// Thread.Sleep(SHORT_DELAY_MS);
// //assertFalse(@lock.HasQueuedThreads); // LUCENENET: Behavior differs from Java around interrupts, but Lucene.NET doesn't support interrupts or use this property.
// t1.Join();
// t2.Join();
// assertFalse(@lock.HasQueuedThreads); // LUCENENET: Added assert
// }
// catch (Exception e) when (e.IsException())
// {
// unexpectedException();
// }
//}
///**
// * getQueueLength reports number of waiting threads
// */
//[Test]
//[Ignore("Behavior differs from Java around interrupts, but Lucene.NET doesn't support interrupts or use this property.")]
//public void TestGetQueueLength()
//{
// ReentrantLock @lock = new ReentrantLock();
// ThreadJob t1 = new InterruptedLockRunnable(this, @lock);
// ThreadJob t2 = new InterruptibleLockRunnable(@lock);
// try
// {
// assertEquals(0, @lock.QueueLength);
// @lock.Lock();
// t1.Start();
// Thread.Sleep(SHORT_DELAY_MS);
// assertEquals(1, @lock.QueueLength);
// t2.Start();
// Thread.Sleep(SHORT_DELAY_MS);
// assertEquals(2, @lock.QueueLength);
// t1.Interrupt();
// Thread.Sleep(SHORT_DELAY_MS);
// assertEquals(1, @lock.QueueLength);
// @lock.Unlock();
// Thread.Sleep(SHORT_DELAY_MS);
// //assertEquals(0, @lock.QueueLength); // LUCENENET: Behavior differs from Java around interrupts, but Lucene.NET doesn't support interrupts or use this property.
// t1.Join();
// t2.Join();
// assertEquals(0, @lock.QueueLength); // LUCENENET: Added assert
// }
// catch (Exception e) when (e.IsException())
// {
// unexpectedException();
// }
//}
///**
// * getQueueLength reports number of waiting threads
// */
//public void testGetQueueLength_fair()
//{
// final ReentrantLock lock = new ReentrantLock(true);
// Thread t1 = new Thread(new InterruptedLockRunnable(lock));
// Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
// try
// {
// assertEquals(0, lock.getQueueLength()) ;
// lock.lock () ;
// t1.start();
// Thread.sleep(SHORT_DELAY_MS);
// assertEquals(1, lock.getQueueLength()) ;
// t2.start();
// Thread.sleep(SHORT_DELAY_MS);
// assertEquals(2, lock.getQueueLength()) ;
// t1.interrupt();
// Thread.sleep(SHORT_DELAY_MS);
// assertEquals(1, lock.getQueueLength()) ;
// lock.unlock();
// Thread.sleep(SHORT_DELAY_MS);
// assertEquals(0, lock.getQueueLength()) ;
// t1.join();
// t2.join();
// }
// catch (Exception e)
// {
// unexpectedException();
// }
//}
///**
// * hasQueuedThread(null) throws NPE
// */
//public void testHasQueuedThreadNPE()
//{
// final ReentrantLock sync = new ReentrantLock();
// try
// {
// sync.hasQueuedThread(null);
// shouldThrow();
// }
// catch (NullPointerException success)
// {
// }
//}
///**
// * hasQueuedThread reports whether a thread is queued.
// */
//public void testHasQueuedThread()
//{
// final ReentrantLock sync = new ReentrantLock();
// Thread t1 = new Thread(new InterruptedLockRunnable(sync));
// Thread t2 = new Thread(new InterruptibleLockRunnable(sync));
// try
// {
// assertFalse(sync.hasQueuedThread(t1));
// assertFalse(sync.hasQueuedThread(t2));
// sync.lock () ;
// t1.start();
// Thread.sleep(SHORT_DELAY_MS);
// assertTrue(sync.hasQueuedThread(t1));
// t2.start();
// Thread.sleep(SHORT_DELAY_MS);
// assertTrue(sync.hasQueuedThread(t1));
// assertTrue(sync.hasQueuedThread(t2));
// t1.interrupt();
// Thread.sleep(SHORT_DELAY_MS);
// assertFalse(sync.hasQueuedThread(t1));
// assertTrue(sync.hasQueuedThread(t2));
// sync.unlock();
// Thread.sleep(SHORT_DELAY_MS);
// assertFalse(sync.hasQueuedThread(t1));
// Thread.sleep(SHORT_DELAY_MS);
// assertFalse(sync.hasQueuedThread(t2));
// t1.join();
// t2.join();
// }
// catch (Exception e)
// {
// unexpectedException();
// }
//}
///**
// * getQueuedThreads includes waiting threads
// */
//public void testGetQueuedThreads()
//{
// final PublicReentrantLock lock = new PublicReentrantLock();
// Thread t1 = new Thread(new InterruptedLockRunnable(lock));
// Thread t2 = new Thread(new InterruptibleLockRunnable(lock));
// try
// {
// assertTrue(lock.getQueuedThreads().isEmpty()) ;
// lock.lock () ;
// assertTrue(lock.getQueuedThreads().isEmpty()) ;
// t1.start();
// Thread.sleep(SHORT_DELAY_MS);
// assertTrue(lock.getQueuedThreads().contains(t1)) ;
// t2.start();
// Thread.sleep(SHORT_DELAY_MS);
// assertTrue(lock.getQueuedThreads().contains(t1)) ;
// assertTrue(lock.getQueuedThreads().contains(t2)) ;
// t1.interrupt();
// Thread.sleep(SHORT_DELAY_MS);
// assertFalse(lock.getQueuedThreads().contains(t1)) ;
// assertTrue(lock.getQueuedThreads().contains(t2)) ;
// lock.unlock();
// Thread.sleep(SHORT_DELAY_MS);
// assertTrue(lock.getQueuedThreads().isEmpty()) ;
// t1.join();
// t2.join();
// }
// catch (Exception e)
// {
// unexpectedException();
// }
//}
///**
// * timed tryLock is interruptible.
// */
//public void testInterruptedException2()
//{
// final ReentrantLock lock = new ReentrantLock();
// lock.lock () ;
// Thread t = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.tryLock(MEDIUM_DELAY_MS, TimeUnit.MILLISECONDS);
// threadShouldThrow();
// }
// catch (InterruptedException success) { }
// }
// });
// try {
// t.start();
// t.interrupt();
// } catch(Exception e){
// unexpectedException();
// }
//}
/**
* TryLock on a locked lock fails
*/
[Test]
public void TestTryLockWhenLocked()
{
ReentrantLock @lock = new ReentrantLock();
@lock.Lock();
Thread t = new Thread(() =>
{
threadAssertFalse(@lock.TryLock());
});
try
{
t.Start();
t.Join();
@lock.Unlock();
}
catch (Exception e) when (e.IsException())
{
unexpectedException();
}
}
///**
// * Timed tryLock on a locked lock times out
// */
//public void testTryLock_Timeout()
//{
// final ReentrantLock lock = new ReentrantLock();
// lock.lock () ;
// Thread t = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// threadAssertFalse(lock.tryLock(1, TimeUnit.MILLISECONDS)) ;
// }
// catch (Exception ex)
// {
// threadUnexpectedException();
// }
// }
// });
// try {
// t.start();
// t.join();
// lock.unlock();
// } catch(Exception e){
// unexpectedException();
// }
//}
///**
// * getHoldCount returns number of recursive holds
// */
//[Test]
//public void testGetHoldCount()
//{
// ReentrantLock @lock = new ReentrantLock();
// for (int i = 1; i <= SIZE; i++)
// {
// @lock.lock () ;
// assertEquals(i, @lock.getHoldCount()) ;
// }
// for (int i = SIZE; i > 0; i--)
// {
// @lock.Unlock();
// assertEquals(i - 1, @lock.getHoldCount()) ;
// }
//}
///**
// * isLocked is true when locked and false when not
// */
//[Test]
//public void TestIsLocked()
//{
// ReentrantLock @lock = new ReentrantLock();
// @lock.Lock();
// assertTrue(@lock.IsLocked);
// @lock.Unlock();
// assertFalse(@lock.IsLocked);
// Thread t = new Thread(() =>
// {
// @lock.Lock();
// try
// {
// Thread.Sleep(SMALL_DELAY_MS);
// }
// catch (Exception e)
// {
// threadUnexpectedException();
// }
// @lock.Unlock();
// });
// try
// {
// t.Start();
// Thread.Sleep(SHORT_DELAY_MS);
// assertTrue(@lock.IsLocked);
// t.Join();
// assertFalse(@lock.IsLocked);
// }
// catch (Exception e) when (e.IsException())
// {
// unexpectedException();
// }
//}
/**
* lockInterruptibly is interruptible.
*/
[Test]
[Ignore("LUCENENET: LockInterruptibly() is broken, but it is not in use anywhere but in the tests. Technically, Lucene.NET does not support Thread.Interrupt().")]
public void TestLockInterruptibly1()
{
ReentrantLock @lock = new ReentrantLock();
@lock.Lock();
ThreadJob t = new InterruptedLockRunnable(this, @lock);
try
{
t.Start();
Thread.Sleep(SHORT_DELAY_MS);
t.Interrupt();
Thread.Sleep(SHORT_DELAY_MS);
@lock.Unlock();
t.Join();
}
catch (Exception e) when (e.IsException())
{
unexpectedException();
}
}
///**
// * lockInterruptibly succeeds when unlocked, else is interruptible
// */
//[Test]
//[Ignore("LUCENENET: LockInterruptibly() is broken, but it is not in use anywhere but in the tests. Technically, Lucene.NET does not support Thread.Interrupt().")]
//public void TestLockInterruptibly2()
//{
// ReentrantLock @lock = new ReentrantLock();
// try
// {
// @lock.LockInterruptibly();
// }
// catch (Exception e) when (e.IsException())
// {
// unexpectedException();
// }
// ThreadJob t = new InterruptedLockRunnable(this, @lock);
// try
// {
// t.Start();
// t.Interrupt();
// assertTrue(@lock.IsLocked);
// assertTrue(@lock.IsHeldByCurrentThread);
// t.Join();
// }
// catch (Exception e) when (e.IsException())
// {
// unexpectedException();
// }
//}
///**
// * Calling await without holding lock throws IllegalMonitorStateException
// */
//public void testAwait_IllegalMonitor()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// try
// {
// c.await();
// shouldThrow();
// }
// catch (IllegalMonitorStateException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * Calling signal without holding lock throws IllegalMonitorStateException
// */
//public void testSignal_IllegalMonitor()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// try
// {
// c.signal();
// shouldThrow();
// }
// catch (IllegalMonitorStateException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * awaitNanos without a signal times out
// */
//public void testAwaitNanos_Timeout()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// try
// {
// lock.lock () ;
// long t = c.awaitNanos(100);
// assertTrue(t <= 0);
// lock.unlock();
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * timed await without a signal times out
// */
//public void testAwait_Timeout()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// try
// {
// lock.lock () ;
// c.await(SHORT_DELAY_MS, TimeUnit.MILLISECONDS);
// lock.unlock();
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * awaitUntil without a signal times out
// */
//public void testAwaitUntil_Timeout()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// try
// {
// lock.lock () ;
// java.util.Date d = new java.util.Date();
// c.awaitUntil(new java.util.Date(d.getTime() + 10));
// lock.unlock();
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * await returns when signalled
// */
//public void testAwait()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// Thread t = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// c.await();
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// try {
// t.start();
// Thread.sleep(SHORT_DELAY_MS);
// lock.lock();
// c.signal();
// lock.unlock();
// t.join(SHORT_DELAY_MS);
// assertFalse(t.isAlive());
// }
// catch (Exception ex) {
// unexpectedException();
// }
//}
///**
// * hasWaiters throws NPE if null
// */
//public void testHasWaitersNPE()
//{
// final ReentrantLock lock = new ReentrantLock();
// try
// {
// lock.hasWaiters(null);
// shouldThrow();
// }
// catch (NullPointerException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * getWaitQueueLength throws NPE if null
// */
//public void testGetWaitQueueLengthNPE()
//{
// final ReentrantLock lock = new ReentrantLock();
// try
// {
// lock.getWaitQueueLength(null);
// shouldThrow();
// }
// catch (NullPointerException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * getWaitingThreads throws NPE if null
// */
//public void testGetWaitingThreadsNPE()
//{
// final PublicReentrantLock lock = new PublicReentrantLock();
// try
// {
// lock.getWaitingThreads(null);
// shouldThrow();
// }
// catch (NullPointerException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * hasWaiters throws IAE if not owned
// */
//public void testHasWaitersIAE()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = (lock.newCondition()) ;
// final ReentrantLock lock2 = new ReentrantLock();
// try
// {
// lock2.hasWaiters(c);
// shouldThrow();
// }
// catch (IllegalArgumentException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * hasWaiters throws IMSE if not locked
// */
//public void testHasWaitersIMSE()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = (lock.newCondition()) ;
// try
// {
// lock.hasWaiters(c);
// shouldThrow();
// }
// catch (IllegalMonitorStateException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * getWaitQueueLength throws IAE if not owned
// */
//public void testGetWaitQueueLengthIAE()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = (lock.newCondition()) ;
// final ReentrantLock lock2 = new ReentrantLock();
// try
// {
// lock2.getWaitQueueLength(c);
// shouldThrow();
// }
// catch (IllegalArgumentException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * getWaitQueueLength throws IMSE if not locked
// */
//public void testGetWaitQueueLengthIMSE()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = (lock.newCondition()) ;
// try
// {
// lock.getWaitQueueLength(c);
// shouldThrow();
// }
// catch (IllegalMonitorStateException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * getWaitingThreads throws IAE if not owned
// */
//public void testGetWaitingThreadsIAE()
//{
// final PublicReentrantLock lock = new PublicReentrantLock();
// final Condition c = (lock.newCondition()) ;
// final PublicReentrantLock lock2 = new PublicReentrantLock();
// try
// {
// lock2.getWaitingThreads(c);
// shouldThrow();
// }
// catch (IllegalArgumentException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * getWaitingThreads throws IMSE if not locked
// */
//public void testGetWaitingThreadsIMSE()
//{
// final PublicReentrantLock lock = new PublicReentrantLock();
// final Condition c = (lock.newCondition()) ;
// try
// {
// lock.getWaitingThreads(c);
// shouldThrow();
// }
// catch (IllegalMonitorStateException success)
// {
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * hasWaiters returns true when a thread is waiting, else false
// */
//public void testHasWaiters()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// Thread t = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// threadAssertFalse(lock.hasWaiters(c)) ;
// threadAssertEquals(0, lock.getWaitQueueLength(c)) ;
// c.await();
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// try
// {
// t.start();
// Thread.sleep(SHORT_DELAY_MS);
// lock.lock () ;
// assertTrue(lock.hasWaiters(c)) ;
// assertEquals(1, lock.getWaitQueueLength(c)) ;
// c.signal();
// lock.unlock();
// Thread.sleep(SHORT_DELAY_MS);
// lock.lock () ;
// assertFalse(lock.hasWaiters(c)) ;
// assertEquals(0, lock.getWaitQueueLength(c)) ;
// lock.unlock();
// t.join(SHORT_DELAY_MS);
// assertFalse(t.isAlive());
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * getWaitQueueLength returns number of waiting threads
// */
//public void testGetWaitQueueLength()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// Thread t1 = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// threadAssertFalse(lock.hasWaiters(c)) ;
// threadAssertEquals(0, lock.getWaitQueueLength(c)) ;
// c.await();
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// Thread t2 = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// threadAssertTrue(lock.hasWaiters(c)) ;
// threadAssertEquals(1, lock.getWaitQueueLength(c)) ;
// c.await();
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// try
// {
// t1.start();
// Thread.sleep(SHORT_DELAY_MS);
// t2.start();
// Thread.sleep(SHORT_DELAY_MS);
// lock.lock () ;
// assertTrue(lock.hasWaiters(c)) ;
// assertEquals(2, lock.getWaitQueueLength(c)) ;
// c.signalAll();
// lock.unlock();
// Thread.sleep(SHORT_DELAY_MS);
// lock.lock () ;
// assertFalse(lock.hasWaiters(c)) ;
// assertEquals(0, lock.getWaitQueueLength(c)) ;
// lock.unlock();
// t1.join(SHORT_DELAY_MS);
// t2.join(SHORT_DELAY_MS);
// assertFalse(t1.isAlive());
// assertFalse(t2.isAlive());
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * getWaitingThreads returns only and all waiting threads
// */
//public void testGetWaitingThreads()
//{
// final PublicReentrantLock lock = new PublicReentrantLock();
// final Condition c = lock.newCondition();
// Thread t1 = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// threadAssertTrue(lock.getWaitingThreads(c).isEmpty()) ;
// c.await();
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// Thread t2 = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// threadAssertFalse(lock.getWaitingThreads(c).isEmpty()) ;
// c.await();
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// try
// {
// lock.lock () ;
// assertTrue(lock.getWaitingThreads(c).isEmpty()) ;
// lock.unlock();
// t1.start();
// Thread.sleep(SHORT_DELAY_MS);
// t2.start();
// Thread.sleep(SHORT_DELAY_MS);
// lock.lock () ;
// assertTrue(lock.hasWaiters(c)) ;
// assertTrue(lock.getWaitingThreads(c).contains(t1)) ;
// assertTrue(lock.getWaitingThreads(c).contains(t2)) ;
// c.signalAll();
// lock.unlock();
// Thread.sleep(SHORT_DELAY_MS);
// lock.lock () ;
// assertFalse(lock.hasWaiters(c)) ;
// assertTrue(lock.getWaitingThreads(c).isEmpty()) ;
// lock.unlock();
// t1.join(SHORT_DELAY_MS);
// t2.join(SHORT_DELAY_MS);
// assertFalse(t1.isAlive());
// assertFalse(t2.isAlive());
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///** A helper class for uninterruptible wait tests */
//class UninterruptableThread extends Thread
//{
// private ReentrantLock lock;
// private Condition c;
// public volatile boolean canAwake = false;
// public volatile boolean interrupted = false;
// public volatile boolean lockStarted = false;
// public UninterruptableThread(ReentrantLock lock, Condition c)
// {
// this.lock = lock;
// this.c = c;
// }
// public synchronized void run()
// {
// lock.lock () ;
// lockStarted = true;
// while (!canAwake)
// {
// c.awaitUninterruptibly();
// }
// interrupted = isInterrupted();
// lock.unlock();
// }
//}
///**
// * awaitUninterruptibly doesn't abort on interrupt
// */
//public void testAwaitUninterruptibly()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// UninterruptableThread thread = new UninterruptableThread(lock, c);
// try
// {
// thread.start();
// while (!thread.lockStarted)
// {
// Thread.sleep(100);
// }
// lock.lock () ;
// try
// {
// thread.interrupt();
// thread.canAwake = true;
// c.signal();
// }
// finally
// {
// lock.unlock();
// }
// thread.join();
// assertTrue(thread.interrupted);
// assertFalse(thread.isAlive());
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * await is interruptible
// */
//public void testAwait_Interrupt()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// Thread t = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// c.await();
// lock.unlock();
// threadShouldThrow();
// }
// catch (InterruptedException success)
// {
// }
// }
// });
// try {
// t.start();
// Thread.sleep(SHORT_DELAY_MS);
// t.interrupt();
// t.join(SHORT_DELAY_MS);
// assertFalse(t.isAlive());
// }
// catch (Exception ex) {
// unexpectedException();
// }
//}
///**
// * awaitNanos is interruptible
// */
//public void testAwaitNanos_Interrupt()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// Thread t = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// c.awaitNanos(1000 * 1000 * 1000); // 1 sec
// lock.unlock();
// threadShouldThrow();
// }
// catch (InterruptedException success)
// {
// }
// }
// });
// try
// {
// t.start();
// Thread.sleep(SHORT_DELAY_MS);
// t.interrupt();
// t.join(SHORT_DELAY_MS);
// assertFalse(t.isAlive());
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * awaitUntil is interruptible
// */
//public void testAwaitUntil_Interrupt()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// Thread t = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// java.util.Date d = new java.util.Date();
// c.awaitUntil(new java.util.Date(d.getTime() + 10000));
// lock.unlock();
// threadShouldThrow();
// }
// catch (InterruptedException success)
// {
// }
// }
// });
// try
// {
// t.start();
// Thread.sleep(SHORT_DELAY_MS);
// t.interrupt();
// t.join(SHORT_DELAY_MS);
// assertFalse(t.isAlive());
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * signalAll wakes up all threads
// */
//public void testSignalAll()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// Thread t1 = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// c.await();
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// Thread t2 = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// c.await();
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// try
// {
// t1.start();
// t2.start();
// Thread.sleep(SHORT_DELAY_MS);
// lock.lock () ;
// c.signalAll();
// lock.unlock();
// t1.join(SHORT_DELAY_MS);
// t2.join(SHORT_DELAY_MS);
// assertFalse(t1.isAlive());
// assertFalse(t2.isAlive());
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * await after multiple reentrant locking preserves lock count
// */
//public void testAwaitLockCount()
//{
// final ReentrantLock lock = new ReentrantLock();
// final Condition c = lock.newCondition();
// Thread t1 = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// threadAssertEquals(1, lock.getHoldCount()) ;
// c.await();
// threadAssertEquals(1, lock.getHoldCount()) ;
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// Thread t2 = new Thread(new Runnable()
// {
// public void run()
// {
// try
// {
// lock.lock () ;
// lock.lock () ;
// threadAssertEquals(2, lock.getHoldCount()) ;
// c.await();
// threadAssertEquals(2, lock.getHoldCount()) ;
// lock.unlock();
// lock.unlock();
// }
// catch (InterruptedException e)
// {
// threadUnexpectedException();
// }
// }
// });
// try
// {
// t1.start();
// t2.start();
// Thread.sleep(SHORT_DELAY_MS);
// lock.lock () ;
// c.signalAll();
// lock.unlock();
// t1.join(SHORT_DELAY_MS);
// t2.join(SHORT_DELAY_MS);
// assertFalse(t1.isAlive());
// assertFalse(t2.isAlive());
// }
// catch (Exception ex)
// {
// unexpectedException();
// }
//}
///**
// * A serialized lock deserializes as unlocked
// */
//public void testSerialization()
//{
// ReentrantLock l = new ReentrantLock();
// l.lock () ;
// l.unlock();
// try
// {
// ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
// ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
// out.writeObject(l);
// out.close();
// ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
// ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
// ReentrantLock r = (ReentrantLock) in.readObject();
// r.lock () ;
// r.unlock();
// }
// catch (Exception e)
// {
// e.printStackTrace();
// unexpectedException();
// }
//}
/**
* toString indicates current lock state
*/
[Test]
[Ignore("LUCENENET: Not implemented")]
public void TestToString()
{
ReentrantLock @lock = new ReentrantLock();
string us = @lock.ToString();
assertTrue(us.IndexOf("Unlocked", StringComparison.Ordinal) >= 0);
@lock.Lock();
string ls = @lock.ToString();
assertTrue(ls.IndexOf("Locked", StringComparison.Ordinal) >= 0);
}
//[Test]
//[LuceneNetSpecific]
//public void TestReentry()
//{
// ReentrantLock @lock = new ReentrantLock();
// assertFalse(@lock.IsLocked);
// @lock.Lock();
// assertTrue(@lock.IsLocked);
// @lock.TryLock();
// assertTrue(@lock.IsLocked);
// @lock.Lock();
// assertTrue(@lock.IsLocked);
// // Now unwind the stack
// @lock.Unlock();
// assertTrue(@lock.IsLocked);
// @lock.Unlock();
// assertTrue(@lock.IsLocked);
// @lock.Unlock();
// assertFalse(@lock.IsLocked);
// Assert.Throws<SynchronizationLockException>(() => @lock.Unlock());
//}
//[Test]
//[LuceneNetSpecific]
//public async Task TestReentryWithTasks()
//{
// var @lock = new ReentrantLock();
// assertFalse(@lock.IsLocked);
// var task1 = Task.Run(() =>
// {
// @lock.Lock();
// assertEquals(1, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// @lock.TryLock();
// assertEquals(2, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// @lock.Lock();
// assertEquals(3, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// // Simulate work
// Thread.Sleep(300);
// // Now unwind the stack
// @lock.Unlock();
// assertEquals(2, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// @lock.Unlock();
// assertEquals(1, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// //lock (@lock.syncLock)
// {
// @lock.Unlock();
// assertEquals(0, @lock.reentrantCount.Value);
// assertFalse(@lock.IsLocked);
// }
// Assert.Throws<SynchronizationLockException>(() => @lock.Unlock());
// });
// var task2 = Task.Run(async () =>
// {
// // Wait a bit to ensure task1 has started and locked
// await Task.Delay(100);
// // Try to lock
// @lock.Lock();
// // Simulate work
// Thread.Sleep(100);
// //lock (@lock.syncLock)
// {
// @lock.Unlock();
// assertEquals(0, @lock.reentrantCount.Value);
// assertFalse(@lock.IsLocked);
// }
// Assert.Throws<SynchronizationLockException>(() => @lock.Unlock());
// });
// await Task.WhenAll(task1, task2);
//}
//#if DEBUG
// private static void DoWorkReentrant(ReentrantLock @lock)
// {
// @lock.Lock();
// assertEquals(1, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// @lock.TryLock();
// assertEquals(2, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// @lock.Lock();
// assertEquals(3, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// // Simulate work
// Thread.Sleep(300);
// // Now unwind the stack
// @lock.Unlock();
// assertEquals(2, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// @lock.Unlock();
// assertEquals(1, @lock.reentrantCount.Value);
// assertTrue(@lock.IsLocked);
// lock (@lock.syncLock)
// {
// @lock.Unlock();
// assertEquals(0, @lock.reentrantCount.Value);
// assertFalse(@lock.IsLocked);
// }
// Assert.Throws<SynchronizationLockException>(() => @lock.Unlock());
// }
// [Test]
// [Slow]
// [LuceneNetSpecific]
// public void TestQueueCompletionWithTasks()
// {
// var @lock = new ReentrantLock();
// assertEquals(0, @lock.queueCount);
// assertEquals(0, @lock.dequeueCount);
// assertEquals(0, @lock.poolReturnCount);
// var tasks = new List<Task>();
// for (int i = 0; i < 10; i++)
// {
// tasks.Add(Task.Factory.StartNew((@lock) =>
// {
// DoWorkReentrant((ReentrantLock)@lock);
// }, @lock));
// }
// // Wait for all tasks to complete
// Task.WaitAll(tasks.ToArray());
// // Make sure everything that was queued has also been dequeued
// assertTrue(@lock.queueCount > 0);
// assertEquals(@lock.queueCount, @lock.dequeueCount);
// assertEquals(@lock.queueCount, @lock.poolReturnCount);
// Console.WriteLine($"{nameof(@lock.queueCount)}: {@lock.queueCount}");
// Console.WriteLine($"{nameof(@lock.dequeueCount)}: {@lock.dequeueCount}");
// Console.WriteLine($"{nameof(@lock.poolReturnCount)}: {@lock.poolReturnCount}");
// }
//#endif
}
}