tests_history.py
Go to the documentation of this file.
1 import time
2 from datetime import datetime, timedelta
3 import unittest
4 
5 from opcua import Client
6 from opcua import Server
7 from opcua import ua
8 
9 from opcua.server.history_sql import HistorySQLite
10 from opcua.server.history import HistoryDict
11 
12 from tests_common import CommonTests, add_server_methods
13 
14 from opcua.common.events import get_event_properties_from_type_node as get_props
15 
16 port_num1 = 48530
17 port_num2 = 48530
18 
19 
20 class HistoryCommon(object):
21  srv = Server
22  clt = Client
23 
24  @classmethod
26  cls.srv = Server()
27  cls.srv.set_endpoint('opc.tcp://localhost:{0:d}'.format(port_num1))
28  cls.srv.start()
29 
30  cls.clt = Client('opc.tcp://localhost:{0:d}'.format(port_num1))
31  cls.clt.connect()
32 
33  @classmethod
35  cls.clt.disconnect()
36  cls.srv.stop()
37 
38  @classmethod
39  def create_var(cls):
40  o = cls.srv.get_objects_node()
41  cls.values = [i for i in range(20)]
42  cls.var = o.add_variable(3, "history_var", 0)
43  cls.srv.historize_node_data_change(cls.var, period=None, count=0)
44  for i in cls.values:
45  cls.var.set_value(i)
46  time.sleep(1)
47 
48  # no start and no end is not defined by spec, return reverse order
50  # Spec says that at least two parameters should be provided, so
51  # this one is out of spec
52  res = self.var.read_raw_history(None, None, 1)
53  self.assertEqual(len(res), 1)
54  self.assertEqual(res[0].Value.Value, self.values[-1])
55 
56  # no start and no end is not defined by spec, return reverse order
58  res = self.var.read_raw_history(None, None, 0)
59  self.assertEqual(len(res), 20)
60  self.assertEqual(res[0].Value.Value, self.values[-1])
61  self.assertEqual(res[-1].Value.Value, self.values[0])
62 
63  # no start and no end is not defined by spec, return reverse order
65  res = self.var.read_raw_history(None, None, 3)
66  self.assertEqual(len(res), 3)
67  self.assertEqual(res[-1].Value.Value, self.values[-3])
68  self.assertEqual(res[0].Value.Value, self.values[-1])
69 
70  # no start and no end is not defined by spec, return reverse order
72  res = self.var.read_raw_history(None, None, 9999)
73  self.assertEqual(len(res), 20)
74  self.assertEqual(res[-1].Value.Value, self.values[0])
75  self.assertEqual(res[0].Value.Value, self.values[-1])
76 
77  # only has end time, should return reverse order
79  now = datetime.utcnow()
80  old = now - timedelta(days=6)
81 
82  res = self.var.read_raw_history(None, now, 2)
83  self.assertEqual(len(res), 2)
84  self.assertEqual(res[-1].Value.Value, self.values[-2])
85 
86  # both start and endtime, return from start to end
88  now = datetime.utcnow()
89  old = now - timedelta(days=6)
90 
91  res = self.var.read_raw_history(old, now, 0)
92  self.assertEqual(len(res), 20)
93  self.assertEqual(res[-1].Value.Value, self.values[-1])
94  self.assertEqual(res[0].Value.Value, self.values[0])
95 
97  now = datetime.utcnow()
98  old = now - timedelta(days=6)
99 
100  res = self.var.read_raw_history(old, now, 5)
101  self.assertEqual(len(res), 5)
102  self.assertEqual(res[-1].Value.Value, self.values[4])
103  self.assertEqual(res[0].Value.Value, self.values[0])
104 
105  # start time greater than end time, should return reverse order
107  now = datetime.utcnow()
108  old = now - timedelta(days=6)
109 
110  res = self.var.read_raw_history(now, old, 5)
111  self.assertEqual(len(res), 5)
112  self.assertEqual(res[-1].Value.Value, self.values[-5])
113  self.assertEqual(res[0].Value.Value, self.values[-1])
114 
115  # only start return original order
117  now = datetime.utcnow()
118  old = now - timedelta(days=6)
119  res = self.var.read_raw_history(old, None, 6)
120  self.assertEqual(len(res), 6)
121  self.assertEqual(res[-1].Value.Value, self.values[5])
122  self.assertEqual(res[0].Value.Value, self.values[0])
123 
124  # only start return original order
126  now = datetime.utcnow()
127  old = now - timedelta(days=6)
128  res = self.var.read_raw_history(old, None, 0)
129  self.assertEqual(len(res), 20)
130  self.assertEqual(res[-1].Value.Value, self.values[-1])
131  self.assertEqual(res[0].Value.Value, self.values[0])
132 
133  # only end return reversed order
135  end = datetime.utcnow() + timedelta(days=6)
136  res = self.var.read_raw_history(None, end, 0)
137  self.assertEqual(len(res), 20)
138  self.assertEqual(res[-1].Value.Value, self.values[0])
139  self.assertEqual(res[0].Value.Value, self.values[-1])
140 
141  # only end return reversed order
143  end = datetime.utcnow() + timedelta(days=6)
144  res = self.var.read_raw_history(None, end, 3)
145  self.assertEqual(len(res), 3)
146  self.assertEqual(res[2].Value.Value, self.values[-3])
147  self.assertEqual(res[0].Value.Value, self.values[-1])
148 
149 
150 class TestHistoryEvents(object):
151 
152  @classmethod
154  cls.ev_values = [i for i in range(20)]
155  cls.srvevgen = cls.srv.get_event_generator()
156 
157  cls.srv_node = cls.srv.get_node(ua.ObjectIds.Server)
158  cls.srv.historize_node_event(cls.srv_node, period=None)
159 
160  for i in cls.ev_values:
161  cls.srvevgen.event.Severity = cls.ev_values[i]
162  cls.srvevgen.trigger(message="test message")
163  time.sleep(.1)
164  time.sleep(2)
165 
166  # only has end time, should return reverse order
168  now = datetime.utcnow()
169  old = now - timedelta(days=6)
170 
171  res = self.srv_node.read_event_history(None, now, 2)
172  self.assertEqual(len(res), 2)
173  self.assertEqual(res[-1].Severity, self.ev_values[-2])
174 
175  # both start and end time, return from start to end
177  now = datetime.utcnow()
178  old = now - timedelta(days=6)
179 
180  res = self.srv_node.read_event_history(old, now, 0)
181  self.assertEqual(len(res), 20)
182  self.assertEqual(res[-1].Severity, self.ev_values[-1])
183  self.assertEqual(res[0].Severity, self.ev_values[0])
184 
186  now = datetime.utcnow()
187  old = now - timedelta(days=6)
188 
189  res = self.srv_node.read_event_history(old, now, 5)
190  self.assertEqual(len(res), 5)
191  self.assertEqual(res[-1].Severity, self.ev_values[4])
192  self.assertEqual(res[0].Severity, self.ev_values[0])
193 
194  # start time greater than end time, should return reverse order
196  now = datetime.utcnow()
197  old = now - timedelta(days=6)
198 
199  res = self.srv_node.read_event_history(now, old, 5)
200  self.assertEqual(len(res), 5)
201  self.assertEqual(res[-1].Severity, self.ev_values[-5])
202  self.assertEqual(res[0].Severity, self.ev_values[-1])
203 
204  # only start return original order
206  now = datetime.utcnow()
207  old = now - timedelta(days=6)
208  res = self.srv_node.read_event_history(old, None, 6)
209  self.assertEqual(len(res), 6)
210  self.assertEqual(res[-1].Severity, self.ev_values[5])
211  self.assertEqual(res[0].Severity, self.ev_values[0])
212 
213  # only start return original order
215  now = datetime.utcnow()
216  old = now - timedelta(days=6)
217  res = self.srv_node.read_event_history(old, None, 0)
218  self.assertEqual(len(res), 20)
219  self.assertEqual(res[-1].Severity, self.ev_values[-1])
220  self.assertEqual(res[0].Severity, self.ev_values[0])
221 
222  # only end return reversed order
224  end = datetime.utcnow() + timedelta(days=6)
225  res = self.srv_node.read_event_history(None, end, 0)
226  self.assertEqual(len(res), 20)
227  self.assertEqual(res[-1].Severity, self.ev_values[0])
228  self.assertEqual(res[0].Severity, self.ev_values[-1])
229 
230  # only end return reversed order
232  end = datetime.utcnow() + timedelta(days=6)
233  res = self.srv_node.read_event_history(None, end, 3)
234  self.assertEqual(len(res), 3)
235  self.assertEqual(res[2].Severity, self.ev_values[-3])
236  self.assertEqual(res[0].Severity, self.ev_values[-1])
237 
238  # reverse event filter select clauses and test that results match the filter order
240  now = datetime.utcnow()
241  old = now - timedelta(days=6)
242  res = self.srv_node.read_event_history(old, None, 0)
243  self.assertEqual(len(res), 20)
244  self.assertEqual(res[-1].Severity, self.ev_values[-1])
245  self.assertEqual(res[0].Severity, self.ev_values[0])
246 
247 
248 class TestHistoryLimitsCommon(unittest.TestCase):
249  id = ua.NodeId(123)
250 
251  def setUp(self):
253 
255  assert(False)
256 
257  def resultCount(self):
258  results, cont = self.history.read_node_history(self.id, None, None, None)
259  return len(results)
260 
261  def addValue(self, age):
262  value = ua.DataValue()
263  value.ServerTimestamp = datetime.utcnow() - timedelta(hours = age)
264  self.history.save_node_value(self.id, value)
265 
266  def test_count_limit(self):
267  self.history.new_historized_node(self.id, period=None, count=3)
268  self.assertEqual(self.resultCount(), 0)
269  self.addValue(5)
270  self.assertEqual(self.resultCount(), 1)
271  self.addValue(4)
272  self.assertEqual(self.resultCount(), 2)
273  self.addValue(3)
274  self.assertEqual(self.resultCount(), 3)
275  self.addValue(2)
276  self.assertEqual(self.resultCount(), 3)
277  self.addValue(1)
278  self.assertEqual(self.resultCount(), 3)
279 
280  def test_period_limit(self):
281  self.history.new_historized_node(self.id, period=timedelta(hours=3))
282  self.assertEqual(self.resultCount(), 0)
283  self.addValue(5)
284  self.assertEqual(self.resultCount(), 0)
285  self.addValue(4)
286  self.assertEqual(self.resultCount(), 0)
287  self.addValue(2)
288  self.assertEqual(self.resultCount(), 1)
289  self.addValue(1)
290  self.assertEqual(self.resultCount(), 2)
291  self.addValue(0)
292  self.assertEqual(self.resultCount(), 3)
293 
295  self.history.new_historized_node(self.id, period=timedelta(hours=3), count=2)
296  self.assertEqual(self.resultCount(), 0)
297  self.addValue(5)
298  self.assertEqual(self.resultCount(), 0)
299  self.addValue(4)
300  self.assertEqual(self.resultCount(), 0)
301  self.addValue(2)
302  self.assertEqual(self.resultCount(), 1)
303  self.addValue(1)
304  self.assertEqual(self.resultCount(), 2)
305  self.addValue(0)
306  self.assertEqual(self.resultCount(), 2)
307 
308 
311  return HistoryDict()
312 
313 
316  return HistorySQLite(":memory:")
317 
318 
319 class TestHistory(unittest.TestCase, HistoryCommon, TestHistoryEvents):
320 
321  @classmethod
322  def setUpClass(cls):
324  cls.create_var()
325  cls.create_srv_events()
326 
327  @classmethod
328  def tearDownClass(cls):
330 
331 
332 class TestHistorySQL(unittest.TestCase, HistoryCommon, TestHistoryEvents):
333  @classmethod
334  def setUpClass(cls):
336  cls.srv.iserver.history_manager.set_storage(HistorySQLite(":memory:"))
337  cls.create_var()
338  cls.create_srv_events()
339 
340  @classmethod
341  def tearDownClass(cls):
def test_history_var_read_3_with_end(self)
def test_history_var_read_all_with_start(self)
def test_history_var_read_all_with_end(self)
def test_history_var_read_6_with_start(self)
def test_history_var_read_2_with_end(self)
def test_history_ev_read_all_filter_order_reversed(self)
def test_history_var_read_last_3(self)
def test_history_ev_read_5_in_timeframe_start_greater_than_end(self)
def test_history_var_read_5_in_timeframe(self)
def test_history_var_read_5_in_timeframe_start_greater_than_end(self)


ros_opcua_impl_python_opcua
Author(s): Denis Štogl , Daniel Draper
autogenerated on Tue Jan 19 2021 03:12:44