From 666d1936c72ae73b9f02d73000015135cdc4a716 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 30 Oct 2013 01:50:16 +0000 Subject: test for binding Unix stream sockets This should prevent us from introducing bugs into some otherwise rarely-tested code. --- test/test_unix_socket.rb | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 test/test_unix_socket.rb (limited to 'test') diff --git a/test/test_unix_socket.rb b/test/test_unix_socket.rb new file mode 100644 index 0000000..374781c --- /dev/null +++ b/test/test_unix_socket.rb @@ -0,0 +1,71 @@ +# Copyright (C) 2013, Eric Wong and all contributors +# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt) +require_relative 'server_helper' + +class TestUnixSocket < Testcase + ENV["N"].to_i > 1 and parallelize_me! + include ServerHelper + alias setup server_helper_setup + alias teardown server_helper_teardown + + def unix_socket(path) + Timeout.timeout(30) do + begin + c = UNIXSocket.new(path) + c.close_on_exec = true + return c + rescue Errno::ENOENT + sleep 0.01 + retry + end + end + end + + def test_socket + tmpdir = Dir.mktmpdir + err, cfg = @err, Yahns::Config.new + sock = "#{tmpdir}/sock" + cfg.instance_eval do + ru = lambda { |_| [ 200, {'Content-Length'=>'2'}, ['HI'] ] } + GTL.synchronize { app(:rack, ru) { listen sock } } + stderr_path err.path + end + pid = mkserver(cfg) + c = unix_socket(sock) + c.write "GET / HTTP/1.0\r\n\r\n" + assert_equal c, c.wait(30) + buf = c.read + assert_match %r{\AHTTP/1\.1 200 OK\r\n}, buf + assert_match %r{\r\n\r\nHI\z}, buf + st = File.stat(sock) + assert st.world_readable? + assert st.world_writable? + ensure + quit_wait(pid) + FileUtils.rm_rf(tmpdir) + end + + def test_socket_perms + tmpdir = Dir.mktmpdir + err, cfg = @err, Yahns::Config.new + sock = "#{tmpdir}/sock" + cfg.instance_eval do + ru = lambda { |_| [ 200, {'Content-Length'=>'2'}, ['HI'] ] } + GTL.synchronize { app(:rack, ru) { listen sock, umask: 0077 } } + stderr_path err.path + end + pid = mkserver(cfg) + c = unix_socket(sock) + c.write "GET / HTTP/1.0\r\n\r\n" + assert_equal c, c.wait(30) + buf = c.read + assert_match %r{\AHTTP/1\.1 200 OK\r\n}, buf + assert_match %r{\r\n\r\nHI\z}, buf + st = File.stat(sock) + refute st.world_readable? + refute st.world_writable? + ensure + quit_wait(pid) + FileUtils.rm_rf(tmpdir) + end +end -- cgit v1.2.3-24-ge0c7