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