1package deb
2
3import (
4	"os"
5	"path/filepath"
6
7	"github.com/aptly-dev/aptly/aptly"
8	"github.com/aptly-dev/aptly/console"
9	"github.com/aptly-dev/aptly/database"
10	"github.com/aptly-dev/aptly/files"
11	"github.com/aptly-dev/aptly/utils"
12
13	. "gopkg.in/check.v1"
14)
15
16type ChangesSuite struct {
17	Dir, Path           string
18	Reporter            aptly.ResultReporter
19	db                  database.Storage
20	localRepoCollection *LocalRepoCollection
21	packageCollection   *PackageCollection
22	packagePool         aptly.PackagePool
23	checksumStorage     aptly.ChecksumStorage
24	progress            aptly.Progress
25}
26
27var _ = Suite(&ChangesSuite{})
28
29func (s *ChangesSuite) SetUpTest(c *C) {
30	s.Reporter = &aptly.RecordingResultReporter{
31		Warnings:     []string{},
32		AddedLines:   []string{},
33		RemovedLines: []string{},
34	}
35	s.Dir = c.MkDir()
36	s.Path = filepath.Join(s.Dir, "calamares.changes")
37	err := utils.CopyFile("testdata/changes/calamares.changes", s.Path)
38	c.Assert(err, IsNil)
39
40	s.db, _ = database.NewOpenDB(c.MkDir())
41	s.localRepoCollection = NewLocalRepoCollection(s.db)
42	s.packageCollection = NewPackageCollection(s.db)
43
44	s.checksumStorage = files.NewMockChecksumStorage()
45	s.packagePool = files.NewPackagePool(s.Dir, false)
46	s.progress = console.NewProgress()
47	s.progress.Start()
48}
49
50func (s *ChangesSuite) TearDownTest(c *C) {
51	s.progress.Shutdown()
52	s.db.Close()
53}
54
55func (s *ChangesSuite) TestParseAndVerify(c *C) {
56	changes, err := NewChanges(s.Path)
57	c.Assert(err, IsNil)
58
59	err = changes.VerifyAndParse(true, true, &NullVerifier{})
60	c.Check(err, IsNil)
61
62	c.Check(changes.Distribution, Equals, "sid")
63	c.Check(changes.Files, HasLen, 4)
64	c.Check(changes.Files[0].Filename, Equals, "calamares_0+git20141127.99.dsc")
65	c.Check(changes.Files[0].Checksums.Size, Equals, int64(1106))
66	c.Check(changes.Files[0].Checksums.MD5, Equals, "05fd8f3ffe8f362c5ef9bad2f936a56e")
67	c.Check(changes.Files[0].Checksums.SHA1, Equals, "79f10e955dab6eb25b7f7bae18213f367a3a0396")
68	c.Check(changes.Files[0].Checksums.SHA256, Equals, "35b3280a7b1ffe159a276128cb5c408d687318f60ecbb8ab6dedb2e49c4e82dc")
69	c.Check(changes.BasePath, Equals, s.Dir)
70	c.Check(changes.Architectures, DeepEquals, []string{"source", "amd64"})
71	c.Check(changes.Source, Equals, "calamares")
72	c.Check(changes.Binary, DeepEquals, []string{"calamares", "calamares-dbg"})
73}
74
75func (s *ChangesSuite) TestCollectChangesFiles(c *C) {
76	changesFiles, failedFiles := CollectChangesFiles([]string{"testdata/changes"}, s.Reporter)
77
78	c.Check(failedFiles, HasLen, 0)
79	c.Check(changesFiles, DeepEquals, []string{
80		"testdata/changes/calamares.changes",
81		"testdata/changes/hardlink_0.2.1-invalidfiles_amd64.changes",
82		"testdata/changes/hardlink_0.2.1-invalidsig_amd64.changes",
83		"testdata/changes/hardlink_0.2.1_amd64.changes",
84	})
85}
86
87func (s *ChangesSuite) TestImportChangesFiles(c *C) {
88	repo := NewLocalRepo("test", "Test Comment")
89	c.Assert(s.localRepoCollection.Add(repo), IsNil)
90
91	origFailedFiles := []string{
92		"testdata/changes/calamares.changes",
93		"testdata/changes/hardlink_0.2.1-invalidfiles_amd64.changes",
94		"testdata/changes/hardlink_0.2.1-invalidsig_amd64.changes",
95		"testdata/changes/hardlink_0.2.0_i386.deb",
96	}
97	origProcessedFiles := []string{
98		"testdata/changes/hardlink_0.2.1.dsc",
99		"testdata/changes/hardlink_0.2.1.tar.gz",
100		"testdata/changes/hardlink_0.2.1_amd64.deb",
101		"testdata/changes/hardlink_0.2.1_amd64.buildinfo",
102		"testdata/changes/hardlink_0.2.1_amd64.changes",
103	}
104
105	var expectedProcessedFiles, expectedFailedFiles []string
106
107	for _, path := range origFailedFiles {
108		filename := filepath.Join(s.Dir, filepath.Base(path))
109		utils.CopyFile(path, filename)
110		expectedFailedFiles = append(expectedFailedFiles, filename)
111	}
112
113	for _, path := range origProcessedFiles {
114		filename := filepath.Join(s.Dir, filepath.Base(path))
115		utils.CopyFile(path, filename)
116		expectedProcessedFiles = append(expectedProcessedFiles, filename)
117	}
118
119	changesFiles, failedFiles := CollectChangesFiles([]string{s.Dir}, s.Reporter)
120	c.Check(failedFiles, HasLen, 0)
121
122	processedFiles, failedFiles, err := ImportChangesFiles(
123		append(changesFiles, "testdata/changes/notexistent.changes"),
124		s.Reporter, true, true, false, false, &NullVerifier{},
125		"test", s.progress, s.localRepoCollection, s.packageCollection, s.packagePool, s.checksumStorage,
126		nil, nil)
127	c.Assert(err, IsNil)
128	c.Check(failedFiles, DeepEquals, append(expectedFailedFiles, "testdata/changes/notexistent.changes"))
129	c.Check(processedFiles, DeepEquals, expectedProcessedFiles)
130}
131
132func (s *ChangesSuite) TestPrepare(c *C) {
133	changes, err := NewChanges("testdata/changes/hardlink_0.2.1_amd64.changes")
134	c.Assert(err, IsNil)
135	err = changes.Prepare()
136	c.Assert(err, IsNil)
137
138	_, err = os.Stat(filepath.Join(changes.TempDir, "hardlink_0.2.1_amd64.changes"))
139	c.Check(err, IsNil)
140}
141
142func (s *ChangesSuite) TestPackageQuery(c *C) {
143	changes, err := NewChanges(s.Path)
144	c.Assert(err, IsNil)
145
146	err = changes.VerifyAndParse(true, true, &NullVerifier{})
147	c.Check(err, IsNil)
148
149	q := changes.PackageQuery()
150	c.Check(q.String(), Equals,
151		"(($Architecture (= amd64)) | (($Architecture (= source)) | ($Architecture (= )))), ((($PackageType (= source)), (Name (= calamares))) | ((!($PackageType (= source))), (((Name (= calamares-dbg)) | (Name (= calamares))) | ((Source (= calamares)), ((Name (= calamares-dbg-dbgsym)) | (Name (= calamares-dbgsym)))))))")
152}
153