dev_server_unittest.py revision 0dcf3a4c80b66d7598f3d7391bc1f9bf5492d8e2
1#!/usr/bin/python 2# 3# Copyright (c) 2012 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 client/common_lib/cros/dev_server.py.""" 8 9import httplib 10import logging 11import mox 12import StringIO 13import unittest 14import urllib2 15 16from autotest_lib.client.common_lib.cros import dev_server 17 18 19class DevServerTest(mox.MoxTestBase): 20 """Unit tests for dev_server.DevServer. 21 22 @var _HOST: fake dev server host address. 23 """ 24 25 _HOST = 'http://nothing' 26 27 def setUp(self): 28 super(DevServerTest, self).setUp() 29 self.dev_server = dev_server.DevServer(self._HOST) 30 31 32 def _returnHttpServerError(self): 33 self.mox.StubOutWithMock(urllib2, 'urlopen') 34 e500 = urllib2.HTTPError(url='', 35 code=httplib.INTERNAL_SERVER_ERROR, 36 msg='', 37 hdrs=None, 38 fp=None) 39 urllib2.urlopen(mox.IgnoreArg()).AndRaise(e500) 40 41 42 def _returnHttpForbidden(self): 43 self.mox.StubOutWithMock(urllib2, 'urlopen') 44 e403 = urllib2.HTTPError(url='', 45 code=httplib.FORBIDDEN, 46 msg='', 47 hdrs=None, 48 fp=None) 49 urllib2.urlopen(mox.IgnoreArg()).AndRaise(e403) 50 51 52 def testSuccessfulTriggerDownloadSync(self): 53 """Call the dev server's download method with synchronous=True.""" 54 name = 'fake/image' 55 self.mox.StubOutWithMock(urllib2, 'urlopen') 56 self.mox.StubOutWithMock(dev_server.DevServer, 'finish_download') 57 to_return = StringIO.StringIO('Success') 58 urllib2.urlopen(mox.And(mox.StrContains(self._HOST), 59 mox.StrContains(name))).AndReturn(to_return) 60 self.dev_server.finish_download(name).AndReturn(True) 61 62 # Synchronous case requires a call to finish download. 63 self.mox.ReplayAll() 64 self.assertTrue(self.dev_server.trigger_download(name, 65 synchronous=True)) 66 self.mox.VerifyAll() 67 68 69 def testSuccessfulTriggerDownloadASync(self): 70 """Call the dev server's download method with synchronous=False.""" 71 name = 'fake/image' 72 self.mox.StubOutWithMock(urllib2, 'urlopen') 73 self.mox.StubOutWithMock(dev_server.DevServer, 'finish_download') 74 to_return = StringIO.StringIO('Success') 75 urllib2.urlopen(mox.And(mox.StrContains(self._HOST), 76 mox.StrContains(name))).AndReturn(to_return) 77 78 self.mox.ReplayAll() 79 self.assertTrue(self.dev_server.trigger_download(name, 80 synchronous=False)) 81 self.mox.VerifyAll() 82 83 84 def testFailedTriggerDownload(self): 85 """Should call the dev server's download method, fail gracefully.""" 86 self._returnHttpServerError() 87 self.mox.ReplayAll() 88 self.assertFalse(self.dev_server.trigger_download('')) 89 90 91 def testExplodingTriggerDownload(self): 92 """Should call the dev server's download method, get exception.""" 93 self._returnHttpForbidden() 94 self.mox.ReplayAll() 95 self.assertRaises(urllib2.HTTPError, 96 self.dev_server.trigger_download, 97 '') 98 99 100 def testSuccessfulFinishDownload(self): 101 """Should successfully call the dev server's finish download method.""" 102 name = 'fake/image' 103 self.mox.StubOutWithMock(urllib2, 'urlopen') 104 to_return = StringIO.StringIO('Success') 105 urllib2.urlopen(mox.And(mox.StrContains(self._HOST), 106 mox.StrContains(name))).AndReturn(to_return) 107 108 # Synchronous case requires a call to finish download. 109 self.mox.ReplayAll() 110 self.assertTrue(self.dev_server.finish_download(name)) 111 self.mox.VerifyAll() 112 113 114 def testFailedTriggerDownload(self): 115 """Should call the dev server's finish download method, fail gracefully. 116 """ 117 self._returnHttpServerError() 118 self.mox.ReplayAll() 119 self.assertFalse(self.dev_server.finish_download('')) 120 121 122 def testListControlFiles(self): 123 """Should successfully list control files from the dev server.""" 124 name = 'fake/build' 125 control_files = ['file/one', 'file/two'] 126 self.mox.StubOutWithMock(urllib2, 'urlopen') 127 to_return = StringIO.StringIO('\n'.join(control_files)) 128 urllib2.urlopen(mox.And(mox.StrContains(self._HOST), 129 mox.StrContains(name))).AndReturn(to_return) 130 self.mox.ReplayAll() 131 paths = self.dev_server.list_control_files(name) 132 self.assertEquals(len(paths), 2) 133 for f in control_files: 134 self.assertTrue(f in paths) 135 136 137 def testFailedListControlFiles(self): 138 """Should call the dev server's list-files method, fail gracefully.""" 139 self._returnHttpServerError() 140 self.mox.ReplayAll() 141 self.assertEquals(self.dev_server.list_control_files(''), None) 142 143 144 def testExplodingListControlFiles(self): 145 """Should call the dev server's list-files method, get exception.""" 146 self._returnHttpForbidden() 147 self.mox.ReplayAll() 148 self.assertRaises(urllib2.HTTPError, 149 self.dev_server.list_control_files, 150 '') 151 152 153 def testGetControlFile(self): 154 """Should successfully get a control file from the dev server.""" 155 name = 'fake/build' 156 file = 'file/one' 157 contents = 'Multi-line\nControl File Contents\n' 158 self.mox.StubOutWithMock(urllib2, 'urlopen') 159 to_return = StringIO.StringIO(contents) 160 urllib2.urlopen(mox.And(mox.StrContains(self._HOST), 161 mox.StrContains(name), 162 mox.StrContains(file))).AndReturn(to_return) 163 self.mox.ReplayAll() 164 self.assertEquals(self.dev_server.get_control_file(name, file), 165 contents) 166 167 168 def testFailedGetControlFile(self): 169 """Should try to get the contents of a control file, fail gracefully.""" 170 self._returnHttpServerError() 171 self.mox.ReplayAll() 172 self.assertEquals(self.dev_server.get_control_file('', ''), None) 173 174 175 def testExplodingGetControlFile(self): 176 """Should try to get the contents of a control file, get exception.""" 177 self._returnHttpForbidden() 178 self.mox.ReplayAll() 179 self.assertRaises(urllib2.HTTPError, 180 self.dev_server.get_control_file, 181 '', '') 182 183 def testGetLatestBuild(self): 184 """Should successfully return a build for a given target.""" 185 target = 'x86-generic-release' 186 build_string = 'R18-1586.0.0-a1-b1514' 187 self.mox.StubOutWithMock(urllib2, 'urlopen') 188 to_return = StringIO.StringIO(build_string) 189 urllib2.urlopen(mox.And(mox.StrContains(self._HOST), 190 mox.StrContains(target))).AndReturn(to_return) 191 self.mox.ReplayAll() 192 build = self.dev_server.get_latest_build(target) 193 self.assertEquals(build_string, build) 194