@@ -121,3 +121,117 @@ pub fn block_timestamp_mock() -> u64 {
121121 . unwrap ( )
122122 . as_secs ( )
123123}
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