33use std:: env;
44use std:: time:: { SystemTime , UNIX_EPOCH } ;
55
6- use serde:: Serialize ;
6+ use serde:: { Deserialize , Serialize } ;
77
88use crate :: error:: { ExitCode , VoltaError } ;
99use crate :: hook:: Publish ;
10- use crate :: monitor:: Monitor ;
10+ use crate :: monitor:: send_events ;
1111use crate :: session:: ActivityKind ;
1212
1313// the Event data that is serialized to JSON and sent the plugin
14- #[ derive( Serialize ) ]
14+ #[ derive( Deserialize , Serialize ) ]
1515pub struct Event {
1616 timestamp : u64 ,
17- name : String ,
18- event : EventKind ,
17+ pub name : String ,
18+ pub event : EventKind ,
1919}
2020
21- #[ derive( Serialize ) ]
21+ #[ derive( Deserialize , Serialize , PartialEq , Debug ) ]
2222pub struct ErrorEnv {
2323 argv : String ,
2424 exec_path : String ,
@@ -27,9 +27,9 @@ pub struct ErrorEnv {
2727 platform_version : String ,
2828}
2929
30- #[ derive( Serialize ) ]
30+ #[ derive( Deserialize , Serialize , PartialEq , Debug ) ]
3131#[ serde( rename_all = "lowercase" ) ]
32- enum EventKind {
32+ pub enum EventKind {
3333 Start ,
3434 End {
3535 exit_code : i32 ,
@@ -42,6 +42,9 @@ enum EventKind {
4242 ToolEnd {
4343 exit_code : i32 ,
4444 } ,
45+ Args {
46+ argv : String ,
47+ } ,
4548}
4649
4750impl EventKind {
@@ -122,6 +125,18 @@ impl EventLog {
122125 activity_kind,
123126 )
124127 }
128+ pub fn add_event_args ( & mut self ) {
129+ let argv = env:: args_os ( )
130+ . enumerate ( )
131+ . fold ( String :: new ( ) , |mut result, ( i, arg) | {
132+ if i > 0 {
133+ result. push ( ' ' ) ;
134+ }
135+ result. push_str ( & arg. to_string_lossy ( ) ) ;
136+ result
137+ } ) ;
138+ self . add_event ( EventKind :: Args { argv } , ActivityKind :: Args )
139+ }
125140
126141 fn add_event ( & mut self , event_kind : EventKind , activity_kind : ActivityKind ) {
127142 let event = event_kind. into_event ( activity_kind) ;
@@ -133,8 +148,7 @@ impl EventLog {
133148 // Note: This call to unimplemented is left in, as it's not a Fallible operation that can use ErrorKind::Unimplemented
134149 Some ( & Publish :: Url ( _) ) => unimplemented ! ( ) ,
135150 Some ( & Publish :: Bin ( ref command) ) => {
136- let mut monitor = Monitor :: new ( command) ;
137- monitor. send_events ( & self . events ) ;
151+ send_events ( command, & self . events ) ;
138152 }
139153 None => { }
140154 }
@@ -144,9 +158,10 @@ impl EventLog {
144158#[ cfg( test) ]
145159pub mod tests {
146160
147- use super :: EventLog ;
161+ use super :: { EventKind , EventLog } ;
148162 use crate :: error:: { ErrorKind , ExitCode } ;
149163 use crate :: session:: ActivityKind ;
164+ use regex:: Regex ;
150165
151166 #[ test]
152167 fn test_adding_events ( ) {
@@ -156,18 +171,41 @@ pub mod tests {
156171 event_log. add_event_start ( ActivityKind :: Current ) ;
157172 assert_eq ! ( event_log. events. len( ) , 1 ) ;
158173 assert_eq ! ( event_log. events[ 0 ] . name, "current" ) ;
174+ assert_eq ! ( event_log. events[ 0 ] . event, EventKind :: Start ) ;
159175
160176 event_log. add_event_end ( ActivityKind :: Pin , ExitCode :: NetworkError ) ;
161177 assert_eq ! ( event_log. events. len( ) , 2 ) ;
162178 assert_eq ! ( event_log. events[ 1 ] . name, "pin" ) ;
179+ assert_eq ! ( event_log. events[ 1 ] . event, EventKind :: End { exit_code: 5 } ) ;
163180
164181 event_log. add_event_tool_end ( ActivityKind :: Version , 12 ) ;
165182 assert_eq ! ( event_log. events. len( ) , 3 ) ;
166183 assert_eq ! ( event_log. events[ 2 ] . name, "version" ) ;
184+ assert_eq ! (
185+ event_log. events[ 2 ] . event,
186+ EventKind :: ToolEnd { exit_code: 12 }
187+ ) ;
167188
168189 let error = ErrorKind :: BinaryExecError . into ( ) ;
169190 event_log. add_event_error ( ActivityKind :: Install , & error) ;
170191 assert_eq ! ( event_log. events. len( ) , 4 ) ;
171192 assert_eq ! ( event_log. events[ 3 ] . name, "install" ) ;
193+ // not checking the error because it has too much machine-specific info
194+
195+ event_log. add_event_args ( ) ;
196+ assert_eq ! ( event_log. events. len( ) , 5 ) ;
197+ assert_eq ! ( event_log. events[ 4 ] . name, "args" ) ;
198+ match event_log. events [ 4 ] . event {
199+ EventKind :: Args { ref argv } => {
200+ let re = Regex :: new ( "volta_core" ) . unwrap ( ) ;
201+ assert ! ( re. is_match( argv) ) ;
202+ }
203+ _ => {
204+ panic ! (
205+ "Expected EventKind::Args {{ argv }}, Got: {:?}" ,
206+ event_log. events[ 4 ] . event
207+ ) ;
208+ }
209+ }
172210 }
173211}
0 commit comments