hawktracer_parser/
event_reader.rs

1use crate::data_provider::DataProvider;
2use crate::data_struct_reader::{DataStructReader, ReadEventError};
3use crate::event::Event;
4use crate::registry::{CoreEventKlassId, EventKlassRegistry};
5use crate::registry_updater::RegistryUpdater;
6
7pub struct EventReader {
8    data_provider: DataProvider,
9}
10
11impl EventReader {
12    pub fn new(data_provider: DataProvider) -> EventReader {
13        EventReader { data_provider }
14    }
15
16    pub fn read_event(
17        &mut self,
18        registry: &mut EventKlassRegistry,
19    ) -> Result<Event, ReadEventError> {
20        let base_event = self.read_header(registry)?;
21
22        let klass_id = base_event
23            .get_value_u32("type")
24            .expect("Cannot find 'type' field in base klass. Registry corrupted?");
25
26        if klass_id == CoreEventKlassId::Base as u32 {
27            return Ok(base_event);
28        }
29
30        let event = self.read_regular_event(registry, klass_id, base_event)?;
31
32        if klass_id == CoreEventKlassId::KlassInfo as u32
33            || klass_id == CoreEventKlassId::FieldInfo as u32
34        {
35            if let Err(err) = RegistryUpdater::new(registry).update_registry_from_event(&event) {
36                return Err(ReadEventError::RegistryUpdateFailed(err.to_owned()));
37            }
38        }
39
40        Ok(event)
41    }
42
43    fn read_regular_event(
44        &mut self,
45        registry: &EventKlassRegistry,
46        klass_id: u32,
47        base_event: Event,
48    ) -> Result<Event, ReadEventError> {
49        let klass = match registry.get_klass_by_id(klass_id) {
50            Some(klass) => klass,
51            None => return Err(ReadEventError::UnknownKlassId(klass_id)),
52        };
53
54        DataStructReader::new(&mut self.data_provider, registry, klass, Some(base_event))
55            .read_event()
56    }
57
58    fn read_header(&mut self, registry: &mut EventKlassRegistry) -> Result<Event, ReadEventError> {
59        let base_event_klass = registry
60            .get_klass_by_id(CoreEventKlassId::Base as u32)
61            .expect("Can not find Base klass definition!");
62
63        DataStructReader::new(&mut self.data_provider, registry, base_event_klass, None)
64            .read_event()
65    }
66}
67
68#[cfg(test)]
69pub mod tests {
70    use super::*;
71    use hawktracer_parser_test_utilities::FakeDataReader;
72    use crate::event_klass::EventKlass;
73    use crate::event::DataType;
74
75    #[test]
76    fn read_header_should_return_valid_base_event() {
77        let data = vec![
78            1, 0, 0, 0, // type
79            1, 2, 0, 0, 0, 0, 0, 0, // timestamp
80            2, 0, 0, 0, 0, 0, 0, 0, // id
81        ];
82        let mut reg = EventKlassRegistry::new();
83        let data_provider = DataProvider::new(Box::new(FakeDataReader::new(data, false)));
84
85        let event = EventReader::new(data_provider)
86            .read_header(&mut reg)
87            .unwrap();
88
89        assert_eq!(event.get_value_u32(&"type").unwrap(), 1);
90        assert_eq!(event.get_value_u64(&"timestamp").unwrap(), 513);
91        assert_eq!(event.get_value_u64(&"id").unwrap(), 2);
92    }
93
94
95    #[test]
96    fn read_event_should_return_full_event() {
97        let data = vec![
98            100, 0, 0, 0, // type
99            1, 2, 0, 0, 0, 0, 0, 0, // timestamp
100            2, 0, 0, 0, 0, 0, 0, 0, // id
101            65, 66, 67, 0, // ABC
102            45, 1, 0, 0, // 301
103        ];
104        let mut reg = EventKlassRegistry::new();
105        let data_provider = DataProvider::new(Box::new(FakeDataReader::new(data, false)));
106
107        let mut klass = EventKlass::new(100, "foo".to_owned());
108        klass.add_field("base".to_owned(), "HT_Event".to_owned(), DataType::Struct);
109        klass.add_field("str_field".to_owned(), "char*".to_owned(), DataType::Str);
110        klass.add_field("u32_field".to_owned(), "uint32_t".to_owned(), DataType::U32);
111
112        reg.add_klass(klass);
113
114        let event = EventReader::new(data_provider)
115            .read_event(&mut reg)
116            .unwrap();
117
118        assert_eq!(event.get_klass_id(), 100);
119
120        let base_event = event.get_value_struct(&"base").unwrap();
121        assert_eq!(base_event.get_value_u32(&"type").unwrap(), 100);
122        assert_eq!(base_event.get_value_u64(&"timestamp").unwrap(), 513);
123        assert_eq!(base_event.get_value_u64(&"id").unwrap(), 2);
124
125        assert_eq!(event.get_value_string(&"str_field").unwrap(), "ABC");
126        assert_eq!(event.get_value_u32(&"u32_field").unwrap(), 301);
127    }
128}