blob: 442d95055841b50a05b3e28fe567e830a01b2321 [file] [log] [blame]
Etan Cohen872a6be2017-05-16 08:08:15 -07001#!/usr/bin/python3.4
2#
3# Copyright 2017 - The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17import string
Etan Cohenfb7f3b12017-05-19 06:54:03 -070018import time
Etan Cohen872a6be2017-05-16 08:08:15 -070019
20from acts import asserts
21from acts.test_utils.wifi.aware import aware_const as aconsts
22from acts.test_utils.wifi.aware import aware_test_utils as autils
23from acts.test_utils.wifi.aware.AwareBaseTest import AwareBaseTest
24
25
26class DiscoveryTest(AwareBaseTest):
27 """Set of tests for Wi-Fi Aware discovery."""
28
29 # configuration parameters used by tests
30 PAYLOAD_SIZE_MIN = 0
31 PAYLOAD_SIZE_TYPICAL = 1
32 PAYLOAD_SIZE_MAX = 2
33
34 # message strings
35 query_msg = "How are you doing? 你好嗎?"
36 response_msg = "Doing ok - thanks! 做的不錯 - 謝謝!"
37
38 # message re-transmit counter (increases reliability in open-environment)
39 # Note: reliability of message transmission is tested elsewhere
40 msg_retx_count = 5 # hard-coded max value, internal API
41
42 def __init__(self, controllers):
43 AwareBaseTest.__init__(self, controllers)
44
Etan Cohenfb7f3b12017-05-19 06:54:03 -070045 def create_base_config(self, caps, is_publish, ptype, stype, payload_size,
46 ttl, term_ind_on, null_match):
Etan Cohen872a6be2017-05-16 08:08:15 -070047 """Create a base configuration based on input parameters.
48
49 Args:
Etan Cohenfb7f3b12017-05-19 06:54:03 -070050 caps: device capability dictionary
Etan Cohen872a6be2017-05-16 08:08:15 -070051 is_publish: True if a publish config, else False
52 ptype: unsolicited or solicited (used if is_publish is True)
53 stype: passive or active (used if is_publish is False)
54 payload_size: min, typical, max (PAYLOAD_SIZE_xx)
55 ttl: time-to-live configuration (0 - forever)
56 term_ind_on: is termination indication enabled
57 null_match: null-out the middle match filter
58 Returns:
59 publish discovery configuration object.
60 """
61 config = {}
62 if is_publish:
63 config[aconsts.DISCOVERY_KEY_DISCOVERY_TYPE] = ptype
64 else:
65 config[aconsts.DISCOVERY_KEY_DISCOVERY_TYPE] = stype
66 config[aconsts.DISCOVERY_KEY_TTL] = ttl
67 config[aconsts.DISCOVERY_KEY_TERM_CB_ENABLED] = term_ind_on
68 if payload_size == self.PAYLOAD_SIZE_MIN:
69 config[aconsts.DISCOVERY_KEY_SERVICE_NAME] = "a"
70 config[aconsts.DISCOVERY_KEY_SSI] = None
Etan Cohen0bc1cab2017-05-18 15:30:41 -070071 config[aconsts.DISCOVERY_KEY_MATCH_FILTER_LIST] = []
Etan Cohen872a6be2017-05-16 08:08:15 -070072 elif payload_size == self.PAYLOAD_SIZE_TYPICAL:
73 config[aconsts.DISCOVERY_KEY_SERVICE_NAME] = "GoogleTestServiceX"
74 if is_publish:
75 config[aconsts.DISCOVERY_KEY_SSI] = string.ascii_letters
76 else:
77 config[aconsts.DISCOVERY_KEY_SSI] = string.ascii_letters[::
78 -1] # reverse
79 config[aconsts.DISCOVERY_KEY_MATCH_FILTER_LIST] = autils.encode_list(
80 [(10).to_bytes(1, byteorder="big"), "hello there string"
81 if not null_match else None,
82 bytes(range(40))])
Etan Cohen5a629a62017-05-19 15:11:18 -070083 else: # PAYLOAD_SIZE_MAX
84 config[aconsts.DISCOVERY_KEY_SERVICE_NAME] = "VeryLong" + "X" * (
85 caps[aconsts.CAP_MAX_SERVICE_NAME_LEN] - 8)
86 config[aconsts.DISCOVERY_KEY_SSI] = ("P" if is_publish else "S") * caps[
87 aconsts.CAP_MAX_SERVICE_SPECIFIC_INFO_LEN]
88 mf = autils.construct_max_match_filter(
89 caps[aconsts.CAP_MAX_MATCH_FILTER_LEN])
90 if null_match:
91 mf[2] = None
92 config[aconsts.DISCOVERY_KEY_MATCH_FILTER_LIST] = autils.encode_list(mf)
93
Etan Cohen872a6be2017-05-16 08:08:15 -070094 return config
95
Etan Cohenfb7f3b12017-05-19 06:54:03 -070096 def create_publish_config(self, caps, ptype, payload_size, ttl, term_ind_on,
Etan Cohen872a6be2017-05-16 08:08:15 -070097 null_match):
98 """Create a publish configuration based on input parameters.
99
100 Args:
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700101 caps: device capability dictionary
Etan Cohen872a6be2017-05-16 08:08:15 -0700102 ptype: unsolicited or solicited
103 payload_size: min, typical, max (PAYLOAD_SIZE_xx)
104 ttl: time-to-live configuration (0 - forever)
105 term_ind_on: is termination indication enabled
106 null_match: null-out the middle match filter
107 Returns:
108 publish discovery configuration object.
109 """
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700110 return self.create_base_config(caps, True, ptype, None, payload_size, ttl,
Etan Cohen872a6be2017-05-16 08:08:15 -0700111 term_ind_on, null_match)
112
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700113 def create_subscribe_config(self, caps, stype, payload_size, ttl, term_ind_on,
Etan Cohen872a6be2017-05-16 08:08:15 -0700114 null_match):
115 """Create a subscribe configuration based on input parameters.
116
117 Args:
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700118 caps: device capability dictionary
Etan Cohen872a6be2017-05-16 08:08:15 -0700119 stype: passive or active
120 payload_size: min, typical, max (PAYLOAD_SIZE_xx)
121 ttl: time-to-live configuration (0 - forever)
122 term_ind_on: is termination indication enabled
123 null_match: null-out the middle match filter
124 Returns:
125 subscribe discovery configuration object.
126 """
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700127 return self.create_base_config(caps, False, None, stype, payload_size, ttl,
Etan Cohen872a6be2017-05-16 08:08:15 -0700128 term_ind_on, null_match)
129
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700130 def positive_discovery_test_utility(self, ptype, stype, payload_size):
Etan Cohen872a6be2017-05-16 08:08:15 -0700131 """Utility which runs a positive discovery test:
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700132 - Discovery (publish/subscribe) with TTL=0 (non-self-terminating)
Etan Cohen872a6be2017-05-16 08:08:15 -0700133 - Exchange messages
134 - Update publish/subscribe
135 - Terminate
136
137 Args:
138 ptype: Publish discovery type
139 stype: Subscribe discovery type
140 payload_size: One of PAYLOAD_SIZE_* constants - MIN, TYPICAL, MAX
Etan Cohen872a6be2017-05-16 08:08:15 -0700141 """
142 p_dut = self.android_devices[0]
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700143 p_dut.pretty_name = "Publisher"
Etan Cohen872a6be2017-05-16 08:08:15 -0700144 s_dut = self.android_devices[1]
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700145 s_dut.pretty_name = "Subscriber"
Etan Cohen872a6be2017-05-16 08:08:15 -0700146
147 # Publisher+Subscriber: attach and wait for confirmation
148 p_id = p_dut.droid.wifiAwareAttach(False)
149 autils.wait_for_event(p_dut, aconsts.EVENT_CB_ON_ATTACHED)
150 s_id = s_dut.droid.wifiAwareAttach(False)
151 autils.wait_for_event(s_dut, aconsts.EVENT_CB_ON_ATTACHED)
152
153 # Publisher: start publish and wait for confirmation
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700154 p_config = self.create_publish_config(
155 p_dut.aware_capabilities,
156 ptype,
157 payload_size,
158 ttl=0,
159 term_ind_on=False,
160 null_match=False)
Etan Cohen872a6be2017-05-16 08:08:15 -0700161 p_disc_id = p_dut.droid.wifiAwarePublish(p_id, p_config)
162 autils.wait_for_event(p_dut, aconsts.SESSION_CB_ON_PUBLISH_STARTED)
163
164 # Subscriber: start subscribe and wait for confirmation
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700165 s_config = self.create_subscribe_config(
166 s_dut.aware_capabilities,
167 stype,
168 payload_size,
169 ttl=0,
170 term_ind_on=False,
171 null_match=True)
Etan Cohen872a6be2017-05-16 08:08:15 -0700172 s_disc_id = s_dut.droid.wifiAwareSubscribe(s_id, s_config)
173 autils.wait_for_event(s_dut, aconsts.SESSION_CB_ON_SUBSCRIBE_STARTED)
174
175 # Subscriber: wait for service discovery
176 discovery_event = autils.wait_for_event(
177 s_dut, aconsts.SESSION_CB_ON_SERVICE_DISCOVERED)
178 peer_id_on_sub = discovery_event["data"][aconsts.SESSION_CB_KEY_PEER_ID]
179
180 # Subscriber: validate contents of discovery (specifically that getting the
181 # Publisher's SSI and MatchFilter!)
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700182 autils.assert_equal_strings(
Etan Cohen872a6be2017-05-16 08:08:15 -0700183 bytes(discovery_event["data"][
184 aconsts.SESSION_CB_KEY_SERVICE_SPECIFIC_INFO]).decode("utf-8"),
185 p_config[aconsts.DISCOVERY_KEY_SSI],
186 "Discovery mismatch: service specific info (SSI)")
187 asserts.assert_equal(
188 autils.decode_list(
189 discovery_event["data"][aconsts.SESSION_CB_KEY_MATCH_FILTER_LIST]),
190 autils.decode_list(p_config[aconsts.DISCOVERY_KEY_MATCH_FILTER_LIST]),
191 "Discovery mismatch: match filter")
192
193 # Subscriber: send message to peer (Publisher)
194 s_dut.droid.wifiAwareSendMessage(s_disc_id, peer_id_on_sub,
195 self.get_next_msg_id(), self.query_msg,
196 self.msg_retx_count)
197 autils.wait_for_event(s_dut, aconsts.SESSION_CB_ON_MESSAGE_SENT)
198
199 # Publisher: wait for received message
200 pub_rx_msg_event = autils.wait_for_event(
201 p_dut, aconsts.SESSION_CB_ON_MESSAGE_RECEIVED)
202 peer_id_on_pub = pub_rx_msg_event["data"][aconsts.SESSION_CB_KEY_PEER_ID]
203
204 # Publisher: validate contents of message
205 asserts.assert_equal(
206 pub_rx_msg_event["data"][aconsts.SESSION_CB_KEY_MESSAGE_AS_STRING],
207 self.query_msg, "Subscriber -> Publisher message corrupted")
208
209 # Publisher: send message to peer (Subscriber)
210 p_dut.droid.wifiAwareSendMessage(p_disc_id, peer_id_on_pub,
211 self.get_next_msg_id(), self.response_msg,
212 self.msg_retx_count)
213 autils.wait_for_event(p_dut, aconsts.SESSION_CB_ON_MESSAGE_SENT)
214
215 # Subscriber: wait for received message
216 sub_rx_msg_event = autils.wait_for_event(
217 s_dut, aconsts.SESSION_CB_ON_MESSAGE_RECEIVED)
218
219 # Subscriber: validate contents of message
220 asserts.assert_equal(
221 sub_rx_msg_event["data"][aconsts.SESSION_CB_KEY_PEER_ID],
222 peer_id_on_sub,
223 "Subscriber received message from different peer ID then discovery!?")
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700224 autils.assert_equal_strings(
Etan Cohen872a6be2017-05-16 08:08:15 -0700225 sub_rx_msg_event["data"][aconsts.SESSION_CB_KEY_MESSAGE_AS_STRING],
226 self.response_msg, "Publisher -> Subscriber message corrupted")
227
228 # Subscriber: validate that we're not getting another Service Discovery
229 autils.fail_on_event(s_dut, aconsts.SESSION_CB_ON_SERVICE_DISCOVERED)
230
231 # Publisher: update publish and wait for confirmation
232 p_config[aconsts.DISCOVERY_KEY_SSI] = "something else"
233 p_dut.droid.wifiAwareUpdatePublish(p_disc_id, p_config)
234 autils.wait_for_event(p_dut, aconsts.SESSION_CB_ON_SESSION_CONFIG_UPDATED)
235
236 # Subscriber: expect a new service discovery
237 discovery_event = autils.wait_for_event(
238 s_dut, aconsts.SESSION_CB_ON_SERVICE_DISCOVERED)
239
240 # Subscriber: validate contents of discovery
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700241 autils.assert_equal_strings(
Etan Cohen872a6be2017-05-16 08:08:15 -0700242 bytes(discovery_event["data"][
243 aconsts.SESSION_CB_KEY_SERVICE_SPECIFIC_INFO]).decode("utf-8"),
244 p_config[aconsts.DISCOVERY_KEY_SSI],
245 "Discovery mismatch (after pub update): service specific info (SSI)")
246 asserts.assert_equal(
247 autils.decode_list(
248 discovery_event["data"][aconsts.SESSION_CB_KEY_MATCH_FILTER_LIST]),
249 autils.decode_list(p_config[aconsts.DISCOVERY_KEY_MATCH_FILTER_LIST]),
250 "Discovery mismatch: match filter")
251
252 # Subscribe: update subscribe and wait for confirmation
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700253 s_config = self.create_subscribe_config(
254 s_dut.aware_capabilities,
255 stype,
256 payload_size,
257 ttl=0,
258 term_ind_on=False,
259 null_match=False)
Etan Cohen872a6be2017-05-16 08:08:15 -0700260 s_dut.droid.wifiAwareUpdateSubscribe(s_disc_id, s_config)
261 autils.wait_for_event(s_dut, aconsts.SESSION_CB_ON_SESSION_CONFIG_UPDATED)
262
Etan Cohen872a6be2017-05-16 08:08:15 -0700263 # Publisher+Subscriber: Terminate sessions
264 p_dut.droid.wifiAwareDestroyDiscoverySession(p_disc_id)
265 s_dut.droid.wifiAwareDestroyDiscoverySession(s_disc_id)
266
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700267 # sleep for timeout period and then verify all 'fail_on_event' together
268 time.sleep(autils.EVENT_TIMEOUT)
269
Etan Cohen2c8db552017-05-22 11:00:03 -0700270 # verify that there were no other events
Etan Cohen60a9b522017-05-22 14:10:01 -0700271 autils.verify_no_more_events(p_dut, timeout=0)
272 autils.verify_no_more_events(s_dut, timeout=0)
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700273
Etan Cohen2c8db552017-05-22 11:00:03 -0700274 def verify_discovery_session_term(self, dut, disc_id, config, is_publish,
275 term_ind_on):
276 """Utility to verify that the specified discovery session has terminated (by
277 waiting for the TTL and then attempting to reconfigure).
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700278
Etan Cohen2c8db552017-05-22 11:00:03 -0700279 Args:
280 dut: device under test
281 disc_id: discovery id for the existing session
282 config: configuration of the existing session
283 is_publish: True if the configuration was publish, False if subscribe
284 term_ind_on: True if a termination indication is expected, False otherwise
285 """
286 # Wait for session termination
287 if term_ind_on:
288 autils.wait_for_event(
289 dut,
290 autils.decorate_event(aconsts.SESSION_CB_ON_SESSION_TERMINATED,
291 disc_id))
292 else:
293 # can't defer wait to end since in any case have to wait for session to
294 # expire
295 autils.fail_on_event(
296 dut,
297 autils.decorate_event(aconsts.SESSION_CB_ON_SESSION_TERMINATED,
298 disc_id))
299
300 # Validate that session expired by trying to configure it (expect failure)
301 config[aconsts.DISCOVERY_KEY_SSI] = "something else"
302 if is_publish:
303 dut.droid.wifiAwareUpdatePublish(disc_id, config)
304 else:
305 dut.droid.wifiAwareUpdateSubscribe(disc_id, config)
306 # failure expected - should verify that SESSION_CB_ON_SESSION_CONFIG_UPDATED
307 # not received but instead will verify_no_more_events at end of test
308
309 def positive_ttl_test_utility(self, is_publish, ptype, stype, term_ind_on):
310 """Utility which runs a positive discovery session TTL configuration test
311
312 Iteration 1: Verify session started with TTL
313 Iteration 2: Verify session started without TTL and reconfigured with TTL
314 Iteration 3: Verify session started with (long) TTL and reconfigured with
315 (short) TTL
316
317 Args:
318 is_publish: True if testing publish, False if testing subscribe
319 ptype: Publish discovery type (used if is_publish is True)
320 stype: Subscribe discovery type (used if is_publish is False)
321 term_ind_on: Configuration of termination indication
322 """
323 SHORT_TTL = 5 # 5 seconds
324 LONG_TTL = 100 # 100 seconds
325 dut = self.android_devices[0]
326
327 # Attach and wait for confirmation
328 id = dut.droid.wifiAwareAttach(False)
329 autils.wait_for_event(dut, aconsts.EVENT_CB_ON_ATTACHED)
330
331 # Iteration 1: Start discovery session with TTL
332 config = self.create_base_config(dut.aware_capabilities, is_publish, ptype,
333 stype, self.PAYLOAD_SIZE_TYPICAL,
334 SHORT_TTL, term_ind_on, False)
335 if is_publish:
336 disc_id = dut.droid.wifiAwarePublish(id, config, True)
337 autils.wait_for_event(dut,
338 autils.decorate_event(
339 aconsts.SESSION_CB_ON_PUBLISH_STARTED, disc_id))
340 else:
341 disc_id = dut.droid.wifiAwareSubscribe(id, config, True)
342 autils.wait_for_event(
343 dut,
344 autils.decorate_event(aconsts.SESSION_CB_ON_SUBSCRIBE_STARTED,
345 disc_id))
346
347 # Wait for session termination & verify
348 self.verify_discovery_session_term(dut, disc_id, config, is_publish,
349 term_ind_on)
350
351 # Iteration 2: Start a discovery session without TTL
352 config = self.create_base_config(dut.aware_capabilities, is_publish, ptype,
353 stype, self.PAYLOAD_SIZE_TYPICAL, 0,
354 term_ind_on, False)
355 if is_publish:
356 disc_id = dut.droid.wifiAwarePublish(id, config, True)
357 autils.wait_for_event(dut,
358 autils.decorate_event(
359 aconsts.SESSION_CB_ON_PUBLISH_STARTED, disc_id))
360 else:
361 disc_id = dut.droid.wifiAwareSubscribe(id, config, True)
362 autils.wait_for_event(
363 dut,
364 autils.decorate_event(aconsts.SESSION_CB_ON_SUBSCRIBE_STARTED,
365 disc_id))
366
367 # Update with a TTL
368 config = self.create_base_config(dut.aware_capabilities, is_publish, ptype,
369 stype, self.PAYLOAD_SIZE_TYPICAL,
370 SHORT_TTL, term_ind_on, False)
371 if is_publish:
372 dut.droid.wifiAwareUpdatePublish(disc_id, config)
373 else:
374 dut.droid.wifiAwareUpdateSubscribe(disc_id, config)
375 autils.wait_for_event(
376 dut,
377 autils.decorate_event(aconsts.SESSION_CB_ON_SESSION_CONFIG_UPDATED,
378 disc_id))
379
380 # Wait for session termination & verify
381 self.verify_discovery_session_term(dut, disc_id, config, is_publish,
382 term_ind_on)
383
384 # Iteration 3: Start a discovery session with (long) TTL
385 config = self.create_base_config(dut.aware_capabilities, is_publish, ptype,
386 stype, self.PAYLOAD_SIZE_TYPICAL, LONG_TTL,
387 term_ind_on, False)
388 if is_publish:
389 disc_id = dut.droid.wifiAwarePublish(id, config, True)
390 autils.wait_for_event(dut,
391 autils.decorate_event(
392 aconsts.SESSION_CB_ON_PUBLISH_STARTED, disc_id))
393 else:
394 disc_id = dut.droid.wifiAwareSubscribe(id, config, True)
395 autils.wait_for_event(
396 dut,
397 autils.decorate_event(aconsts.SESSION_CB_ON_SUBSCRIBE_STARTED,
398 disc_id))
399
400 # Update with a TTL
401 config = self.create_base_config(dut.aware_capabilities, is_publish, ptype,
402 stype, self.PAYLOAD_SIZE_TYPICAL,
403 SHORT_TTL, term_ind_on, False)
404 if is_publish:
405 dut.droid.wifiAwareUpdatePublish(disc_id, config)
406 else:
407 dut.droid.wifiAwareUpdateSubscribe(disc_id, config)
408 autils.wait_for_event(
409 dut,
410 autils.decorate_event(aconsts.SESSION_CB_ON_SESSION_CONFIG_UPDATED,
411 disc_id))
412
413 # Wait for session termination & verify
414 self.verify_discovery_session_term(dut, disc_id, config, is_publish,
415 term_ind_on)
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700416
417 # verify that there were no other events
Etan Cohen2c8db552017-05-22 11:00:03 -0700418 autils.verify_no_more_events(dut)
Etan Cohen872a6be2017-05-16 08:08:15 -0700419
Etan Cohen60a9b522017-05-22 14:10:01 -0700420 def negative_discovery_test_utility(self, p_dut, s_dut, p_config, s_config):
421 """Utility which runs a negative discovery test:
422 - Start discovery (publish/subscribe) with TTL=0 (non-self-terminating)
423 - Validate no service is discovered
424 - Terminate discovery sessions
425
426 Uses typical payload size.
427
428 Args:
429 p_dut: Publish device under test
430 s_dut: Subscribe device under test
431 p_config: Publish discovery configuration
432 s_config: Subscribe discovery configuration
433 """
434 # Publisher+Subscriber: attach and wait for confirmation
435 p_id = p_dut.droid.wifiAwareAttach(False)
436 autils.wait_for_event(p_dut, aconsts.EVENT_CB_ON_ATTACHED)
437 s_id = s_dut.droid.wifiAwareAttach(False)
438 autils.wait_for_event(s_dut, aconsts.EVENT_CB_ON_ATTACHED)
439
440 # Publisher: start publish and wait for confirmation
441 p_disc_id = p_dut.droid.wifiAwarePublish(p_id, p_config)
442 autils.wait_for_event(p_dut, aconsts.SESSION_CB_ON_PUBLISH_STARTED)
443
444 # Subscriber: start subscribe and wait for confirmation
445 s_disc_id = s_dut.droid.wifiAwareSubscribe(s_id, s_config)
446 autils.wait_for_event(s_dut, aconsts.SESSION_CB_ON_SUBSCRIBE_STARTED)
447
448 # Subscriber: fail on service discovery
449 autils.fail_on_event(s_dut, aconsts.SESSION_CB_ON_SERVICE_DISCOVERED)
450
451 # Publisher+Subscriber: Terminate sessions
452 p_dut.droid.wifiAwareDestroyDiscoverySession(p_disc_id)
453 s_dut.droid.wifiAwareDestroyDiscoverySession(s_disc_id)
454
455 # verify that there were no other events (including terminations)
456 time.sleep(autils.EVENT_TIMEOUT)
457 autils.verify_no_more_events(p_dut, timeout=0)
458 autils.verify_no_more_events(s_dut, timeout=0)
459
460 def negative_discovery_mismatch_name_test_utility(
461 self, p_type, s_type, p_service_name, s_service_name):
462 """Utility which runs the negative discovery test for mismatched service
463 names.
464
465 Args:
466 p_type: Publish discovery type
467 s_type: Subscribe discovery type
468 p_service_name: Publish service name
469 s_service_name: Subscribe service name
470 """
471 p_dut = self.android_devices[0]
472 p_dut.pretty_name = "Publisher"
473 s_dut = self.android_devices[1]
474 s_dut.pretty_name = "Subscriber"
475
476 # create configurations
477 p_config = self.create_publish_config(
478 p_dut.aware_capabilities,
479 p_type,
480 self.PAYLOAD_SIZE_TYPICAL,
481 ttl=0,
482 term_ind_on=False,
483 null_match=False)
484 p_config[aconsts.DISCOVERY_KEY_SERVICE_NAME] = p_service_name
485 s_config = self.create_publish_config(
486 s_dut.aware_capabilities,
487 s_type,
488 self.PAYLOAD_SIZE_TYPICAL,
489 ttl=0,
490 term_ind_on=False,
491 null_match=False)
492 s_config[aconsts.DISCOVERY_KEY_SERVICE_NAME] = s_service_name
493
494 self.negative_discovery_test_utility(p_dut, s_dut, p_config, s_config)
495
496
Etan Cohen872a6be2017-05-16 08:08:15 -0700497 #######################################
498 # Positive tests key:
499 #
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700500 # names is: test_<pub_type>_<sub_type>_<size>
Etan Cohen872a6be2017-05-16 08:08:15 -0700501 # where:
502 #
503 # pub_type: Type of publish discovery session: unsolicited or solicited.
504 # sub_type: Type of subscribe discovery session: passive or active.
505 # size: Size of payload fields (service name, service specific info, and match
506 # filter: typical, max, or min.
Etan Cohen872a6be2017-05-16 08:08:15 -0700507 #######################################
508
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700509 def test_positive_unsolicited_passive_typical(self):
Etan Cohen872a6be2017-05-16 08:08:15 -0700510 """Functional test case / Discovery test cases / positive test case:
511 - Solicited publish + passive subscribe
512 - Typical payload fields size
Etan Cohen872a6be2017-05-16 08:08:15 -0700513
514 Verifies that discovery and message exchange succeeds.
515 """
516 self.positive_discovery_test_utility(
517 ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
518 stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700519 payload_size=self.PAYLOAD_SIZE_TYPICAL)
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700520
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700521 def test_positive_unsolicited_passive_min(self):
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700522 """Functional test case / Discovery test cases / positive test case:
523 - Solicited publish + passive subscribe
524 - Minimal payload fields size
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700525
526 Verifies that discovery and message exchange succeeds.
527 """
528 self.positive_discovery_test_utility(
529 ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
530 stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700531 payload_size=self.PAYLOAD_SIZE_MIN)
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700532
Etan Cohen5a629a62017-05-19 15:11:18 -0700533 def test_positive_unsolicited_passive_max(self):
534 """Functional test case / Discovery test cases / positive test case:
535 - Solicited publish + passive subscribe
536 - Maximal payload fields size
537
538 Verifies that discovery and message exchange succeeds.
539 """
540 self.positive_discovery_test_utility(
541 ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
542 stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
543 payload_size=self.PAYLOAD_SIZE_MAX)
544
545
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700546 def test_positive_solicited_active_typical(self):
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700547 """Functional test case / Discovery test cases / positive test case:
548 - Unsolicited publish + active subscribe
549 - Typical payload fields size
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700550
551 Verifies that discovery and message exchange succeeds.
552 """
553 self.positive_discovery_test_utility(
554 ptype=aconsts.PUBLISH_TYPE_SOLICITED,
555 stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700556 payload_size=self.PAYLOAD_SIZE_TYPICAL)
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700557
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700558 def test_positive_solicited_active_min(self):
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700559 """Functional test case / Discovery test cases / positive test case:
560 - Unsolicited publish + active subscribe
561 - Minimal payload fields size
Etan Cohen0bc1cab2017-05-18 15:30:41 -0700562
563 Verifies that discovery and message exchange succeeds.
564 """
565 self.positive_discovery_test_utility(
566 ptype=aconsts.PUBLISH_TYPE_SOLICITED,
567 stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
Etan Cohenfb7f3b12017-05-19 06:54:03 -0700568 payload_size=self.PAYLOAD_SIZE_MIN)
Etan Cohen5a629a62017-05-19 15:11:18 -0700569
570 def test_positive_solicited_active_max(self):
571 """Functional test case / Discovery test cases / positive test case:
572 - Unsolicited publish + active subscribe
573 - Maximal payload fields size
574
575 Verifies that discovery and message exchange succeeds.
576 """
577 self.positive_discovery_test_utility(
578 ptype=aconsts.PUBLISH_TYPE_SOLICITED,
579 stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
580 payload_size=self.PAYLOAD_SIZE_MAX)
Etan Cohen2c8db552017-05-22 11:00:03 -0700581
582 #######################################
583 # TTL tests key:
584 #
585 # names is: test_ttl_<pub_type|sub_type>_<term_ind>
586 # where:
587 #
588 # pub_type: Type of publish discovery session: unsolicited or solicited.
589 # sub_type: Type of subscribe discovery session: passive or active.
590 # term_ind: ind_on or ind_off
591 #######################################
592
593 def test_ttl_unsolicited_ind_on(self):
594 """Functional test case / Discovery test cases / TTL test case:
595 - Unsolicited publish
596 - Termination indication enabled
597 """
598 self.positive_ttl_test_utility(
599 is_publish=True,
600 ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
601 stype=None,
602 term_ind_on=True)
Etan Cohen3010bc22017-05-22 12:47:17 -0700603
604 def test_ttl_unsolicited_ind_off(self):
605 """Functional test case / Discovery test cases / TTL test case:
606 - Unsolicited publish
607 - Termination indication disabled
608 """
609 self.positive_ttl_test_utility(
610 is_publish=True,
611 ptype=aconsts.PUBLISH_TYPE_UNSOLICITED,
612 stype=None,
613 term_ind_on=False)
614
615 def test_ttl_solicited_ind_on(self):
616 """Functional test case / Discovery test cases / TTL test case:
617 - Solicited publish
618 - Termination indication enabled
619 """
620 self.positive_ttl_test_utility(
621 is_publish=True,
622 ptype=aconsts.PUBLISH_TYPE_SOLICITED,
623 stype=None,
624 term_ind_on=True)
625
626 def test_ttl_solicited_ind_off(self):
627 """Functional test case / Discovery test cases / TTL test case:
628 - Solicited publish
629 - Termination indication disabled
630 """
631 self.positive_ttl_test_utility(
632 is_publish=True,
633 ptype=aconsts.PUBLISH_TYPE_SOLICITED,
634 stype=None,
635 term_ind_on=False)
636
637 def test_ttl_passive_ind_on(self):
638 """Functional test case / Discovery test cases / TTL test case:
639 - Passive subscribe
640 - Termination indication enabled
641 """
642 self.positive_ttl_test_utility(
643 is_publish=False,
644 ptype=None,
645 stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
646 term_ind_on=True)
647
648 def test_ttl_passive_ind_off(self):
649 """Functional test case / Discovery test cases / TTL test case:
650 - Passive subscribe
651 - Termination indication disabled
652 """
653 self.positive_ttl_test_utility(
654 is_publish=False,
655 ptype=None,
656 stype=aconsts.SUBSCRIBE_TYPE_PASSIVE,
657 term_ind_on=False)
658
659 def test_ttl_active_ind_on(self):
660 """Functional test case / Discovery test cases / TTL test case:
661 - Active subscribe
662 - Termination indication enabled
663 """
664 self.positive_ttl_test_utility(
665 is_publish=False,
666 ptype=None,
667 stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
668 term_ind_on=True)
669
670 def test_ttl_active_ind_off(self):
671 """Functional test case / Discovery test cases / TTL test case:
672 - Active subscribe
673 - Termination indication disabled
674 """
675 self.positive_ttl_test_utility(
676 is_publish=False,
677 ptype=None,
678 stype=aconsts.SUBSCRIBE_TYPE_ACTIVE,
679 term_ind_on=False)
Etan Cohen60a9b522017-05-22 14:10:01 -0700680
681 #######################################
682 # Mismatched service name tests key:
683 #
684 # names is: test_mismatch_service_name_<pub_type>_<sub_type>
685 # where:
686 #
687 # pub_type: Type of publish discovery session: unsolicited or solicited.
688 # sub_type: Type of subscribe discovery session: passive or active.
689 #######################################
690
691 def test_mismatch_service_name_unsolicited_passive(self):
692 """Functional test case / Discovery test cases / Mismatch service name
693 - Unsolicited publish
694 - Passive subscribe
695 """
696 self.negative_discovery_mismatch_name_test_utility(
697 p_type=aconsts.PUBLISH_TYPE_UNSOLICITED,
698 s_type=aconsts.SUBSCRIBE_TYPE_PASSIVE,
699 p_service_name="GoogleTestServiceXXX",
700 s_service_name="GoogleTestServiceYYY")
701
702 def test_mismatch_service_name_solicited_active(self):
703 """Functional test case / Discovery test cases / Mismatch service name
704 - Solicited publish
705 - Active subscribe
706 """
707 self.negative_discovery_mismatch_name_test_utility(
708 p_type=aconsts.PUBLISH_TYPE_SOLICITED,
709 s_type=aconsts.SUBSCRIBE_TYPE_ACTIVE,
710 p_service_name="GoogleTestServiceXXX",
711 s_service_name="GoogleTestServiceYYY")