1#!/usr/bin/env ruby
2# $RoughId: test.rb,v 1.9 2002/02/25 08:20:14 knu Exp $
3# $Id: test_syslog.rb 37446 2012-11-03 04:46:06Z kou $
4
5# Please only run this test on machines reasonable for testing.
6# If in doubt, ask your admin.
7
8require 'test/unit'
9
10begin
11  require 'syslog'
12rescue LoadError
13  # suppress error messages.
14end
15
16class TestSyslog < Test::Unit::TestCase
17  def test_new
18    assert_raises(NoMethodError) {
19      Syslog.new
20    }
21  end
22
23  def test_instance
24    sl1 = Syslog.instance
25    sl2 = Syslog.open
26    sl3 = Syslog.instance
27
28    assert_equal(Syslog, sl1)
29    assert_equal(Syslog, sl2)
30    assert_equal(Syslog, sl3)
31  ensure
32    Syslog.close if Syslog.opened?
33  end
34
35  def test_open
36    # default parameters
37    Syslog.open
38
39    assert_equal($0, Syslog.ident)
40    assert_equal(Syslog::LOG_PID | Syslog::LOG_CONS, Syslog.options)
41    assert_equal(Syslog::LOG_USER, Syslog.facility)
42
43    # open without close
44    assert_raises(RuntimeError) {
45      Syslog.open
46    }
47
48    Syslog.close
49
50    # given parameters
51    options = Syslog::LOG_NDELAY | Syslog::LOG_PID
52    Syslog.open("foo", options, Syslog::LOG_DAEMON)
53
54    assert_equal('foo', Syslog.ident)
55    assert_equal(options, Syslog.options)
56    assert_equal(Syslog::LOG_DAEMON, Syslog.facility)
57
58    Syslog.close
59
60    # default parameters again (after close)
61    Syslog.open
62    Syslog.close
63
64    assert_equal(nil, Syslog.ident)
65    assert_equal(nil, Syslog.options)
66    assert_equal(nil, Syslog.facility)
67
68    # block
69    param = nil
70    Syslog.open { |syslog|
71      param = syslog
72    }
73    assert_equal(Syslog, param)
74  ensure
75    Syslog.close if Syslog.opened?
76  end
77
78  def test_opened?
79    assert_equal(false, Syslog.opened?)
80
81    Syslog.open
82    assert_equal(true, Syslog.opened?)
83
84    Syslog.close
85    assert_equal(false, Syslog.opened?)
86
87    Syslog.open {
88      assert_equal(true, Syslog.opened?)
89    }
90
91    assert_equal(false, Syslog.opened?)
92  end
93
94  def test_close
95    assert_raises(RuntimeError) {
96      Syslog.close
97    }
98  end
99
100  def test_mask
101    assert_equal(nil, Syslog.mask)
102
103    Syslog.open
104
105    orig = Syslog.mask
106
107    Syslog.mask = Syslog.LOG_UPTO(Syslog::LOG_ERR)
108    assert_equal(Syslog.LOG_UPTO(Syslog::LOG_ERR), Syslog.mask)
109
110    Syslog.mask = Syslog.LOG_MASK(Syslog::LOG_CRIT)
111    assert_equal(Syslog.LOG_MASK(Syslog::LOG_CRIT), Syslog.mask)
112
113    Syslog.mask = orig
114  ensure
115    Syslog.close if Syslog.opened?
116  end
117
118  def syslog_line_regex(ident, message)
119    /(?:^| )#{Regexp.quote(ident)}(?:\[([1-9][0-9]*)\])?(?: |[: ].* )#{Regexp.quote(message)}$/
120  end
121
122  def test_log
123    stderr = IO::pipe
124
125    pid = fork {
126      stderr[0].close
127      STDERR.reopen(stderr[1])
128      stderr[1].close
129
130      options = Syslog::LOG_PERROR | Syslog::LOG_NDELAY
131
132      Syslog.open("syslog_test", options) { |sl|
133	sl.log(Syslog::LOG_NOTICE, "test1 - hello, %s!", "world")
134	sl.notice("test1 - hello, %s!", "world")
135      }
136
137      Syslog.open("syslog_test", options | Syslog::LOG_PID) { |sl|
138	sl.log(Syslog::LOG_CRIT, "test2 - pid")
139	sl.crit("test2 - pid")
140      }
141      exit!
142    }
143
144    stderr[1].close
145    Process.waitpid(pid)
146
147    # LOG_PERROR is not implemented on Cygwin or Solaris.  Only test
148    # these on systems that define it.
149    return unless Syslog.const_defined?(:LOG_PERROR)
150
151    2.times {
152      re = syslog_line_regex("syslog_test", "test1 - hello, world!")
153      line = stderr[0].gets
154      m = re.match(line)
155      assert_not_nil(m)
156      if m[1]
157        # pid is written regardless of LOG_PID on OS X 10.7+
158        assert_equal(pid, m[1].to_i)
159      end
160    }
161
162    2.times {
163      re = syslog_line_regex("syslog_test", "test2 - pid")
164      line = stderr[0].gets
165      m = re.match(line)
166      assert_not_nil(m)
167      assert_not_nil(m[1])
168      assert_equal(pid, m[1].to_i)
169    }
170  end
171
172  def test_inspect
173    Syslog.open { |sl|
174      assert_equal(format('<#%s: opened=true, ident="%s", options=%d, facility=%d, mask=%d>',
175			  Syslog,
176			  sl.ident,
177			  sl.options,
178			  sl.facility,
179			  sl.mask),
180		   sl.inspect)
181    }
182
183    assert_equal(format('<#%s: opened=false>', Syslog), Syslog.inspect)
184  end
185end if defined?(Syslog)
186