43
42
class TestGetPublicationsInArchive(TestCaseWithFactory):
45
layer = LaunchpadZopelessLayer
48
"""Use `SoyuzTestPublisher` to publish some sources in archives."""
49
super(TestGetPublicationsInArchive, self).setUp()
51
self.distribution = getUtility(IDistributionSet)['ubuntutest']
53
# Create two PPAs for gedit.
55
self.archives['ubuntu-main'] = self.distribution.main_archive
56
self.archives['gedit-nightly'] = self.factory.makeArchive(
57
name="gedit-nightly", distribution=self.distribution)
58
self.archives['gedit-beta'] = self.factory.makeArchive(
59
name="gedit-beta", distribution=self.distribution)
61
self.publisher = SoyuzTestPublisher()
62
self.publisher.prepareBreezyAutotest()
64
# Publish gedit in all three archives, but with different
66
self.gedit_nightly_src_hist = self.publisher.getPubSource(
67
sourcename="gedit", archive=self.archives['gedit-nightly'],
68
date_uploaded=datetime(2010, 12, 1, tzinfo=pytz.UTC),
69
status=PackagePublishingStatus.PUBLISHED)
70
self.gedit_beta_src_hist = self.publisher.getPubSource(
71
sourcename="gedit", archive=self.archives['gedit-beta'],
72
date_uploaded=datetime(2010, 11, 30, tzinfo=pytz.UTC),
73
status=PackagePublishingStatus.PUBLISHED)
74
self.gedit_main_src_hist = self.publisher.getPubSource(
75
sourcename="gedit", archive=self.archives['ubuntu-main'],
76
date_uploaded=datetime(2010, 12, 30, tzinfo=pytz.UTC),
77
status=PackagePublishingStatus.PUBLISHED)
79
# Save the archive utility for easy access, as well as the gedit
80
# source package name.
81
self.archive_set = getUtility(IArchiveSet)
82
spr = self.gedit_main_src_hist.sourcepackagerelease
83
self.gedit_name = spr.sourcepackagename
85
def testReturnsAllPublishedPublications(self):
44
layer = DatabaseFunctionalLayer
46
def makeArchivesForOneDistribution(self, count=3):
47
distribution = self.factory.makeDistribution()
49
for i in range(count):
51
self.factory.makeArchive(distribution=distribution))
54
def makeArchivesWithPublications(self, count=3):
55
archives = self.makeArchivesForOneDistribution(count=count)
56
sourcepackagename = self.factory.makeSourcePackageName()
57
for archive in archives:
58
self.factory.makeSourcePackagePublishingHistory(
59
sourcepackagename=sourcepackagename, archive=archive,
60
status=PackagePublishingStatus.PUBLISHED,
62
return archives, sourcepackagename
64
def getPublications(self, sourcepackagename, archives, distribution):
65
return getUtility(IArchiveSet).getPublicationsInArchives(
66
sourcepackagename, archives, distribution=distribution)
68
def test_getPublications_returns_all_published_publications(self):
86
69
# Returns all currently published publications for archives
87
results = self.archive_set.getPublicationsInArchives(
88
self.gedit_name, self.archives.values(),
89
distribution=self.distribution)
70
archives, sourcepackagename = self.makeArchivesWithPublications()
71
results = self.getPublications(
72
sourcepackagename, archives, archives[0].distribution)
90
73
num_results = results.count()
91
self.assertEquals(3, num_results, "Expected 3 publications but "
92
"got %s" % num_results)
74
self.assertEquals(3, num_results)
94
def testEmptyListOfArchives(self):
76
def test_getPublications_empty_list_of_archives(self):
95
77
# Passing an empty list of archives will result in an empty
97
results = self.archive_set.getPublicationsInArchives(
98
self.gedit_name, [], distribution=self.distribution)
99
self.assertEquals(0, results.count())
101
def testReturnsOnlyPublicationsForGivenArchives(self):
79
archives, sourcepackagename = self.makeArchivesWithPublications()
80
results = self.getPublications(
81
sourcepackagename, [], archives[0].distribution)
82
self.assertEquals([], list(results))
84
def assertPublicationsFromArchives(self, publications, archives):
85
self.assertEquals(len(archives), publications.count())
86
for publication, archive in zip(publications, archives):
87
self.assertEquals(archive, publication.archive)
89
def test_getPublications_returns_only_for_given_archives(self):
102
90
# Returns only publications for the specified archives
103
results = self.archive_set.getPublicationsInArchives(
104
self.gedit_name, [self.archives['gedit-beta']],
105
distribution=self.distribution)
106
num_results = results.count()
107
self.assertEquals(1, num_results, "Expected 1 publication but "
108
"got %s" % num_results)
109
self.assertEquals(self.archives['gedit-beta'],
111
"Expected publication from %s but was instead "
113
self.archives['gedit-beta'].displayname,
114
results[0].archive.displayname))
91
archives, sourcepackagename = self.makeArchivesWithPublications()
92
results = self.getPublications(
93
sourcepackagename, [archives[0]], archives[0].distribution)
94
self.assertPublicationsFromArchives(results, [archives[0]])
116
def testReturnsOnlyPublishedPublications(self):
96
def test_getPublications_returns_only_published_publications(self):
117
97
# Publications that are not published will not be returned.
118
secure_src_hist = self.gedit_beta_src_hist
119
secure_src_hist.status = PackagePublishingStatus.PENDING
121
results = self.archive_set.getPublicationsInArchives(
122
self.gedit_name, [self.archives['gedit-beta']],
123
distribution=self.distribution)
124
num_results = results.count()
125
self.assertEquals(0, num_results, "Expected 0 publication but "
126
"got %s" % num_results)
128
def testPubsForSpecificDistro(self):
98
archive = self.factory.makeArchive()
99
sourcepackagename = self.factory.makeSourcePackageName()
100
self.factory.makeSourcePackagePublishingHistory(
101
archive=archive, sourcepackagename=sourcepackagename,
102
status=PackagePublishingStatus.PENDING)
103
results = self.getPublications(
104
sourcepackagename, [archive], archive.distribution)
105
self.assertEquals([], list(results))
107
def publishSourceInNewArchive(self, sourcepackagename):
108
distribution = self.factory.makeDistribution()
109
distroseries = self.factory.makeDistroSeries(
110
distribution=distribution)
111
archive = self.factory.makeArchive(distribution=distribution)
112
self.factory.makeSourcePackagePublishingHistory(
113
archive=archive, sourcepackagename=sourcepackagename,
114
distroseries=distroseries,
115
status=PackagePublishingStatus.PUBLISHED)
118
def test_getPublications_for_specific_distro(self):
129
119
# Results can be filtered for specific distributions.
131
# Add a publication in the ubuntu distribution
132
ubuntu = getUtility(IDistributionSet)['ubuntu']
133
warty = ubuntu['warty']
134
gedit_main_src_hist = self.publisher.getPubSource(
136
archive=self.archives['ubuntu-main'],
138
date_uploaded=datetime(2010, 12, 30, tzinfo=pytz.UTC),
139
status=PackagePublishingStatus.PUBLISHED)
141
# Only the 3 results for ubuntutest are returned when requested:
142
results = self.archive_set.getPublicationsInArchives(
143
self.gedit_name, self.archives.values(),
144
distribution=self.distribution)
145
num_results = results.count()
146
self.assertEquals(3, num_results, "Expected 3 publications but "
147
"got %s" % num_results)
149
# Similarly, requesting the ubuntu publications only returns the
151
results = self.archive_set.getPublicationsInArchives(
152
self.gedit_name, self.archives.values(),
154
num_results = results.count()
155
self.assertEquals(1, num_results, "Expected 1 publication but "
156
"got %s" % num_results)
120
sourcepackagename = self.factory.makeSourcePackageName()
121
archive = self.publishSourceInNewArchive(sourcepackagename)
122
other_archive = self.publishSourceInNewArchive(sourcepackagename)
123
# We don't get the results for other_distribution
124
results = self.getPublications(
125
sourcepackagename, [archive, other_archive],
126
distribution=archive.distribution)
127
self.assertPublicationsFromArchives(results, [archive])
159
130
class TestArchiveRepositorySize(TestCaseWithFactory):
161
132
layer = LaunchpadZopelessLayer
164
super(TestArchiveRepositorySize, self).setUp()
165
self.publisher = SoyuzTestPublisher()
166
self.publisher.prepareBreezyAutotest()
167
self.ppa = self.factory.makeArchive(
168
name="testing", distribution=self.publisher.ubuntutest)
134
def publishDDEBInArchive(self, archive):
135
"""Publish an arbitrary DDEB with content in to the archive.
137
Publishes a DDEB that will take up some space in to `archive`.
139
:param archive: the IArchive to publish to.
141
binarypackagerelease = self.factory.makeBinaryPackageRelease(
142
binpackageformat=BinaryPackageFormat.DDEB)
143
self.factory.makeBinaryPackagePublishingHistory(
144
archive=archive, binarypackagerelease=binarypackagerelease,
145
status=PackagePublishingStatus.PUBLISHED)
146
self.factory.makeBinaryPackageFile(
147
binarypackagerelease=binarypackagerelease,
148
filetype=BinaryPackageFileType.DDEB)
150
def test_empty_ppa_has_zero_binaries_size(self):
151
# An empty PPA has no binaries so has zero binaries_size.
152
ppa = self.factory.makeArchive(purpose=ArchivePurpose.PPA)
153
self.assertEquals(0, ppa.binaries_size)
170
155
def test_binaries_size_does_not_include_ddebs_for_ppas(self):
171
156
# DDEBs are not computed in the PPA binaries size because
172
157
# they are not being published. See bug #399444.
173
self.assertEquals(0, self.ppa.binaries_size)
174
self.publisher.getPubBinaries(
175
filecontent='X', format=BinaryPackageFormat.DDEB,
177
self.assertEquals(0, self.ppa.binaries_size)
158
ppa = self.factory.makeArchive(purpose=ArchivePurpose.PPA)
159
self.publishDDEBInArchive(ppa)
160
self.assertEquals(0, ppa.binaries_size)
162
def test_empty_primary_archive_has_zero_binaries_size(self):
163
# PRIMARY archives have zero binaries_size when created.
164
archive = self.factory.makeArchive(purpose=ArchivePurpose.PRIMARY)
165
self.assertEquals(0, archive.binaries_size)
179
167
def test_binaries_size_includes_ddebs_for_other_archives(self):
180
168
# DDEBs size are computed for all archive purposes, except PPAs.
181
previous_size = self.publisher.ubuntutest.main_archive.binaries_size
182
self.publisher.getPubBinaries(
183
filecontent='X', format=BinaryPackageFormat.DDEB)
186
self.publisher.ubuntutest.main_archive.binaries_size)
169
archive = self.factory.makeArchive(purpose=ArchivePurpose.PRIMARY)
170
self.publishDDEBInArchive(archive)
171
self.assertNotEquals(0, archive.binaries_size)
188
173
def test_sources_size_on_empty_archive(self):
189
174
# Zero is returned for an archive without sources.
191
0, self.ppa.sources_size,
192
'Zero should be returned for an archive without sources.')
175
archive = self.factory.makeArchive()
176
self.assertEquals(0, archive.sources_size)
178
def publishSourceFile(self, archive, library_file):
179
"""Publish a source package with the given content to the archive.
181
:param archive: the IArchive to publish to.
182
:param library_file: a LibraryFileAlias for the content of the
185
sourcepackagerelease = self.factory.makeSourcePackageRelease()
186
self.factory.makeSourcePackagePublishingHistory(
187
archive=archive, sourcepackagerelease=sourcepackagerelease,
188
status=PackagePublishingStatus.PUBLISHED)
189
self.factory.makeSourcePackageReleaseFile(
190
sourcepackagerelease=sourcepackagerelease,
191
library_file=library_file)
194
193
def test_sources_size_does_not_count_duplicated_files(self):
195
194
# If there are multiple copies of the same file name/size
196
195
# only one will be counted.
197
pub_1 = self.publisher.getPubSource(
198
filecontent='22', version='0.5.11~ppa1', archive=self.ppa)
200
pub_2 = self.publisher.getPubSource(
201
filecontent='333', version='0.5.11~ppa2', archive=self.ppa)
203
self.assertEquals(5, self.ppa.sources_size)
205
shared_tarball = self.publisher.addMockFile(
206
filename='foo_0.5.11.tar.gz', filecontent='1')
208
# After adding a the shared tarball to the ppa1 version,
209
# the sources_size updates to reflect the change.
210
pub_1.sourcepackagerelease.addFile(shared_tarball)
212
6, self.ppa.sources_size,
213
'The sources_size should update after a file is added.')
215
# But after adding a copy of the shared tarball to the ppa2 version,
216
# the sources_size is unchanged.
217
shared_tarball_copy = self.publisher.addMockFile(
218
filename='foo_0.5.11.tar.gz', filecontent='1')
220
pub_2.sourcepackagerelease.addFile(shared_tarball_copy)
222
6, self.ppa.sources_size,
223
'The sources_size should change after adding a duplicate file.')
196
archive = self.factory.makeArchive()
197
library_file = self.factory.makeLibraryFileAlias()
198
self.publishSourceFile(archive, library_file)
200
library_file.content.filesize, archive.sources_size)
202
self.publishSourceFile(archive, library_file)
204
library_file.content.filesize, archive.sources_size)
226
207
class TestSeriesWithSources(TestCaseWithFactory):