1# Copyright (C) 2009, 2010, 2011, 2016 Canonical Ltd
2#
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 2 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program; if not, write to the Free Software
15# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
17from ..chk_serializer import (
18    chk_bencode_serializer,
19    )
20from ...revision import (
21    Revision,
22    )
23from . import TestCase
24
25_working_revision_bencode1 = (b'l'
26                              b'l6:formati10ee'
27                              b'l9:committer54:Canonical.com Patch Queue Manager <pqm@pqm.ubuntu.com>e'
28                              b'l8:timezonei3600ee'
29                              b'l10:propertiesd11:branch-nick6:+trunkee'
30                              b'l9:timestamp14:1242300770.844e'
31                              b'l11:revision-id50:pqm@pqm.ubuntu.com-20090514113250-jntkkpminfn3e0tze'
32                              b'l10:parent-ids'
33                              b'l'
34                              b'50:pqm@pqm.ubuntu.com-20090514104039-kggemn7lrretzpvc'
35                              b'48:jelmer@samba.org-20090510012654-jp9ufxquekaokbeo'
36                              b'ee'
37                              b'l14:inventory-sha140:4a2c7fb50e077699242cf6eb16a61779c7b680a7e'
38                              b'l7:message35:(Jelmer) Move dpush to InterBranch.e'
39                              b'e')
40
41_working_revision_bencode1_no_timezone = (b'l'
42                                          b'l6:formati10ee'
43                                          b'l9:committer54:Canonical.com Patch Queue Manager <pqm@pqm.ubuntu.com>e'
44                                          b'l9:timestamp14:1242300770.844e'
45                                          b'l10:propertiesd11:branch-nick6:+trunkee'
46                                          b'l11:revision-id50:pqm@pqm.ubuntu.com-20090514113250-jntkkpminfn3e0tze'
47                                          b'l10:parent-ids'
48                                          b'l'
49                                          b'50:pqm@pqm.ubuntu.com-20090514104039-kggemn7lrretzpvc'
50                                          b'48:jelmer@samba.org-20090510012654-jp9ufxquekaokbeo'
51                                          b'ee'
52                                          b'l14:inventory-sha140:4a2c7fb50e077699242cf6eb16a61779c7b680a7e'
53                                          b'l7:message35:(Jelmer) Move dpush to InterBranch.e'
54                                          b'e')
55
56
57class TestBEncodeSerializer1(TestCase):
58    """Test BEncode serialization"""
59
60    def test_unpack_revision(self):
61        """Test unpacking a revision"""
62        rev = chk_bencode_serializer.read_revision_from_string(
63            _working_revision_bencode1)
64        self.assertEqual(rev.committer,
65                         "Canonical.com Patch Queue Manager <pqm@pqm.ubuntu.com>")
66        self.assertEqual(rev.inventory_sha1,
67                         b"4a2c7fb50e077699242cf6eb16a61779c7b680a7")
68        self.assertEqual([b"pqm@pqm.ubuntu.com-20090514104039-kggemn7lrretzpvc",
69                          b"jelmer@samba.org-20090510012654-jp9ufxquekaokbeo"],
70                         rev.parent_ids)
71        self.assertEqual("(Jelmer) Move dpush to InterBranch.", rev.message)
72        self.assertEqual(b"pqm@pqm.ubuntu.com-20090514113250-jntkkpminfn3e0tz",
73                         rev.revision_id)
74        self.assertEqual({u"branch-nick": u"+trunk"}, rev.properties)
75        self.assertEqual(3600, rev.timezone)
76
77    def test_written_form_matches(self):
78        rev = chk_bencode_serializer.read_revision_from_string(
79            _working_revision_bencode1)
80        as_str = chk_bencode_serializer.write_revision_to_string(rev)
81        self.assertEqualDiff(_working_revision_bencode1, as_str)
82
83    def test_unpack_revision_no_timezone(self):
84        rev = chk_bencode_serializer.read_revision_from_string(
85            _working_revision_bencode1_no_timezone)
86        self.assertEqual(None, rev.timezone)
87
88    def assertRoundTrips(self, serializer, orig_rev):
89        lines = serializer.write_revision_to_lines(orig_rev)
90        new_rev = serializer.read_revision_from_string(b''.join(lines))
91        self.assertEqual(orig_rev, new_rev)
92
93    def test_roundtrips_non_ascii(self):
94        rev = Revision(b"revid1")
95        rev.message = u"\n\xe5me"
96        rev.committer = u'Erik B\xe5gfors'
97        rev.timestamp = 1242385452
98        rev.inventory_sha1 = b"4a2c7fb50e077699242cf6eb16a61779c7b680a7"
99        rev.timezone = 3600
100        self.assertRoundTrips(chk_bencode_serializer, rev)
101
102    def test_roundtrips_xml_invalid_chars(self):
103        rev = Revision(b"revid1")
104        rev.message = "\t\ue000"
105        rev.committer = u'Erik B\xe5gfors'
106        rev.timestamp = 1242385452
107        rev.timezone = 3600
108        rev.inventory_sha1 = b"4a2c7fb50e077699242cf6eb16a61779c7b680a7"
109        self.assertRoundTrips(chk_bencode_serializer, rev)
110