@@ -5,16 +5,17 @@ use std::collections::HashMap;
5
5
6
6
use fil_actor_market:: balance_table:: { BalanceTable , BALANCE_TABLE_BITWIDTH } ;
7
7
use fil_actor_market:: {
8
- ext, Actor as MarketActor , Method , State , WithdrawBalanceParams , PROPOSALS_AMT_BITWIDTH ,
8
+ ext, Actor as MarketActor , Label , Method , State , WithdrawBalanceParams , PROPOSALS_AMT_BITWIDTH ,
9
9
STATES_AMT_BITWIDTH ,
10
10
} ;
11
+ use fil_actors_runtime:: cbor:: deserialize;
11
12
use fil_actors_runtime:: runtime:: Runtime ;
12
13
use fil_actors_runtime:: test_utils:: * ;
13
14
use fil_actors_runtime:: {
14
15
make_empty_map, ActorError , SetMultimap , STORAGE_MARKET_ACTOR_ADDR , SYSTEM_ACTOR_ADDR ,
15
16
} ;
16
17
use fvm_ipld_amt:: Amt ;
17
- use fvm_ipld_encoding:: RawBytes ;
18
+ use fvm_ipld_encoding:: { to_vec , RawBytes } ;
18
19
use fvm_shared:: address:: Address ;
19
20
use fvm_shared:: bigint:: bigint_ser:: BigIntDe ;
20
21
use fvm_shared:: clock:: EPOCH_UNDEFINED ;
@@ -96,6 +97,81 @@ fn simple_construction() {
96
97
assert_eq ! ( state_data. last_cron, EPOCH_UNDEFINED ) ;
97
98
}
98
99
100
+ #[ test]
101
+ fn label_cbor ( ) {
102
+ let label = Label :: String ( "i_am_random_string____i_am_random_string____" . parse ( ) . unwrap ( ) ) ;
103
+ let _ = to_vec ( & label)
104
+ . map_err ( |e| ActorError :: from ( e) . wrap ( "failed to serialize DealProposal" ) )
105
+ . unwrap ( ) ;
106
+
107
+ let label2 = Label :: Bytes ( b"i_am_random_____i_am_random_____" . to_vec ( ) ) ;
108
+ println ! ( "{:?}" , ( b"i_am_random_____i_am_random_____" . to_vec( ) ) ) ;
109
+ let _ = to_vec ( & label2)
110
+ . map_err ( |e| ActorError :: from ( e) . wrap ( "failed to serialize DealProposal" ) )
111
+ . unwrap ( ) ;
112
+
113
+ let empty_string_label = Label :: String ( "" . parse ( ) . unwrap ( ) ) ;
114
+ let sv_bz = to_vec ( & empty_string_label) . unwrap ( ) ;
115
+ assert_eq ! ( vec![ 0x60 ] , sv_bz) ;
116
+
117
+ let empty_bytes_label = Label :: Bytes ( b"" . to_vec ( ) ) ;
118
+ let sv_bz = to_vec ( & empty_bytes_label) . unwrap ( ) ;
119
+ assert_eq ! ( vec![ 0x40 ] , sv_bz) ;
120
+ }
121
+
122
+ #[ test]
123
+ fn label_from_cbor ( ) {
124
+ // empty string, b001_00000
125
+ let empty_cbor_text = vec ! [ 0x60 ] ;
126
+ let label1: Label = deserialize ( & RawBytes :: from ( empty_cbor_text) , "empty cbor string" ) . unwrap ( ) ;
127
+ if let Label :: String ( s) = label1 {
128
+ assert_eq ! ( "" , s)
129
+ } else {
130
+ panic ! ( "expected string label not bytes" )
131
+ }
132
+
133
+ // valid utf8 string b011_01000 "deadbeef"
134
+ let end_valid_cbor_text = b"deadbeef" . to_vec ( ) ;
135
+ let mut valid_cbor_text = vec ! [ 0x68 ] ;
136
+ for i in end_valid_cbor_text {
137
+ valid_cbor_text. push ( i) ;
138
+ }
139
+ let label2: Label = deserialize ( & RawBytes :: from ( valid_cbor_text) , "valid cbor string" ) . unwrap ( ) ;
140
+ if let Label :: String ( s) = label2 {
141
+ assert_eq ! ( "deadbeef" , s)
142
+ } else {
143
+ panic ! ( "expected string label not bytes" )
144
+ }
145
+
146
+ // invalid utf8 string 0b011_00100 0xde 0xad 0xbe 0xeef
147
+ let invalid_cbor_text = vec ! [ 0x64 , 0xde , 0xad , 0xbe , 0xef ] ;
148
+ let out = deserialize :: < Label > ( & RawBytes :: from ( invalid_cbor_text) , "invalid cbor string" ) ;
149
+ out. expect_err ( "invalid utf8 string in maj typ 3 should fail deser" ) ;
150
+
151
+ // empty bytes, b010_00000
152
+ let empty_cbor_bytes = vec ! [ 0x40 ] ;
153
+ let label3: Label = deserialize ( & RawBytes :: from ( empty_cbor_bytes) , "empty cbor bytes" ) . unwrap ( ) ;
154
+ if let Label :: Bytes ( b) = label3 {
155
+ assert_eq ! ( Vec :: <u8 >:: new( ) , b)
156
+ } else {
157
+ panic ! ( "expected bytes label not string" )
158
+ }
159
+
160
+ // bytes b010_00100 0xde 0xad 0xbe 0xef
161
+ let cbor_bytes = vec ! [ 0x44 , 0xde , 0xad , 0xbe , 0xef ] ;
162
+ let label4: Label = deserialize ( & RawBytes :: from ( cbor_bytes) , "cbor bytes" ) . unwrap ( ) ;
163
+ if let Label :: Bytes ( b) = label4 {
164
+ assert_eq ! ( vec![ 0xde , 0xad , 0xbe , 0xef ] , b)
165
+ } else {
166
+ panic ! ( "expected bytes label not string" )
167
+ }
168
+
169
+ // bad major type, array of empty array b100_00001 b100_00000
170
+ let bad_bytes = vec ! [ 0x81 , 0x80 ] ;
171
+ let out = deserialize :: < Label > ( & RawBytes :: from ( bad_bytes) , "cbor array, unexpected major type" ) ;
172
+ out. expect_err ( "major type 4 should not be recognized by union type and deser should fail" ) ;
173
+ }
174
+
99
175
#[ ignore]
100
176
#[ test]
101
177
fn add_provider_escrow_funds ( ) {
0 commit comments