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  }