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