1package deb
2
3import (
4	"bufio"
5	"bytes"
6	"os"
7	"strings"
8
9	. "gopkg.in/check.v1"
10)
11
12type ControlFileSuite struct {
13	reader *bytes.Buffer
14}
15
16var _ = Suite(&ControlFileSuite{})
17
18const installerFile = `dab96042d8e25e0f6bbb8d7c5bd78543afb5eb31a4a8b122ece68ab197228028  ./udeb.list
199d8bb14044dee520f4706ab197dfff10e9e39ecb3c1a402331712154e8284b2e  ./MANIFEST.udebs
20`
21
22const controlFile = `Package: bti
23Binary: bti
24Version: 032-1
25Maintainer: gregor herrmann <gregoa@debian.org>
26Uploaders: tony mancill <tmancill@debian.org>
27Build-Depends: debhelper (>= 8),
28  bash-completion (>= 1:1.1-3),
29  libcurl4-nss-dev, libreadline-dev, libxml2-dev, libpcre3-dev, liboauth-dev, xsltproc, docbook-xsl, docbook-xml, dh-autoreconf
30Architecture: any
31Standards-Version: 3.9.2
32Format: 3.0 (quilt)
33Files:
34 3d5f65778bf3f89be03c313b0024b62c 1980 bti_032-1.dsc
35 1e0d0b693fdeebec268004ba41701baf 59773 bti_032.orig.tar.gz
36 ac1229a6d685023aeb8fcb0806324aa8 5065 bti_032-1.debian.tar.gz
37Vcs-Browser: http://svn.toastfreeware.priv.at/wsvn/ToastfreewareDebian/bti/trunk/
38Vcs-Svn: http://svn.toastfreeware.priv.at/debian/bti/trunk/
39Checksums-Sha1:
40 3da2c5a42138c884a7d9524b9706dc56c0d6d46e 1980 bti_032-1.dsc
41 22061e3f56074703be415d65abc9ca27ef775c6a 59773 bti_032.orig.tar.gz
42 66ae7f56a3c1f0ebe0638d0ec0599a819d72baea 5065 bti_032-1.debian.tar.gz
43Checksums-Sha256:
44 ed6015b79693f270d0a826c695b40e4d8eb4307942cac81a98f1fda479f74215 1980 bti_032-1.dsc
45 feeabec98a89040a53283d798f7d55eb4311a854f17312a177dc45919883746a 59773 bti_032.orig.tar.gz
46 f025da42efaf57db5e71a14cb8be27eb802ad23e7ab02b7ce2252454a86ac1d9 5065 bti_032-1.debian.tar.gz
47Homepage: http://gregkh.github.com/bti/
48Package-List:
49 bti deb net extra
50Directory: pool/main/b/bti
51Description: This is cool
52 Multiline description
53Section: net
54
55
56Package: i3-wm
57Version: 4.2-1
58Installed-Size: 1573
59Maintainer: Michael Stapelberg <stapelberg@debian.org>
60Architecture: amd64
61Provides: x-window-manager
62Depends: libc6 (>= 2.8), libev4 (>= 1:4.04), libpcre3 (>= 8.10), libstartup-notification0 (>= 0.10), libx11-6, libxcb-icccm4 (>= 0.3.8), libxcb-keysyms1 (>= 0.3.8), libxcb-randr0 (>= 1.3), libxcb-util0 (>= 0.3.8), libxcb-xinerama0, libxcb1, libxcursor1 (>> 1.1.2), libyajl2 (>= 2.0.4), perl, x11-utils
63Recommends: xfonts-base
64Suggests: rxvt-unicode | x-terminal-emulator
65Description-en: improved dynamic tiling window manager
66 Key features of i3 are good documentation, reasonable defaults (changeable in
67 a simple configuration file) and good multi-monitor support. The user
68 interface is designed for power users and emphasizes keyboard usage. i3 uses
69 XCB for asynchronous communication with X11 and aims to be fast and
70 light-weight.
71 .
72 Please be aware i3 is primarily targeted at advanced users and developers.
73Homepage: http://i3wm.org/
74Description-md5: 2be7e62f455351435b1e055745d3e81c
75Tag: implemented-in::c, interface::x11, role::program, uitoolkit::TODO,
76 works-with::unicode, x11::window-manager
77Section: x11
78Priority: extra
79Filename: pool/main/i/i3-wm/i3-wm_4.2-1_amd64.deb
80Size: 798186
81MD5sum: 3c7dbecd76d5c271401860967563fa8c
82SHA1: 2e94f3faa5d4d617061f94076b2537d15fbff73f
83SHA256: 2894bc999b3982c4e57f100fa31e21b52e14c5f3bc7ad5345f46842fcdab0db7`
84
85func (s *ControlFileSuite) SetUpTest(c *C) {
86	s.reader = bytes.NewBufferString(controlFile)
87}
88
89func (s *ControlFileSuite) TestReadStanza(c *C) {
90	r := NewControlFileReader(s.reader, false, false)
91
92	stanza1, err := r.ReadStanza()
93	c.Assert(err, IsNil)
94
95	stanza2, err := r.ReadStanza()
96	c.Assert(err, IsNil)
97
98	stanza3, err := r.ReadStanza()
99	c.Assert(err, IsNil)
100	c.Assert(stanza3, IsNil)
101
102	c.Check(stanza1["Format"], Equals, "3.0 (quilt)")
103	c.Check(stanza1["Build-Depends"], Equals, "debhelper (>= 8), bash-completion (>= 1:1.1-3), libcurl4-nss-dev, libreadline-dev, libxml2-dev, libpcre3-dev, liboauth-dev, xsltproc, docbook-xsl, docbook-xml, dh-autoreconf")
104	c.Check(stanza1["Files"], Equals, " 3d5f65778bf3f89be03c313b0024b62c 1980 bti_032-1.dsc\n"+
105		" 1e0d0b693fdeebec268004ba41701baf 59773 bti_032.orig.tar.gz\n"+" ac1229a6d685023aeb8fcb0806324aa8 5065 bti_032-1.debian.tar.gz\n")
106	c.Check(len(stanza2), Equals, 20)
107}
108
109func (s *ControlFileSuite) TestReadWriteStanza(c *C) {
110	r := NewControlFileReader(s.reader, false, false)
111	stanza, err := r.ReadStanza()
112	c.Assert(err, IsNil)
113
114	buf := &bytes.Buffer{}
115	w := bufio.NewWriter(buf)
116	err = stanza.Copy().WriteTo(w, true, false, false)
117	c.Assert(err, IsNil)
118	err = w.Flush()
119	c.Assert(err, IsNil)
120
121	str := buf.String()
122
123	r = NewControlFileReader(buf, false, false)
124	stanza2, err := r.ReadStanza()
125	c.Assert(err, IsNil)
126
127	c.Assert(stanza2, DeepEquals, stanza)
128	c.Assert(strings.HasPrefix(str, "Package: "), Equals, true)
129}
130
131func (s *ControlFileSuite) TestReadWriteInstallerStanza(c *C) {
132	s.reader = bytes.NewBufferString(installerFile)
133	r := NewControlFileReader(s.reader, false, true)
134	stanza, err := r.ReadStanza()
135	c.Assert(err, IsNil)
136
137	buf := &bytes.Buffer{}
138	w := bufio.NewWriter(buf)
139	err = stanza.Copy().WriteTo(w, false, false, true)
140	c.Assert(err, IsNil)
141	err = w.Flush()
142	c.Assert(err, IsNil)
143
144	r = NewControlFileReader(buf, false, true)
145	stanza2, err := r.ReadStanza()
146	c.Assert(err, IsNil)
147
148	c.Assert(stanza2, DeepEquals, stanza)
149}
150
151func (s *ControlFileSuite) TestCanonicalCase(c *C) {
152	c.Check(canonicalCase("Package"), Equals, "Package")
153	c.Check(canonicalCase("package"), Equals, "Package")
154	c.Check(canonicalCase("pAckaGe"), Equals, "Package")
155	c.Check(canonicalCase("MD5Sum"), Equals, "MD5Sum")
156	c.Check(canonicalCase("SHA1"), Equals, "SHA1")
157	c.Check(canonicalCase("SHA256"), Equals, "SHA256")
158	c.Check(canonicalCase("Package-List"), Equals, "Package-List")
159	c.Check(canonicalCase("package-list"), Equals, "Package-List")
160	c.Check(canonicalCase("packaGe-lIst"), Equals, "Package-List")
161}
162
163func (s *ControlFileSuite) TestLongFields(c *C) {
164	f, err := os.Open("long.stanza")
165	c.Assert(err, IsNil)
166	defer f.Close()
167
168	r := NewControlFileReader(f, false, false)
169	stanza, e := r.ReadStanza()
170	c.Assert(e, IsNil)
171	c.Assert(len(stanza["Provides"]), Equals, 586929)
172}
173
174func (s *ControlFileSuite) BenchmarkReadStanza(c *C) {
175	for i := 0; i < c.N; i++ {
176		reader := bytes.NewBufferString(controlFile)
177		r := NewControlFileReader(reader, false, false)
178		for {
179			s, e := r.ReadStanza()
180			if s == nil && e == nil {
181				break
182			}
183		}
184	}
185}
186