diff --git a/tests/unit/test_lockutils.py b/tests/unit/test_lockutils.py index 43ddb6d..6b419f4 100644 --- a/tests/unit/test_lockutils.py +++ b/tests/unit/test_lockutils.py @@ -22,12 +22,9 @@ import tempfile import threading import time -import eventlet -eventlet.monkey_patch() -from eventlet import greenpool -from eventlet import greenthread from oslo.config import cfg from oslotest import base as test_base +import six from six import moves from openstack.common.fixture import config @@ -35,42 +32,6 @@ from openstack.common.fixture import lockutils as fixtures from openstack.common import lockutils -class TestFileLocks(test_base.BaseTestCase): - - def test_concurrent_green_lock_succeeds(self): - """Verify spawn_n greenthreads with two locks run concurrently.""" - tmpdir = tempfile.mkdtemp() - try: - self.completed = False - - def locka(wait): - a = lockutils.InterProcessLock(os.path.join(tmpdir, 'a')) - with a: - wait.wait() - self.completed = True - - def lockb(wait): - b = lockutils.InterProcessLock(os.path.join(tmpdir, 'b')) - with b: - wait.wait() - - wait1 = eventlet.event.Event() - wait2 = eventlet.event.Event() - pool = greenpool.GreenPool() - pool.spawn_n(locka, wait1) - pool.spawn_n(lockb, wait2) - wait2.send() - eventlet.sleep(0) - wait1.send() - pool.waitall() - - self.assertTrue(self.completed) - - finally: - if os.path.exists(tmpdir): - shutil.rmtree(tmpdir) - - class LockTestCase(test_base.BaseTestCase): def setUp(self): @@ -124,7 +85,7 @@ class LockTestCase(test_base.BaseTestCase): self.assertNotEqual(0, acquired_children) def test_lock_internally(self): - """We can lock across multiple green threads.""" + """We can lock across multiple threads.""" saved_sem_num = len(lockutils._semaphores) seen_threads = list() @@ -132,15 +93,15 @@ class LockTestCase(test_base.BaseTestCase): with lockutils.lock('testlock2', 'test-', external=False): for x in range(10): seen_threads.append(_id) - greenthread.sleep(0) threads = [] - pool = greenpool.GreenPool(10) for i in range(10): - threads.append(pool.spawn(f, i)) + thread = threading.Thread(target=f, args=(i,)) + threads.append(thread) + thread.start() for thread in threads: - thread.wait() + thread.join() self.assertEqual(len(seen_threads), 100) # Looking at the seen threads, split it into chunks of 10, and verify @@ -299,7 +260,10 @@ class LockTestCase(test_base.BaseTestCase): # Note(flaper87): Lock is not external, which means # a semaphore will be yielded with lockutils.lock("test") as sem: - self.assertTrue(isinstance(sem, threading._Semaphore)) + if six.PY2: + self.assertTrue(isinstance(sem, threading._Semaphore)) + else: + self.assertTrue(isinstance(sem, threading.Semaphore)) # NOTE(flaper87): Lock is external so an InterProcessLock # will be yielded. @@ -322,7 +286,10 @@ class LockTestCase(test_base.BaseTestCase): try: with lockutils.lock("test") as sem: - self.assertTrue(isinstance(sem, threading._Semaphore)) + if six.PY2: + self.assertTrue(isinstance(sem, threading._Semaphore)) + else: + self.assertTrue(isinstance(sem, threading.Semaphore)) with lockutils.lock("test2", external=True) as lock: self.assertTrue(lock.exists()) @@ -448,16 +415,18 @@ class FileBasedLockingTestCase(test_base.BaseTestCase): def other(param): foo(param) - thread = eventlet.spawn(other, 'other') + thread = threading.Thread(target=other, args=('other',)) + thread.start() # Make sure the other thread grabs the lock start = time.time() while not os.path.exists(os.path.join(self.lock_dir, 'foo')): if time.time() - start > 5: self.fail('Timed out waiting for thread to grab lock') time.sleep(0) - thread1 = eventlet.spawn(other, 'main') - thread1.wait() - thread.wait() + thread1 = threading.Thread(target=other, args=('main',)) + thread1.start() + thread1.join() + thread.join() self.assertEqual(call_list, ['other', 'other', 'main', 'main']) diff --git a/tests/unit/test_lockutils_eventlet.py b/tests/unit/test_lockutils_eventlet.py new file mode 100644 index 0000000..11ede9b --- /dev/null +++ b/tests/unit/test_lockutils_eventlet.py @@ -0,0 +1,60 @@ +# Copyright 2011 Justin Santa Barbara +# +# 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. + +import os +import shutil +import tempfile + +import eventlet +eventlet.monkey_patch() +from eventlet import greenpool +from oslotest import base as test_base + +from openstack.common import lockutils + + +class TestFileLocks(test_base.BaseTestCase): + + def test_concurrent_green_lock_succeeds(self): + """Verify spawn_n greenthreads with two locks run concurrently.""" + tmpdir = tempfile.mkdtemp() + try: + self.completed = False + + def locka(wait): + a = lockutils.InterProcessLock(os.path.join(tmpdir, 'a')) + with a: + wait.wait() + self.completed = True + + def lockb(wait): + b = lockutils.InterProcessLock(os.path.join(tmpdir, 'b')) + with b: + wait.wait() + + wait1 = eventlet.event.Event() + wait2 = eventlet.event.Event() + pool = greenpool.GreenPool() + pool.spawn_n(locka, wait1) + pool.spawn_n(lockb, wait2) + wait2.send() + eventlet.sleep(0) + wait1.send() + pool.waitall() + + self.assertTrue(self.completed) + + finally: + if os.path.exists(tmpdir): + shutil.rmtree(tmpdir)