#! /bin/sh
# $Id: testPatternLayout 550 2007-05-22 16:45:22Z sfsetse $

myName=`basename $0`
myPath=`dirname $0`

DEBUG=${DEBUG:+' '}
DEBUG=${DEBUG:-':'}
${DEBUG} echo 'DEBUG output enabled' >&2

APP_NAME='stdout'

#------------------------------------------------------------------------------
# suite tests
#

commonPatternAssert()
{
  pattern=$1
  expected=$2
  msg=$3

  appender_setPattern ${APP_NAME} "${pattern}"
  appender_activateOptions ${APP_NAME}
  actual=`logger_info 'dummy'`
  ${DEBUG} echo "pattern='${pattern}' expected='${expected}' actual='${actual}'"
  msg=`eval "echo \"${msg}\""`
  assertEquals "${msg}" "${expected}" "${actual}"
}

testCategoryPattern()
{
  pattern='%c'
  expected='shell'
  msg="category '%c' pattern failed: '\${expected}' != '\${actual}'"
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return
}

commonDatePatternAssert()
{
  pattern=$1
  regex=$2

  appender_setPattern ${APP_NAME} "${pattern}"
  appender_activateOptions ${APP_NAME}
  result=`logger_info 'dummy'`
  matched=`echo ${result} |sed "s/${regex}//"`
  ${DEBUG} echo "pattern='${pattern}' result='${result}' regex='${regex}' matched='${matched}'"

  assertNotNull \
    "date pattern '${pattern}' failed: empty result '${result}'" \
    "${result}" || return
  assertNull \
    "date pattern '${pattern}' failed: result '${result}' did not match the regex '${regex}'" \
    "${matched}" || return
}

testDatePattern()
{
  # without conversion specifier (Unix date format '+%Y-%m-%d %H:%M:%S')
  pattern='%d'
  regex='^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}'
  commonDatePatternAssert "${pattern}" "${regex}" || return

  # ISODATE conversion specifier
  pattern='%d{ISODATE}'
  regex='^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}'
  commonDatePatternAssert "${pattern}" "${regex}" || return

  # custom conversion specifier
  pattern='%d{HH:mm:ss,SSS}'
  regex='^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\}'
  commonDatePatternAssert "${pattern}" "${regex}" || return
}

testFileNamePattern()
{
  pattern='%F'
  expected="${myName}"
  msg="file name '%F' pattern failed: '\${expected}' != '\${actual}'"
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return
}

testLineNumberPattern()
{
  pattern='%L'
  expected=''
  msg="line number '%L' pattern failed: '\${expected}' != '\${actual}'"
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return
}

testLineSeparatorPattern()
{
  pattern='%n'
  expected=''
  msg="line separator '%n' pattern failed: '\${expected}' != '\${actual}'"
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return
}

testMessagePattern()
{
  pattern='%m'
  expected='dummy'
  msg="message '%m' pattern failed: '\${expected}' != '\${actual}'"
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return
}

commonPriorityPatternAssert()
{
  expected=$2
  msg=$3

  appender_setPattern ${APP_NAME} "${pattern}"
  appender_activateOptions ${APP_NAME}
  actual=`logger_info 'dummy'`
  ${DEBUG} echo "pattern='${pattern}' expected='${expected}' actual='${actual}'"
  msg=`eval echo "${msg}"`
  assertEquals "${msg}" "${expected}" "${actual}"
}

# note: this function using the base log() function rather than the logger_*()
# functions as the functionality is effectively the same
testPriorityPattern()
{
  currPriority=`appender_getLevel ${APP_NAME}`

  pattern='%p'
  appender_setPattern ${APP_NAME} "${pattern}"
  for priority in TRACE DEBUG INFO WARN ERROR FATAL; do
    appender_setLevel ${APP_NAME} ${priority}
    appender_activateOptions ${APP_NAME}
    result=`log ${priority} 'dummy'`
    ${DEBUG} echo "pattern='${pattern}' priority='${priority}' result='${result}'"
    assertEquals \
      "priority pattern '${pattern}' failed: the requested priority of '${priority}' does not match the returned priority of '${result}'" \
      "${priority}" "${result}" || break
  done

  appender_setLevel ${APP_NAME} ${currPriority}
  appender_activateOptions ${APP_NAME}
}

testRunningTimePattern()
{
  pattern='%r'
  regex='^[0-9]*(\.[0-9]*){0,1}$'

  appender_setPattern ${APP_NAME} "${pattern}"
  appender_activateOptions ${APP_NAME}
  result=`logger_info 'dummy'`
  matched=`echo "${result}" |egrep "${regex}"`
  ${DEBUG} echo "pattern='${pattern}' result='${result}' regex='${regex}' matched='${matched}'"

  assertNotNull \
    "running time pattern '${pattern}' failed: empty result '${result}'" \
    "${result}" || return
  assertNotNull \
    "running time pattern '${pattern}' failed: result '${result}' did not match the regex '${regex}'" \
    "${matched}" || return
}

testThreadNamePattern()
{
  pattern='%t'
  expected=${__LOG4SH_THREAD_DEFAULT}
  msg="thread name '%t' pattern failed: '\${expected}' != '\${actual}'"
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return
}

# NDC (Nested Diagnostic Context)
testNDCPattern()
{
  pattern='%x'
  expected=''
  msg="NDC '%x' pattern failed: '\${expected}' != '\${actual}'"
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return
}

# MDC (Mapped Diagnostic Context)
testMDCPattern()
{
  msg="MDC '\${pattern}' pattern failed: '\${expected}' != '\${actual}'"

  pattern='%X{USER}'
  expected=${USER}
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return

  # the %X pattern should not parse unless it has an environment variable name
  # enclosed in {} chars following the 'X'
  pattern='%X'
  expected=${pattern}
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return
}

testPercentPattern()
{
  pattern='%%'
  expected='%'
  msg="percent '\${pattern}' pattern failed: '\${expected}' != '\${actual}'"
  commonPatternAssert "${pattern}" "${expected}" "${msg}" || return
}

testDefaultPattern()
{
  # the pattern should be '%d %p - %m%n'
  pattern=${__LOG4SH_PATTERN_DEFAULT}
  regex='^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\} INFO - dummy'
  result=`logger_info 'dummy'`
  matched=`echo ${result} |sed "s/${regex}//"`
  ${DEBUG} echo "pattern='${pattern}' result='${result}' regex='${regex}' matched='${matched}'"

  assertNotNull \
    "default pattern '${pattern}' failed: empty result '${result}'" \
    "${result}" || return
  assertNull \
    "default pattern '${pattern}' failed: result '${result}' did not match the regex '${regex}'" \
    "${matched}" || return
}

#------------------------------------------------------------------------------
# suite functions
#

oneTimeSetUp()
{
  # source log4sh
  ${DEBUG} echo "loading log4sh" >&2
  LOG4SH_CONFIGURATION='none' . ./log4sh
  logger_setLevel INFO
  appender_setLayout ${APP_NAME} PatternLayout
}

#------------------------------------------------------------------------------
# main
#

suite()
{
  suite_addTest testCategoryPattern
  suite_addTest testDatePattern
  suite_addTest testFileNamePattern
  suite_addTest testLineNumberPattern
  suite_addTest testLineSeparatorPattern
  suite_addTest testMessagePattern
  suite_addTest testPriorityPattern
  suite_addTest testRunningTimePattern
  suite_addTest testThreadNamePattern
  suite_addTest testNDCPattern
  suite_addTest testMDCPattern
  suite_addTest testPercentPattern
}

# need working egrep. the one for Solaris is in /usr/xpg4/bin, so we will add
# that to the path
PATH="/usr/xpg4/bin:${PATH}"

# load and run shUnit
${DEBUG} echo "loading shUnit" >&2
. ./shunit2
