示例#1
0
    def test_getChangeUids_multi(self):
        yield self.insertTestData(self.change14_rows + self.change13_rows + [
            fakedb.User(uid=1, identifier="one"),
            fakedb.User(uid=2, identifier="two"),
            fakedb.User(uid=99, identifier="nooo"),
            fakedb.ChangeUser(changeid=14, uid=1),
            fakedb.ChangeUser(changeid=14, uid=2),
            fakedb.ChangeUser(changeid=13, uid=99),  # not selected
        ])
        res = yield self.db.changes.getChangeUids(14)

        self.assertEqual(sorted(res), [1, 2])
示例#2
0
 def test_getChangeUids_multi(self):
     d = self.insertTestData(self.change14_rows + self.change13_rows + [
             fakedb.User(uid=1, identifier="one"),
             fakedb.User(uid=2, identifier="two"),
             fakedb.User(uid=99, identifier="nooo"),
             fakedb.ChangeUser(changeid=14, uid=1),
             fakedb.ChangeUser(changeid=14, uid=2),
             fakedb.ChangeUser(changeid=13, uid=99), # not selected
         ])
     d.addCallback(lambda _ : self.db.changes.getChangeUids(14))
     def check(res):
         self.assertEqual(sorted(res), [1, 2])
     d.addCallback(check)
     return d
示例#3
0
    def test_getChangeUids_found(self):
        yield self.insertTestData(self.change14_rows + [
            fakedb.SourceStamp(id=92),
            fakedb.User(uid=1),
            fakedb.ChangeUser(changeid=14, uid=1),
        ])
        res = yield self.db.changes.getChangeUids(14)

        self.assertEqual(res, [1])
示例#4
0
 def test_getChangeUids_found(self):
     d = self.insertTestData(self.change14_rows + [
             fakedb.User(uid=1),
             fakedb.ChangeUser(changeid=14, uid=1),
         ])
     d.addCallback(lambda _ : self.db.changes.getChangeUids(14))
     def check(res):
         self.assertEqual(res, [1])
     d.addCallback(check)
     return d
示例#5
0
class Change(unittest.TestCase):

    change23_rows = [
        fakedb.Change(changeid=23,
                      author="dustin",
                      comments="fix whitespace",
                      branch="warnerdb",
                      revision="deadbeef",
                      when_timestamp=266738404,
                      revlink='http://warner/0e92a098b',
                      category='devel',
                      repository='git://warner',
                      codebase='mainapp',
                      project='Buildbot'),
        fakedb.ChangeFile(changeid=23, filename='master/README.txt'),
        fakedb.ChangeFile(changeid=23, filename='worker/README.txt'),
        fakedb.ChangeProperty(changeid=23,
                              property_name='notest',
                              property_value='["no","Change"]'),
        fakedb.ChangeUser(changeid=23, uid=27),
    ]

    def setUp(self):
        self.master = fakemaster.make_master(testcase=self, wantDb=True)
        self.change23 = changes.Change(
            **dict(  # using **dict(..) forces kwargs
                category='devel',
                repository=u'git://warner',
                codebase=u'mainapp',
                who=u'dustin',
                when=266738404,
                comments=u'fix whitespace',
                project=u'Buildbot',
                branch=u'warnerdb',
                revlink=u'http://warner/0e92a098b',
                properties={'notest': "no"},
                files=[u'master/README.txt', u'worker/README.txt'],
                revision=u'deadbeef'))
        self.change23.number = 23

    @defer.inlineCallbacks
    def test_fromChdict(self):
        # get a real honest-to-goodness chdict from the fake db
        yield self.master.db.insertTestData(self.change23_rows)
        chdict = yield self.master.db.changes.getChange(23)

        exp = self.change23
        got = yield changes.Change.fromChdict(self.master, chdict)

        # compare
        ok = True
        ok = ok and got.number == exp.number
        ok = ok and got.who == exp.who
        ok = ok and sorted(got.files) == sorted(exp.files)
        ok = ok and got.comments == exp.comments
        ok = ok and got.revision == exp.revision
        ok = ok and got.when == exp.when
        ok = ok and got.branch == exp.branch
        ok = ok and got.category == exp.category
        ok = ok and got.revlink == exp.revlink
        ok = ok and got.properties == exp.properties
        ok = ok and got.repository == exp.repository
        ok = ok and got.codebase == exp.codebase
        ok = ok and got.project == exp.project
        if not ok:

            def printable(c):
                return pprint.pformat(c.__dict__)

            self.fail("changes do not match; expected\n%s\ngot\n%s" %
                      (printable(exp), printable(got)))

    def test_str(self):
        string = str(self.change23)
        self.assertTrue(re.match(r"Change\(.*\)", string), string)

    def test_asText(self):
        text = self.change23.asText()
        self.assertTrue(
            re.match(
                textwrap.dedent(u'''\
            Files:
             master/README.txt
             worker/README.txt
            On: git://warner
            For: Buildbot
            At: .*
            Changed By: dustin
            Comments: fix whitespaceProperties:.
              notest: no

            '''), text), text)

    def test_asDict(self):
        dict = self.change23.asDict()
        self.assertIn('1978', dict['at'])  # timezone-sensitive
        del dict['at']
        self.assertEqual(
            dict, {
                'branch':
                u'warnerdb',
                'category':
                u'devel',
                'codebase':
                u'mainapp',
                'comments':
                u'fix whitespace',
                'files': [{
                    'name': u'master/README.txt'
                }, {
                    'name': u'worker/README.txt'
                }],
                'number':
                23,
                'project':
                u'Buildbot',
                'properties': [('notest', 'no', 'Change')],
                'repository':
                u'git://warner',
                'rev':
                u'deadbeef',
                'revision':
                u'deadbeef',
                'revlink':
                u'http://warner/0e92a098b',
                'when':
                266738404,
                'who':
                u'dustin'
            })

    def test_getShortAuthor(self):
        self.assertEqual(self.change23.getShortAuthor(), 'dustin')

    def test_getTime(self):
        # careful, or timezones will hurt here
        self.assertIn('Jun 1978', self.change23.getTime())

    def test_getTimes(self):
        self.assertEqual(self.change23.getTimes(), (266738404, None))

    def test_getText(self):
        self.change23.who = 'nasty < nasty'  # test the html escaping (ugh!)
        self.assertEqual(self.change23.getText(), ['nasty &lt; nasty'])

    def test_getLogs(self):
        self.assertEqual(self.change23.getLogs(), {})
示例#6
0
    def test_sendToInterestedUsers_two_builds(self):
        from email.Message import Message
        m = Message()

        mn = MailNotifier(fromaddr="*****@*****.**", lookup=None)
        mn.sendMessage = Mock()

        def fakeGetBuilder(buildername):
            if buildername == builder.name:
                return builder
            return None
        def fakeGetBuildRequests(self, bsid):
            return defer.succeed([{"buildername":"Builder", "brid":1}])

        builder = Mock()
        builder.name = "Builder"

        build1 = FakeBuildStatus(name="build")
        build1.result = FAILURE
        build1.finished = True
        build1.reason = "testReason"
        build1.builder = builder

        build2 = FakeBuildStatus(name="build")
        build2.result = FAILURE
        build2.finished = True
        build2.reason = "testReason"
        build2.builder = builder

        def fakeCreateEmail(msgdict, builderName, title, results, builds=None,
                            patches=None, logs=None):
            # only concerned with m['To'] and m['CC'], which are added in
            # _got_recipients later
            return m
        mn.createEmail = fakeCreateEmail

        self.db = fakedb.FakeDBConnector(self)
        self.db.insertTestData([fakedb.SourceStampSet(id=1099),
                                fakedb.Buildset(id=99, sourcestampsetid=1099,
                                                results=SUCCESS,
                                                reason="testReason"),
                                fakedb.BuildRequest(id=11, buildsetid=99,
                                                    buildername='Builder'),
                                fakedb.Build(number=0, brid=11),
                                fakedb.Build(number=1, brid=11),
                                fakedb.Change(changeid=9123),
                                fakedb.Change(changeid=9124),
                                fakedb.ChangeUser(changeid=9123, uid=1),
                                fakedb.ChangeUser(changeid=9124, uid=2),
                                fakedb.User(uid=1, identifier="tdurden"),
                                fakedb.User(uid=2, identifier="user2"),
                                fakedb.UserInfo(uid=1, attr_type='email',
                                            attr_data="*****@*****.**"),
                                fakedb.UserInfo(uid=2, attr_type='email',
                                            attr_data="*****@*****.**")
                                ])

        def _getInterestedUsers():
            # 'narrator' in this case is the owner, which tests the lookup
            return ["Big Bob <*****@*****.**>", "narrator"]
        build1.getInterestedUsers = _getInterestedUsers
        build2.getInterestedUsers = _getInterestedUsers

        def _getResponsibleUsers():
            return ["Big Bob <*****@*****.**>"]
        build1.getResponsibleUsers = _getResponsibleUsers
        build2.getResponsibleUsers = _getResponsibleUsers

        # fake sourcestamp with relevant user bits
        ss1 = Mock(name="sourcestamp")
        fake_change1 = Mock(name="change")
        fake_change1.number = 9123
        ss1.changes = [fake_change1]
        ss1.patch, ss1.addPatch = None, None

        ss2 = Mock(name="sourcestamp")
        fake_change2 = Mock(name="change")
        fake_change2.number = 9124
        ss2.changes = [fake_change2]
        ss2.patch, ss1.addPatch = None, None

        def fakeGetSS(ss):
            return lambda: ss
        build1.getSourceStamp = fakeGetSS(ss1)
        build2.getSourceStamp = fakeGetSS(ss2)

        mn.parent = self
        self.status = mn.master_status = mn.buildMessageDict = Mock()
        mn.master_status.getBuilder = fakeGetBuilder
        mn.buildMessageDict.return_value = {"body": "body", "type": "text"}

        mn.buildMessage(builder.name, [build1, build2], build1.result)
        self.assertEqual(m['To'], "[email protected], [email protected]")
示例#7
0
    def do_test_sendToInterestedUsers(self, lookup=None, extraRecipients=[],
                                      sendToInterestedUsers=True,
                                      exp_called_with=None, exp_TO=None,
                                      exp_CC=None):
        from email.Message import Message
        m = Message()

        mn = MailNotifier(fromaddr='*****@*****.**',
                          lookup=lookup,
                          sendToInterestedUsers=sendToInterestedUsers,
                          extraRecipients=extraRecipients)
        mn.sendMessage = Mock()

        def fakeGetBuild(number):
            return build
        def fakeGetBuilder(buildername):
            if buildername == builder.name:
                return builder
            return None
        def fakeGetBuildRequests(self, bsid):
            return defer.succeed([{"buildername":"Builder", "brid":1}])

        builder = Mock()
        builder.getBuild = fakeGetBuild
        builder.name = "Builder"

        build = FakeBuildStatus(name="build")
        build.result = FAILURE
        build.finished = True
        build.reason = "testReason"
        build.builder = builder

        def fakeCreateEmail(msgdict, builderName, title, results, builds=None,
                            patches=None, logs=None):
            # only concerned with m['To'] and m['CC'], which are added in
            # _got_recipients later
            return m
        mn.createEmail = fakeCreateEmail

        self.db = fakedb.FakeDBConnector(self)
        self.db.insertTestData([fakedb.SourceStampSet(id=1099),
                                fakedb.Buildset(id=99, sourcestampsetid=1099,
                                                results=SUCCESS,
                                                reason="testReason"),
                                fakedb.BuildRequest(id=11, buildsetid=99,
                                                    buildername='Builder'),
                                fakedb.Build(number=0, brid=11),
                                fakedb.Change(changeid=9123),
                                fakedb.ChangeUser(changeid=9123, uid=1),
                                fakedb.User(uid=1, identifier="tdurden"),
                                fakedb.UserInfo(uid=1, attr_type='svn',
                                            attr_data="tdurden"),
                                fakedb.UserInfo(uid=1, attr_type='email',
                                            attr_data="*****@*****.**")
                                ])

        # fake sourcestamp with relevant user bits
        ss = Mock(name="sourcestamp")
        fake_change = Mock(name="change")
        fake_change.number = 9123
        ss.changes = [fake_change]
        ss.patch, ss.addPatch = None, None

        def fakeGetSS():
            return ss
        build.getSourceStamp = fakeGetSS

        def _getInterestedUsers():
            # 'narrator' in this case is the owner, which tests the lookup
            return ["Big Bob <*****@*****.**>", "narrator"]
        build.getInterestedUsers = _getInterestedUsers

        def _getResponsibleUsers():
            return ["Big Bob <*****@*****.**>"]
        build.getResponsibleUsers = _getResponsibleUsers

        mn.parent = self
        self.status = mn.master_status = mn.buildMessageDict = Mock()
        mn.master_status.getBuilder = fakeGetBuilder
        mn.buildMessageDict.return_value = {"body": "body", "type": "text"}

        mn.buildMessage(builder.name, [build], build.result)
        mn.sendMessage.assert_called_with(m, exp_called_with)
        self.assertEqual(m['To'], exp_TO)
        self.assertEqual(m['CC'], exp_CC)
class Change(unittest.TestCase):

    change23_rows = [
        fakedb.Change(changeid=23,
                      author="dustin",
                      comments="fix whitespace",
                      is_dir=0,
                      branch="warnerdb",
                      revision="deadbeef",
                      when_timestamp=266738404,
                      revlink='http://warner/0e92a098b',
                      category='devel',
                      repository='git://warner',
                      codebase='mainapp',
                      project='Buildbot'),
        fakedb.ChangeFile(changeid=23, filename='master/README.txt'),
        fakedb.ChangeFile(changeid=23, filename='slave/README.txt'),
        fakedb.ChangeProperty(changeid=23,
                              property_name='notest',
                              property_value='["no","Change"]'),
        fakedb.ChangeUser(changeid=23, uid=27),
    ]

    def setUp(self):
        self.change23 = changes.Change(
            **dict(  # using **dict(..) forces kwargs
                category='devel',
                isdir=0,
                repository=u'git://warner',
                codebase=u'mainapp',
                who=u'dustin',
                when=266738404,
                comments=u'fix whitespace',
                project=u'Buildbot',
                branch=u'warnerdb',
                revlink=u'http://warner/0e92a098b',
                properties={'notest': "no"},
                files=[u'master/README.txt', u'slave/README.txt'],
                revision=u'deadbeef'))
        self.change23.number = 23

    def test_str(self):
        string = str(self.change23)
        self.assertTrue(re.match(r"Change\(.*\)", string), string)

    def test_asText(self):
        text = self.change23.asText()
        self.assertTrue(
            re.match(
                textwrap.dedent(u'''\
            Files:
             master/README.txt
             slave/README.txt
            On: git://warner
            For: Buildbot
            At: .*
            Changed By: dustin
            Comments: fix whitespaceProperties: 
              notest: no

            '''), text), text)

    def test_asDict(self):
        dict = self.change23.asDict()
        self.assertIn('1978', dict['at'])  # timezone-sensitive
        del dict['at']
        self.assertEqual(
            dict, {
                'branch':
                u'warnerdb',
                'category':
                u'devel',
                'codebase':
                u'mainapp',
                'comments':
                u'fix whitespace',
                'files': [{
                    'name': u'master/README.txt'
                }, {
                    'name': u'slave/README.txt'
                }],
                'number':
                23,
                'project':
                u'Buildbot',
                'properties': [('notest', 'no', 'Change')],
                'repository':
                u'git://warner',
                'rev':
                u'deadbeef',
                'revision':
                u'deadbeef',
                'revlink':
                u'http://warner/0e92a098b',
                'when':
                266738404,
                'who':
                u'dustin'
            })

    def test_getShortAuthor(self):
        self.assertEqual(self.change23.getShortAuthor(), 'dustin')

    def test_getTime(self):
        # careful, or timezones will hurt here
        self.assertIn('Jun 1978', self.change23.getTime())

    def test_getTimes(self):
        self.assertEqual(self.change23.getTimes(), (266738404, None))

    def test_getText(self):
        self.change23.who = 'nasty < nasty'  # test the html escaping (ugh!)
        self.assertEqual(self.change23.getText(), ['nasty &lt; nasty'])

    def test_getLogs(self):
        self.assertEqual(self.change23.getLogs(), {})