1a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis/* 2a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** 3a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** Copyright 2017, The Android Open Source Project 4a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** 5a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** Licensed under the Apache License, Version 2.0 (the "License"); 6a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** you may not use this file except in compliance with the License. 7a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** You may obtain a copy of the License at 8a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** 9a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** http://www.apache.org/licenses/LICENSE-2.0 10a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** 11a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** Unless required by applicable law or agreed to in writing, software 12a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** distributed under the License is distributed on an "AS IS" BASIS, 13a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** See the License for the specific language governing permissions and 15a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis** limitations under the License. 16a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis*/ 17a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 18a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis#include <android/hardware/confirmationui/support/cbor.h> 19a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 20a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis#include <cstddef> 21a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis#include <cstdint> 22a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis#include <iomanip> 23a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis#include <iostream> 24a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 25a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis#include <gtest/gtest.h> 26a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 27a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskisusing namespace android::hardware::confirmationui::support; 28a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 29a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskisuint8_t testVector[] = { 30a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0xA4, 0x63, 0x6B, 0x65, 0x79, 0x65, 0x76, 0x61, 0x6C, 0x75, 0x65, 0x63, 0x6B, 0x65, 0x79, 0x4D, 31a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x00, 0x04, 0x07, 0x1B, 32a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x07, 0x1A, 0xFD, 0x49, 0x8C, 0xFF, 33a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0xFF, 0x82, 0x69, 0xE2, 0x99, 0xA8, 0xE2, 0x9A, 0x96, 0xE2, 0xB6, 0x96, 0x59, 0x01, 0x91, 0x61, 34a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 35a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 36a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 37a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 38a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 39a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 40a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 41a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 42a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 43a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 44a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 45a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 46a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 47a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 48a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 49a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 50a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 51a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 52a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 53a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 54a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 55a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 56a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 57a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 58a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61, 0x00, 59a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis}; 60a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 61a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis// 400 'a's and a '\0' 62a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskisconstexpr char fourHundredAs[] = 63a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 64a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 65a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 66a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" 67a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis "aaaaaaaaaaaaaaaaaaaaaaaa"; 68a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 69a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisWriteState writeTest(WriteState state) { 70a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis return write(state, // 71a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis map( // 72a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis pair(text("key"), text("value")), // 73a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis pair(text("key"), bytes("100101010010")), // 74a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis pair(4, 7), // 75a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis pair((UINT64_C(1) << 62), INT64_C(-2000000000000000)) // 76a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ), // 77a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis arr(text("♨⚖ⶖ"), bytes(fourHundredAs))); 78a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 79a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 80a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, FeatureTest) { 81a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[0x1000]; 82a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer); 83a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeTest(state); 84a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(sizeof(testVector), size_t(state.data_ - buffer)); 85a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(Error::OK, state.error_); 86a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(0, memcmp(buffer, testVector, sizeof(testVector))); 87a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 88a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 89a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis// Test if in all write cases an out of data error is correctly propagated and we don't 90a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis// write beyond the end of the buffer. 91a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, BufferTooShort) { 92a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[0x1000]; 93a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis for (size_t s = 1; s < sizeof(testVector); ++s) { 94a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis memset(buffer, 0x22, 0x1000); // 0x22 is not in the testVector 95a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer, s); 96a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeTest(state); 97a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis for (size_t t = s; t < 0x1000; ++t) { 98a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(0x22, buffer[t]); // check if a canary has been killed 99a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis } 100a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(Error::OUT_OF_DATA, state.error_); 101a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis } 102a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 103a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 104a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, MalformedUTF8Test_Stray) { 105a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[20]; 106a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer); 107a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis char malformed[] = {char(0x80), 0}; 108a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = write(state, text(malformed)); 109a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(Error::MALFORMED_UTF8, state.error_); 110a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 111a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 112a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, MalformendUTF8Test_StringEndsMidMultiByte) { 113a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[20]; 114a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer); 115a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis char malformed[] = {char(0xc0), 0}; 116a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = write(state, text(malformed)); 117a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(Error::MALFORMED_UTF8, state.error_); 118a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 119a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 120a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, UTF8Test_TwoBytes) { 121a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[20]; 122a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer); 123a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis char neat[] = {char(0xc3), char(0x82), 0}; 124a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = write(state, text(neat)); 125a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(Error::OK, state.error_); 126a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 127a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 128a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, UTF8Test_ThreeBytes) { 129a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[20]; 130a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer); 131a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis char neat[] = {char(0xe3), char(0x82), char(0x82), 0}; 132a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = write(state, text(neat)); 133a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(Error::OK, state.error_); 134a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 135a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 136a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, UTF8Test_FourBytes) { 137a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[20]; 138a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer); 139a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis char neat[] = {char(0xf3), char(0x82), char(0x82), char(0x82), 0}; 140a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = write(state, text(neat)); 141a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(Error::OK, state.error_); 142a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 143a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 144a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, MalformendUTF8Test_CharacterTooLong) { 145a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[20]; 146a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer); 147a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis char malformed[] = {char(0xf8), char(0x82), char(0x82), char(0x82), char(0x82), 0}; 148a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = write(state, text(malformed)); 149a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(Error::MALFORMED_UTF8, state.error_); 150a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 151a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 152a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, MalformendUTF8Test_StringEndsMidMultiByte2) { 153a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[20]; 154a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer); 155a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis char malformed[] = {char(0xc0), char(0x82), char(0x83), 0}; 156a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = write(state, text(malformed)); 157a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(Error::MALFORMED_UTF8, state.error_); 158a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 159a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 160a9f0fb0db1e62168534c5a27e123e1413b818586Janis DanisevskisTEST(Cbor, MinimalViableHeaderSizeTest) { 161a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis uint8_t buffer[20]; 162a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis WriteState state(buffer); 163a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeHeader(state, Type::NUMBER, 23); 164a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(state.data_ - buffer, 1); 165a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 166a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = WriteState(buffer); 167a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeHeader(state, Type::NUMBER, 24); 168a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(state.data_ - buffer, 2); 169a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 170a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = WriteState(buffer); 171a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeHeader(state, Type::NUMBER, 0xff); 172a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(state.data_ - buffer, 2); 173a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 174a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = WriteState(buffer); 175a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeHeader(state, Type::NUMBER, 0x100); 176a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(state.data_ - buffer, 3); 177a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 178a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = WriteState(buffer); 179a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeHeader(state, Type::NUMBER, 0xffff); 180a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(state.data_ - buffer, 3); 181a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 182a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = WriteState(buffer); 183a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeHeader(state, Type::NUMBER, 0x10000); 184a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(state.data_ - buffer, 5); 185a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 186a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = WriteState(buffer); 187a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeHeader(state, Type::NUMBER, 0xffffffff); 188a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(state.data_ - buffer, 5); 189a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 190a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = WriteState(buffer); 191a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeHeader(state, Type::NUMBER, 0x100000000); 192a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(state.data_ - buffer, 9); 193a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis 194a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = WriteState(buffer); 195a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis state = writeHeader(state, Type::NUMBER, 0xffffffffffffffff); 196a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis ASSERT_EQ(state.data_ - buffer, 9); 197a9f0fb0db1e62168534c5a27e123e1413b818586Janis Danisevskis} 198