Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.utils.retry_unittest.py @ 3b877f08

History | View | Annotate | Download (3.6 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 79d22269 Michael Hanselmann
38 79d22269 Michael Hanselmann
  @staticmethod
39 79d22269 Michael Hanselmann
  def _RaiseRetryAgain():
40 79d22269 Michael Hanselmann
    raise utils.RetryAgain()
41 79d22269 Michael Hanselmann
42 79d22269 Michael Hanselmann
  @staticmethod
43 79d22269 Michael Hanselmann
  def _RaiseRetryAgainWithArg(args):
44 79d22269 Michael Hanselmann
    raise utils.RetryAgain(*args)
45 79d22269 Michael Hanselmann
46 79d22269 Michael Hanselmann
  def _WrongNestedLoop(self):
47 79d22269 Michael Hanselmann
    return utils.Retry(self._RaiseRetryAgain, 0.01, 0.02)
48 79d22269 Michael Hanselmann
49 79d22269 Michael Hanselmann
  def _RetryAndSucceed(self, retries):
50 79d22269 Michael Hanselmann
    if self.retries < retries:
51 79d22269 Michael Hanselmann
      self.retries += 1
52 79d22269 Michael Hanselmann
      raise utils.RetryAgain()
53 79d22269 Michael Hanselmann
    else:
54 79d22269 Michael Hanselmann
      return True
55 79d22269 Michael Hanselmann
56 79d22269 Michael Hanselmann
  def testRaiseTimeout(self):
57 79d22269 Michael Hanselmann
    self.failUnlessRaises(utils.RetryTimeout, utils.Retry,
58 79d22269 Michael Hanselmann
                          self._RaiseRetryAgain, 0.01, 0.02)
59 79d22269 Michael Hanselmann
    self.failUnlessRaises(utils.RetryTimeout, utils.Retry,
60 79d22269 Michael Hanselmann
                          self._RetryAndSucceed, 0.01, 0, args=[1])
61 79d22269 Michael Hanselmann
    self.failUnlessEqual(self.retries, 1)
62 79d22269 Michael Hanselmann
63 79d22269 Michael Hanselmann
  def testComplete(self):
64 79d22269 Michael Hanselmann
    self.failUnlessEqual(utils.Retry(lambda: True, 0, 1), True)
65 79d22269 Michael Hanselmann
    self.failUnlessEqual(utils.Retry(self._RetryAndSucceed, 0, 1, args=[2]),
66 79d22269 Michael Hanselmann
                         True)
67 79d22269 Michael Hanselmann
    self.failUnlessEqual(self.retries, 2)
68 79d22269 Michael Hanselmann
69 79d22269 Michael Hanselmann
  def testNestedLoop(self):
70 79d22269 Michael Hanselmann
    try:
71 79d22269 Michael Hanselmann
      self.failUnlessRaises(errors.ProgrammerError, utils.Retry,
72 79d22269 Michael Hanselmann
                            self._WrongNestedLoop, 0, 1)
73 79d22269 Michael Hanselmann
    except utils.RetryTimeout:
74 79d22269 Michael Hanselmann
      self.fail("Didn't detect inner loop's exception")
75 79d22269 Michael Hanselmann
76 79d22269 Michael Hanselmann
  def testTimeoutArgument(self):
77 79d22269 Michael Hanselmann
    retry_arg="my_important_debugging_message"
78 79d22269 Michael Hanselmann
    try:
79 79d22269 Michael Hanselmann
      utils.Retry(self._RaiseRetryAgainWithArg, 0.01, 0.02, args=[[retry_arg]])
80 79d22269 Michael Hanselmann
    except utils.RetryTimeout, err:
81 79d22269 Michael Hanselmann
      self.failUnlessEqual(err.args, (retry_arg, ))
82 79d22269 Michael Hanselmann
    else:
83 79d22269 Michael Hanselmann
      self.fail("Expected timeout didn't happen")
84 79d22269 Michael Hanselmann
85 79d22269 Michael Hanselmann
  def testRaiseInnerWithExc(self):
86 79d22269 Michael Hanselmann
    retry_arg="my_important_debugging_message"
87 79d22269 Michael Hanselmann
    try:
88 79d22269 Michael Hanselmann
      try:
89 79d22269 Michael Hanselmann
        utils.Retry(self._RaiseRetryAgainWithArg, 0.01, 0.02,
90 79d22269 Michael Hanselmann
                    args=[[errors.GenericError(retry_arg, retry_arg)]])
91 79d22269 Michael Hanselmann
      except utils.RetryTimeout, err:
92 79d22269 Michael Hanselmann
        err.RaiseInner()
93 79d22269 Michael Hanselmann
      else:
94 79d22269 Michael Hanselmann
        self.fail("Expected timeout didn't happen")
95 79d22269 Michael Hanselmann
    except errors.GenericError, err:
96 79d22269 Michael Hanselmann
      self.failUnlessEqual(err.args, (retry_arg, retry_arg))
97 79d22269 Michael Hanselmann
    else:
98 79d22269 Michael Hanselmann
      self.fail("Expected GenericError didn't happen")
99 79d22269 Michael Hanselmann
100 79d22269 Michael Hanselmann
  def testRaiseInnerWithMsg(self):
101 79d22269 Michael Hanselmann
    retry_arg="my_important_debugging_message"
102 79d22269 Michael Hanselmann
    try:
103 79d22269 Michael Hanselmann
      try:
104 79d22269 Michael Hanselmann
        utils.Retry(self._RaiseRetryAgainWithArg, 0.01, 0.02,
105 79d22269 Michael Hanselmann
                    args=[[retry_arg, retry_arg]])
106 79d22269 Michael Hanselmann
      except utils.RetryTimeout, err:
107 79d22269 Michael Hanselmann
        err.RaiseInner()
108 79d22269 Michael Hanselmann
      else:
109 79d22269 Michael Hanselmann
        self.fail("Expected timeout didn't happen")
110 79d22269 Michael Hanselmann
    except utils.RetryTimeout, err:
111 79d22269 Michael Hanselmann
      self.failUnlessEqual(err.args, (retry_arg, retry_arg))
112 79d22269 Michael Hanselmann
    else:
113 79d22269 Michael Hanselmann
      self.fail("Expected RetryTimeout didn't happen")
114 79d22269 Michael Hanselmann
115 79d22269 Michael Hanselmann
116 79d22269 Michael Hanselmann
if __name__ == "__main__":
117 79d22269 Michael Hanselmann
  testutils.GanetiTestProgram()