branch: elpa/logview
commit 9784604caf786fa99161ccdf684184f45e5f64fc
Author: Mace Ojala <m...@itu.dk>
Commit: Mace Ojala <m...@itu.dk>

    Added RFC 5424 levels, with tests. Closes #31.
---
 logview.el                      |  43 ++++++++-----
 test/levels/rfc-5424-levels.log |  10 +++
 test/logview.el                 | 138 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 176 insertions(+), 15 deletions(-)

diff --git a/logview.el b/logview.el
index b42ae6e840..965b42d245 100644
--- a/logview.el
+++ b/logview.el
@@ -78,17 +78,23 @@ This value is used as the fallback for customizable
 `logview-additional-submodes'.")
 
 (defvar logview-std-level-mappings
-  '(("SLF4J" . ((error       "ERROR")
-                (warning     "WARN")
-                (information "INFO")
-                (debug       "DEBUG")
-                (trace       "TRACE")
-                (aliases     "Log4j" "Log4j2" "Logback")))
-    ("JUL"   . ((error       "SEVERE")
-                (warning     "WARNING")
-                (information "INFO")
-                (debug       "CONFIG" "FINE")
-                (trace       "FINER" "FINEST"))))
+  '(("SLF4J"    . ((error       "ERROR")
+                   (warning     "WARN")
+                   (information "INFO")
+                   (debug       "DEBUG")
+                   (trace       "TRACE")
+                   (aliases     "Log4j" "Log4j2" "Logback")))
+    ("JUL"      . ((error       "SEVERE")
+                   (warning     "WARNING")
+                   (information "INFO")
+                   (debug       "CONFIG" "FINE")
+                   (trace       "FINER" "FINEST")))
+    ("RFC 5424" . ((error "EMERGENCY" "ALERT" "CRITICAL" "ERROR")
+                   (warning "WARNING")
+                   (information "NOTICE" "INFO")
+                   (debug "DEBUG")
+                   (trace)
+                   (aliases "syslog"))))
   "Standard mappings of actual log levels to mode's final levels.
 This alist value is used as the fallback for customizable
 `logview-additional-level-mappings'.")
@@ -203,9 +209,9 @@ levels  [may be optional]
     lacks levels altogether.
 
     There are some predefined values valid for this field:
-    \"SLF4J\" (and its alises \"Log4j\", \"Log4j2\", \"Logback\"
-    and \"JUL\".  See variable `logview-std-level-mappings' for
-    details.
+    \"SLF4J\" (and its aliases \"Log4j\", \"Log4j2\",
+    \"Logback\", \"JUL\" and the syslog standard \"RFC 5424\".
+    See variable `logview-std-level-mappings' for details.
 
 timestamp  [optional]
 
@@ -260,7 +266,14 @@ complicated:
 JUL has seven severity levels and we need to map them to five the
 mode supports.  So the last two lists contain two levels each.
 It is also legal to have empty lists, usually if there are less
-than five levels.
+than five levels, or if some of the levels do not conceptually
+map to the levels of the mode.  This is the case with RFC 5424:
+
+        Error levels:        EMERGENCY, ALERT, CRITICAL, ERROR
+        Warning levels:      WARNING
+        Information levels:  NOTICE, INFO
+        Debug levels:        DEBUG
+        Trace levels:
 
 Mapping can have any number of optional aliases, which work just
 as the name."
diff --git a/test/levels/rfc-5424-levels.log b/test/levels/rfc-5424-levels.log
new file mode 100644
index 0000000000..10a7ae2e29
--- /dev/null
+++ b/test/levels/rfc-5424-levels.log
@@ -0,0 +1,10 @@
+[2019-12-23 10:51:54] name[thread].EMERGENCY: Emergency message.
+[2019-12-23 10:51:55] name[thread].ALERT: Alert message.
+[2019-12-23 10:51:55] name[thread].CRITICAL: Critical message.
+[2019-12-23 10:51:56] name[thread].ERROR: Error message.
+[2019-12-23 10:51:56] name[thread].WARNING: Warning message.
+[2019-12-23 10:51:56] name[thread].NOTICE: Notice message.
+[2019-12-23 10:51:56] name[thread].INFO: Info message.
+[2019-12-23 10:51:56] name[thread].DEBUG: Debug message.
+[2019-12-23 10:51:56] name[thread].KITTENS: No such level defined by RFC 5424.
+[2019-12-23 10:51:56] name[thread].INFO: Info message after an invalid level.
diff --git a/test/logview.el b/test/logview.el
index 8451de1ab0..f51786b405 100644
--- a/test/logview.el
+++ b/test/logview.el
@@ -101,3 +101,141 @@
     (should (equal logview--submode-name "custom"))
     (logview--locate-current-entry entry start
       (should (and entry (equal start 1))))))
+
+;; RFC 5424 levels.
+;;
+;; The mock log file should have a list of log messages in the default
+;; Monolog format, in decreasing order of importance, from EMERGENCY
+;; to DEBUG. The second last entry should be an entry with a level
+;; which isn't defined in RFC 5424.
+;;
+;; TODO:  An epic case of DRY in these tests, maybe a function would be a good 
idea?
+(ert-deftest logview-test-rfc5424-level-0-emergency ()
+  (logview--test-with-file "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 0))
+    (logview-go-to-message-beginning)
+    (should (looking-at "Emergency message.$"))))
+
+(ert-deftest logview-test-rfc5424-level-1-alert ()
+  (logview--test-with-file
+      "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    (logview-next-entry 1)
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 1))
+    (logview-go-to-message-beginning)
+    (should (looking-at "Alert message.$"))))
+
+(ert-deftest logview-test-rfc5424-level-2-critical ()
+  (logview--test-with-file
+      "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    (logview-next-entry 2)
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 2))
+    (logview-go-to-message-beginning)
+    (should (looking-at "Critical message.$"))))
+
+(ert-deftest logview-test-rfc5424-level-3-error ()
+  (logview--test-with-file
+      "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    (logview-next-entry 3)
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 3))
+    (logview-go-to-message-beginning)
+    (should (looking-at "Error message.$"))))
+
+(ert-deftest logview-test-rfc5424-level-4-warning ()
+  (logview--test-with-file
+      "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    (logview-next-entry 4)
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 4))
+    (logview-go-to-message-beginning)
+    (should (looking-at "Warning message.$"))))
+
+(ert-deftest logview-test-rfc5424-level-5-notice ()
+  (logview--test-with-file
+      "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    (logview-next-entry 5)
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 5))
+    (logview-go-to-message-beginning)
+    (should (looking-at "Notice message.$"))))
+
+(ert-deftest logview-test-rfc5424-level-6-info ()
+  (logview--test-with-file
+      "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    (logview-next-entry 6)
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 6))
+    (logview-go-to-message-beginning)
+    (should (looking-at "Info message.$"))))
+
+(ert-deftest logview-test-rfc5424-level-7-debug ()
+  (logview--test-with-file
+      "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    (logview-next-entry 7)
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 7))
+    (logview-go-to-message-beginning)
+    (should (looking-at "Debug message.$"))))
+
+(ert-deftest logview-test-rfc5424-level-undefined ()
+  (logview--test-with-file
+      "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    ;; (logview-next-entry 8)
+    (forward-line 8)
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 7))
+    (logview-go-to-message-beginning)
+    ;; (should (looking-at "No such level defined by RFC 5424.$"))))
+    (should (looking-at ""))))
+
+(ert-deftest logview-test-rfc5424-level-defined-level-after-an-undefined-one ()
+  (logview--test-with-file
+      "levels/rfc-5424-levels.log"
+      ((logview-additional-submodes
+        '(("Monolog"
+           (format . "[TIMESTAMP] NAME[THREAD].LEVEL: MESSAGE")
+           (levels . "RFC 5424")))))
+    (should (equal logview--submode-name "Monolog"))
+    (logview-next-entry 8)
+    (should (equal (logview--locate-current-entry entry nil 
(logview--entry-level entry)) 6))
+    (logview-go-to-message-beginning)
+    (should (looking-at "Info message after an invalid level.$"))))

Reply via email to