test_utils.rs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. //! Test utilities.
  2. use crate::{HeaderTagFlag, HeaderTagType};
  3. use std::mem::size_of;
  4. /// Returns the pointer to a variable value in memory.
  5. #[macro_export]
  6. macro_rules! get_ptr {
  7. (&$tag_ref: ident, $type: ty) => {
  8. (&$tag_ref) as *const $type as u64
  9. };
  10. ($tag: ident, $type: ty) => {
  11. get_ptr!(&$tag, $type)
  12. };
  13. }
  14. /// This macro helps to get the pointer to a specific field
  15. /// and is helpful to check what Rust produces from the structs,
  16. /// i.e. in scenarios with "packed" and alignments.
  17. #[macro_export]
  18. macro_rules! get_field_ptr {
  19. ($tag: ident, $field: ident, $type: ty) => {
  20. (&$tag.$field) as *const $type as u64
  21. };
  22. }
  23. #[repr(C, packed(8))]
  24. struct DummyHeaderTag {
  25. typ: HeaderTagType,
  26. flags: HeaderTagFlag,
  27. size: u32,
  28. foo: u32,
  29. bar: u32,
  30. }
  31. #[test]
  32. fn test_macro_get_ptr() {
  33. let tag = DummyHeaderTag {
  34. typ: HeaderTagType::End,
  35. flags: HeaderTagFlag::Required,
  36. size: 0,
  37. foo: 0,
  38. bar: 0,
  39. };
  40. let expected_base_ptr = (&tag) as *const DummyHeaderTag as u64;
  41. let actual_base_ptr1 = get_ptr!(tag, DummyHeaderTag);
  42. let actual_base_ptr2 = get_ptr!(&tag, DummyHeaderTag);
  43. assert_eq!(expected_base_ptr, actual_base_ptr1);
  44. assert_eq!(actual_base_ptr1, actual_base_ptr2);
  45. }
  46. #[test]
  47. fn test_macro_get_field_ptr() {
  48. let tag = DummyHeaderTag {
  49. typ: HeaderTagType::End,
  50. flags: HeaderTagFlag::Required,
  51. size: 0,
  52. foo: 0,
  53. bar: 0,
  54. };
  55. let base_ptr = get_ptr!(tag, DummyHeaderTag);
  56. let prop0_ptr = get_field_ptr!(tag, typ, HeaderTagType);
  57. let prop1_ptr = get_field_ptr!(tag, flags, HeaderTagFlag);
  58. let prop2_ptr = get_field_ptr!(tag, size, u32);
  59. let prop3_ptr = get_field_ptr!(tag, foo, u32);
  60. let prop4_ptr = get_field_ptr!(tag, bar, u32);
  61. assert_eq!(
  62. prop0_ptr,
  63. base_ptr + 0 * size_of::<u16>() as u64 + 0 * size_of::<u32>() as u64
  64. );
  65. assert_eq!(
  66. prop1_ptr,
  67. base_ptr + 1 * size_of::<u16>() as u64 + 0 * size_of::<u32>() as u64
  68. );
  69. assert_eq!(
  70. prop2_ptr,
  71. base_ptr + 2 * size_of::<u16>() as u64 + 0 * size_of::<u32>() as u64
  72. );
  73. assert_eq!(
  74. prop3_ptr,
  75. base_ptr + 2 * size_of::<u16>() as u64 + 1 * size_of::<u32>() as u64
  76. );
  77. assert_eq!(
  78. prop4_ptr,
  79. base_ptr + 2 * size_of::<u16>() as u64 + 2 * size_of::<u32>() as u64
  80. );
  81. }