@@ -121,3 +121,117 @@ pub fn block_timestamp_mock() -> u64 {
121
121
. unwrap ( )
122
122
. as_secs ( )
123
123
}
124
+
125
+ #[ cfg( test) ]
126
+ pub mod oracle_layout_test {
127
+ use super :: * ;
128
+ use anchor_lang:: Discriminator ;
129
+ #[ test]
130
+ fn test_observation_layout ( ) {
131
+ let initialized = true ;
132
+ let recent_epoch: u64 = 0x123456789abcdef0 ;
133
+ let observation_index: u16 = 0x1122 ;
134
+ let pool_id: Pubkey = Pubkey :: new_unique ( ) ;
135
+ let padding: [ u64 ; 4 ] = [
136
+ 0x123456789abcde0f ,
137
+ 0x123456789abcd0ef ,
138
+ 0x123456789abc0def ,
139
+ 0x123456789ab0cdef ,
140
+ ] ;
141
+
142
+ let mut observation_datas = [ 0u8 ; Observation :: LEN * OBSERVATION_NUM ] ;
143
+ let mut observations = [ Observation :: default ( ) ; OBSERVATION_NUM ] ;
144
+ let mut offset = 0 ;
145
+ for i in 0 ..OBSERVATION_NUM {
146
+ let index = i + 1 ;
147
+ let block_timestamp: u32 = u32:: MAX - 3 * index as u32 ;
148
+ let tick_cumulative: i64 = i64:: MAX - 3 * index as i64 ;
149
+ let padding: [ u64 ; 4 ] = [
150
+ u64:: MAX - index as u64 ,
151
+ u64:: MAX - 2 * index as u64 ,
152
+ u64:: MAX - 3 * index as u64 ,
153
+ u64:: MAX - 4 * index as u64 ,
154
+ ] ;
155
+ observations[ i] . block_timestamp = block_timestamp;
156
+ observations[ i] . tick_cumulative = tick_cumulative;
157
+ observations[ i] . padding = padding;
158
+ observation_datas[ offset..offset + 4 ] . copy_from_slice ( & block_timestamp. to_le_bytes ( ) ) ;
159
+ offset += 4 ;
160
+ observation_datas[ offset..offset + 8 ] . copy_from_slice ( & tick_cumulative. to_le_bytes ( ) ) ;
161
+ offset += 8 ;
162
+ observation_datas[ offset..offset + 8 ] . copy_from_slice ( & padding[ 0 ] . to_le_bytes ( ) ) ;
163
+ offset += 8 ;
164
+ observation_datas[ offset..offset + 8 ] . copy_from_slice ( & padding[ 1 ] . to_le_bytes ( ) ) ;
165
+ offset += 8 ;
166
+ observation_datas[ offset..offset + 8 ] . copy_from_slice ( & padding[ 2 ] . to_le_bytes ( ) ) ;
167
+ offset += 8 ;
168
+ observation_datas[ offset..offset + 8 ] . copy_from_slice ( & padding[ 3 ] . to_le_bytes ( ) ) ;
169
+ offset += 8 ;
170
+ }
171
+
172
+ // serialize original data
173
+ let mut observation_state_data = [ 0u8 ; ObservationState :: LEN ] ;
174
+ let mut offset = 0 ;
175
+ observation_state_data[ offset..offset + 8 ]
176
+ . copy_from_slice ( & ObservationState :: discriminator ( ) ) ;
177
+ offset += 8 ;
178
+ observation_state_data[ offset..offset + 1 ]
179
+ . copy_from_slice ( & ( initialized as u8 ) . to_le_bytes ( ) ) ;
180
+ offset += 1 ;
181
+ observation_state_data[ offset..offset + 8 ] . copy_from_slice ( & recent_epoch. to_le_bytes ( ) ) ;
182
+ offset += 8 ;
183
+ observation_state_data[ offset..offset + 2 ]
184
+ . copy_from_slice ( & observation_index. to_le_bytes ( ) ) ;
185
+ offset += 2 ;
186
+ observation_state_data[ offset..offset + 32 ] . copy_from_slice ( & pool_id. to_bytes ( ) ) ;
187
+ offset += 32 ;
188
+ observation_state_data[ offset..offset + Observation :: LEN * OBSERVATION_NUM ]
189
+ . copy_from_slice ( & observation_datas) ;
190
+ offset += Observation :: LEN * OBSERVATION_NUM ;
191
+ observation_state_data[ offset..offset + 8 ] . copy_from_slice ( & padding[ 0 ] . to_le_bytes ( ) ) ;
192
+ offset += 8 ;
193
+ observation_state_data[ offset..offset + 8 ] . copy_from_slice ( & padding[ 1 ] . to_le_bytes ( ) ) ;
194
+ offset += 8 ;
195
+ observation_state_data[ offset..offset + 8 ] . copy_from_slice ( & padding[ 2 ] . to_le_bytes ( ) ) ;
196
+ offset += 8 ;
197
+ observation_state_data[ offset..offset + 8 ] . copy_from_slice ( & padding[ 3 ] . to_le_bytes ( ) ) ;
198
+ offset += 8 ;
199
+ // len check
200
+ assert_eq ! ( offset, observation_state_data. len( ) ) ;
201
+ assert_eq ! (
202
+ observation_state_data. len( ) ,
203
+ core:: mem:: size_of:: <ObservationState >( ) + 8
204
+ ) ;
205
+
206
+ // deserialize original data
207
+ let unpack_data: & ObservationState = bytemuck:: from_bytes (
208
+ & observation_state_data[ 8 ..core:: mem:: size_of :: < ObservationState > ( ) + 8 ] ,
209
+ ) ;
210
+
211
+ // data check
212
+ let unpack_initialized = unpack_data. initialized ;
213
+ assert_eq ! ( unpack_initialized, initialized) ;
214
+ let unpack_recent_epoch = unpack_data. recent_epoch ;
215
+ assert_eq ! ( unpack_recent_epoch, recent_epoch) ;
216
+ let unpack_observation_index = unpack_data. observation_index ;
217
+ assert_eq ! ( unpack_observation_index, observation_index) ;
218
+ let unpack_pool_id = unpack_data. pool_id ;
219
+ assert_eq ! ( unpack_pool_id, pool_id) ;
220
+ let unpack_padding = unpack_data. padding ;
221
+ assert_eq ! ( unpack_padding, padding) ;
222
+ for ( observation, unpack_observation) in
223
+ observations. iter ( ) . zip ( unpack_data. observations . iter ( ) )
224
+ {
225
+ let block_timestamp = observation. block_timestamp ;
226
+ let tick_cumulative = observation. tick_cumulative ;
227
+ let padding = observation. padding ;
228
+
229
+ let unpack_block_timestamp = unpack_observation. block_timestamp ;
230
+ let unpack_tick_cumulative = unpack_observation. tick_cumulative ;
231
+ let unpack_padding = unpack_observation. padding ;
232
+ assert_eq ! ( block_timestamp, unpack_block_timestamp) ;
233
+ assert_eq ! ( tick_cumulative, unpack_tick_cumulative) ;
234
+ assert_eq ! ( padding, unpack_padding) ;
235
+ }
236
+ }
237
+ }
0 commit comments