unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Bob Rogers <rogers@rgrjr.com>
To: 53811@debbugs.gnu.org
Subject: bug#53811: 29.0.50; [PATCH] ietf-drums-parse-address and rfc2047-decode-string
Date: Sat, 05 Feb 2022 21:20:30 -0500	[thread overview]
Message-ID: <m3bkzkbus1.fsf@orion.rgrjr.com> (raw)

In GNU Emacs 29.0.50 (build 2, x86_64-pc-linux-gnu, GTK+ Version 3.24.20, cairo version 1.16.0)
 of 2022-02-02 built on orion
Repository revision: ed13b0d0f427df333f8e1f9a24015c354da4c62f
Repository branch: rgr-ietf-drums-date
Windowing system distributor 'The X.Org Foundation', version 11.0.12003000
System Description: openSUSE Leap 15.3

   While developing tests for ietf-drums.el, I found that if
ietf-drums-parse-address is asked to do RFC2047 decoding, it does not by
itself load or declare the necessary rfc2047.el code.  So evaluating

        (require 'ietf-drums)
        (ietf-drums-parse-address
          "=?utf-8?B?0JfQtNGA0LDMgdCy0YHRgtCy0YPQudGC0LUh?= <foo@goo.ru>"
          t)

gets a "(void-function rfc2047-decode-string)" error.  The patch below
includes a possible fix plus a new test file (with the code above as a
regression test).

					-- Bob Rogers
					   http://www.rgrjr.com/

From 82e26ef8edd40815347b2f1b5311ab07046cd6f7 Mon Sep 17 00:00:00 2001
From: Bob Rogers <rogers@rgrjr.com>
Date: Fri, 4 Feb 2022 22:08:07 -0500
Subject: [PATCH] Add ietf-drums tests, fix parse-address decoding

* test/lisp/mail/ietf-drums-tests.el (ietf-drums-tests):  Test most of
     lisp/mail/ietf-drums.el functionality.
* lisp/mail/ietf-drums.el:
   + (ietf-drums-parse-address):  Bug fix:  Require rfc2047 when needed.
---
 lisp/mail/ietf-drums.el            |   2 +
 test/lisp/mail/ietf-drums-tests.el | 162 +++++++++++++++++++++++++++++
 2 files changed, 164 insertions(+)
 create mode 100644 test/lisp/mail/ietf-drums-tests.el

diff --git a/lisp/mail/ietf-drums.el b/lisp/mail/ietf-drums.el
index fd9cb6abb7..473f95ca50 100644
--- a/lisp/mail/ietf-drums.el
+++ b/lisp/mail/ietf-drums.el
@@ -191,6 +191,8 @@ ietf-drums-parse-address
   "Parse STRING and return a MAILBOX / DISPLAY-NAME pair.
 If DECODE, the DISPLAY-NAME will have RFC2047 decoding performed
 (that's the \"=?utf...q...=?\") stuff."
+  (when decode
+    (require 'rfc2047))
   (with-temp-buffer
     (let (display-name mailbox c display-string)
       (ietf-drums-init string)
diff --git a/test/lisp/mail/ietf-drums-tests.el b/test/lisp/mail/ietf-drums-tests.el
new file mode 100644
index 0000000000..4cc38b8763
--- /dev/null
+++ b/test/lisp/mail/ietf-drums-tests.el
@@ -0,0 +1,162 @@
+;;; ietf-drums-tests.el --- Test suite for ietf-drums.el  -*- lexical-binding:t -*-
+
+;; Copyright (C) 2022 Free Software Foundation, Inc.
+
+;; Author: Bob Rogers <rogers@rgrjr.com>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(require 'ert)
+(require 'ietf-drums)
+
+(ert-deftest ietf-drums-tests ()
+  "Test ietf-drums functionality."
+
+  ;; ietf-drums-remove-comments
+  (should (equal (ietf-drums-remove-comments "random string") "random string"))
+  (should (equal (ietf-drums-remove-comments "random \"non comment\" string")
+                 "random \"non comment\" string"))
+  (should (equal (ietf-drums-remove-comments "random (comment) string")
+                 "random  string"))
+  (should (equal (ietf-drums-remove-comments "random (comment) (string)")
+                 "random  "))
+  (should (equal (ietf-drums-remove-comments
+                  "random (first) (second (and)) (third) not fourth")
+                 "random    not fourth"))
+
+  ;; ietf-drums-remove-whitespace
+  (should (equal (ietf-drums-remove-whitespace "random string")
+                 "randomstring"))
+  (should (equal (ietf-drums-remove-whitespace "random (comment) string")
+                 "random(comment)string"))
+  (should (equal (ietf-drums-remove-whitespace "random \"non comment\" string")
+                 "random\"non comment\"string"))
+  (should (equal (ietf-drums-remove-whitespace "random (comment)\r\n(string)")
+                 "random(comment)(string)"))
+  (should (equal (ietf-drums-remove-whitespace
+                  "random (first) (second (and)) (third) not fourth")
+                 "random(first)(second (and))(third)notfourth"))
+
+  ;; ietf-drums-strip
+  (should (equal (ietf-drums-strip "random string") "randomstring"))
+  (should (equal (ietf-drums-strip "random \"non comment\" string")
+                 "random\"non comment\"string"))
+  (should (equal (ietf-drums-strip "random (comment) string")
+                 "randomstring"))
+  (should (equal (ietf-drums-strip "random (comment) (string)")
+                 "random"))
+  (should (equal (ietf-drums-strip
+                  "random (first) (second (and)) (third) not fourth")
+                 "randomnotfourth"))
+
+  ;; ietf-drums-strip-cte
+  (should (equal (ietf-drums-strip-cte "random \"non comment\" string")
+                 ;; [the " " is still in there because it was quoted
+                 ;; through the "strip".  -- rgr, 5-Feb-22.]
+                 "randomnon commentstring"))
+  (should (equal (ietf-drums-strip-cte "ran(d)do<m@>[s;t:r],,in=g")
+                 "randomstring"))
+
+  ;; ietf-drums-quote-string
+  (should (equal (ietf-drums-quote-string "Bob") "Bob"))
+  (should (equal (ietf-drums-quote-string "Foo Bar") "\"Foo Bar\""))
+
+  ;; ietf-drums-get-comment
+  (should (equal (ietf-drums-get-comment "random string") nil))
+  (should (equal (ietf-drums-get-comment "random (comment) string") "comment"))
+  (should (equal (ietf-drums-get-comment "random \"non comment\" string") nil))
+  (should (equal (ietf-drums-get-comment "\"still (non) comment\" string")
+                 nil))
+  (should (equal (ietf-drums-get-comment "random (comment)\r\nstring")
+                 "comment"))
+  (should (equal (ietf-drums-get-comment "random (comment) (string)") "string"))
+  (should (equal (ietf-drums-get-comment
+                  "random (first) (second (and)) (third) not fourth")
+                 "third"))
+
+  ;; ietf-drums-make-address
+  (should (equal (ietf-drums-make-address "Bob Rogers" "rogers@rgrjr.com")
+                 "\"Bob Rogers\" <rogers@rgrjr.com>"))
+  (should (equal (ietf-drums-make-address nil "rogers@rgrjr.com")
+                 "rogers@rgrjr.com"))
+
+  ;; ietf-drums-parse-address
+  (should (equal (ietf-drums-parse-address "foo@example.com")
+                 '("foo@example.com")))
+  (should (equal (ietf-drums-parse-address "<foo@example.com>")
+                 '("foo@example.com")))
+  (should (equal (ietf-drums-parse-address "'foo' <foo@example.com>")
+                 '("foo@example.com" . "'foo'")))
+  (should (equal (ietf-drums-parse-address "foo <foo@example.com>")
+                 '("foo@example.com" . "foo")))
+  (should (equal (ietf-drums-parse-address "foo <foo@example.com> bar")
+                 ;; [contrary to RFC2822, which wants the display-name
+                 ;; before the address.  -- rgr, 5-Feb-22.]
+                 '("foo@example.com" . "foo bar")))
+  (should (equal (ietf-drums-parse-address " <foo@example.com> foo ")
+                 ;; [ditto.  -- rgr, 5-Feb-22.]
+                 '("foo@example.com" . "foo")))
+  (should (equal (ietf-drums-parse-address "foo@example.com (foo)")
+                 '("foo@example.com" . "foo")))
+  (should (equal (ietf-drums-parse-address "Bar Baz <barbaz@example.com>")
+                 '("barbaz@example.com" . "Bar Baz")))
+  (should (equal (ietf-drums-parse-address "barbaz@example.com (Bar Baz)")
+                 '("barbaz@example.com" . "Bar Baz")))
+  (should (equal (ietf-drums-parse-address
+                  "Bar Baz (ignored) <barbaz@example.com>")
+                 '("barbaz@example.com" . "Bar Baz")))
+  (should (equal (ietf-drums-parse-address "<barbaz@example.com> Bar Baz")
+                 '("barbaz@example.com" . "Bar Baz")))
+  (should (equal (ietf-drums-parse-address
+                  "(Bar Baz not ignored) barbaz@example.com")
+                 ;; [not strictly RFC2822, which expects the name
+                 ;; comment after the address.  -- rgr, 5-Feb-22.]
+                 '("barbaz@example.com" . "Bar Baz not ignored")))
+  (should (equal (ietf-drums-parse-address
+                  "(ignored) <barbaz@example.com> (Bar Baz not ignored)")
+                 '("barbaz@example.com" . "Bar Baz not ignored")))
+  (should (equal (ietf-drums-parse-address
+                  "(ignored) barbaz@example.com (Bar Baz not ignored)")
+                 '("barbaz@example.com" . "Bar Baz not ignored")))
+  ;; Test for RFC2047 token decoding.
+  (should (equal (ietf-drums-parse-address
+                  "=?utf-8?B?0JfQtNGA0LDMgdCy0YHRgtCy0YPQudGC0LUh?= <foo@goo.ru>"
+                  t)
+                 '("foo@goo.ru" . "Здра́вствуйте!")))
+
+  ;; ietf-drums-parse-addresses
+  ;; Note that it's not worth getting too elaborate here, as the heavy
+  ;; lifting is all done by ietf-drums-parse-address.
+  (should (equal (ietf-drums-parse-addresses "foo@example.com")
+                 '(("foo@example.com"))))
+  (should (equal (ietf-drums-parse-addresses
+                  "foo@example.com, bar@example.com")
+                 '(("foo@example.com") ("bar@example.com"))))
+  (should (equal (ietf-drums-parse-addresses
+                  "foo@example.com, quux, bar@example.com")
+                 '(("foo@example.com") ("bar@example.com"))))
+  (should (equal (ietf-drums-parse-addresses
+                  "foo@example.com, Quux Dude <quux@noop.org>, bar@example.com")
+                 '(("foo@example.com") ("quux@noop.org" . "Quux Dude")
+                   ("bar@example.com")))))
+
+(provide 'ietf-drums-tests)
+
+;;; ietf-drums-tests.el ends here
-- 
2.34.1






             reply	other threads:[~2022-02-06  2:20 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-06  2:20 Bob Rogers [this message]
2022-02-06  3:08 ` bug#53811: 29.0.50; [PATCH] ietf-drums-parse-address and rfc2047-decode-string Lars Ingebrigtsen
2022-02-06  4:54   ` Bob Rogers
2022-02-06 23:08     ` Lars Ingebrigtsen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m3bkzkbus1.fsf@orion.rgrjr.com \
    --to=rogers@rgrjr.com \
    --cc=53811@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).