Statistics
| Branch: | Tag: | Revision:

root / test / ganeti.daemon_unittest.py @ 4db33137

History | View | Annotate | Download (6.4 kB)

1
#!/usr/bin/python
2
#
3

    
4
# Copyright (C) 2010 Google Inc.
5
#
6
# This program is free software; you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation; either version 2 of the License, or
9
# (at your option) any later version.
10
#
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
# General Public License for more details.
15
#
16
# You should have received a copy of the GNU General Public License
17
# along with this program; if not, write to the Free Software
18
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19
# 02110-1301, USA.
20

    
21

    
22
"""Script for unittesting the daemon module"""
23

    
24
import unittest
25
import signal
26
import os
27
import socket
28

    
29
from ganeti import daemon
30

    
31
import testutils
32

    
33

    
34
class TestMainloop(testutils.GanetiTestCase):
35
  """Test daemon.Mainloop"""
36

    
37
  def setUp(self):
38
    testutils.GanetiTestCase.setUp(self)
39
    self.mainloop = daemon.Mainloop()
40
    self.sendsig_events = []
41
    self.onsignal_events = []
42

    
43
  def _CancelEvent(self, handle):
44
    self.mainloop.scheduler.cancel(handle)
45

    
46
  def _SendSig(self, sig):
47
    self.sendsig_events.append(sig)
48
    os.kill(os.getpid(), sig)
49

    
50
  def OnSignal(self, signum):
51
    self.onsignal_events.append(signum)
52

    
53
  def testRunAndTermBySched(self):
54
    self.mainloop.scheduler.enter(0.1, 1, self._SendSig, [signal.SIGTERM])
55
    self.mainloop.Run() # terminates by _SendSig being scheduled
56
    self.assertEquals(self.sendsig_events, [signal.SIGTERM])
57

    
58
  def testSchedulerCancel(self):
59
    handle = self.mainloop.scheduler.enter(0.1, 1, self._SendSig,
60
                                           [signal.SIGTERM])
61
    self.mainloop.scheduler.cancel(handle)
62
    self.mainloop.scheduler.enter(0.2, 1, self._SendSig, [signal.SIGCHLD])
63
    self.mainloop.scheduler.enter(0.3, 1, self._SendSig, [signal.SIGTERM])
64
    self.mainloop.Run()
65
    self.assertEquals(self.sendsig_events, [signal.SIGCHLD, signal.SIGTERM])
66

    
67
  def testRegisterSignal(self):
68
    self.mainloop.RegisterSignal(self)
69
    self.mainloop.scheduler.enter(0.1, 1, self._SendSig, [signal.SIGCHLD])
70
    handle = self.mainloop.scheduler.enter(0.1, 1, self._SendSig,
71
                                           [signal.SIGTERM])
72
    self.mainloop.scheduler.cancel(handle)
73
    self.mainloop.scheduler.enter(0.2, 1, self._SendSig, [signal.SIGCHLD])
74
    self.mainloop.scheduler.enter(0.3, 1, self._SendSig, [signal.SIGTERM])
75
    # ...not delievered because they are scheduled after TERM
76
    self.mainloop.scheduler.enter(0.4, 1, self._SendSig, [signal.SIGCHLD])
77
    self.mainloop.scheduler.enter(0.5, 1, self._SendSig, [signal.SIGCHLD])
78
    self.mainloop.Run()
79
    self.assertEquals(self.sendsig_events,
80
                      [signal.SIGCHLD, signal.SIGCHLD, signal.SIGTERM])
81
    self.assertEquals(self.onsignal_events, self.sendsig_events)
82

    
83
  def testDeferredCancel(self):
84
    self.mainloop.RegisterSignal(self)
85
    self.mainloop.scheduler.enter(0.1, 1, self._SendSig, [signal.SIGCHLD])
86
    handle1 = self.mainloop.scheduler.enter(0.3, 2, self._SendSig,
87
                                           [signal.SIGCHLD])
88
    handle2 = self.mainloop.scheduler.enter(0.4, 2, self._SendSig,
89
                                           [signal.SIGCHLD])
90
    self.mainloop.scheduler.enter(0, 1, self._CancelEvent, [handle1])
91
    self.mainloop.scheduler.enter(0, 1, self._CancelEvent, [handle2])
92
    self.mainloop.scheduler.enter(0.5, 1, self._SendSig, [signal.SIGTERM])
93
    self.mainloop.Run()
94
    self.assertEquals(self.sendsig_events, [signal.SIGCHLD, signal.SIGTERM])
95
    self.assertEquals(self.onsignal_events, self.sendsig_events)
96

    
97

    
98
class _MyAsyncUDPSocket(daemon.AsyncUDPSocket):
99

    
100
  def __init__(self):
101
    daemon.AsyncUDPSocket.__init__(self)
102
    self.received = []
103
    self.error_count = 0
104

    
105
  def handle_datagram(self, payload, ip, port):
106
    self.received.append((payload))
107
    if payload == "terminate":
108
      os.kill(os.getpid(), signal.SIGTERM)
109
    elif payload == "error":
110
      raise errors.GenericError("error")
111

    
112
  def handle_error(self):
113
    self.error_count += 1
114

    
115

    
116
class TestAsyncUDPSocket(testutils.GanetiTestCase):
117
  """Test daemon.AsyncUDPSocket"""
118

    
119
  def setUp(self):
120
    testutils.GanetiTestCase.setUp(self)
121
    self.mainloop = daemon.Mainloop()
122
    self.server = _MyAsyncUDPSocket()
123
    self.client = _MyAsyncUDPSocket()
124
    self.server.bind(("127.0.0.1", 0))
125
    self.port = self.server.getsockname()[1]
126

    
127
  def tearDown(self):
128
    self.server.close()
129
    self.client.close()
130
    testutils.GanetiTestCase.tearDown(self)
131

    
132
  def testNoDoubleBind(self):
133
    self.assertRaises(socket.error, self.client.bind, ("127.0.0.1", self.port))
134

    
135
  def _ThreadedClient(self, payload):
136
    self.client.enqueue_send("127.0.0.1", self.port, payload)
137
    print "sending %s" % payload
138
    while self.client.writable():
139
      self.client.handle_write()
140

    
141
  def testAsyncClientServer(self):
142
    self.client.enqueue_send("127.0.0.1", self.port, "p1")
143
    self.client.enqueue_send("127.0.0.1", self.port, "p2")
144
    self.client.enqueue_send("127.0.0.1", self.port, "terminate")
145
    self.mainloop.Run()
146
    self.assertEquals(self.server.received, ["p1", "p2", "terminate"])
147

    
148
  def testSyncClientServer(self):
149
    self.client.enqueue_send("127.0.0.1", self.port, "p1")
150
    self.client.enqueue_send("127.0.0.1", self.port, "p2")
151
    while self.client.writable():
152
      self.client.handle_write()
153
    self.server.process_next_packet()
154
    self.assertEquals(self.server.received, ["p1"])
155
    self.server.process_next_packet()
156
    self.assertEquals(self.server.received, ["p1", "p2"])
157
    self.client.enqueue_send("127.0.0.1", self.port, "p3")
158
    while self.client.writable():
159
      self.client.handle_write()
160
    self.server.process_next_packet()
161
    self.assertEquals(self.server.received, ["p1", "p2", "p3"])
162

    
163
  def testErrorHandling(self):
164
    self.client.enqueue_send("127.0.0.1", self.port, "p1")
165
    self.client.enqueue_send("127.0.0.1", self.port, "p2")
166
    self.client.enqueue_send("127.0.0.1", self.port, "error")
167
    self.client.enqueue_send("127.0.0.1", self.port, "p3")
168
    self.client.enqueue_send("127.0.0.1", self.port, "error")
169
    self.client.enqueue_send("127.0.0.1", self.port, "terminate")
170
    self.mainloop.Run()
171
    self.assertEquals(self.server.received,
172
                      ["p1", "p2", "error", "p3", "error", "terminate"])
173
    self.assertEquals(self.server.error_count, 2)
174

    
175

    
176
if __name__ == "__main__":
177
  testutils.GanetiTestProgram()