| OLD | NEW |
| (Empty) |
| 1 # -*- test-case-name: buildbot.test.test_buildreq -*- | |
| 2 | |
| 3 from twisted.trial import unittest | |
| 4 | |
| 5 from buildbot import buildset, interfaces, sourcestamp | |
| 6 from buildbot.process import base | |
| 7 from buildbot.status import builder | |
| 8 from buildbot.changes.changes import Change | |
| 9 | |
| 10 class Request(unittest.TestCase): | |
| 11 def testMerge(self): | |
| 12 R = base.BuildRequest | |
| 13 S = sourcestamp.SourceStamp | |
| 14 N = 'test_builder' | |
| 15 b1 = R("why", S("branch1", None, None, None), N) | |
| 16 b1r1 = R("why2", S("branch1", "rev1", None, None), N) | |
| 17 b1r1a = R("why not", S("branch1", "rev1", None, None), N) | |
| 18 b1r2 = R("why3", S("branch1", "rev2", None, None), N) | |
| 19 b2r2 = R("why4", S("branch2", "rev2", None, None), N) | |
| 20 b1r1p1 = R("why5", S("branch1", "rev1", (3, "diff"), None), N) | |
| 21 c1 = Change("alice", [], "changed stuff", branch="branch1") | |
| 22 c2 = Change("alice", [], "changed stuff", branch="branch1") | |
| 23 c3 = Change("alice", [], "changed stuff", branch="branch1") | |
| 24 c4 = Change("alice", [], "changed stuff", branch="branch1") | |
| 25 c5 = Change("alice", [], "changed stuff", branch="branch1") | |
| 26 c6 = Change("alice", [], "changed stuff", branch="branch1") | |
| 27 b1c1 = R("changes", S("branch1", None, None, [c1,c2,c3]), N) | |
| 28 b1c2 = R("changes", S("branch1", None, None, [c4,c5,c6]), N) | |
| 29 | |
| 30 self.failUnless(b1.canBeMergedWith(b1)) | |
| 31 self.failIf(b1.canBeMergedWith(b1r1)) | |
| 32 self.failIf(b1.canBeMergedWith(b2r2)) | |
| 33 self.failIf(b1.canBeMergedWith(b1r1p1)) | |
| 34 self.failIf(b1.canBeMergedWith(b1c1)) | |
| 35 | |
| 36 self.failIf(b1r1.canBeMergedWith(b1)) | |
| 37 self.failUnless(b1r1.canBeMergedWith(b1r1)) | |
| 38 self.failIf(b1r1.canBeMergedWith(b2r2)) | |
| 39 self.failIf(b1r1.canBeMergedWith(b1r1p1)) | |
| 40 self.failIf(b1r1.canBeMergedWith(b1c1)) | |
| 41 | |
| 42 self.failIf(b1r2.canBeMergedWith(b1)) | |
| 43 self.failIf(b1r2.canBeMergedWith(b1r1)) | |
| 44 self.failUnless(b1r2.canBeMergedWith(b1r2)) | |
| 45 self.failIf(b1r2.canBeMergedWith(b2r2)) | |
| 46 self.failIf(b1r2.canBeMergedWith(b1r1p1)) | |
| 47 | |
| 48 self.failIf(b1r1p1.canBeMergedWith(b1)) | |
| 49 self.failIf(b1r1p1.canBeMergedWith(b1r1)) | |
| 50 self.failIf(b1r1p1.canBeMergedWith(b1r2)) | |
| 51 self.failIf(b1r1p1.canBeMergedWith(b2r2)) | |
| 52 self.failIf(b1r1p1.canBeMergedWith(b1c1)) | |
| 53 | |
| 54 self.failIf(b1c1.canBeMergedWith(b1)) | |
| 55 self.failIf(b1c1.canBeMergedWith(b1r1)) | |
| 56 self.failIf(b1c1.canBeMergedWith(b1r2)) | |
| 57 self.failIf(b1c1.canBeMergedWith(b2r2)) | |
| 58 self.failIf(b1c1.canBeMergedWith(b1r1p1)) | |
| 59 self.failUnless(b1c1.canBeMergedWith(b1c1)) | |
| 60 self.failUnless(b1c1.canBeMergedWith(b1c2)) | |
| 61 | |
| 62 sm = b1.mergeWith([]) | |
| 63 self.failUnlessEqual(sm.branch, "branch1") | |
| 64 self.failUnlessEqual(sm.revision, None) | |
| 65 self.failUnlessEqual(sm.patch, None) | |
| 66 self.failUnlessEqual(sm.changes, ()) | |
| 67 | |
| 68 ss = b1r1.mergeWith([b1r1]) | |
| 69 self.failUnlessEqual(ss, S("branch1", "rev1", None, None)) | |
| 70 why = b1r1.mergeReasons([b1r1]) | |
| 71 self.failUnlessEqual(why, "why2") | |
| 72 why = b1r1.mergeReasons([b1r1a]) | |
| 73 self.failUnlessEqual(why, "why2, why not") | |
| 74 | |
| 75 ss = b1c1.mergeWith([b1c2]) | |
| 76 self.failUnlessEqual(ss, S("branch1", None, None, [c1,c2,c3,c4,c5,c6])) | |
| 77 why = b1c1.mergeReasons([b1c2]) | |
| 78 self.failUnlessEqual(why, "changes") | |
| 79 | |
| 80 | |
| 81 class FakeBuilder: | |
| 82 name = "fake" | |
| 83 def __init__(self): | |
| 84 self.requests = [] | |
| 85 def submitBuildRequest(self, req): | |
| 86 self.requests.append(req) | |
| 87 | |
| 88 | |
| 89 class Set(unittest.TestCase): | |
| 90 def testBuildSet(self): | |
| 91 S = buildset.BuildSet | |
| 92 a,b = FakeBuilder(), FakeBuilder() | |
| 93 | |
| 94 # two builds, the first one fails, the second one succeeds. The | |
| 95 # waitUntilSuccess watcher fires as soon as the first one fails, | |
| 96 # while the waitUntilFinished watcher doesn't fire until all builds | |
| 97 # are complete. | |
| 98 | |
| 99 source = sourcestamp.SourceStamp() | |
| 100 s = S(["a","b"], source, "forced build") | |
| 101 s.start([a,b]) | |
| 102 self.failUnlessEqual(len(a.requests), 1) | |
| 103 self.failUnlessEqual(len(b.requests), 1) | |
| 104 r1 = a.requests[0] | |
| 105 self.failUnlessEqual(r1.reason, s.reason) | |
| 106 self.failUnlessEqual(r1.source, s.source) | |
| 107 | |
| 108 st = s.status | |
| 109 self.failUnlessEqual(st.getSourceStamp(), source) | |
| 110 self.failUnlessEqual(st.getReason(), "forced build") | |
| 111 self.failUnlessEqual(st.getBuilderNames(), ["a","b"]) | |
| 112 self.failIf(st.isFinished()) | |
| 113 brs = st.getBuildRequests() | |
| 114 self.failUnlessEqual(len(brs), 2) | |
| 115 | |
| 116 res = [] | |
| 117 d1 = s.waitUntilSuccess() | |
| 118 d1.addCallback(lambda r: res.append(("success", r))) | |
| 119 d2 = s.waitUntilFinished() | |
| 120 d2.addCallback(lambda r: res.append(("finished", r))) | |
| 121 | |
| 122 self.failUnlessEqual(res, []) | |
| 123 | |
| 124 # the first build finishes here, with FAILURE | |
| 125 builderstatus_a = builder.BuilderStatus("a") | |
| 126 bsa = builder.BuildStatus(builderstatus_a, 1) | |
| 127 bsa.setResults(builder.FAILURE) | |
| 128 a.requests[0].finished(bsa) | |
| 129 | |
| 130 # any FAILURE flunks the BuildSet immediately, so the | |
| 131 # waitUntilSuccess deferred fires right away. However, the | |
| 132 # waitUntilFinished deferred must wait until all builds have | |
| 133 # completed. | |
| 134 self.failUnlessEqual(len(res), 1) | |
| 135 self.failUnlessEqual(res[0][0], "success") | |
| 136 bss = res[0][1] | |
| 137 self.failUnless(interfaces.IBuildSetStatus(bss, None)) | |
| 138 self.failUnlessEqual(bss.getResults(), builder.FAILURE) | |
| 139 | |
| 140 # here we finish the second build | |
| 141 builderstatus_b = builder.BuilderStatus("b") | |
| 142 bsb = builder.BuildStatus(builderstatus_b, 1) | |
| 143 bsb.setResults(builder.SUCCESS) | |
| 144 b.requests[0].finished(bsb) | |
| 145 | |
| 146 # .. which ought to fire the waitUntilFinished deferred | |
| 147 self.failUnlessEqual(len(res), 2) | |
| 148 self.failUnlessEqual(res[1][0], "finished") | |
| 149 self.failUnlessEqual(res[1][1], bss) | |
| 150 | |
| 151 # and finish the BuildSet overall | |
| 152 self.failUnless(st.isFinished()) | |
| 153 self.failUnlessEqual(st.getResults(), builder.FAILURE) | |
| 154 | |
| 155 def testSuccess(self): | |
| 156 S = buildset.BuildSet | |
| 157 a,b = FakeBuilder(), FakeBuilder() | |
| 158 # this time, both builds succeed | |
| 159 | |
| 160 source = sourcestamp.SourceStamp() | |
| 161 s = S(["a","b"], source, "forced build") | |
| 162 s.start([a,b]) | |
| 163 | |
| 164 st = s.status | |
| 165 self.failUnlessEqual(st.getSourceStamp(), source) | |
| 166 self.failUnlessEqual(st.getReason(), "forced build") | |
| 167 self.failUnlessEqual(st.getBuilderNames(), ["a","b"]) | |
| 168 self.failIf(st.isFinished()) | |
| 169 | |
| 170 builderstatus_a = builder.BuilderStatus("a") | |
| 171 bsa = builder.BuildStatus(builderstatus_a, 1) | |
| 172 bsa.setResults(builder.SUCCESS) | |
| 173 a.requests[0].finished(bsa) | |
| 174 | |
| 175 builderstatus_b = builder.BuilderStatus("b") | |
| 176 bsb = builder.BuildStatus(builderstatus_b, 1) | |
| 177 bsb.setResults(builder.SUCCESS) | |
| 178 b.requests[0].finished(bsb) | |
| 179 | |
| 180 self.failUnless(st.isFinished()) | |
| 181 self.failUnlessEqual(st.getResults(), builder.SUCCESS) | |
| 182 | |
| OLD | NEW |