OLD | NEW |
| (Empty) |
1 #!/usr/bin/python | |
2 # | |
3 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | |
4 # Use of this source code is governed by a BSD-style license that can be | |
5 # found in the LICENSE file. | |
6 | |
7 """Unit tests for ctest.""" | |
8 | |
9 import mox | |
10 import os | |
11 import unittest | |
12 import urllib | |
13 | |
14 import ctest | |
15 | |
16 _TEST_BOOT_DESC = """ | |
17 --arch="x86" | |
18 --output_dir="/home/chrome-bot/0.8.70.5-a1" | |
19 --espfs_mountpoint="/home/chrome-bot/0.8.70.5-a1/esp" | |
20 --enable_rootfs_verification | |
21 """ | |
22 | |
23 class CrosTestTest(mox.MoxTestBase): | |
24 """Test class for CTest.""" | |
25 | |
26 def setUp(self): | |
27 mox.MoxTestBase.setUp(self) | |
28 self.board = 'test-board' | |
29 self.channel = 'test-channel' | |
30 self.version = '1.2.3.4.5' | |
31 self.revision = '7ghfa9999-12345' | |
32 self.image_name = 'TestOS-%s-%s' % (self.version, self.revision) | |
33 self.download_folder = 'test_folder' | |
34 self.latestbase = 'http://test-latest/TestOS' | |
35 self.zipbase = 'http://test-zips/archive/TestOS' | |
36 self.image_url = '%s/%s/%s/%s/%s.zip' % (self.zipbase, self.channel, | |
37 self.board, self.version, | |
38 self.image_name) | |
39 self.test_regex = 'ChromeOS-\d+\.\d+\.\d+\.\d+-.*\.zip' | |
40 | |
41 def testModifyBootDesc(self): | |
42 """Tests to make sure we correctly modify a boot desc.""" | |
43 in_chroot_path = ctest.ReinterpretPathForChroot(os.path.abspath( | |
44 self.download_folder)) | |
45 self.mox.StubOutWithMock(__builtins__, 'open') | |
46 self.mox.StubOutWithMock(ctest.fileinput, 'input') | |
47 m_file = self.mox.CreateMock(file) | |
48 | |
49 mock_file = _TEST_BOOT_DESC.splitlines(True) | |
50 ctest.fileinput.input('%s/%s' % (os.path.abspath(self.download_folder), | |
51 'boot.desc'), | |
52 inplace=1).AndReturn(mock_file) | |
53 | |
54 m_file.write('\n') | |
55 m_file.write(' --arch="x86"\n') | |
56 m_file.write(' --output_dir="%s"\n' % in_chroot_path) | |
57 m_file.write(' --espfs_mountpoint="%s/%s"\n' % (in_chroot_path, 'esp')) | |
58 m_file.write(' --enable_rootfs_verification\n') | |
59 | |
60 self.mox.ReplayAll() | |
61 ctest.ModifyBootDesc(os.path.abspath(self.download_folder), m_file) | |
62 self.mox.VerifyAll() | |
63 | |
64 | |
65 def testGetLatestZipUrl(self): | |
66 """Test case that tests GetLatestZipUrl with test urls.""" | |
67 self.mox.StubOutWithMock(urllib, 'urlopen') | |
68 m_file = self.mox.CreateMock(file) | |
69 | |
70 urllib.urlopen('%s/%s/LATEST-%s' % (self.latestbase, self.channel, | |
71 self.board)).AndReturn(m_file) | |
72 m_file.read().AndReturn('%s.bin.gz' % self.image_name) | |
73 m_file.close() | |
74 | |
75 self.mox.ReplayAll() | |
76 self.assertEquals(ctest.GetLatestZipUrl(self.board, self.channel, | |
77 self.latestbase, self.zipbase), | |
78 self.image_url) | |
79 self.mox.VerifyAll() | |
80 | |
81 def testGetLatestZipFromBadUrl(self): | |
82 """Tests whether GetLatestZipUrl returns correct url given bad link.""" | |
83 self.mox.StubOutWithMock(urllib, 'urlopen') | |
84 self.mox.StubOutWithMock(ctest, 'GetNewestLinkFromZipBase') | |
85 m_file = self.mox.CreateMock(file) | |
86 | |
87 urllib.urlopen('%s/%s/LATEST-%s' % (self.latestbase, self.channel, | |
88 self.board)).AndRaise(IOError('Cannot open url.')) | |
89 ctest.GetNewestLinkFromZipBase(self.board, self.channel, | |
90 self.zipbase).AndReturn(self.image_url) | |
91 | |
92 self.mox.ReplayAll() | |
93 self.assertEquals(ctest.GetLatestZipUrl(self.board, self.channel, | |
94 self.latestbase, self.zipbase), | |
95 self.image_url) | |
96 self.mox.VerifyAll() | |
97 | |
98 def testGrabZipAndExtractImageUseCached(self): | |
99 """Test case where cache holds our image.""" | |
100 self.mox.StubOutWithMock(os.path, 'exists') | |
101 self.mox.StubOutWithMock(__builtins__, 'open') | |
102 m_file = self.mox.CreateMock(file) | |
103 | |
104 os.path.exists('%s/%s' % ( | |
105 self.download_folder, 'download_url')).AndReturn(True) | |
106 | |
107 open('%s/%s' % (self.download_folder, 'download_url')).AndReturn(m_file) | |
108 m_file.read().AndReturn(self.image_url) | |
109 m_file.close() | |
110 | |
111 os.path.exists('%s/%s' % ( | |
112 self.download_folder, ctest._IMAGE_TO_EXTRACT)).AndReturn(True) | |
113 | |
114 self.mox.ReplayAll() | |
115 ctest.GrabZipAndExtractImage(self.image_url, self.download_folder, | |
116 ctest._IMAGE_TO_EXTRACT) | |
117 self.mox.VerifyAll() | |
118 | |
119 def CommonDownloadAndExtractImage(self): | |
120 """Common code to mock downloading image, unzipping it and setting url.""" | |
121 zip_path = os.path.join(self.download_folder, 'image.zip') | |
122 m_file = self.mox.CreateMock(file) | |
123 | |
124 ctest.RunCommand(['rm', '-rf', self.download_folder], print_cmd=False) | |
125 os.mkdir(self.download_folder) | |
126 urllib.urlretrieve(self.image_url, zip_path) | |
127 ctest.RunCommand(['unzip', '-d', self.download_folder, zip_path], | |
128 print_cmd=False, error_message=mox.IgnoreArg()) | |
129 | |
130 ctest.ModifyBootDesc(self.download_folder) | |
131 | |
132 open('%s/%s' % (self.download_folder, 'download_url'), | |
133 'w+').AndReturn(m_file) | |
134 m_file.write(self.image_url) | |
135 m_file.close() | |
136 | |
137 self.mox.ReplayAll() | |
138 ctest.GrabZipAndExtractImage(self.image_url, self.download_folder, | |
139 ctest._IMAGE_TO_EXTRACT) | |
140 self.mox.VerifyAll() | |
141 | |
142 def testGrabZipAndExtractImageNoCache(self): | |
143 """Test case where download_url doesn't exist.""" | |
144 self.mox.StubOutWithMock(os.path, 'exists') | |
145 self.mox.StubOutWithMock(os, 'mkdir') | |
146 self.mox.StubOutWithMock(__builtins__, 'open') | |
147 self.mox.StubOutWithMock(ctest, 'RunCommand') | |
148 self.mox.StubOutWithMock(urllib, 'urlretrieve') | |
149 self.mox.StubOutWithMock(ctest, 'ModifyBootDesc') | |
150 | |
151 m_file = self.mox.CreateMock(file) | |
152 | |
153 os.path.exists('%s/%s' % ( | |
154 self.download_folder, 'download_url')).AndReturn(False) | |
155 | |
156 self.CommonDownloadAndExtractImage() | |
157 | |
158 | |
159 def testGrabZipAndExtractImageWrongCache(self): | |
160 """Test case where download_url exists but doesn't match our url.""" | |
161 self.mox.StubOutWithMock(os.path, 'exists') | |
162 self.mox.StubOutWithMock(os, 'mkdir') | |
163 self.mox.StubOutWithMock(__builtins__, 'open') | |
164 self.mox.StubOutWithMock(ctest, 'RunCommand') | |
165 self.mox.StubOutWithMock(urllib, 'urlretrieve') | |
166 self.mox.StubOutWithMock(ctest, 'ModifyBootDesc') | |
167 | |
168 m_file = self.mox.CreateMock(file) | |
169 | |
170 os.path.exists('%s/%s' % ( | |
171 self.download_folder, 'download_url')).AndReturn(True) | |
172 | |
173 open('%s/%s' % (self.download_folder, 'download_url')).AndReturn(m_file) | |
174 m_file.read().AndReturn(self.image_url) | |
175 m_file.close() | |
176 | |
177 os.path.exists('%s/%s' % ( | |
178 self.download_folder, ctest._IMAGE_TO_EXTRACT)).AndReturn(False) | |
179 | |
180 self.CommonDownloadAndExtractImage() | |
181 | |
182 def testGetLatestLinkFromPage(self): | |
183 """Tests whether we get the latest link from a url given a regex.""" | |
184 test_url = 'test_url' | |
185 test_html = """ | |
186 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> | |
187 <html> | |
188 <body> | |
189 <h1>Test Index</h1> | |
190 <a href="ZsomeCruft">Cruft</a> | |
191 <a href="YotherCruft">Cruft</a> | |
192 <a href="ChromeOS-0.9.12.4-blahblah.zip">testlink1/</a> | |
193 <a href="ChromeOS-0.9.12.4-blahblah.zip.other/">testlink2/</a> | |
194 <a href="ChromeOS-Factory-0.9.12.4-blahblah.zip/">testlink3/</a> | |
195 </body></html> | |
196 """ | |
197 self.mox.StubOutWithMock(urllib, 'urlopen') | |
198 m_file = self.mox.CreateMock(file) | |
199 | |
200 urllib.urlopen(test_url).AndReturn(m_file) | |
201 m_file.read().AndReturn(test_html) | |
202 m_file.close() | |
203 | |
204 self.mox.ReplayAll() | |
205 latest_link = ctest.GetLatestLinkFromPage(test_url, regex=self.test_regex) | |
206 self.assertTrue(latest_link == 'ChromeOS-0.9.12.4-blahblah.zip') | |
207 self.mox.VerifyAll() | |
208 | |
209 | |
210 class HTMLDirectoryParserTest(unittest.TestCase): | |
211 """Test class for HTMLDirectoryParser.""" | |
212 | |
213 def setUp(self): | |
214 self.test_regex = '\d+\.\d+\.\d+\.\d+/' | |
215 | |
216 def testHandleStarttagGood(self): | |
217 parser = ctest.HTMLDirectoryParser(regex=self.test_regex) | |
218 parser.handle_starttag('a', [('href', '0.9.74.1/')]) | |
219 self.assertTrue('0.9.74.1' in parser.link_list) | |
220 | |
221 def testHandleStarttagBad(self): | |
222 parser = ctest.HTMLDirectoryParser(regex=self.test_regex) | |
223 parser.handle_starttag('a', [('href', 'ZsomeCruft/')]) | |
224 self.assertTrue('ZsomeCruft' not in parser.link_list) | |
225 | |
226 | |
227 if __name__ == '__main__': | |
228 unittest.main() | |
OLD | NEW |