1*61c4878aSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*61c4878aSAndroid Build Coastguard Worker# Copyright 2020 The Pigweed Authors 3*61c4878aSAndroid Build Coastguard Worker# 4*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not 5*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of 6*61c4878aSAndroid Build Coastguard Worker# the License at 7*61c4878aSAndroid Build Coastguard Worker# 8*61c4878aSAndroid Build Coastguard Worker# https://www.apache.org/licenses/LICENSE-2.0 9*61c4878aSAndroid Build Coastguard Worker# 10*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 11*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under 14*61c4878aSAndroid Build Coastguard Worker# the License. 15*61c4878aSAndroid Build Coastguard Worker"""Tests the tokenized string encoder module.""" 16*61c4878aSAndroid Build Coastguard Worker 17*61c4878aSAndroid Build Coastguard Workerimport unittest 18*61c4878aSAndroid Build Coastguard Worker 19*61c4878aSAndroid Build Coastguard Workerimport varint_test_data 20*61c4878aSAndroid Build Coastguard Worker 21*61c4878aSAndroid Build Coastguard Workerfrom pw_tokenizer.encode import encode_token_and_args 22*61c4878aSAndroid Build Coastguard Worker 23*61c4878aSAndroid Build Coastguard Worker 24*61c4878aSAndroid Build Coastguard Workerclass TestEncodeTokenized(unittest.TestCase): 25*61c4878aSAndroid Build Coastguard Worker """Tests encoding tokenized strings with various arguments.""" 26*61c4878aSAndroid Build Coastguard Worker 27*61c4878aSAndroid Build Coastguard Worker def test_no_args(self): 28*61c4878aSAndroid Build Coastguard Worker self.assertEqual(b'\xab\xcd\x12\x34', encode_token_and_args(0x3412CDAB)) 29*61c4878aSAndroid Build Coastguard Worker self.assertEqual(b'\x00\x00\x00\x00', encode_token_and_args(0)) 30*61c4878aSAndroid Build Coastguard Worker 31*61c4878aSAndroid Build Coastguard Worker def test_int(self): 32*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 33*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\0', encode_token_and_args(0xFFFFFFFF, 0) 34*61c4878aSAndroid Build Coastguard Worker ) 35*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 36*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\1', encode_token_and_args(0xFFFFFFFF, -1) 37*61c4878aSAndroid Build Coastguard Worker ) 38*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 39*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\2', encode_token_and_args(0xFFFFFFFF, 1) 40*61c4878aSAndroid Build Coastguard Worker ) 41*61c4878aSAndroid Build Coastguard Worker 42*61c4878aSAndroid Build Coastguard Worker def test_float(self): 43*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 44*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\0\0\0\0', encode_token_and_args(0xFFFFFFFF, 0.0) 45*61c4878aSAndroid Build Coastguard Worker ) 46*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 47*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\0\0\0\x80', 48*61c4878aSAndroid Build Coastguard Worker encode_token_and_args(0xFFFFFFFF, -0.0), 49*61c4878aSAndroid Build Coastguard Worker ) 50*61c4878aSAndroid Build Coastguard Worker 51*61c4878aSAndroid Build Coastguard Worker def test_string(self): 52*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 53*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\5hello', 54*61c4878aSAndroid Build Coastguard Worker encode_token_and_args(0xFFFFFFFF, 'hello'), 55*61c4878aSAndroid Build Coastguard Worker ) 56*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 57*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\x7f' + b'!' * 127, 58*61c4878aSAndroid Build Coastguard Worker encode_token_and_args(0xFFFFFFFF, '!' * 127), 59*61c4878aSAndroid Build Coastguard Worker ) 60*61c4878aSAndroid Build Coastguard Worker 61*61c4878aSAndroid Build Coastguard Worker def test_string_too_long(self): 62*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 63*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\xff' + b'!' * 127, 64*61c4878aSAndroid Build Coastguard Worker encode_token_and_args(0xFFFFFFFF, '!' * 128), 65*61c4878aSAndroid Build Coastguard Worker ) 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker def test_bytes(self): 68*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 69*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\4\0yo\0', 70*61c4878aSAndroid Build Coastguard Worker encode_token_and_args(0xFFFFFFFF, '\0yo\0'), 71*61c4878aSAndroid Build Coastguard Worker ) 72*61c4878aSAndroid Build Coastguard Worker 73*61c4878aSAndroid Build Coastguard Worker def test_bytes_too_long(self): 74*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 75*61c4878aSAndroid Build Coastguard Worker b'\xff\xff\xff\xff\xff' + b'?' * 127, 76*61c4878aSAndroid Build Coastguard Worker encode_token_and_args(0xFFFFFFFF, b'?' * 200), 77*61c4878aSAndroid Build Coastguard Worker ) 78*61c4878aSAndroid Build Coastguard Worker 79*61c4878aSAndroid Build Coastguard Worker def test_multiple_args(self): 80*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 81*61c4878aSAndroid Build Coastguard Worker b'\xdd\xcc\xbb\xaa\0', encode_token_and_args(0xAABBCCDD, 0) 82*61c4878aSAndroid Build Coastguard Worker ) 83*61c4878aSAndroid Build Coastguard Worker 84*61c4878aSAndroid Build Coastguard Worker 85*61c4878aSAndroid Build Coastguard Workerclass TestIntegerEncoding(unittest.TestCase): 86*61c4878aSAndroid Build Coastguard Worker """Test encoding variable-length integers.""" 87*61c4878aSAndroid Build Coastguard Worker 88*61c4878aSAndroid Build Coastguard Worker def test_encode_generated_data(self): 89*61c4878aSAndroid Build Coastguard Worker test_data = varint_test_data.TEST_DATA 90*61c4878aSAndroid Build Coastguard Worker self.assertGreater(len(test_data), 100) 91*61c4878aSAndroid Build Coastguard Worker 92*61c4878aSAndroid Build Coastguard Worker for _, signed, _, unsigned, encoded in test_data: 93*61c4878aSAndroid Build Coastguard Worker # Skip numbers that are larger than 32-bits, since they aren't 94*61c4878aSAndroid Build Coastguard Worker # supported currently. 95*61c4878aSAndroid Build Coastguard Worker if int(unsigned).bit_length() > 32: 96*61c4878aSAndroid Build Coastguard Worker continue 97*61c4878aSAndroid Build Coastguard Worker 98*61c4878aSAndroid Build Coastguard Worker # Encode the value as an arg, but skip the 4 bytes for the token. 99*61c4878aSAndroid Build Coastguard Worker self.assertEqual(encode_token_and_args(0, int(signed))[4:], encoded) 100*61c4878aSAndroid Build Coastguard Worker self.assertEqual( 101*61c4878aSAndroid Build Coastguard Worker encode_token_and_args(0, int(unsigned))[4:], encoded 102*61c4878aSAndroid Build Coastguard Worker ) 103*61c4878aSAndroid Build Coastguard Worker 104*61c4878aSAndroid Build Coastguard Worker 105*61c4878aSAndroid Build Coastguard Workerif __name__ == '__main__': 106*61c4878aSAndroid Build Coastguard Worker unittest.main() 107