Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.workerpool_unittest.py @ 18215385

History | View | Annotate | Download (3.5 kB)

1 76094e37 Michael Hanselmann
#!/usr/bin/python
2 76094e37 Michael Hanselmann
#
3 76094e37 Michael Hanselmann
4 76094e37 Michael Hanselmann
# Copyright (C) 2008 Google Inc.
5 76094e37 Michael Hanselmann
#
6 76094e37 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 76094e37 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 76094e37 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 76094e37 Michael Hanselmann
# (at your option) any later version.
10 76094e37 Michael Hanselmann
#
11 76094e37 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 76094e37 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 76094e37 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 76094e37 Michael Hanselmann
# General Public License for more details.
15 76094e37 Michael Hanselmann
#
16 76094e37 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 76094e37 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 76094e37 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 76094e37 Michael Hanselmann
# 02110-1301, USA.
20 76094e37 Michael Hanselmann
21 76094e37 Michael Hanselmann
22 76094e37 Michael Hanselmann
"""Script for unittesting the workerpool module"""
23 76094e37 Michael Hanselmann
24 76094e37 Michael Hanselmann
import unittest
25 76094e37 Michael Hanselmann
import threading
26 76094e37 Michael Hanselmann
import time
27 76094e37 Michael Hanselmann
import sys
28 76094e37 Michael Hanselmann
import zlib
29 76094e37 Michael Hanselmann
30 76094e37 Michael Hanselmann
from ganeti import workerpool
31 76094e37 Michael Hanselmann
32 25231ec5 Michael Hanselmann
import testutils
33 25231ec5 Michael Hanselmann
34 76094e37 Michael Hanselmann
35 76094e37 Michael Hanselmann
class DummyBaseWorker(workerpool.BaseWorker):
36 76094e37 Michael Hanselmann
  def RunTask(self, text):
37 76094e37 Michael Hanselmann
    pass
38 76094e37 Michael Hanselmann
39 76094e37 Michael Hanselmann
40 76094e37 Michael Hanselmann
class ChecksumContext:
41 76094e37 Michael Hanselmann
  CHECKSUM_START = zlib.adler32("")
42 76094e37 Michael Hanselmann
43 76094e37 Michael Hanselmann
  def __init__(self):
44 76094e37 Michael Hanselmann
    self.lock = threading.Condition(threading.Lock())
45 76094e37 Michael Hanselmann
    self.checksum = self.CHECKSUM_START
46 76094e37 Michael Hanselmann
47 76094e37 Michael Hanselmann
  @staticmethod
48 76094e37 Michael Hanselmann
  def UpdateChecksum(current, value):
49 76094e37 Michael Hanselmann
    return zlib.adler32(str(value), current)
50 76094e37 Michael Hanselmann
51 76094e37 Michael Hanselmann
52 76094e37 Michael Hanselmann
class ChecksumBaseWorker(workerpool.BaseWorker):
53 76094e37 Michael Hanselmann
  def RunTask(self, ctx, number):
54 76094e37 Michael Hanselmann
    ctx.lock.acquire()
55 76094e37 Michael Hanselmann
    try:
56 76094e37 Michael Hanselmann
      ctx.checksum = ctx.UpdateChecksum(ctx.checksum, number)
57 76094e37 Michael Hanselmann
    finally:
58 76094e37 Michael Hanselmann
      ctx.lock.release()
59 76094e37 Michael Hanselmann
60 76094e37 Michael Hanselmann
61 76094e37 Michael Hanselmann
class TestWorkerpool(unittest.TestCase):
62 76094e37 Michael Hanselmann
  """Workerpool tests"""
63 76094e37 Michael Hanselmann
64 76094e37 Michael Hanselmann
  def testDummy(self):
65 89e2b4d2 Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 3, DummyBaseWorker)
66 76094e37 Michael Hanselmann
    try:
67 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 3)
68 76094e37 Michael Hanselmann
69 f1501b3f Michael Hanselmann
      for i in range(10):
70 76094e37 Michael Hanselmann
        wp.AddTask("Hello world %s" % i)
71 76094e37 Michael Hanselmann
72 76094e37 Michael Hanselmann
      wp.Quiesce()
73 76094e37 Michael Hanselmann
    finally:
74 76094e37 Michael Hanselmann
      wp.TerminateWorkers()
75 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
76 76094e37 Michael Hanselmann
77 76094e37 Michael Hanselmann
  def testNoTasks(self):
78 89e2b4d2 Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 3, DummyBaseWorker)
79 76094e37 Michael Hanselmann
    try:
80 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 3)
81 76094e37 Michael Hanselmann
      self._CheckNoTasks(wp)
82 76094e37 Michael Hanselmann
    finally:
83 76094e37 Michael Hanselmann
      wp.TerminateWorkers()
84 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
85 76094e37 Michael Hanselmann
86 76094e37 Michael Hanselmann
  def testNoTasksQuiesce(self):
87 89e2b4d2 Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 3, DummyBaseWorker)
88 76094e37 Michael Hanselmann
    try:
89 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 3)
90 76094e37 Michael Hanselmann
      self._CheckNoTasks(wp)
91 76094e37 Michael Hanselmann
      wp.Quiesce()
92 76094e37 Michael Hanselmann
      self._CheckNoTasks(wp)
93 76094e37 Michael Hanselmann
    finally:
94 76094e37 Michael Hanselmann
      wp.TerminateWorkers()
95 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
96 76094e37 Michael Hanselmann
97 76094e37 Michael Hanselmann
  def testChecksum(self):
98 76094e37 Michael Hanselmann
    # Tests whether all tasks are run and, since we're only using a single
99 76094e37 Michael Hanselmann
    # thread, whether everything is started in order.
100 89e2b4d2 Michael Hanselmann
    wp = workerpool.WorkerPool("Test", 1, ChecksumBaseWorker)
101 76094e37 Michael Hanselmann
    try:
102 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 1)
103 76094e37 Michael Hanselmann
104 76094e37 Michael Hanselmann
      ctx = ChecksumContext()
105 76094e37 Michael Hanselmann
      checksum = ChecksumContext.CHECKSUM_START
106 f1501b3f Michael Hanselmann
      for i in range(1, 100):
107 76094e37 Michael Hanselmann
        checksum = ChecksumContext.UpdateChecksum(checksum, i)
108 76094e37 Michael Hanselmann
        wp.AddTask(ctx, i)
109 76094e37 Michael Hanselmann
110 76094e37 Michael Hanselmann
      wp.Quiesce()
111 76094e37 Michael Hanselmann
112 76094e37 Michael Hanselmann
      self._CheckNoTasks(wp)
113 76094e37 Michael Hanselmann
114 76094e37 Michael Hanselmann
      # Check sum
115 76094e37 Michael Hanselmann
      ctx.lock.acquire()
116 76094e37 Michael Hanselmann
      try:
117 76094e37 Michael Hanselmann
        self.assertEqual(checksum, ctx.checksum)
118 76094e37 Michael Hanselmann
      finally:
119 76094e37 Michael Hanselmann
        ctx.lock.release()
120 76094e37 Michael Hanselmann
    finally:
121 76094e37 Michael Hanselmann
      wp.TerminateWorkers()
122 76094e37 Michael Hanselmann
      self._CheckWorkerCount(wp, 0)
123 76094e37 Michael Hanselmann
124 76094e37 Michael Hanselmann
  def _CheckNoTasks(self, wp):
125 76094e37 Michael Hanselmann
    wp._lock.acquire()
126 76094e37 Michael Hanselmann
    try:
127 76094e37 Michael Hanselmann
      # The task queue must be empty now
128 76094e37 Michael Hanselmann
      self.failUnless(not wp._tasks)
129 76094e37 Michael Hanselmann
    finally:
130 76094e37 Michael Hanselmann
      wp._lock.release()
131 76094e37 Michael Hanselmann
132 76094e37 Michael Hanselmann
  def _CheckWorkerCount(self, wp, num_workers):
133 76094e37 Michael Hanselmann
    wp._lock.acquire()
134 76094e37 Michael Hanselmann
    try:
135 76094e37 Michael Hanselmann
      self.assertEqual(len(wp._workers), num_workers)
136 76094e37 Michael Hanselmann
    finally:
137 76094e37 Michael Hanselmann
      wp._lock.release()
138 76094e37 Michael Hanselmann
139 76094e37 Michael Hanselmann
140 76094e37 Michael Hanselmann
if __name__ == '__main__':
141 25231ec5 Michael Hanselmann
  testutils.GanetiTestProgram()