git.gammaspectra.live/P2Pool/consensus/v3@v3.8.0/monero/client/levin/portable_storage_test.go (about) 1 package levin_test 2 3 import ( 4 "testing" 5 6 "git.gammaspectra.live/P2Pool/consensus/v3/monero/client/levin" 7 ) 8 9 func TestPortableStorage(t *testing.T) { 10 t.Parallel() 11 t.Run("NewPortableStorageFromBytes", func(t *testing.T) { 12 it(t, "fails w/ wrong sigA", func(t *testing.T) { 13 bytes := []byte{ 14 0xaa, 0xaa, 0xaa, 0xaa, 15 } 16 17 _, err := levin.NewPortableStorageFromBytes(bytes) 18 assertError(t, err) 19 assertContains(t, err.Error(), "sig-a doesn't match") 20 }) 21 22 it(t, "fails w/ wrong sigB", func(t *testing.T) { 23 bytes := []byte{ 24 0x01, 0x11, 0x01, 0x01, 25 0xaa, 0xaa, 0xaa, 0xaa, 26 } 27 28 _, err := levin.NewPortableStorageFromBytes(bytes) 29 assertError(t, err) 30 assertContains(t, err.Error(), "sig-b doesn't match") 31 }) 32 33 it(t, "fails w/ wrong format ver", func(t *testing.T) { 34 bytes := []byte{ 35 0x01, 0x11, 0x01, 0x01, 36 0x01, 0x01, 0x02, 0x01, 37 0xaa, 38 } 39 40 _, err := levin.NewPortableStorageFromBytes(bytes) 41 assertError(t, err) 42 assertContains(t, err.Error(), "version doesn't match") 43 }) 44 45 it(t, "reads the contents", func(t *testing.T) { 46 bytes := []byte{ 47 0x01, 0x11, 0x01, 0x01, // sig a 48 0x01, 0x01, 0x02, 0x01, // sig b 49 0x01, // format ver 50 51 0x08, // var_in(len(entries)) 52 53 // node_data 54 0x09, // len("node_data") 55 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, // "node_data" 56 0x0c, // boost_serialized_obj 57 0x04, // var_in(node_data.entries) 58 59 // for i in range node_data 60 0x03, // len("foo") 61 0x66, 0x6f, 0x6f, // "foo" 62 0x0a, // boost_serialized_string 63 0xc, // var_in(len("bar")) 64 0x62, 0x61, 0x72, // "bar" 65 66 // payload_data 67 0x0c, // len("payload_data") 68 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, // "payload_data" 69 0x0c, // boost_serialized_obj 70 0x04, // var_in(payload_data.entries) 71 72 // for i in range payload_data.entries 73 0x06, // len("number") 74 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, // "number" 75 0x06, // boost_serialized_uint32 76 0x01, 0x00, 0x00, 0x00, // uint32(1) 77 } 78 79 ps, err := levin.NewPortableStorageFromBytes(bytes) 80 assertNoError(t, err) 81 82 assertEqual(t, len(ps.Entries), 2, "len") 83 assertEqual(t, ps.Entries[0].Name, "node_data") 84 assertEqual(t, ps.Entries[0].Value, levin.Entries{ 85 { 86 Name: "foo", 87 Value: "bar", 88 }, 89 }) 90 91 assertEqual(t, ps.Entries[1].Name, "payload_data") 92 assertEqual(t, ps.Entries[1].Value, levin.Entries{ 93 { 94 Name: "number", 95 Value: uint32(1), 96 }, 97 }) 98 }) 99 }) 100 101 t.Run("ReadVarIn", func(t *testing.T) { 102 it(t, "i <= 63", func(t *testing.T) { 103 b := []byte{0x08} 104 n, v := levin.ReadVarInt(b) 105 106 assertEqual(t, n, 1) 107 assertEqual(t, v, 2) 108 }) 109 110 it(t, "64 <= i <= 16383", func(t *testing.T) { 111 b := []byte{0x01, 0x02} 112 n, v := levin.ReadVarInt(b) 113 assertEqual(t, n, 2) 114 assertEqual(t, v, 128) 115 }) 116 117 it(t, "16384 <= i <= 1073741823", func(t *testing.T) { 118 b := []byte{0x02, 0x00, 0x01, 0x00} 119 n, v := levin.ReadVarInt(b) 120 assertEqual(t, n, 4) 121 assertEqual(t, v, 16384) 122 }) 123 }) 124 125 t.Run("VarrIn", func(t *testing.T) { 126 it(t, "i <= 63", func(t *testing.T) { 127 i := 2 // 0b00000010 128 129 b, err := levin.VarIn(i) 130 assertNoError(t, err) 131 assertEqual(t, b, []byte{ 132 0x08, // 0b00001000 (shift left twice, union 0) 133 }) 134 }) 135 136 it(t, "64 <= i <= 16383", func(t *testing.T) { 137 i := 128 // 0b010000000 138 139 b, err := levin.VarIn(i) 140 assertNoError(t, err) 141 assertEqual(t, b, []byte{ 142 0x01, 0x02, // 0b1000000001 ((128 * 2 * 2) | 1) == 513 143 // ' ' 144 // 1 2 * 256 145 }) 146 }) 147 148 it(t, "16384 <= i <= 1073741823", func(t *testing.T) { 149 i := 16384 // 1 << 14 150 151 b, err := levin.VarIn(i) 152 assertNoError(t, err) 153 assertEqual(t, b, []byte{ 154 0x02, 0x00, 0x01, 0x00, // (1 << 16) | 2 155 }) 156 }) 157 }) 158 159 t.Run("PortableStorage", func(t *testing.T) { 160 it(t, "bytes", func(t *testing.T) { 161 ps := &levin.PortableStorage{ 162 Entries: []levin.Entry{ 163 { 164 Name: "node_data", 165 Serializable: &levin.Section{ 166 Entries: []levin.Entry{ 167 { 168 Name: "foo", 169 Serializable: levin.BoostString("bar"), 170 }, 171 }, 172 }, 173 }, 174 { 175 Name: "payload_data", 176 Serializable: &levin.Section{ 177 Entries: []levin.Entry{ 178 { 179 Name: "number", 180 Serializable: levin.BoostUint32(1), 181 }, 182 }, 183 }, 184 }, 185 }, 186 } 187 188 assertEqual(t, []byte{ 189 0x01, 0x11, 0x01, 0x01, // sig a 190 0x01, 0x01, 0x02, 0x01, // sig b 191 0x01, // format ver 192 0x08, // var_in(len(entries)) 193 194 // node_data 195 0x09, // len("node_data") 196 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, // "node_data" 197 0x0c, // boost_serialized_obj 198 0x04, // var_in(node_data.entries) 199 200 // for i in range node_data 201 0x03, // len("foo") 202 0x66, 0x6f, 0x6f, // "foo" 203 0x0a, // boost_serialized_string 204 0xc, // var_in(len("bar")) 205 0x62, 0x61, 0x72, // "bar" 206 207 // payload_data 208 0x0c, // len("payload_data") 209 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, // "payload_data" 210 0x0c, // boost_serialized_obj 211 0x04, // var_in(payload_data.entries) 212 213 // for i in range payload_data.entries 214 0x06, // len("number") 215 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, // "number" 216 0x06, // boost_serialized_uint32 217 0x01, 0x00, 0x00, 0x00, // uint32(1) 218 219 }, ps.Bytes()) 220 }) 221 }) 222 }