Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.retry_unittest.py @ 1a2eb2dc

History | View | Annotate | Download (4.5 kB)

1 79d22269 Michael Hanselmann
#!/usr/bin/python
2 79d22269 Michael Hanselmann
#
3 79d22269 Michael Hanselmann
4 79d22269 Michael Hanselmann
# Copyright (C) 2011 Google Inc.
5 79d22269 Michael Hanselmann
#
6 79d22269 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 79d22269 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 79d22269 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 79d22269 Michael Hanselmann
# (at your option) any later version.
10 79d22269 Michael Hanselmann
#
11 79d22269 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 79d22269 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 79d22269 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 79d22269 Michael Hanselmann
# General Public License for more details.
15 79d22269 Michael Hanselmann
#
16 79d22269 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 79d22269 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 79d22269 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 79d22269 Michael Hanselmann
# 02110-1301, USA.
20 79d22269 Michael Hanselmann
21 79d22269 Michael Hanselmann
22 79d22269 Michael Hanselmann
"""Script for testing ganeti.utils.retry"""
23 79d22269 Michael Hanselmann
24 79d22269 Michael Hanselmann
import unittest
25 79d22269 Michael Hanselmann
26 79d22269 Michael Hanselmann
from ganeti import constants
27 79d22269 Michael Hanselmann
from ganeti import errors
28 79d22269 Michael Hanselmann
from ganeti import utils
29 79d22269 Michael Hanselmann
30 79d22269 Michael Hanselmann
import testutils
31 79d22269 Michael Hanselmann
32 79d22269 Michael Hanselmann
33 79d22269 Michael Hanselmann
class TestRetry(testutils.GanetiTestCase):
34 79d22269 Michael Hanselmann
  def setUp(self):
35 79d22269 Michael Hanselmann
    testutils.GanetiTestCase.setUp(self)
36 79d22269 Michael Hanselmann
    self.retries = 0
37 c7d3a832 Iustin Pop
    self.called = 0
38 79d22269 Michael Hanselmann
39 79d22269 Michael Hanselmann
  @staticmethod
40 79d22269 Michael Hanselmann
  def _RaiseRetryAgain():
41 79d22269 Michael Hanselmann
    raise utils.RetryAgain()
42 79d22269 Michael Hanselmann
43 79d22269 Michael Hanselmann
  @staticmethod
44 79d22269 Michael Hanselmann
  def _RaiseRetryAgainWithArg(args):
45 79d22269 Michael Hanselmann
    raise utils.RetryAgain(*args)
46 79d22269 Michael Hanselmann
47 79d22269 Michael Hanselmann
  def _WrongNestedLoop(self):
48 79d22269 Michael Hanselmann
    return utils.Retry(self._RaiseRetryAgain, 0.01, 0.02)
49 79d22269 Michael Hanselmann
50 79d22269 Michael Hanselmann
  def _RetryAndSucceed(self, retries):
51 79d22269 Michael Hanselmann
    if self.retries < retries:
52 79d22269 Michael Hanselmann
      self.retries += 1
53 79d22269 Michael Hanselmann
      raise utils.RetryAgain()
54 79d22269 Michael Hanselmann
    else:
55 79d22269 Michael Hanselmann
      return True
56 79d22269 Michael Hanselmann
57 c7d3a832 Iustin Pop
  def _SimpleRetryAndSucceed(self, retries):
58 c7d3a832 Iustin Pop
    self.called += 1
59 c7d3a832 Iustin Pop
    if self.retries < retries:
60 c7d3a832 Iustin Pop
      self.retries += 1
61 c7d3a832 Iustin Pop
      return False
62 c7d3a832 Iustin Pop
    else:
63 c7d3a832 Iustin Pop
      return True
64 c7d3a832 Iustin Pop
65 79d22269 Michael Hanselmann
  def testRaiseTimeout(self):
66 79d22269 Michael Hanselmann
    self.failUnlessRaises(utils.RetryTimeout, utils.Retry,
67 79d22269 Michael Hanselmann
                          self._RaiseRetryAgain, 0.01, 0.02)
68 79d22269 Michael Hanselmann
    self.failUnlessRaises(utils.RetryTimeout, utils.Retry,
69 79d22269 Michael Hanselmann
                          self._RetryAndSucceed, 0.01, 0, args=[1])
70 79d22269 Michael Hanselmann
    self.failUnlessEqual(self.retries, 1)
71 79d22269 Michael Hanselmann
72 79d22269 Michael Hanselmann
  def testComplete(self):
73 79d22269 Michael Hanselmann
    self.failUnlessEqual(utils.Retry(lambda: True, 0, 1), True)
74 79d22269 Michael Hanselmann
    self.failUnlessEqual(utils.Retry(self._RetryAndSucceed, 0, 1, args=[2]),
75 79d22269 Michael Hanselmann
                         True)
76 79d22269 Michael Hanselmann
    self.failUnlessEqual(self.retries, 2)
77 79d22269 Michael Hanselmann
78 79d22269 Michael Hanselmann
  def testNestedLoop(self):
79 79d22269 Michael Hanselmann
    try:
80 79d22269 Michael Hanselmann
      self.failUnlessRaises(errors.ProgrammerError, utils.Retry,
81 79d22269 Michael Hanselmann
                            self._WrongNestedLoop, 0, 1)
82 79d22269 Michael Hanselmann
    except utils.RetryTimeout:
83 79d22269 Michael Hanselmann
      self.fail("Didn't detect inner loop's exception")
84 79d22269 Michael Hanselmann
85 79d22269 Michael Hanselmann
  def testTimeoutArgument(self):
86 79d22269 Michael Hanselmann
    retry_arg="my_important_debugging_message"
87 79d22269 Michael Hanselmann
    try:
88 79d22269 Michael Hanselmann
      utils.Retry(self._RaiseRetryAgainWithArg, 0.01, 0.02, args=[[retry_arg]])
89 79d22269 Michael Hanselmann
    except utils.RetryTimeout, err:
90 79d22269 Michael Hanselmann
      self.failUnlessEqual(err.args, (retry_arg, ))
91 79d22269 Michael Hanselmann
    else:
92 79d22269 Michael Hanselmann
      self.fail("Expected timeout didn't happen")
93 79d22269 Michael Hanselmann
94 79d22269 Michael Hanselmann
  def testRaiseInnerWithExc(self):
95 79d22269 Michael Hanselmann
    retry_arg="my_important_debugging_message"
96 79d22269 Michael Hanselmann
    try:
97 79d22269 Michael Hanselmann
      try:
98 79d22269 Michael Hanselmann
        utils.Retry(self._RaiseRetryAgainWithArg, 0.01, 0.02,
99 79d22269 Michael Hanselmann
                    args=[[errors.GenericError(retry_arg, retry_arg)]])
100 79d22269 Michael Hanselmann
      except utils.RetryTimeout, err:
101 79d22269 Michael Hanselmann
        err.RaiseInner()
102 79d22269 Michael Hanselmann
      else:
103 79d22269 Michael Hanselmann
        self.fail("Expected timeout didn't happen")
104 79d22269 Michael Hanselmann
    except errors.GenericError, err:
105 79d22269 Michael Hanselmann
      self.failUnlessEqual(err.args, (retry_arg, retry_arg))
106 79d22269 Michael Hanselmann
    else:
107 79d22269 Michael Hanselmann
      self.fail("Expected GenericError didn't happen")
108 79d22269 Michael Hanselmann
109 79d22269 Michael Hanselmann
  def testRaiseInnerWithMsg(self):
110 79d22269 Michael Hanselmann
    retry_arg="my_important_debugging_message"
111 79d22269 Michael Hanselmann
    try:
112 79d22269 Michael Hanselmann
      try:
113 79d22269 Michael Hanselmann
        utils.Retry(self._RaiseRetryAgainWithArg, 0.01, 0.02,
114 79d22269 Michael Hanselmann
                    args=[[retry_arg, retry_arg]])
115 79d22269 Michael Hanselmann
      except utils.RetryTimeout, err:
116 79d22269 Michael Hanselmann
        err.RaiseInner()
117 79d22269 Michael Hanselmann
      else:
118 79d22269 Michael Hanselmann
        self.fail("Expected timeout didn't happen")
119 79d22269 Michael Hanselmann
    except utils.RetryTimeout, err:
120 79d22269 Michael Hanselmann
      self.failUnlessEqual(err.args, (retry_arg, retry_arg))
121 79d22269 Michael Hanselmann
    else:
122 79d22269 Michael Hanselmann
      self.fail("Expected RetryTimeout didn't happen")
123 79d22269 Michael Hanselmann
124 c7d3a832 Iustin Pop
  def testSimpleRetry(self):
125 c7d3a832 Iustin Pop
    self.assertFalse(utils.SimpleRetry(True, lambda: False, 0.01, 0.02))
126 c7d3a832 Iustin Pop
    self.assertFalse(utils.SimpleRetry(lambda x: x, lambda: False, 0.01, 0.02))
127 c7d3a832 Iustin Pop
    self.assertTrue(utils.SimpleRetry(True, lambda: True, 0, 1))
128 c7d3a832 Iustin Pop
    self.assertTrue(utils.SimpleRetry(lambda x: x, lambda: True, 0, 1))
129 c7d3a832 Iustin Pop
    self.assertTrue(utils.SimpleRetry(True, self._SimpleRetryAndSucceed,
130 c7d3a832 Iustin Pop
                                      0, 1, args=[1]))
131 c7d3a832 Iustin Pop
    self.assertEqual(self.retries, 1)
132 c7d3a832 Iustin Pop
    self.assertEqual(self.called, 2)
133 c7d3a832 Iustin Pop
    self.called = self.retries = 0
134 c7d3a832 Iustin Pop
    self.assertTrue(utils.SimpleRetry(True, self._SimpleRetryAndSucceed,
135 c7d3a832 Iustin Pop
                                      0, 1, args=[2]))
136 c7d3a832 Iustin Pop
    self.assertEqual(self.called, 3)
137 c7d3a832 Iustin Pop
138 79d22269 Michael Hanselmann
139 79d22269 Michael Hanselmann
if __name__ == "__main__":
140 79d22269 Michael Hanselmann
  testutils.GanetiTestProgram()