1- #![ feature( core , old_io , test) ]
1+ #![ feature( collections , io , net , test) ]
22extern crate hyper;
33
44extern crate test;
55
66use std:: fmt;
7- use std:: old_io:: net:: ip:: Ipv4Addr ;
8- use hyper:: server:: { Request , Response , Server } ;
9- use hyper:: header:: Headers ;
10- use hyper:: Client ;
11-
12- fn listen ( ) -> hyper:: server:: Listening {
13- let server = Server :: http ( Ipv4Addr ( 127 , 0 , 0 , 1 ) , 0 ) ;
14- server. listen ( handle) . unwrap ( )
7+ use std:: io:: { self , Read , Write , Cursor } ;
8+ use std:: net:: SocketAddr ;
9+
10+ use hyper:: net;
11+
12+ static README : & ' static [ u8 ] = include_bytes ! ( "../README.md" ) ;
13+
14+ struct MockStream {
15+ read : Cursor < Vec < u8 > >
16+ }
17+
18+ impl MockStream {
19+ fn new ( ) -> MockStream {
20+ let head = b"HTTP/1.1 200 OK\r \n Server: Mock\r \n \r \n " ;
21+ let mut res = head. to_vec ( ) ;
22+ res. push_all ( README ) ;
23+ MockStream {
24+ read : Cursor :: new ( res)
25+ }
26+ }
1527}
1628
17- macro_rules! try_return(
18- ( $e: expr) => { {
19- match $e {
20- Ok ( v) => v,
21- Err ( ..) => return
29+ impl Clone for MockStream {
30+ fn clone ( & self ) -> MockStream {
31+ MockStream {
32+ read : Cursor :: new ( self . read . get_ref ( ) . clone ( ) )
2233 }
23- } }
24- ) ;
25-
26- fn handle ( _r : Request , res : Response ) {
27- static BODY : & ' static [ u8 ] = b"Benchmarking hyper vs others!" ;
28- let mut res = try_return ! ( res. start( ) ) ;
29- try_return ! ( res. write_all( BODY ) ) ;
30- try_return ! ( res. end( ) ) ;
34+ }
35+ }
36+
37+ impl Read for MockStream {
38+ fn read ( & mut self , buf : & mut [ u8 ] ) -> io:: Result < usize > {
39+ self . read . read ( buf)
40+ }
41+ }
42+
43+ impl Write for MockStream {
44+ fn write ( & mut self , msg : & [ u8 ] ) -> io:: Result < usize > {
45+ // we're mocking, what do we care.
46+ Ok ( msg. len ( ) )
47+ }
48+ fn flush ( & mut self ) -> io:: Result < ( ) > {
49+ Ok ( ( ) )
50+ }
3151}
3252
3353#[ derive( Clone ) ]
@@ -48,17 +68,36 @@ impl hyper::header::HeaderFormat for Foo {
4868 }
4969}
5070
71+ impl net:: NetworkStream for MockStream {
72+ fn peer_addr ( & mut self ) -> io:: Result < SocketAddr > {
73+ Ok ( "127.0.0.1:1337" . parse ( ) . unwrap ( ) )
74+ }
75+ }
76+
77+ struct MockConnector ;
78+
79+ impl net:: NetworkConnector for MockConnector {
80+ type Stream = MockStream ;
81+ fn connect ( & mut self , _: & str , _: u16 , _: & str ) -> io:: Result < MockStream > {
82+ Ok ( MockStream :: new ( ) )
83+ }
84+
85+ }
86+
5187#[ bench]
52- fn bench_hyper ( b : & mut test:: Bencher ) {
53- let mut listening = listen ( ) ;
54- let s = format ! ( "http://{}/" , listening. socket) ;
55- let url = s. as_slice ( ) ;
56- let mut client = Client :: new ( ) ;
57- let mut headers = Headers :: new ( ) ;
58- headers. set ( Foo ) ;
88+ fn bench_mock_hyper ( b : & mut test:: Bencher ) {
89+ let url = "http://127.0.0.1:1337/" ;
5990 b. iter ( || {
60- client. get ( url) . header ( Foo ) . send ( ) . unwrap ( ) . read_to_string ( ) . unwrap ( ) ;
91+ let mut req = hyper:: client:: Request :: with_connector (
92+ hyper:: Get , hyper:: Url :: parse ( url) . unwrap ( ) , & mut MockConnector
93+ ) . unwrap ( ) ;
94+ req. headers_mut ( ) . set ( Foo ) ;
95+
96+ let mut s = String :: new ( ) ;
97+ req
98+ . start ( ) . unwrap ( )
99+ . send ( ) . unwrap ( )
100+ . read_to_string ( & mut s) . unwrap ( )
61101 } ) ;
62- listening. close ( ) . unwrap ( )
63102}
64103
0 commit comments