module Test_syslog =

	let conf="# $FreeBSD: src/etc/syslog.conf,v 1.30.2.1 2009/08/03 08:13:06 kensmith Exp $
#

daemon.info                                     /var/log/cvsupd.log
security.*					-/var/log/security
*.notice;authpriv.none;kern.debug;lpr.info;mail.crit;news.err	/var/log/messages
uucp,news.crit                                          /var/log/spooler
*.emerg						*
daemon.!info					/var/log/foo
daemon.<=info					/var/log/foo
daemon.!<=info					/var/log/foo
*.*						@syslog.far.away
*.*						@syslog.far.away:123
*.*						@@syslog.far.away
*.*						@@syslog.far.away:123
*.*						@[2001::1]:514
*.*						foo,bar
*.*						|\"/usr/bin/soft arg\"
!startslip
# get that out
*.*						/var/log/slip.log
!pppd,ppp

*.*						/var/log/ppp.log
!+startslip
*.*						/var/log/slip.log
!-startslip
*.*						/var/log/slip.log
#!pppd
*.*						/var/log/ppp.log
+foo.example.com
daemon.info                                     /var/log/cvsupd.log
+foo.example.com,bar.example.com
daemon.info                                     /var/log/cvsupd.log
#+bar.example.com
daemon.info                                     /var/log/cvsupd.log
-foo.example.com
daemon.info                                     /var/log/cvsupd.log
+*
daemon.info                                     /var/log/cvsupd.log
!*
daemon.info                                     /var/log/cvsupd.log
*.=debug;\
        auth,authpriv.none;\
        news.none;mail.none     -/var/log/debug
# !pppd
"

	test Syslog.lns get conf =
          { "#comment" = "$FreeBSD: src/etc/syslog.conf,v 1.30.2.1 2009/08/03 08:13:06 kensmith Exp $" }
	  { }
	  { }
	  { "entry"
	    { "selector" { "facility" = "daemon" } { "level" = "info" } }
	    { "action" { "file" = "/var/log/cvsupd.log" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "security" } { "level" = "*" } }
	    { "action" { "no_sync" } { "file" = "/var/log/security" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "*" } { "level" = "notice" } }
	    { "selector" { "facility" = "authpriv" } { "level" = "none" } }
	    { "selector" { "facility" = "kern" } { "level" = "debug" } }
	    { "selector" { "facility" = "lpr" } { "level" = "info" } }
	    { "selector" { "facility" = "mail" } { "level" = "crit" } }
	    { "selector" { "facility" = "news" } { "level" = "err" } }
	    { "action" { "file" = "/var/log/messages" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "uucp" } { "facility" = "news" } { "level" = "crit" } }
	    { "action" { "file" = "/var/log/spooler" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "*" } { "level" = "emerg" } }
	    { "action" { "user" = "*" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "daemon" } { "comparison" = "!" } { "level" = "info" } }
	    { "action" { "file" = "/var/log/foo" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "daemon" } { "comparison" = "<=" } { "level" = "info" } }
	    { "action" { "file" = "/var/log/foo" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "daemon" } { "comparison" = "!<=" } { "level" = "info" } }
	    { "action" { "file" = "/var/log/foo" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "*" } { "level" = "*" } }
	    { "action" { "protocol" = "@" } { "hostname" = "syslog.far.away" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "*" } { "level" = "*" } }
	    { "action" { "protocol" = "@" } { "hostname" = "syslog.far.away" } { "port" = "123" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "*" } { "level" = "*" } }
	    { "action" { "protocol" = "@@" } { "hostname" = "syslog.far.away" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "*" } { "level" = "*" } }
	    { "action" { "protocol" = "@@" } { "hostname" = "syslog.far.away" } { "port" = "123" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "*" } { "level" = "*" } }
	    { "action" { "protocol" = "@" } { "hostname" = "[2001::1]" } { "port" = "514" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "*" } { "level" = "*" } }
	    { "action" { "user" = "foo" } { "user" = "bar" } }
	  }
	  { "entry"
	    { "selector" { "facility" = "*" } { "level" = "*" } }
	    { "action" { "program" = "\"/usr/bin/soft arg\"" } }
	  }
	  { "program"
	    { "program" = "startslip" }
	    { "#comment" = "get that out" }
	    { "entry"
	      { "selector" { "facility" = "*" } { "level" = "*" } }
	      { "action" { "file" = "/var/log/slip.log" } }
	    }
	  }
	  { "program"
	    { "program" = "pppd" }
	    { "program" = "ppp" }
	    { }
	    { "entry"
	      { "selector" { "facility" = "*" } { "level" = "*" } }
	      { "action" { "file" = "/var/log/ppp.log" } }
	    }
	  }
	  { "program"
	    { "program" = "startslip" }
	    { "entry"
	      { "selector" { "facility" = "*" } { "level" = "*" } }
	      { "action" { "file" = "/var/log/slip.log" } }
	    }
	  }
	  { "program"
	    { "reverse" }
	    { "program" = "startslip" }
	    { "entry"
	      { "selector" { "facility" = "*" } { "level" = "*" } }
	      { "action" { "file" = "/var/log/slip.log" } }
	    }
	  }
	  { "program"
	    { "program" = "pppd" }
	    { "entry"
	      { "selector" { "facility" = "*" } { "level" = "*" } }
	      { "action" { "file" = "/var/log/ppp.log" } }
	    }
	  }
	  { "hostname"
	    { "hostname" = "foo.example.com" }
	    { "entry"
	      { "selector" { "facility" = "daemon" } { "level" = "info" } }
	      { "action" { "file" = "/var/log/cvsupd.log" } }
	    }
	  }
	  { "hostname"
	    { "hostname" = "foo.example.com" }
	    { "hostname" = "bar.example.com" }
	    { "entry"
	      { "selector" { "facility" = "daemon" } { "level" = "info" } }
	      { "action" { "file" = "/var/log/cvsupd.log" } }
	    }
	  }
	  { "hostname"
	    { "hostname" = "bar.example.com" }
	    { "entry"
	      { "selector" { "facility" = "daemon" } { "level" = "info" } }
	      { "action" { "file" = "/var/log/cvsupd.log" } }
	    }
	  }
	  { "hostname"
	    { "reverse" }
	    { "hostname" = "foo.example.com" }
	    { "entry"
	      { "selector" { "facility" = "daemon" } { "level" = "info" } }
	      { "action" { "file" = "/var/log/cvsupd.log" } }
	    }
	  }
	  { "hostname"
	    { "hostname" = "*" }
	    { "entry"
	      { "selector" { "facility" = "daemon" } { "level" = "info" } }
	      { "action" { "file" = "/var/log/cvsupd.log" } }
	    }
	  }
	  { "program"
	    { "program" = "*" }
	    { "entry"
	      { "selector" { "facility" = "daemon" } { "level" = "info" } }
	      { "action" { "file" = "/var/log/cvsupd.log" } } }
            { "entry"
              { "selector" { "facility" = "*" } { "comparison" = "=" } { "level" = "debug" } }
              { "selector" { "facility" = "auth" } { "facility" = "authpriv" } { "level" = "none" } }
              { "selector" { "facility" = "news" } { "level" = "none" } }
              { "selector" { "facility" = "mail" } { "level" = "none" } }
	      { "action" { "no_sync" } { "file" = "/var/log/debug" } } }
      { "#comment" = "!pppd" }
	  }

	(* changing file *)
	test Syslog.lns put "*.* /var\n" after
	  set "/entry[1]/action/file" "/foo"
	  = "*.* /foo\n"

	(* changing file to discard *)
	test Syslog.lns put "*.* /var\n" after
	  rm "/entry[1]/action/file" ;
	  set "/entry[1]/action/discard" ""
	  = "*.* ~\n"

	(* removing entry *)
	test Syslog.lns put "*.* /var\n" after
	  rm "/entry[1]"
	  = ""

	(* changing facility and level *)
	test Syslog.lns put "*.* /var\n" after
	  set "/entry[1]/selector/facility" "daemon" ;
	  set "/entry[1]/selector/level" "info"
	  = "daemon.info /var\n"

	(* insert a facility *)
	test Syslog.lns put "daemon.* /var\n" after
	  insa "facility" "/entry/selector/facility" ;
	  set "/entry/selector/facility[2]" "mail"
	  = "daemon,mail.* /var\n"

	(* creating an entry *)
	test Syslog.lns put "" after
	  set "/entry/selector/facility" "daemon" ;
	  set "/entry/selector/level" "info" ;
	  set "/entry/action/file" "/var"
	  = "daemon.info\t/var\n"

	(* inserting an entry before *)
	test Syslog.lns put "*.* /var\n" after
	  insb "entry" "/entry" ;
	  set "/entry[1]/selector/facility" "daemon" ;
	  set "/entry[1]/selector/level" "info" ;
	  set "/entry[1]/action/file" "/foo"
	  = "daemon.info /foo\n*.*\t/var\n"

	(* inserting an entry after *)
	test Syslog.lns put "*.* /var\n" after
	  insa "entry" "/entry" ;
	  set "/entry[2]/selector/facility" "daemon" ;
	  set "/entry[2]/selector/level" "info" ;
	  set "/entry[2]/action/file" "/foo"
	  = "*.* /var\ndaemon.info\t/foo\n"

	(* insert sync on a file *)
	test Syslog.lns put "*.* /var\n" after
	  insb "no_sync" "/entry/action/file"
	  = "*.* -/var\n"

	(* changing file to remote host *)
	test Syslog.lns put "*.* /var\n" after
	  rm "/entry/action/file" ;
	  set "/entry/action/protocol"  "@" ;
	  set "/entry/action/hostname" "far.far.away"
	  = "*.* @far.far.away\n"

	(* changing file to remote host *)
	test Syslog.lns put "*.* /var/lib\n" after
	  rm "/entry/action/file" ;
	  set "/entry/action/protocol"  "@@" ;
	  set "/entry/action/hostname" "far.far.away"
	  = "*.* @@far.far.away\n"

	(* changing file to * *)
	test Syslog.lns put "*.* /var\n" after
	  rm "/entry/action/file" ;
	  set "/entry/action/user" "*"
	  = "*.* *\n"

	(* changing file to users *)
	test Syslog.lns put "*.* /var\n" after
	  rm "/entry/action/file" ;
	  set "/entry/action/user[1]" "john" ;
	  set "/entry/action/user[2]" "paul" ;
	  set "/entry/action/user[3]" "george" ;
	  set "/entry/action/user[4]" "ringo"
	  = "*.* john,paul,george,ringo\n"

	(* changing file to program *)
	test Syslog.lns put "*.* /var\n" after
	  rm "/entry/action/file" ;
	  set "/entry/action/program" "/usr/bin/foo"
	  = "*.* |/usr/bin/foo\n"

	(* inserting a matching program *)
	test Syslog.lns put "" after
	  insa "program" "/" ;
	  set "/program/program" "foo"
	  = "!foo\n"

	(* inserting an entry to a matching program *)
	test Syslog.lns put "!foo\n" after
	  set "/program/entry/selector/facility" "*" ;
	  set "/program/entry/selector/level" "*" ;
	  set "/program/entry/action/file" "/foo"
	  = "!foo\n*.*\t/foo\n"

	(* inserting a matching hostname *)
	test Syslog.lns put "" after
	  insa "hostname" "/" ;
	  set "/hostname/hostname" "foo.foo.away"
	  = "+foo.foo.away\n"

	(* inserting an entry to a matching hostname *)
	test Syslog.lns put "+foo.foo.away\n" after
	  set "/hostname/entry/selector/facility" "*" ;
	  set "/hostname/entry/selector/level" "*" ;
	  set "/hostname/entry/action/file" "/foo"
	  = "+foo.foo.away\n*.*\t/foo\n"

	(* inserting a reverse matching hostname *)
	test Syslog.lns put "" after
	  insa "hostname" "/" ;
	  set "/hostname/reverse" "" ;
	  set "/hostname/hostname" "foo.foo.away"
	  = "-foo.foo.away\n"

        (* tokens can contain capital letters *)
        test Syslog.lns get "LOCAL5.*    -/var/log/foo.log\n" =
          { "entry"
            { "selector"
              { "facility" = "LOCAL5" }
              { "level" = "*" }
            }
            { "action"
              { "no_sync" }
              { "file" = "/var/log/foo.log" }
            }
          }

    (* test for commented out statements *)
    test Syslog.lns put "" after
       set "#comment" "!pppd" = "# !pppd\n"

    (* allow space before comments *)
    test Syslog.lns get "  \t# space comment\n" =
      { "#comment" = "space comment" }

    test Syslog.lns get "include /etc/syslog.d\n" =
      { "include" = "/etc/syslog.d" }
