OLD | NEW |
| (Empty) |
1 # -*- test-case-name: buildbot.test.test_web_status_json -*- | |
2 # -*- coding: utf-8 -*- | |
3 | |
4 import os, shutil | |
5 | |
6 from twisted.python import components | |
7 from twisted.trial import unittest | |
8 from twisted.web import client, error | |
9 | |
10 from buildbot import master, interfaces | |
11 from buildbot.status import html | |
12 from buildbot.status.web.status_json import JsonStatusResource | |
13 | |
14 try: | |
15 import simplejson as json | |
16 except ImportError: | |
17 import json | |
18 | |
19 | |
20 class ConfiguredMaster(master.BuildMaster): | |
21 """This BuildMaster variant has a static config file, provided as a | |
22 string when it is created.""" | |
23 | |
24 def __init__(self, basedir, config): | |
25 self.config = config | |
26 master.BuildMaster.__init__(self, basedir) | |
27 | |
28 def loadTheConfigFile(self): | |
29 self.loadConfig(self.config) | |
30 | |
31 | |
32 components.registerAdapter(master.Control, ConfiguredMaster, | |
33 interfaces.IControl) | |
34 | |
35 | |
36 base_config = """ | |
37 from buildbot.changes.pb import PBChangeSource | |
38 from buildbot.status import html | |
39 from buildbot.buildslave import BuildSlave | |
40 from buildbot.scheduler import Scheduler | |
41 from buildbot.process.factory import BuildFactory | |
42 from buildbot.config import BuilderConfig | |
43 | |
44 BuildmasterConfig = c = { | |
45 'change_source': PBChangeSource(), | |
46 'slaves': [BuildSlave('bot1name', 'bot1passwd')], | |
47 'schedulers': [Scheduler('name', None, 60, ['builder1'])], | |
48 'slavePortnum': 0, | |
49 } | |
50 c['builders'] = [ | |
51 BuilderConfig(name='builder1', slavename='bot1name', factory=BuildFactory())
, | |
52 ] | |
53 c['slavePortnum'] = 0 | |
54 c['projectUrl'] = 'example.com/yay' | |
55 c['projectName'] = 'Pouet' | |
56 c['buildbotURL'] = 'build.example.com/yo' | |
57 """ | |
58 | |
59 | |
60 class TestStatusJson(unittest.TestCase): | |
61 def setUp(self): | |
62 config = base_config + "c['status'] = [html.WebStatus(http_port=0)]\n" | |
63 if os.path.isdir('test_web1'): | |
64 shutil.rmtree('test_web1') | |
65 os.mkdir('test_web1') | |
66 self.master = ConfiguredMaster('test_web1', config) | |
67 self.master.startService() | |
68 self.web_status = self.find(html.WebStatus) | |
69 self.status_json = self.find( | |
70 JsonStatusResource, | |
71 self.web_status.site.resource.children.itervalues()) | |
72 # Hack to find out what randomly-assigned port it is listening on. | |
73 self.port = self.web_status.getPortnum() | |
74 | |
75 def tearDown(self): | |
76 self.master.stopService() | |
77 shutil.rmtree('test_web1') | |
78 | |
79 def find(self, type=None, obj=None): | |
80 obj = obj or self.master | |
81 for child in list(obj): | |
82 if isinstance(child, type): | |
83 return child | |
84 self.assertTrue(False) | |
85 | |
86 def getPage(self, url, cb=None, err=None): | |
87 d = client.getPage('http://localhost:%d%s' % (self.port, url)) | |
88 if cb: | |
89 d.addCallback(cb) | |
90 if err: | |
91 d.addErrback(err) | |
92 return d | |
93 | |
94 def testPresence(self): | |
95 def _check(page): | |
96 data = json.loads(page) | |
97 EXPECTED = { | |
98 'builders': { | |
99 'builder1': { | |
100 'basedir': 'builder1', | |
101 'cachedBuilds': [], | |
102 'category': None, | |
103 'currentBuilds': [], | |
104 'pendingBuilds': [], | |
105 'slaves': ['bot1name'], | |
106 'state': 'offline' | |
107 } | |
108 }, | |
109 'change_sources': { | |
110 '0': { | |
111 'description': 'PBChangeSource listener on all-purpose s
laveport' | |
112 } | |
113 }, | |
114 'project': { | |
115 'buildbotURL': 'build.example.com/yo', | |
116 'projectName': 'Pouet', | |
117 'projectURL': None | |
118 }, | |
119 'slaves': { | |
120 'bot1name': { | |
121 'access_uri': None, | |
122 'admin': None, | |
123 'builders': {u'builder1': []}, | |
124 'connected': False, | |
125 'host': None, | |
126 'name': u'bot1name', | |
127 'runningBuilds': [], | |
128 'version': None | |
129 } | |
130 } | |
131 } | |
132 self.assertEqual(EXPECTED, data) | |
133 return self.getPage('/json', _check) | |
134 | |
135 def testHelp(self): | |
136 def _check(page): | |
137 self.failUnless(page) | |
138 return self.getPage('/json/help', _check) | |
139 | |
140 def testNonPresence(self): | |
141 def _checkOk(page): | |
142 self.assertFalse(page) | |
143 def _checkFail(result): | |
144 self.assertEqual(result.type, error.Error) | |
145 return self.getPage('/json2', _checkOk, _checkFail) | |
146 | |
147 # vim: set ts=4 sts=4 sw=4 et: | |
OLD | NEW |