17db96d56Sopenharmony_ciimport io
27db96d56Sopenharmony_ciimport types
37db96d56Sopenharmony_ciimport textwrap
47db96d56Sopenharmony_ciimport unittest
57db96d56Sopenharmony_ciimport email.errors
67db96d56Sopenharmony_ciimport email.policy
77db96d56Sopenharmony_ciimport email.parser
87db96d56Sopenharmony_ciimport email.generator
97db96d56Sopenharmony_ciimport email.message
107db96d56Sopenharmony_cifrom email import headerregistry
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_cidef make_defaults(base_defaults, differences):
137db96d56Sopenharmony_ci    defaults = base_defaults.copy()
147db96d56Sopenharmony_ci    defaults.update(differences)
157db96d56Sopenharmony_ci    return defaults
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ciclass PolicyAPITests(unittest.TestCase):
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci    longMessage = True
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci    # Base default values.
227db96d56Sopenharmony_ci    compat32_defaults = {
237db96d56Sopenharmony_ci        'max_line_length':          78,
247db96d56Sopenharmony_ci        'linesep':                  '\n',
257db96d56Sopenharmony_ci        'cte_type':                 '8bit',
267db96d56Sopenharmony_ci        'raise_on_defect':          False,
277db96d56Sopenharmony_ci        'mangle_from_':             True,
287db96d56Sopenharmony_ci        'message_factory':          None,
297db96d56Sopenharmony_ci        }
307db96d56Sopenharmony_ci    # These default values are the ones set on email.policy.default.
317db96d56Sopenharmony_ci    # If any of these defaults change, the docs must be updated.
327db96d56Sopenharmony_ci    policy_defaults = compat32_defaults.copy()
337db96d56Sopenharmony_ci    policy_defaults.update({
347db96d56Sopenharmony_ci        'utf8':                     False,
357db96d56Sopenharmony_ci        'raise_on_defect':          False,
367db96d56Sopenharmony_ci        'header_factory':           email.policy.EmailPolicy.header_factory,
377db96d56Sopenharmony_ci        'refold_source':            'long',
387db96d56Sopenharmony_ci        'content_manager':          email.policy.EmailPolicy.content_manager,
397db96d56Sopenharmony_ci        'mangle_from_':             False,
407db96d56Sopenharmony_ci        'message_factory':          email.message.EmailMessage,
417db96d56Sopenharmony_ci        })
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci    # For each policy under test, we give here what we expect the defaults to
447db96d56Sopenharmony_ci    # be for that policy.  The second argument to make defaults is the
457db96d56Sopenharmony_ci    # difference between the base defaults and that for the particular policy.
467db96d56Sopenharmony_ci    new_policy = email.policy.EmailPolicy()
477db96d56Sopenharmony_ci    policies = {
487db96d56Sopenharmony_ci        email.policy.compat32: make_defaults(compat32_defaults, {}),
497db96d56Sopenharmony_ci        email.policy.default: make_defaults(policy_defaults, {}),
507db96d56Sopenharmony_ci        email.policy.SMTP: make_defaults(policy_defaults,
517db96d56Sopenharmony_ci                                         {'linesep': '\r\n'}),
527db96d56Sopenharmony_ci        email.policy.SMTPUTF8: make_defaults(policy_defaults,
537db96d56Sopenharmony_ci                                             {'linesep': '\r\n',
547db96d56Sopenharmony_ci                                              'utf8': True}),
557db96d56Sopenharmony_ci        email.policy.HTTP: make_defaults(policy_defaults,
567db96d56Sopenharmony_ci                                         {'linesep': '\r\n',
577db96d56Sopenharmony_ci                                          'max_line_length': None}),
587db96d56Sopenharmony_ci        email.policy.strict: make_defaults(policy_defaults,
597db96d56Sopenharmony_ci                                           {'raise_on_defect': True}),
607db96d56Sopenharmony_ci        new_policy: make_defaults(policy_defaults, {}),
617db96d56Sopenharmony_ci        }
627db96d56Sopenharmony_ci    # Creating a new policy creates a new header factory.  There is a test
637db96d56Sopenharmony_ci    # later that proves this.
647db96d56Sopenharmony_ci    policies[new_policy]['header_factory'] = new_policy.header_factory
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci    def test_defaults(self):
677db96d56Sopenharmony_ci        for policy, expected in self.policies.items():
687db96d56Sopenharmony_ci            for attr, value in expected.items():
697db96d56Sopenharmony_ci                with self.subTest(policy=policy, attr=attr):
707db96d56Sopenharmony_ci                    self.assertEqual(getattr(policy, attr), value,
717db96d56Sopenharmony_ci                                    ("change {} docs/docstrings if defaults have "
727db96d56Sopenharmony_ci                                    "changed").format(policy))
737db96d56Sopenharmony_ci
747db96d56Sopenharmony_ci    def test_all_attributes_covered(self):
757db96d56Sopenharmony_ci        for policy, expected in self.policies.items():
767db96d56Sopenharmony_ci            for attr in dir(policy):
777db96d56Sopenharmony_ci                with self.subTest(policy=policy, attr=attr):
787db96d56Sopenharmony_ci                    if (attr.startswith('_') or
797db96d56Sopenharmony_ci                            isinstance(getattr(email.policy.EmailPolicy, attr),
807db96d56Sopenharmony_ci                                  types.FunctionType)):
817db96d56Sopenharmony_ci                        continue
827db96d56Sopenharmony_ci                    else:
837db96d56Sopenharmony_ci                        self.assertIn(attr, expected,
847db96d56Sopenharmony_ci                                      "{} is not fully tested".format(attr))
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci    def test_abc(self):
877db96d56Sopenharmony_ci        with self.assertRaises(TypeError) as cm:
887db96d56Sopenharmony_ci            email.policy.Policy()
897db96d56Sopenharmony_ci        msg = str(cm.exception)
907db96d56Sopenharmony_ci        abstract_methods = ('fold',
917db96d56Sopenharmony_ci                            'fold_binary',
927db96d56Sopenharmony_ci                            'header_fetch_parse',
937db96d56Sopenharmony_ci                            'header_source_parse',
947db96d56Sopenharmony_ci                            'header_store_parse')
957db96d56Sopenharmony_ci        for method in abstract_methods:
967db96d56Sopenharmony_ci            self.assertIn(method, msg)
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ci    def test_policy_is_immutable(self):
997db96d56Sopenharmony_ci        for policy, defaults in self.policies.items():
1007db96d56Sopenharmony_ci            for attr in defaults:
1017db96d56Sopenharmony_ci                with self.assertRaisesRegex(AttributeError, attr+".*read-only"):
1027db96d56Sopenharmony_ci                    setattr(policy, attr, None)
1037db96d56Sopenharmony_ci            with self.assertRaisesRegex(AttributeError, 'no attribute.*foo'):
1047db96d56Sopenharmony_ci                policy.foo = None
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci    def test_set_policy_attrs_when_cloned(self):
1077db96d56Sopenharmony_ci        # None of the attributes has a default value of None, so we set them
1087db96d56Sopenharmony_ci        # all to None in the clone call and check that it worked.
1097db96d56Sopenharmony_ci        for policyclass, defaults in self.policies.items():
1107db96d56Sopenharmony_ci            testattrdict = {attr: None for attr in defaults}
1117db96d56Sopenharmony_ci            policy = policyclass.clone(**testattrdict)
1127db96d56Sopenharmony_ci            for attr in defaults:
1137db96d56Sopenharmony_ci                self.assertIsNone(getattr(policy, attr))
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci    def test_reject_non_policy_keyword_when_called(self):
1167db96d56Sopenharmony_ci        for policyclass in self.policies:
1177db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
1187db96d56Sopenharmony_ci                policyclass(this_keyword_should_not_be_valid=None)
1197db96d56Sopenharmony_ci            with self.assertRaises(TypeError):
1207db96d56Sopenharmony_ci                policyclass(newtline=None)
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci    def test_policy_addition(self):
1237db96d56Sopenharmony_ci        expected = self.policy_defaults.copy()
1247db96d56Sopenharmony_ci        p1 = email.policy.default.clone(max_line_length=100)
1257db96d56Sopenharmony_ci        p2 = email.policy.default.clone(max_line_length=50)
1267db96d56Sopenharmony_ci        added = p1 + p2
1277db96d56Sopenharmony_ci        expected.update(max_line_length=50)
1287db96d56Sopenharmony_ci        for attr, value in expected.items():
1297db96d56Sopenharmony_ci            self.assertEqual(getattr(added, attr), value)
1307db96d56Sopenharmony_ci        added = p2 + p1
1317db96d56Sopenharmony_ci        expected.update(max_line_length=100)
1327db96d56Sopenharmony_ci        for attr, value in expected.items():
1337db96d56Sopenharmony_ci            self.assertEqual(getattr(added, attr), value)
1347db96d56Sopenharmony_ci        added = added + email.policy.default
1357db96d56Sopenharmony_ci        for attr, value in expected.items():
1367db96d56Sopenharmony_ci            self.assertEqual(getattr(added, attr), value)
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci    def test_fold_zero_max_line_length(self):
1397db96d56Sopenharmony_ci        expected = 'Subject: =?utf-8?q?=C3=A1?=\n'
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci        msg = email.message.EmailMessage()
1427db96d56Sopenharmony_ci        msg['Subject'] = 'á'
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci        p1 = email.policy.default.clone(max_line_length=0)
1457db96d56Sopenharmony_ci        p2 = email.policy.default.clone(max_line_length=None)
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci        self.assertEqual(p1.fold('Subject', msg['Subject']), expected)
1487db96d56Sopenharmony_ci        self.assertEqual(p2.fold('Subject', msg['Subject']), expected)
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci    def test_register_defect(self):
1517db96d56Sopenharmony_ci        class Dummy:
1527db96d56Sopenharmony_ci            def __init__(self):
1537db96d56Sopenharmony_ci                self.defects = []
1547db96d56Sopenharmony_ci        obj = Dummy()
1557db96d56Sopenharmony_ci        defect = object()
1567db96d56Sopenharmony_ci        policy = email.policy.EmailPolicy()
1577db96d56Sopenharmony_ci        policy.register_defect(obj, defect)
1587db96d56Sopenharmony_ci        self.assertEqual(obj.defects, [defect])
1597db96d56Sopenharmony_ci        defect2 = object()
1607db96d56Sopenharmony_ci        policy.register_defect(obj, defect2)
1617db96d56Sopenharmony_ci        self.assertEqual(obj.defects, [defect, defect2])
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci    class MyObj:
1647db96d56Sopenharmony_ci        def __init__(self):
1657db96d56Sopenharmony_ci            self.defects = []
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci    class MyDefect(Exception):
1687db96d56Sopenharmony_ci        pass
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci    def test_handle_defect_raises_on_strict(self):
1717db96d56Sopenharmony_ci        foo = self.MyObj()
1727db96d56Sopenharmony_ci        defect = self.MyDefect("the telly is broken")
1737db96d56Sopenharmony_ci        with self.assertRaisesRegex(self.MyDefect, "the telly is broken"):
1747db96d56Sopenharmony_ci            email.policy.strict.handle_defect(foo, defect)
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci    def test_handle_defect_registers_defect(self):
1777db96d56Sopenharmony_ci        foo = self.MyObj()
1787db96d56Sopenharmony_ci        defect1 = self.MyDefect("one")
1797db96d56Sopenharmony_ci        email.policy.default.handle_defect(foo, defect1)
1807db96d56Sopenharmony_ci        self.assertEqual(foo.defects, [defect1])
1817db96d56Sopenharmony_ci        defect2 = self.MyDefect("two")
1827db96d56Sopenharmony_ci        email.policy.default.handle_defect(foo, defect2)
1837db96d56Sopenharmony_ci        self.assertEqual(foo.defects, [defect1, defect2])
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    class MyPolicy(email.policy.EmailPolicy):
1867db96d56Sopenharmony_ci        defects = None
1877db96d56Sopenharmony_ci        def __init__(self, *args, **kw):
1887db96d56Sopenharmony_ci            super().__init__(*args, defects=[], **kw)
1897db96d56Sopenharmony_ci        def register_defect(self, obj, defect):
1907db96d56Sopenharmony_ci            self.defects.append(defect)
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci    def test_overridden_register_defect_still_raises(self):
1937db96d56Sopenharmony_ci        foo = self.MyObj()
1947db96d56Sopenharmony_ci        defect = self.MyDefect("the telly is broken")
1957db96d56Sopenharmony_ci        with self.assertRaisesRegex(self.MyDefect, "the telly is broken"):
1967db96d56Sopenharmony_ci            self.MyPolicy(raise_on_defect=True).handle_defect(foo, defect)
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci    def test_overridden_register_defect_works(self):
1997db96d56Sopenharmony_ci        foo = self.MyObj()
2007db96d56Sopenharmony_ci        defect1 = self.MyDefect("one")
2017db96d56Sopenharmony_ci        my_policy = self.MyPolicy()
2027db96d56Sopenharmony_ci        my_policy.handle_defect(foo, defect1)
2037db96d56Sopenharmony_ci        self.assertEqual(my_policy.defects, [defect1])
2047db96d56Sopenharmony_ci        self.assertEqual(foo.defects, [])
2057db96d56Sopenharmony_ci        defect2 = self.MyDefect("two")
2067db96d56Sopenharmony_ci        my_policy.handle_defect(foo, defect2)
2077db96d56Sopenharmony_ci        self.assertEqual(my_policy.defects, [defect1, defect2])
2087db96d56Sopenharmony_ci        self.assertEqual(foo.defects, [])
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci    def test_default_header_factory(self):
2117db96d56Sopenharmony_ci        h = email.policy.default.header_factory('Test', 'test')
2127db96d56Sopenharmony_ci        self.assertEqual(h.name, 'Test')
2137db96d56Sopenharmony_ci        self.assertIsInstance(h, headerregistry.UnstructuredHeader)
2147db96d56Sopenharmony_ci        self.assertIsInstance(h, headerregistry.BaseHeader)
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci    class Foo:
2177db96d56Sopenharmony_ci        parse = headerregistry.UnstructuredHeader.parse
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_ci    def test_each_Policy_gets_unique_factory(self):
2207db96d56Sopenharmony_ci        policy1 = email.policy.EmailPolicy()
2217db96d56Sopenharmony_ci        policy2 = email.policy.EmailPolicy()
2227db96d56Sopenharmony_ci        policy1.header_factory.map_to_type('foo', self.Foo)
2237db96d56Sopenharmony_ci        h = policy1.header_factory('foo', 'test')
2247db96d56Sopenharmony_ci        self.assertIsInstance(h, self.Foo)
2257db96d56Sopenharmony_ci        self.assertNotIsInstance(h, headerregistry.UnstructuredHeader)
2267db96d56Sopenharmony_ci        h = policy2.header_factory('foo', 'test')
2277db96d56Sopenharmony_ci        self.assertNotIsInstance(h, self.Foo)
2287db96d56Sopenharmony_ci        self.assertIsInstance(h, headerregistry.UnstructuredHeader)
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci    def test_clone_copies_factory(self):
2317db96d56Sopenharmony_ci        policy1 = email.policy.EmailPolicy()
2327db96d56Sopenharmony_ci        policy2 = policy1.clone()
2337db96d56Sopenharmony_ci        policy1.header_factory.map_to_type('foo', self.Foo)
2347db96d56Sopenharmony_ci        h = policy1.header_factory('foo', 'test')
2357db96d56Sopenharmony_ci        self.assertIsInstance(h, self.Foo)
2367db96d56Sopenharmony_ci        h = policy2.header_factory('foo', 'test')
2377db96d56Sopenharmony_ci        self.assertIsInstance(h, self.Foo)
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci    def test_new_factory_overrides_default(self):
2407db96d56Sopenharmony_ci        mypolicy = email.policy.EmailPolicy()
2417db96d56Sopenharmony_ci        myfactory = mypolicy.header_factory
2427db96d56Sopenharmony_ci        newpolicy = mypolicy + email.policy.strict
2437db96d56Sopenharmony_ci        self.assertEqual(newpolicy.header_factory, myfactory)
2447db96d56Sopenharmony_ci        newpolicy = email.policy.strict + mypolicy
2457db96d56Sopenharmony_ci        self.assertEqual(newpolicy.header_factory, myfactory)
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci    def test_adding_default_policies_preserves_default_factory(self):
2487db96d56Sopenharmony_ci        newpolicy = email.policy.default + email.policy.strict
2497db96d56Sopenharmony_ci        self.assertEqual(newpolicy.header_factory,
2507db96d56Sopenharmony_ci                         email.policy.EmailPolicy.header_factory)
2517db96d56Sopenharmony_ci        self.assertEqual(newpolicy.__dict__, {'raise_on_defect': True})
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ci    def test_non_ascii_chars_do_not_cause_inf_loop(self):
2547db96d56Sopenharmony_ci        policy = email.policy.default.clone(max_line_length=20)
2557db96d56Sopenharmony_ci        actual = policy.fold('Subject', 'ą' * 12)
2567db96d56Sopenharmony_ci        self.assertEqual(
2577db96d56Sopenharmony_ci            actual,
2587db96d56Sopenharmony_ci            'Subject: \n' +
2597db96d56Sopenharmony_ci            12 * ' =?utf-8?q?=C4=85?=\n')
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci    def test_short_maxlen_error(self):
2627db96d56Sopenharmony_ci        # RFC 2047 chrome takes up 7 characters, plus the length of the charset
2637db96d56Sopenharmony_ci        # name, so folding should fail if maxlen is lower than the minimum
2647db96d56Sopenharmony_ci        # required length for a line.
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci        # Note: This is only triggered when there is a single word longer than
2677db96d56Sopenharmony_ci        # max_line_length, hence the 1234567890 at the end of this whimsical
2687db96d56Sopenharmony_ci        # subject. This is because when we encounter a word longer than
2697db96d56Sopenharmony_ci        # max_line_length, it is broken down into encoded words to fit
2707db96d56Sopenharmony_ci        # max_line_length. If the max_line_length isn't large enough to even
2717db96d56Sopenharmony_ci        # contain the RFC 2047 chrome (`?=<charset>?q??=`), we fail.
2727db96d56Sopenharmony_ci        subject = "Melt away the pounds with this one simple trick! 1234567890"
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci        for maxlen in [3, 7, 9]:
2757db96d56Sopenharmony_ci            with self.subTest(maxlen=maxlen):
2767db96d56Sopenharmony_ci                policy = email.policy.default.clone(max_line_length=maxlen)
2777db96d56Sopenharmony_ci                with self.assertRaises(email.errors.HeaderParseError):
2787db96d56Sopenharmony_ci                    policy.fold("Subject", subject)
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci    # XXX: Need subclassing tests.
2817db96d56Sopenharmony_ci    # For adding subclassed objects, make sure the usual rules apply (subclass
2827db96d56Sopenharmony_ci    # wins), but that the order still works (right overrides left).
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ciclass TestException(Exception):
2867db96d56Sopenharmony_ci    pass
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ciclass TestPolicyPropagation(unittest.TestCase):
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci    # The abstract methods are used by the parser but not by the wrapper
2917db96d56Sopenharmony_ci    # functions that call it, so if the exception gets raised we know that the
2927db96d56Sopenharmony_ci    # policy was actually propagated all the way to feedparser.
2937db96d56Sopenharmony_ci    class MyPolicy(email.policy.Policy):
2947db96d56Sopenharmony_ci        def badmethod(self, *args, **kw):
2957db96d56Sopenharmony_ci            raise TestException("test")
2967db96d56Sopenharmony_ci        fold = fold_binary = header_fetch_parser = badmethod
2977db96d56Sopenharmony_ci        header_source_parse = header_store_parse = badmethod
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci    def test_message_from_string(self):
3007db96d56Sopenharmony_ci        with self.assertRaisesRegex(TestException, "^test$"):
3017db96d56Sopenharmony_ci            email.message_from_string("Subject: test\n\n",
3027db96d56Sopenharmony_ci                                      policy=self.MyPolicy)
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci    def test_message_from_bytes(self):
3057db96d56Sopenharmony_ci        with self.assertRaisesRegex(TestException, "^test$"):
3067db96d56Sopenharmony_ci            email.message_from_bytes(b"Subject: test\n\n",
3077db96d56Sopenharmony_ci                                     policy=self.MyPolicy)
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci    def test_message_from_file(self):
3107db96d56Sopenharmony_ci        f = io.StringIO('Subject: test\n\n')
3117db96d56Sopenharmony_ci        with self.assertRaisesRegex(TestException, "^test$"):
3127db96d56Sopenharmony_ci            email.message_from_file(f, policy=self.MyPolicy)
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci    def test_message_from_binary_file(self):
3157db96d56Sopenharmony_ci        f = io.BytesIO(b'Subject: test\n\n')
3167db96d56Sopenharmony_ci        with self.assertRaisesRegex(TestException, "^test$"):
3177db96d56Sopenharmony_ci            email.message_from_binary_file(f, policy=self.MyPolicy)
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci    # These are redundant, but we need them for black-box completeness.
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci    def test_parser(self):
3227db96d56Sopenharmony_ci        p = email.parser.Parser(policy=self.MyPolicy)
3237db96d56Sopenharmony_ci        with self.assertRaisesRegex(TestException, "^test$"):
3247db96d56Sopenharmony_ci            p.parsestr('Subject: test\n\n')
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci    def test_bytes_parser(self):
3277db96d56Sopenharmony_ci        p = email.parser.BytesParser(policy=self.MyPolicy)
3287db96d56Sopenharmony_ci        with self.assertRaisesRegex(TestException, "^test$"):
3297db96d56Sopenharmony_ci            p.parsebytes(b'Subject: test\n\n')
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci    # Now that we've established that all the parse methods get the
3327db96d56Sopenharmony_ci    # policy in to feedparser, we can use message_from_string for
3337db96d56Sopenharmony_ci    # the rest of the propagation tests.
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci    def _make_msg(self, source='Subject: test\n\n', policy=None):
3367db96d56Sopenharmony_ci        self.policy = email.policy.default.clone() if policy is None else policy
3377db96d56Sopenharmony_ci        return email.message_from_string(source, policy=self.policy)
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci    def test_parser_propagates_policy_to_message(self):
3407db96d56Sopenharmony_ci        msg = self._make_msg()
3417db96d56Sopenharmony_ci        self.assertIs(msg.policy, self.policy)
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ci    def test_parser_propagates_policy_to_sub_messages(self):
3447db96d56Sopenharmony_ci        msg = self._make_msg(textwrap.dedent("""\
3457db96d56Sopenharmony_ci            Subject: mime test
3467db96d56Sopenharmony_ci            MIME-Version: 1.0
3477db96d56Sopenharmony_ci            Content-Type: multipart/mixed, boundary="XXX"
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci            --XXX
3507db96d56Sopenharmony_ci            Content-Type: text/plain
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci            test
3537db96d56Sopenharmony_ci            --XXX
3547db96d56Sopenharmony_ci            Content-Type: text/plain
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci            test2
3577db96d56Sopenharmony_ci            --XXX--
3587db96d56Sopenharmony_ci            """))
3597db96d56Sopenharmony_ci        for part in msg.walk():
3607db96d56Sopenharmony_ci            self.assertIs(part.policy, self.policy)
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci    def test_message_policy_propagates_to_generator(self):
3637db96d56Sopenharmony_ci        msg = self._make_msg("Subject: test\nTo: foo\n\n",
3647db96d56Sopenharmony_ci                             policy=email.policy.default.clone(linesep='X'))
3657db96d56Sopenharmony_ci        s = io.StringIO()
3667db96d56Sopenharmony_ci        g = email.generator.Generator(s)
3677db96d56Sopenharmony_ci        g.flatten(msg)
3687db96d56Sopenharmony_ci        self.assertEqual(s.getvalue(), "Subject: testXTo: fooXX")
3697db96d56Sopenharmony_ci
3707db96d56Sopenharmony_ci    def test_message_policy_used_by_as_string(self):
3717db96d56Sopenharmony_ci        msg = self._make_msg("Subject: test\nTo: foo\n\n",
3727db96d56Sopenharmony_ci                             policy=email.policy.default.clone(linesep='X'))
3737db96d56Sopenharmony_ci        self.assertEqual(msg.as_string(), "Subject: testXTo: fooXX")
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ciclass TestConcretePolicies(unittest.TestCase):
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ci    def test_header_store_parse_rejects_newlines(self):
3797db96d56Sopenharmony_ci        instance = email.policy.EmailPolicy()
3807db96d56Sopenharmony_ci        self.assertRaises(ValueError,
3817db96d56Sopenharmony_ci                          instance.header_store_parse,
3827db96d56Sopenharmony_ci                          'From', 'spam\negg@foo.py')
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci
3857db96d56Sopenharmony_ciif __name__ == '__main__':
3867db96d56Sopenharmony_ci    unittest.main()
387