-type t = int
-let connect _ = assert false
-let send _ = assert false
-let recv _ = assert false
+open Base
+
+type t = in_channel * out_channel
+
+let connect host port =
+ let inet =
+ Unix.inet_addr_of_string host in
+ let addr =
+ Unix.ADDR_INET (inet, port) in
+ Unix.open_connection addr
+
+let close (ic, _) =
+ Unix.shutdown_connection ic
+
+let send (_, oc) s =
+ output_string oc s
+
+let recv (ic, _) len =
+ let buffer =
+ String.make len ' ' in
+ let n =
+ Unix.recv (Unix.descr_of_in_channel ic) buffer 0 len [] in
+ String.sub buffer 0 n
--- /dev/null
+open Base
+open OUnit
+
+(* stub server *)
+let server port f =
+ if Unix.fork () = 0 then
+ let sa =
+ Unix.ADDR_INET (Unix.inet_addr_any, port) in
+ Unix.establish_server f sa
+
+let last_msg = ref ""
+
+let send_test port f =
+ server port begin fun ic _ ->
+ try f () with _ -> ();
+ last_msg := input_line ic;
+ Unix.shutdown_connection ic
+ end
+
+let recv_test port f =
+ server port begin fun ic oc ->
+ output_string oc "hi!";
+ try f () with _ -> ();
+ Unix.shutdown_connection ic
+ end
+
+let _ = begin "socket.ml" >::: [
+ "send" >:: begin fun () ->
+ send_test 9000 begin fun () ->
+ let socket =
+ Socket.connect "localhost" 9000 in
+ Socket.send socket "hi";
+ assert_equal "hi" !last_msg;
+ Socket.close socket
+ end;
+ end;
+ "recv" >:: begin fun () ->
+ recv_test 9001 begin fun () ->
+ let socket =
+ Socket.connect "localhost" 9001 in
+ assert_equal "hi!" @@ Socket.recv socket 3;
+ Socket.close socket
+ end;
+ end;
+] end +> run_test_tt_main