1
+ use std:: cmp:: max;
1
2
use std:: fmt:: Write ;
2
3
use std:: time:: { Duration , Instant } ;
3
4
use libusb:: * ;
@@ -142,23 +143,25 @@ fn bulk_loopback(dev, _out) {
142
143
data. len( ) ,
143
144
"bulk write len {}" , len) ;
144
145
145
- if * len % 64 == 0 {
146
+ if * len > 0 && * len % 64 == 0 {
146
147
assert_eq!(
147
148
dev. write_bulk( 0x01 , & [ ] , TIMEOUT )
148
149
. expect( & format!( "bulk write zero-length packet" ) ) ,
149
150
0 ,
150
151
"bulk write zero-length packet" ) ;
151
152
}
152
153
153
- let mut response = vec![ 0u8 ; * len] ;
154
+ // Prevent libusb from instantaneously reading an empty packet on Windows when
155
+ // zero-sized buffer is passed.
156
+ let mut response = vec![ 0u8 ; max( * len, 1 ) ] ;
154
157
155
158
assert_eq!(
156
159
dev. read_bulk( 0x81 , & mut response, TIMEOUT )
157
160
. expect( & format!( "bulk read len {}" , len) ) ,
158
161
data. len( ) ,
159
162
"bulk read len {}" , len) ;
160
163
161
- assert_eq!( & response, & data) ;
164
+ assert_eq!( & response[ .. * len ] , & data[ .. ] ) ;
162
165
}
163
166
}
164
167
@@ -172,15 +175,17 @@ fn interrupt_loopback(dev, _out) {
172
175
data. len( ) ,
173
176
"interrupt write len {}" , len) ;
174
177
175
- let mut response = vec![ 0u8 ; * len] ;
178
+ // Prevent libusb from instantaneously reading an empty packet on Windows when
179
+ // zero-sized buffer is passed.
180
+ let mut response = vec![ 0u8 ; max( * len, 1 ) ] ;
176
181
177
182
assert_eq!(
178
183
dev. read_interrupt( 0x82 , & mut response, TIMEOUT )
179
184
. expect( & format!( "interrupt read len {}" , len) ) ,
180
185
data. len( ) ,
181
186
"interrupt read len {}" , len) ;
182
187
183
- assert_eq!( & response, & data) ;
188
+ assert_eq!( & response[ .. * len ] , & data[ .. ] ) ;
184
189
}
185
190
}
186
191
0 commit comments