~launchpad-pqm/launchpad/devel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#!/usr/bin/python
#
# Copyright 2010 Canonical Ltd.  This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).

from lp.app.errors import NotFoundError
from lp.archiveuploader.uploadpolicy import (
    AbstractUploadPolicy,
    ArchiveUploadType,
    )
from lp.testing import (
    TestCase,
    TestCaseWithFactory,
    )
from lp.testing.layers import DatabaseFunctionalLayer


class TestUploadPolicy_validateUploadType(TestCase):
    """Test what kind (sourceful/binaryful/mixed) of uploads are accepted."""

    def test_sourceful_accepted(self):
        policy = make_policy(accepted_type=ArchiveUploadType.SOURCE_ONLY)
        upload = make_fake_upload(sourceful=True)

        policy.validateUploadType(upload)

        self.assertEquals([], upload.rejections)

    def test_binaryful_accepted(self):
        policy = make_policy(accepted_type=ArchiveUploadType.BINARY_ONLY)
        upload = make_fake_upload(binaryful=True)

        policy.validateUploadType(upload)

        self.assertEquals([], upload.rejections)

    def test_mixed_accepted(self):
        policy = make_policy(accepted_type=ArchiveUploadType.MIXED_ONLY)
        upload = make_fake_upload(sourceful=True, binaryful=True)

        policy.validateUploadType(upload)

        self.assertEquals([], upload.rejections)

    def test_sourceful_not_accepted(self):
        policy = make_policy(accepted_type=ArchiveUploadType.BINARY_ONLY)
        upload = make_fake_upload(sourceful=True)

        policy.validateUploadType(upload)

        self.assertIn(
            'Sourceful uploads are not accepted by this policy.',
            upload.rejections)

    def test_binaryful_not_accepted(self):
        policy = make_policy(accepted_type=ArchiveUploadType.SOURCE_ONLY)
        upload = make_fake_upload(binaryful=True)

        policy.validateUploadType(upload)

        self.assertTrue(len(upload.rejections) > 0)
        self.assertIn(
            'Upload rejected because it contains binary packages.',
            upload.rejections[0])

    def test_mixed_not_accepted(self):
        policy = make_policy(accepted_type=ArchiveUploadType.SOURCE_ONLY)
        upload = make_fake_upload(sourceful=True, binaryful=True)

        policy.validateUploadType(upload)

        self.assertIn(
            'Source/binary (i.e. mixed) uploads are not allowed.',
            upload.rejections)

    def test_sourceful_when_only_mixed_accepted(self):
        policy = make_policy(accepted_type=ArchiveUploadType.MIXED_ONLY)
        upload = make_fake_upload(sourceful=True, binaryful=False)

        policy.validateUploadType(upload)

        self.assertIn(
            'Sourceful uploads are not accepted by this policy.',
            upload.rejections)

    def test_binaryful_when_only_mixed_accepted(self):
        policy = make_policy(accepted_type=ArchiveUploadType.MIXED_ONLY)
        upload = make_fake_upload(sourceful=False, binaryful=True)

        policy.validateUploadType(upload)

        self.assertTrue(len(upload.rejections) > 0)
        self.assertIn(
            'Upload rejected because it contains binary packages.',
            upload.rejections[0])


class TestUploadPolicy(TestCaseWithFactory):

    layer = DatabaseFunctionalLayer

    def test_setDistroSeriesAndPocket_distro_not_found(self):
        policy = AbstractUploadPolicy()
        policy.distro = self.factory.makeDistribution()
        self.assertRaises(
            NotFoundError, policy.setDistroSeriesAndPocket,
            'nonexistent_security')


class FakeNascentUpload:

    def __init__(self, sourceful, binaryful):
        self.sourceful = sourceful
        self.binaryful = binaryful
        self.is_ppa = False
        self.rejections = []

    def reject(self, msg):
        self.rejections.append(msg)


def make_fake_upload(sourceful=False, binaryful=False):
    return FakeNascentUpload(sourceful, binaryful)


def make_policy(accepted_type):
    policy = AbstractUploadPolicy()
    policy.accepted_type = accepted_type
    return policy