From 511e43aa89d0bac73081be70bbb013b9934beec3 Mon Sep 17 00:00:00 2001
From: Mark Somerville 
Date: Wed, 14 May 2008 11:20:10 +0100
Subject: [PATCH] Copied over TCPServer#accept spec to UNIXServer#accept

---
 1.8/library/socket/fixtures/classes.rb       |    3 +
 1.8/library/socket/unixserver/accept_spec.rb |   65 ++++++++++++++++++++++++++
 2 files changed, 68 insertions(+), 0 deletions(-)

diff --git a/1.8/library/socket/fixtures/classes.rb b/1.8/library/socket/fixtures/classes.rb
index 3c55328..0dec25d 100644
--- a/1.8/library/socket/fixtures/classes.rb
+++ b/1.8/library/socket/fixtures/classes.rb
@@ -9,4 +9,7 @@ module SocketSpecs
     Socket::SockAddr_In.new(Socket.sockaddr_in(port, host))
   end

+  def self.socket_path
+    "#{File.dirname(__FILE__)}/unix_server_spec.socket"
+  end
 end
diff --git a/1.8/library/socket/unixserver/accept_spec.rb b/1.8/library/socket/unixserver/accept_spec.rb
index 63bcd9b..7db60c6 100644
--- a/1.8/library/socket/unixserver/accept_spec.rb
+++ b/1.8/library/socket/unixserver/accept_spec.rb
@@ -1,2 +1,67 @@
 require File.dirname(__FILE__) + '/../../../spec_helper'
 require File.dirname(__FILE__) + '/../fixtures/classes'
+
+describe "UNIXServer#accept" do
+  before :each do
+    FileUtils.rm(SocketSpecs.socket_path, :force => true)
+  end
+
+  after :all do
+    FileUtils.rm(SocketSpecs.socket_path, :force => true)
+  end
+
+  it "accepts what is written by the client" do
+    server = UNIXServer.open(SocketSpecs.socket_path)
+    server.listen 5
+    data = nil
+    t = Thread.new do
+      client = server.accept
+      data = client.read(5)
+      client << "goodbye"
+      client.close
+    end
+    Thread.pass until t.status == "sleep"
+
+    socket = UNIXSocket.open(SocketSpecs.socket_path)
+    socket.write('hello')
+    socket.read.should == 'goodbye'
+    t.join
+    data.should == 'hello'
+    server.close
+    socket.close
+    FileUtils.rm(SocketSpecs.socket_path, :force => true)
+  end
+
+  it "can be interrupted by Thread#kill" do
+    server = UNIXServer.new(SocketSpecs.socket_path)
+    t = Thread.new {
+      server.accept
+    }
+    Thread.pass until t.status == "sleep"
+
+    # kill thread, ensure it dies in a reasonable amount of time
+    t.kill
+    a = 1
+    while a < 1000
+      break unless t.alive?
+      Thread.pass
+      a += 1
+    end
+    a.should < 1000
+    server.close
+  end
+
+  it "can be interrupted by Thread#raise" do
+    server = UNIXServer.new(SocketSpecs.socket_path)
+    t = Thread.new {
+      server.accept
+    }
+    Thread.pass until t.status == "sleep"
+
+    # raise in thread, ensure the raise happens
+    ex = Exception.new
+    t.raise ex
+    lambda { t.join }.should raise_error(Exception)
+    server.close
+  end
+end
--
1.5.4.1