1
+ #![ deny( warnings) ]
2
+
1
3
extern crate tempdir;
2
4
3
5
use std:: env;
4
6
use std:: fs:: { File , OpenOptions } ;
5
- use std:: io:: { Read , Write } ;
6
- use std:: process:: { Child , ChildStdout , Command , Stdio } ;
7
+ use std:: io:: Write ;
8
+ use std:: process:: { Command , Output , Stdio } ;
7
9
8
10
use tempdir:: TempDir ;
9
11
10
12
// NOTE the order of these fields is important. The file must be closed before
11
13
// destroying the temporary directory.
12
14
struct ItmDump {
13
- stdout : ChildStdout ,
14
- child : Child ,
15
- pipe : File ,
15
+ command : Command ,
16
+ file : File ,
16
17
_td : TempDir ,
17
18
}
18
19
19
20
impl ItmDump {
20
21
pub fn new ( ) -> ItmDump {
21
22
let td = TempDir :: new ( "itmdump" ) . unwrap ( ) ;
22
- let path = td. path ( ) . join ( "fifo " ) ;
23
+ let path = td. path ( ) . join ( "file " ) ;
23
24
let mut me = env:: current_exe ( ) . unwrap ( ) ;
24
25
me. pop ( ) ;
25
26
if me. ends_with ( "deps" ) {
26
27
me. pop ( ) ;
27
28
}
28
- let mut child = Command :: new ( me. join ( "itmdump" ) )
29
- . arg ( & path)
30
- . stdout ( Stdio :: piped ( ) )
31
- . spawn ( )
32
- . unwrap ( ) ;
29
+ let mut command = Command :: new ( me. join ( "itmdump" ) ) ;
30
+ command. arg ( "-f" )
31
+ . arg ( & path)
32
+ . stdout ( Stdio :: piped ( ) ) ;
33
33
34
- while !path. exists ( ) { }
35
- let pipe = OpenOptions :: new ( )
34
+ let file = OpenOptions :: new ( )
36
35
. write ( true )
36
+ . create ( true )
37
37
. open ( path)
38
38
. unwrap ( ) ;
39
39
40
40
ItmDump {
41
- pipe : pipe,
42
- stdout : child. stdout . take ( ) . unwrap ( ) ,
41
+ file : file,
43
42
_td : td,
44
- child : child ,
43
+ command : command ,
45
44
}
46
45
}
47
46
48
47
fn write_u8 ( & mut self , payload : u8 ) {
49
- self . pipe . write_all ( & [ 0b01 , payload] ) . unwrap ( ) ;
50
- self . pipe . flush ( ) . unwrap ( ) ;
48
+ self . file . write_all ( & [ 0b01 , payload] ) . unwrap ( ) ;
49
+ self . file . flush ( ) . unwrap ( ) ;
51
50
}
52
51
53
52
fn write_u8x2 ( & mut self , payload : [ u8 ; 2 ] ) {
54
- self . pipe . write_all ( & [ 0b10 , payload[ 0 ] , payload[ 1 ] ] ) . unwrap ( )
53
+ self . file . write_all ( & [ 0b10 , payload[ 0 ] , payload[ 1 ] ] ) . unwrap ( ) ;
54
+ self . file . flush ( ) . unwrap ( ) ;
55
55
}
56
56
57
57
fn write_u8x4 ( & mut self , payload : [ u8 ; 4 ] ) {
58
- self . pipe
58
+ self . file
59
59
. write_all ( & [ 0b11 , payload[ 0 ] , payload[ 1 ] , payload[ 2 ] , payload[ 3 ] ] )
60
- . unwrap ( )
61
- }
62
-
63
- fn read ( & mut self , buffer : & mut [ u8 ] ) {
64
- self . stdout . read_exact ( buffer) . unwrap ( )
60
+ . unwrap ( ) ;
61
+ self . file . flush ( ) . unwrap ( ) ;
65
62
}
66
- }
67
63
68
- impl Drop for ItmDump {
69
- fn drop ( & mut self ) {
70
- self . child . kill ( ) . unwrap ( )
64
+ fn output ( & mut self ) -> Output {
65
+ self . command . output ( ) . unwrap ( )
71
66
}
72
67
}
73
68
@@ -80,10 +75,9 @@ fn chunks() {
80
75
itmdump. write_u8x4 ( * b"Worl" ) ;
81
76
itmdump. write_u8x2 ( * b"d\n " ) ;
82
77
83
- let mut buffer = [ 0u8 ; 13 ] ;
84
- itmdump. read ( & mut buffer) ;
78
+ let out = itmdump. output ( ) ;
85
79
86
- assert_eq ! ( b"Hello, World\n " , & buffer ) ;
80
+ assert_eq ! ( * b"Hello, World\n " , * out . stdout ) ;
87
81
88
82
}
89
83
@@ -97,19 +91,17 @@ fn multiple() {
97
91
itmdump. write_u8 ( 'o' as u8 ) ;
98
92
itmdump. write_u8 ( '\n' as u8 ) ;
99
93
100
- let mut buffer = [ 0u8 ; 6 ] ;
101
- itmdump. read ( & mut buffer) ;
94
+ let out = itmdump. output ( ) ;
102
95
103
- assert_eq ! ( b"Hello\n " , & buffer ) ;
96
+ assert_eq ! ( * b"Hello\n " , * out . stdout ) ;
104
97
}
105
98
106
99
#[ test]
107
100
fn single ( ) {
108
101
let mut itmdump = ItmDump :: new ( ) ;
109
102
itmdump. write_u8 ( '\n' as u8 ) ;
110
103
111
- let mut buffer = [ 0u8 ] ;
112
- itmdump. read ( & mut buffer) ;
104
+ let out = itmdump. output ( ) ;
113
105
114
- assert_eq ! ( b"\n " , & buffer ) ;
106
+ assert_eq ! ( * b"\n " , * out . stdout ) ;
115
107
}
0 commit comments