Merge "Add RFC2544 iteration status field"
[yardstick.git] / yardstick / tests / unit / network_services / traffic_profile / test_ixia_rfc2544.py
1 # Copyright (c) 2016-2017 Intel Corporation
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 import copy
16
17 import mock
18 import unittest
19
20 from yardstick.network_services.traffic_profile import ixia_rfc2544
21 from yardstick.network_services.traffic_profile import trex_traffic_profile
22
23
24 class TestIXIARFC2544Profile(unittest.TestCase):
25
26     TRAFFIC_PROFILE = {
27         "schema": "isb:traffic_profile:0.1",
28         "name": "fixed",
29         "description": "Fixed traffic profile to run UDP traffic",
30         "traffic_profile": {
31             "traffic_type": "FixedTraffic",
32             "frame_rate": 100,  # pps
33             "flow_number": 10,
34             "frame_size": 64,
35         },
36     }
37
38     PROFILE = {
39         'description': 'Traffic profile to run RFC2544 latency',
40         'name': 'rfc2544',
41         'traffic_profile': {
42             'traffic_type': 'IXIARFC2544Profile',
43             'frame_rate': 100},
44         ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
45             'ipv4': {
46                 'outer_l2': {
47                     'framesize': {
48                         '64B': '100',
49                         '1518B': '0',
50                         '128B': '0',
51                         '1400B': '0',
52                         '256B': '0',
53                         '373b': '0',
54                         '570B': '0'}},
55                 'outer_l3v4': {
56                     'dstip4': '1.1.1.1-1.15.255.255',
57                     'proto': 'udp',
58                     'count': '1',
59                     'srcip4': '90.90.1.1-90.105.255.255',
60                     'dscp': 0,
61                     'ttl': 32},
62                 'outer_l4': {
63                     'srcport': '2001',
64                     'dsrport': '1234'}}},
65         ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
66             'ipv4': {
67                 'outer_l2': {
68                     'framesize': {
69                         '64B': '100',
70                         '1518B': '0',
71                         '128B': '0',
72                         '1400B': '0',
73                         '256B': '0',
74                         '373b': '0',
75                         '570B': '0'}},
76                 'outer_l3v4': {
77                     'dstip4': '9.9.1.1-90.105.255.255',
78                     'proto': 'udp',
79                     'count': '1',
80                     'srcip4': '1.1.1.1-1.15.255.255',
81                     'dscp': 0,
82                     'ttl': 32},
83                 'outer_l4': {
84                     'dstport': '2001',
85                     'srcport': '1234'}}},
86         'schema': 'isb:traffic_profile:0.1'}
87
88     def test_get_ixia_traffic_profile_error(self):
89         traffic_generator = mock.Mock(
90             autospec=trex_traffic_profile.TrexProfile)
91         traffic_generator.my_ports = [0, 1]
92         traffic_generator.uplink_ports = [-1]
93         traffic_generator.downlink_ports = [1]
94         traffic_generator.client = \
95             mock.Mock(return_value=True)
96         STATIC_TRAFFIC = {
97             ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
98                 "id": 1,
99                 "bidir": "False",
100                 "duration": 60,
101                 "iload": "100",
102                 "outer_l2": {
103                     "dstmac": "00:00:00:00:00:03",
104                     "framesPerSecond": True,
105                     "framesize": 64,
106                     "srcmac": "00:00:00:00:00:01"
107                 },
108                 "outer_l3": {
109                     "dscp": 0,
110                     "dstip4": "152.16.40.20",
111                     "proto": "udp",
112                     "srcip4": "152.16.100.20",
113                     "ttl": 32
114                 },
115                 "outer_l3v4": {
116                     "dscp": 0,
117                     "dstip4": "152.16.40.20",
118                     "proto": "udp",
119                     "srcip4": "152.16.100.20",
120                     "ttl": 32
121                 },
122                 "outer_l3v6": {
123                     "count": 1024,
124                     "dscp": 0,
125                     "dstip4": "152.16.100.20",
126                     "proto": "udp",
127                     "srcip4": "152.16.40.20",
128                     "ttl": 32
129                 },
130                 "outer_l4": {
131                     "dstport": "2001",
132                     "srcport": "1234"
133                 },
134                 "traffic_type": "continuous"
135             },
136             ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
137                 "id": 2,
138                 "bidir": "False",
139                 "duration": 60,
140                 "iload": "100",
141                 "outer_l2": {
142                     "dstmac": "00:00:00:00:00:04",
143                     "framesPerSecond": True,
144                     "framesize": 64,
145                     "srcmac": "00:00:00:00:00:01"
146                 },
147                 "outer_l3": {
148                     "count": 1024,
149                     "dscp": 0,
150                     "dstip4": "152.16.100.20",
151                     "proto": "udp",
152                     "srcip4": "152.16.40.20",
153                     "ttl": 32
154                 },
155                 "outer_l3v4": {
156                     "count": 1024,
157                     "dscp": 0,
158                     "dstip4": "152.16.100.20",
159                     "proto": "udp",
160                     "srcip4": "152.16.40.20",
161                     "ttl": 32
162                 },
163                 "outer_l3v6": {
164                     "count": 1024,
165                     "dscp": 0,
166                     "dstip4": "152.16.100.20",
167                     "proto": "udp",
168                     "srcip4": "152.16.40.20",
169                     "ttl": 32
170                 },
171                 "outer_l4": {
172                     "dstport": "1234",
173                     "srcport": "2001"
174                 },
175                 "traffic_type": "continuous"
176             }
177         }
178         ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
179
180         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
181             self.TRAFFIC_PROFILE)
182         r_f_c2544_profile.rate = 100
183         mac = {"src_mac_0": "00:00:00:00:00:01",
184                "src_mac_1": "00:00:00:00:00:02",
185                "src_mac_2": "00:00:00:00:00:02",
186                "dst_mac_0": "00:00:00:00:00:03",
187                "dst_mac_1": "00:00:00:00:00:04",
188                "dst_mac_2": "00:00:00:00:00:04"}
189         result = r_f_c2544_profile._get_ixia_traffic_profile(self.PROFILE, mac)
190         self.assertIsNotNone(result)
191
192     def test_get_ixia_traffic_profile(self):
193         traffic_generator = mock.Mock(
194             autospec=trex_traffic_profile.TrexProfile)
195         traffic_generator.my_ports = [0, 1]
196         traffic_generator.uplink_ports = [-1]
197         traffic_generator.downlink_ports = [1]
198         traffic_generator.client = \
199             mock.Mock(return_value=True)
200         STATIC_TRAFFIC = {
201             ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
202                 "id": 1,
203                 "bidir": "False",
204                 "duration": 60,
205                 "iload": "100",
206                 "outer_l2": {
207                     "dstmac": "00:00:00:00:00:03",
208                     "framesPerSecond": True,
209                     "framesize": 64,
210                     "srcmac": "00:00:00:00:00:01"
211                 },
212                 "outer_l3": {
213                     "dscp": 0,
214                     "dstip4": "152.16.40.20",
215                     "proto": "udp",
216                     "srcip4": "152.16.100.20",
217                     "ttl": 32
218                 },
219                 "outer_l3v4": {
220                     "dscp": 0,
221                     "dstip4": "152.16.40.20",
222                     "proto": "udp",
223                     "srcip4": "152.16.100.20",
224                     "ttl": 32,
225                     "count": "1"
226                 },
227                 "outer_l3v6": {
228                     "dscp": 0,
229                     "dstip4": "152.16.100.20",
230                     "proto": "udp",
231                     "srcip4": "152.16.40.20",
232                     "ttl": 32,
233                 },
234                 "outer_l4": {
235                     "dstport": "2001",
236                     "srcport": "1234",
237                     "count": "1"
238                 },
239                 "traffic_type": "continuous"
240             },
241             ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
242                 "id": 2,
243                 "bidir": "False",
244                 "duration": 60,
245                 "iload": "100",
246                 "outer_l2": {
247                     "dstmac": "00:00:00:00:00:04",
248                     "framesPerSecond": True,
249                     "framesize": 64,
250                     "srcmac": "00:00:00:00:00:01"
251                 },
252                 "outer_l3": {
253                     "count": 1024,
254                     "dscp": 0,
255                     "dstip4": "152.16.100.20",
256                     "proto": "udp",
257                     "srcip4": "152.16.40.20",
258                     "ttl": 32
259                 },
260                 "outer_l3v4": {
261                     "dscp": 0,
262                     "dstip4": "152.16.100.20",
263                     "proto": "udp",
264                     "srcip4": "152.16.40.20",
265                     "ttl": 32,
266                 },
267                 "outer_l3v6": {
268                     "dscp": 0,
269                     "dstip4": "152.16.100.20",
270                     "proto": "udp",
271                     "srcip4": "152.16.40.20",
272                     "ttl": 32,
273                 },
274                 "outer_l4": {
275                     "dstport": "1234",
276                     "srcport": "2001",
277                     "count": "1"
278                 },
279                 "traffic_type": "continuous"
280             }
281         }
282         ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
283
284         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
285             self.TRAFFIC_PROFILE)
286         r_f_c2544_profile.rate = 100
287         mac = {"src_mac_0": "00:00:00:00:00:01",
288                "src_mac_1": "00:00:00:00:00:02",
289                "src_mac_2": "00:00:00:00:00:02",
290                "dst_mac_0": "00:00:00:00:00:03",
291                "dst_mac_1": "00:00:00:00:00:04",
292                "dst_mac_2": "00:00:00:00:00:04"}
293         result = r_f_c2544_profile._get_ixia_traffic_profile(self.PROFILE, mac)
294         self.assertIsNotNone(result)
295
296     @mock.patch("yardstick.network_services.traffic_profile.ixia_rfc2544.open")
297     def test_get_ixia_traffic_profile_v6(self, *args):
298         traffic_generator = mock.Mock(
299             autospec=trex_traffic_profile.TrexProfile)
300         traffic_generator.my_ports = [0, 1]
301         traffic_generator.uplink_ports = [-1]
302         traffic_generator.downlink_ports = [1]
303         traffic_generator.client = \
304             mock.Mock(return_value=True)
305         STATIC_TRAFFIC = {
306             ixia_rfc2544.IXIARFC2544Profile.UPLINK: {
307                 "id": 1,
308                 "bidir": "False",
309                 "duration": 60,
310                 "iload": "100",
311                 "outer_l2": {
312                     "dstmac": "00:00:00:00:00:03",
313                     "framesPerSecond": True,
314                     "framesize": 64,
315                     "srcmac": "00:00:00:00:00:01"
316                 },
317                 "outer_l3": {
318                     "dscp": 0,
319                     "dstip4": "152.16.40.20",
320                     "proto": "udp",
321                     "srcip4": "152.16.100.20",
322                     "ttl": 32
323                 },
324                 "outer_l3v4": {
325                     "dscp": 0,
326                     "dstip4": "152.16.40.20",
327                     "proto": "udp",
328                     "srcip4": "152.16.100.20",
329                     "ttl": 32
330                 },
331                 "outer_l3v6": {
332                     "count": 1024,
333                     "dscp": 0,
334                     "dstip4": "152.16.100.20",
335                     "proto": "udp",
336                     "srcip4": "152.16.40.20",
337                     "ttl": 32
338                 },
339                 "outer_l4": {
340                     "dstport": "2001",
341                     "srcport": "1234"
342                 },
343                 "traffic_type": "continuous"
344             },
345             ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {
346                 "id": 2,
347                 "bidir": "False",
348                 "duration": 60,
349                 "iload": "100",
350                 "outer_l2": {
351                     "dstmac": "00:00:00:00:00:04",
352                     "framesPerSecond": True,
353                     "framesize": 64,
354                     "srcmac": "00:00:00:00:00:01"
355                 },
356                 "outer_l3": {
357                     "count": 1024,
358                     "dscp": 0,
359                     "dstip4": "152.16.100.20",
360                     "proto": "udp",
361                     "srcip4": "152.16.40.20",
362                     "ttl": 32
363                 },
364                 "outer_l3v4": {
365                     "count": 1024,
366                     "dscp": 0,
367                     "dstip4": "152.16.100.20",
368                     "proto": "udp",
369                     "srcip4": "152.16.40.20",
370                     "ttl": 32
371                 },
372                 "outer_l3v6": {
373                     "count": 1024,
374                     "dscp": 0,
375                     "dstip4": "152.16.100.20",
376                     "proto": "udp",
377                     "srcip4": "152.16.40.20",
378                     "ttl": 32
379                 },
380                 "outer_l4": {
381                     "dstport": "1234",
382                     "srcport": "2001"
383                 },
384                 "traffic_type": "continuous"
385             }
386         }
387         ixia_rfc2544.STATIC_TRAFFIC = STATIC_TRAFFIC
388
389         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
390             self.TRAFFIC_PROFILE)
391         r_f_c2544_profile.rate = 100
392         mac = {"src_mac_0": "00:00:00:00:00:01",
393                "src_mac_1": "00:00:00:00:00:02",
394                "src_mac_2": "00:00:00:00:00:02",
395                "dst_mac_0": "00:00:00:00:00:03",
396                "dst_mac_1": "00:00:00:00:00:04",
397                "dst_mac_2": "00:00:00:00:00:04"}
398         profile_data = {'description': 'Traffic profile to run RFC2544',
399                         'name': 'rfc2544',
400                         'traffic_profile':
401                         {'traffic_type': 'IXIARFC2544Profile',
402                          'frame_rate': 100},
403                         ixia_rfc2544.IXIARFC2544Profile.DOWNLINK:
404                         {'ipv4':
405                          {'outer_l2': {'framesize':
406                                        {'64B': '100', '1518B': '0',
407                                         '128B': '0', '1400B': '0',
408                                         '256B': '0', '373b': '0',
409                                         '570B': '0'}},
410                           'outer_l3v4': {'dstip4': '1.1.1.1-1.15.255.255',
411                                          'proto': 'udp', 'count': '1',
412                                          'srcip4': '90.90.1.1-90.105.255.255',
413                                          'dscp': 0, 'ttl': 32},
414                           'outer_l3v6': {'dstip6': '1.1.1.1-1.15.255.255',
415                                          'proto': 'udp', 'count': '1',
416                                          'srcip6': '90.90.1.1-90.105.255.255',
417                                          'dscp': 0, 'ttl': 32},
418                           'outer_l4': {'srcport': '2001',
419                                        'dsrport': '1234'}}},
420                         ixia_rfc2544.IXIARFC2544Profile.UPLINK: {'ipv4':
421                                                     {'outer_l2': {'framesize':
422                                                                   {'64B': '100', '1518B': '0',
423                                                                    '128B': '0', '1400B': '0',
424                                                                    '256B': '0', '373b': '0',
425                                                                    '570B': '0'}},
426                                                         'outer_l3v4':
427                                                         {'dstip4': '9.9.1.1-90.105.255.255',
428                                                          'proto': 'udp', 'count': '1',
429                                                          'srcip4': '1.1.1.1-1.15.255.255',
430                                                          'dscp': 0, 'ttl': 32},
431                                                         'outer_l3v6':
432                                                         {'dstip6': '9.9.1.1-90.105.255.255',
433                                                          'proto': 'udp', 'count': '1',
434                                                          'srcip6': '1.1.1.1-1.15.255.255',
435                                                          'dscp': 0, 'ttl': 32},
436
437                                                         'outer_l4': {'dstport': '2001',
438                                                                      'srcport': '1234'}}},
439                         'schema': 'isb:traffic_profile:0.1'}
440         result = r_f_c2544_profile._get_ixia_traffic_profile(profile_data, mac)
441         self.assertIsNotNone(result)
442
443     def test__init__(self):
444         t_profile_data = copy.deepcopy(self.TRAFFIC_PROFILE)
445         t_profile_data['traffic_profile']['frame_rate'] = 12345678
446         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(t_profile_data)
447         self.assertEqual(12345678, r_f_c2544_profile.rate)
448
449     def test__get_ip_and_mask_range(self):
450         ip_range = '1.2.0.2-1.2.255.254'
451         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
452             self.TRAFFIC_PROFILE)
453         ip, mask = r_f_c2544_profile._get_ip_and_mask(ip_range)
454         self.assertEqual('1.2.0.2', ip)
455         self.assertEqual(16, mask)
456
457     def test__get_ip_and_mask_single(self):
458         ip_range = '192.168.1.10'
459         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
460             self.TRAFFIC_PROFILE)
461         ip, mask = r_f_c2544_profile._get_ip_and_mask(ip_range)
462         self.assertEqual('192.168.1.10', ip)
463         self.assertIsNone(mask)
464
465     def test__get_fixed_and_mask_range(self):
466         fixed_mask = '8-48'
467         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
468             self.TRAFFIC_PROFILE)
469         fixed, mask = r_f_c2544_profile._get_fixed_and_mask(fixed_mask)
470         self.assertEqual(8, fixed)
471         self.assertEqual(48, mask)
472
473     def test__get_fixed_and_mask_single(self):
474         fixed_mask = 1234
475         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
476             self.TRAFFIC_PROFILE)
477         fixed, mask = r_f_c2544_profile._get_fixed_and_mask(fixed_mask)
478         self.assertEqual(1234, fixed)
479         self.assertEqual(0, mask)
480
481     def test__get_ixia_traffic_profile_default_args(self):
482         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
483             self.TRAFFIC_PROFILE)
484
485         expected = {}
486         result = r_f_c2544_profile._get_ixia_traffic_profile({})
487         self.assertDictEqual(result, expected)
488
489     def test__ixia_traffic_generate(self):
490         traffic_generator = mock.Mock(
491             autospec=trex_traffic_profile.TrexProfile)
492         traffic_generator.networks = {
493             "uplink_0": ["xe0"],
494             "downlink_0": ["xe1"],
495         }
496         traffic_generator.client = \
497             mock.Mock(return_value=True)
498         traffic = {ixia_rfc2544.IXIARFC2544Profile.DOWNLINK: {'iload': 10},
499                    ixia_rfc2544.IXIARFC2544Profile.UPLINK: {'iload': 10}}
500         ixia_obj = mock.MagicMock()
501         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(
502             self.TRAFFIC_PROFILE)
503         r_f_c2544_profile.rate = 100
504         result = r_f_c2544_profile._ixia_traffic_generate(traffic, ixia_obj)
505         self.assertIsNone(result)
506
507     def test_execute_traffic_first_run(self):
508         rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
509         rfc2544_profile.first_run = True
510         rfc2544_profile.rate = 50
511         with mock.patch.object(rfc2544_profile, '_get_ixia_traffic_profile') \
512                 as mock_get_tp, \
513                 mock.patch.object(rfc2544_profile, '_ixia_traffic_generate') \
514                 as mock_tgenerate, \
515                 mock.patch.object(rfc2544_profile, 'update_traffic_profile') \
516                 as mock_update_tp:
517             mock_get_tp.return_value = 'fake_tprofile'
518             output = rfc2544_profile.execute_traffic(mock.ANY,
519                                                      ixia_obj=mock.ANY)
520
521         self.assertTrue(output)
522         self.assertFalse(rfc2544_profile.first_run)
523         self.assertEqual(50, rfc2544_profile.max_rate)
524         self.assertEqual(0, rfc2544_profile.min_rate)
525         mock_get_tp.assert_called_once()
526         mock_tgenerate.assert_called_once()
527         mock_update_tp.assert_called_once()
528
529     def test_execute_traffic_not_first_run(self):
530         rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
531         rfc2544_profile.first_run = False
532         rfc2544_profile.max_rate = 70
533         rfc2544_profile.min_rate = 0
534         with mock.patch.object(rfc2544_profile, '_get_ixia_traffic_profile') \
535                 as mock_get_tp, \
536                 mock.patch.object(rfc2544_profile, '_ixia_traffic_generate') \
537                 as mock_tgenerate:
538             mock_get_tp.return_value = 'fake_tprofile'
539             rfc2544_profile.full_profile = mock.ANY
540             output = rfc2544_profile.execute_traffic(mock.ANY,
541                                                      ixia_obj=mock.ANY)
542
543         self.assertFalse(output)
544         self.assertEqual(35.0, rfc2544_profile.rate)
545         mock_get_tp.assert_called_once()
546         mock_tgenerate.assert_called_once()
547
548     def test_update_traffic_profile(self):
549         traffic_generator = mock.Mock(
550             autospec=trex_traffic_profile.TrexProfile)
551         traffic_generator.networks = {
552             "uplink_0": ["xe0"],  # private, one value for intfs
553             "downlink_0": ["xe1", "xe2"],  # public, two values for intfs
554             "downlink_1": ["xe3"],  # not in TRAFFIC PROFILE
555             "tenant_0": ["xe4"],  # not public or private
556         }
557
558         ports_expected = [8, 3, 5]
559         traffic_generator.vnfd_helper.port_num.side_effect = ports_expected
560         traffic_generator.client.return_value = True
561
562         traffic_profile = copy.deepcopy(self.TRAFFIC_PROFILE)
563         traffic_profile.update({
564             "uplink_0": ["xe0"],
565             "downlink_0": ["xe1", "xe2"],
566         })
567
568         r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(traffic_profile)
569         r_f_c2544_profile.full_profile = {}
570         r_f_c2544_profile.get_streams = mock.Mock()
571
572         self.assertIsNone(
573             r_f_c2544_profile.update_traffic_profile(traffic_generator))
574         self.assertEqual(r_f_c2544_profile.ports, ports_expected)
575
576     def test_get_drop_percentage_completed(self):
577         samples = {'iface_name_1':
578                        {'in_packets': 1000, 'out_packets': 1000,
579                         'Store-Forward_Avg_latency_ns': 20,
580                         'Store-Forward_Min_latency_ns': 15,
581                         'Store-Forward_Max_latency_ns': 25},
582                    'iface_name_2':
583                        {'in_packets': 1005, 'out_packets': 1007,
584                         'Store-Forward_Avg_latency_ns': 23,
585                         'Store-Forward_Min_latency_ns': 13,
586                         'Store-Forward_Max_latency_ns': 28}
587                    }
588         rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
589         completed, samples = rfc2544_profile.get_drop_percentage(
590             samples, 0, 1, 4)
591         self.assertTrue(completed)
592         self.assertEqual(66.9, samples['TxThroughput'])
593         self.assertEqual(66.833, samples['RxThroughput'])
594         self.assertEqual(0.099651, samples['DropPercentage'])
595         self.assertEqual(21.5, samples['latency_ns_avg'])
596         self.assertEqual(14.0, samples['latency_ns_min'])
597         self.assertEqual(26.5, samples['latency_ns_max'])
598
599     def test_get_drop_percentage_over_drop_percentage(self):
600         samples = {'iface_name_1':
601                        {'in_packets': 1000, 'out_packets': 1000,
602                         'Store-Forward_Avg_latency_ns': 20,
603                         'Store-Forward_Min_latency_ns': 15,
604                         'Store-Forward_Max_latency_ns': 25},
605                    'iface_name_2':
606                        {'in_packets': 1005, 'out_packets': 1007,
607                         'Store-Forward_Avg_latency_ns': 20,
608                         'Store-Forward_Min_latency_ns': 15,
609                         'Store-Forward_Max_latency_ns': 25}
610                    }
611         rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
612         rfc2544_profile.rate = 1000
613         completed, samples = rfc2544_profile.get_drop_percentage(
614             samples, 0, 0.05, 4)
615         self.assertFalse(completed)
616         self.assertEqual(66.9, samples['TxThroughput'])
617         self.assertEqual(66.833, samples['RxThroughput'])
618         self.assertEqual(0.099651, samples['DropPercentage'])
619         self.assertEqual(rfc2544_profile.rate, rfc2544_profile.max_rate)
620
621     def test_get_drop_percentage_under_drop_percentage(self):
622         samples = {'iface_name_1':
623                        {'in_packets': 1000, 'out_packets': 1000,
624                         'Store-Forward_Avg_latency_ns': 20,
625                         'Store-Forward_Min_latency_ns': 15,
626                         'Store-Forward_Max_latency_ns': 25},
627                    'iface_name_2':
628                        {'in_packets': 1005, 'out_packets': 1007,
629                         'Store-Forward_Avg_latency_ns': 20,
630                         'Store-Forward_Min_latency_ns': 15,
631                         'Store-Forward_Max_latency_ns': 25}
632                    }
633         rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
634         rfc2544_profile.rate = 1000
635         completed, samples = rfc2544_profile.get_drop_percentage(
636             samples, 0.2, 1, 4)
637         self.assertFalse(completed)
638         self.assertEqual(66.9, samples['TxThroughput'])
639         self.assertEqual(66.833, samples['RxThroughput'])
640         self.assertEqual(0.099651, samples['DropPercentage'])
641         self.assertEqual(rfc2544_profile.rate, rfc2544_profile.min_rate)
642
643     @mock.patch.object(ixia_rfc2544.LOG, 'info')
644     def test_get_drop_percentage_not_flow(self, *args):
645         samples = {'iface_name_1':
646                        {'in_packets': 1000, 'out_packets': 0,
647                         'Store-Forward_Avg_latency_ns': 20,
648                         'Store-Forward_Min_latency_ns': 15,
649                         'Store-Forward_Max_latency_ns': 25},
650                    'iface_name_2':
651                        {'in_packets': 1005, 'out_packets': 0,
652                         'Store-Forward_Avg_latency_ns': 20,
653                         'Store-Forward_Min_latency_ns': 15,
654                         'Store-Forward_Max_latency_ns': 25}
655                    }
656         rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
657         rfc2544_profile.rate = 1000
658         completed, samples = rfc2544_profile.get_drop_percentage(
659             samples, 0.2, 1, 4)
660         self.assertFalse(completed)
661         self.assertEqual(0.0, samples['TxThroughput'])
662         self.assertEqual(66.833, samples['RxThroughput'])
663         self.assertEqual(100, samples['DropPercentage'])
664         self.assertEqual(rfc2544_profile.rate, rfc2544_profile.max_rate)
665
666     def test_get_drop_percentage_first_run(self):
667         samples = {'iface_name_1':
668                        {'in_packets': 1000, 'out_packets': 1000,
669                         'Store-Forward_Avg_latency_ns': 20,
670                         'Store-Forward_Min_latency_ns': 15,
671                         'Store-Forward_Max_latency_ns': 25},
672                    'iface_name_2':
673                        {'in_packets': 1005, 'out_packets': 1007,
674                         'Store-Forward_Avg_latency_ns': 20,
675                         'Store-Forward_Min_latency_ns': 15,
676                         'Store-Forward_Max_latency_ns': 25}
677                    }
678         rfc2544_profile = ixia_rfc2544.IXIARFC2544Profile(self.TRAFFIC_PROFILE)
679         completed, samples = rfc2544_profile.get_drop_percentage(
680             samples, 0, 1, 4, first_run=True)
681         self.assertTrue(completed)
682         self.assertEqual(66.9, samples['TxThroughput'])
683         self.assertEqual(66.833, samples['RxThroughput'])
684         self.assertEqual(0.099651, samples['DropPercentage'])
685         self.assertEqual(33.45, rfc2544_profile.rate)