1# Copyright 2021-2022 Google LLC 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# https://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# ----------------------------------------------------------------------------- 16# Imports 17# ----------------------------------------------------------------------------- 18from bumble.sdp import * 19from bumble.core import UUID 20 21 22# ----------------------------------------------------------------------------- 23def basic_check(x): 24 serialized = bytes(x) 25 if len(serialized) < 500: 26 print('Original:', x) 27 print('Serialized:', serialized.hex()) 28 parsed = DataElement.from_bytes(serialized) 29 if len(serialized) < 500: 30 print('Parsed:', parsed) 31 parsed_bytes = bytes(parsed) 32 if len(serialized) < 500: 33 print('Parsed Bytes:', parsed_bytes.hex()) 34 assert(parsed_bytes == serialized) 35 x_str = str(x) 36 parsed_str = str(parsed) 37 assert(x_str == parsed_str) 38 39 40# ----------------------------------------------------------------------------- 41def test_data_elements(): 42 e = DataElement(DataElement.NIL, None) 43 basic_check(e) 44 45 e = DataElement(DataElement.UNSIGNED_INTEGER, 12, 1) 46 basic_check(e) 47 48 e = DataElement(DataElement.UNSIGNED_INTEGER, 1234, 2) 49 basic_check(e) 50 51 e = DataElement(DataElement.UNSIGNED_INTEGER, 0x123456, 4) 52 basic_check(e) 53 54 e = DataElement(DataElement.UNSIGNED_INTEGER, 0x123456789, 8) 55 basic_check(e) 56 57 e = DataElement(DataElement.UNSIGNED_INTEGER, 0x0000FFFF, value_size=4) 58 basic_check(e) 59 60 e = DataElement(DataElement.SIGNED_INTEGER, -12, 1) 61 basic_check(e) 62 63 e = DataElement(DataElement.SIGNED_INTEGER, -1234, 2) 64 basic_check(e) 65 66 e = DataElement(DataElement.SIGNED_INTEGER, -0x123456, 4) 67 basic_check(e) 68 69 e = DataElement(DataElement.SIGNED_INTEGER, -0x123456789, 8) 70 basic_check(e) 71 72 e = DataElement(DataElement.SIGNED_INTEGER, 0x0000FFFF, value_size=4) 73 basic_check(e) 74 75 e = DataElement(DataElement.UUID, UUID.from_16_bits(1234)) 76 basic_check(e) 77 78 e = DataElement(DataElement.UUID, UUID.from_32_bits(123456789)) 79 basic_check(e) 80 81 e = DataElement(DataElement.UUID, UUID('61A3512C-09BE-4DDC-A6A6-0B03667AAFC6')) 82 basic_check(e) 83 84 e = DataElement(DataElement.TEXT_STRING, 'hello') 85 basic_check(e) 86 87 e = DataElement(DataElement.TEXT_STRING, 'hello' * 60) 88 basic_check(e) 89 90 e = DataElement(DataElement.TEXT_STRING, 'hello' * 20000) 91 basic_check(e) 92 93 e = DataElement(DataElement.BOOLEAN, True) 94 basic_check(e) 95 96 e = DataElement(DataElement.BOOLEAN, False) 97 basic_check(e) 98 99 e = DataElement(DataElement.SEQUENCE, [DataElement(DataElement.BOOLEAN, True)]) 100 basic_check(e) 101 102 e = DataElement(DataElement.SEQUENCE, [ 103 DataElement(DataElement.BOOLEAN, True), 104 DataElement(DataElement.TEXT_STRING, 'hello') 105 ]) 106 basic_check(e) 107 108 e = DataElement(DataElement.ALTERNATIVE, [DataElement(DataElement.BOOLEAN, True)]) 109 basic_check(e) 110 111 e = DataElement(DataElement.ALTERNATIVE, [ 112 DataElement(DataElement.BOOLEAN, True), 113 DataElement(DataElement.TEXT_STRING, 'hello') 114 ]) 115 basic_check(e) 116 117 e = DataElement(DataElement.URL, 'http://example.com') 118 119 e = DataElement.nil() 120 121 e = DataElement.unsigned_integer(1234, 2) 122 basic_check(e) 123 124 e = DataElement.signed_integer(-1234, 2) 125 basic_check(e) 126 127 e = DataElement.uuid(UUID.from_16_bits(1234)) 128 basic_check(e) 129 130 e = DataElement.text_string('hello') 131 basic_check(e) 132 133 e = DataElement.boolean(True) 134 basic_check(e) 135 136 e = DataElement.sequence([DataElement.signed_integer(0, 1), DataElement.text_string('hello')]) 137 basic_check(e) 138 139 e = DataElement.alternative([DataElement.signed_integer(0, 1), DataElement.text_string('hello')]) 140 basic_check(e) 141 142 e = DataElement.url('http://foobar.com') 143 basic_check(e) 144 145 146# ----------------------------------------------------------------------------- 147if __name__ == '__main__': 148 test_data_elements() 149