blob: ca84970eda37d6d7881b89c517d4c8f1907d8598 [file] [log] [blame]
Chris Sosa47a7d4e2012-03-28 11:26:55 -07001#!/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 gsutil_util module."""
8
Chris Sosa47a7d4e2012-03-28 11:26:55 -07009import subprocess
Chris Sosa101fd862012-06-12 17:44:53 -070010import time
Chris Sosa47a7d4e2012-03-28 11:26:55 -070011import unittest
12
Gilad Arnoldabb352e2012-09-23 01:24:27 -070013import mox
14
Chris Sosa47a7d4e2012-03-28 11:26:55 -070015import gsutil_util
16
17
Chris Sosa76e44b92013-01-31 12:11:38 -080018# pylint: disable=W0212
Chris Sosa47a7d4e2012-03-28 11:26:55 -070019class GSUtilUtilTest(mox.MoxTestBase):
20
21 def setUp(self):
22 mox.MoxTestBase.setUp(self)
23
24 self._good_mock_process = self.mox.CreateMock(subprocess.Popen)
25 self._good_mock_process.returncode = 0
26 self._bad_mock_process = self.mox.CreateMock(subprocess.Popen)
27 self._bad_mock_process.returncode = 1
Chris Sosa47a7d4e2012-03-28 11:26:55 -070028
29 def _CallRunGS(self, str_should_contain, attempts=1):
30 """Helper that wraps a RunGS for tests."""
31 for attempt in range(attempts):
32 if attempt == gsutil_util.GSUTIL_ATTEMPTS:
33 # We can't mock more than we can attempt.
34 return
35
36 # Return 1's for all but last attempt.
37 if attempt != attempts - 1:
38 mock_process = self._bad_mock_process
39 else:
40 mock_process = self._good_mock_process
41
42 subprocess.Popen(mox.StrContains(str_should_contain), shell=True,
43 stdout=subprocess.PIPE).AndReturn(mock_process)
44 mock_process.communicate().AndReturn(('Does not matter', None))
45
46 def testDownloadFromGS(self):
47 """Tests that we can run download build from gs with one error."""
Chris Sosa76e44b92013-01-31 12:11:38 -080048 self.mox.StubOutWithMock(time, 'sleep')
49 time.sleep(mox.IgnoreArg()).MultipleTimes()
Chris Sosa47a7d4e2012-03-28 11:26:55 -070050 self.mox.StubOutWithMock(subprocess, 'Popen', use_mock_anything=True)
51
52 # Make sure we our retry works.
53 self._CallRunGS('from to', attempts=2)
54 self.mox.ReplayAll()
55 gsutil_util.DownloadFromGS('from', 'to')
56 self.mox.VerifyAll()
57
58 def testDownloadFromGSButGSDown(self):
59 """Tests that we fail correctly if we can't reach GS."""
Chris Sosa76e44b92013-01-31 12:11:38 -080060 self.mox.StubOutWithMock(time, 'sleep')
61 time.sleep(mox.IgnoreArg()).MultipleTimes()
Chris Sosa47a7d4e2012-03-28 11:26:55 -070062 self.mox.StubOutWithMock(subprocess, 'Popen', use_mock_anything=True)
63 self._CallRunGS('from to', attempts=gsutil_util.GSUTIL_ATTEMPTS + 1)
64
65 self.mox.ReplayAll()
66 self.assertRaises(
67 gsutil_util.GSUtilError,
68 gsutil_util.DownloadFromGS,
69 'from', 'to')
70 self.mox.VerifyAll()
71
Chris Sosa76e44b92013-01-31 12:11:38 -080072 def testGSNamesFromList(self):
73 """Test that we can detect whether the target artifacts are available."""
74 # Test when the all target files are available
75 pattern = '.*_full_.*'
76 uploaded_list = ['chromeos_R17-1413.0.0-a1_x86-mario_full_dev.bin',
77 'debug.tgz',
78 'autotest.tar.bz2']
79
80 names = gsutil_util._GetGSNamesFromList(uploaded_list, pattern)
81 self.assertEqual(names[0],
82 'chromeos_R17-1413.0.0-a1_x86-mario_full_dev.bin')
83
84 bad_pattern = '_delta_'
85 # Test when some target files are missing
86 names = gsutil_util._GetGSNamesFromList(uploaded_list, bad_pattern)
87 self.assertEqual(names, [])
88
89 def testGetGSNamesWithWait(self):
90 """Test that we get the target artifact that is available."""
91 archive_url = ('gs://chromeos-image-archive/x86-mario-release/'
92 'R17-1413.0.0-a1-b1346')
93 name = 'chromeos_R17-1413.0.0-a1_x86-mario_full_dev.bin'
94 pattern = '_full_'
95 mock_data = 'mock data\nmock_data\nmock_data'
96 msg = 'UNIT TEST'
97
98 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
99 self.mox.StubOutWithMock(gsutil_util, '_GetGSNamesFromList')
100
101 # GSUtil cat gs://archive_url_prefix/UPLOADED.
102 gsutil_util.GSUtilRun(mox.StrContains(gsutil_util.UPLOADED_LIST),
103 mox.IgnoreArg()).AndReturn(mock_data)
104 gsutil_util._GetGSNamesFromList(mock_data.split('\n'),
105 pattern).AndReturn([name])
106
107 self.mox.ReplayAll()
108 returned_names = gsutil_util.GetGSNamesWithWait(
109 pattern, archive_url, msg, delay=1)
110 self.assertEqual([name], returned_names)
111 self.mox.VerifyAll()
112
113 def testGetGSNamesWithWaitWithRetry(self):
114 """Test that we can poll until all target artifacts are available."""
115 archive_url = ('gs://chromeos-image-archive/x86-mario-release/'
116 'R17-1413.0.0-a1-b1346')
117 name = 'chromeos_R17-1413.0.0-a1_x86-mario_full_dev.bin'
118 pattern = '_full_'
119 mock_data = 'mock data\nmock_data\nmock_data'
120 msg = 'UNIT TEST'
121
122 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
123 self.mox.StubOutWithMock(gsutil_util, '_GetGSNamesFromList')
124
125 # GSUtil cat gs://archive_url_prefix/UPLOADED.
126 gsutil_util.GSUtilRun(mox.StrContains(gsutil_util.UPLOADED_LIST),
127 mox.IgnoreArg()).AndReturn(mock_data)
128 gsutil_util._GetGSNamesFromList(mock_data.split('\n'),
129 pattern).AndReturn(None)
130
131 gsutil_util.GSUtilRun(mox.StrContains(gsutil_util.UPLOADED_LIST),
132 mox.IgnoreArg()).AndReturn(mock_data)
133 gsutil_util._GetGSNamesFromList(mox.IgnoreArg(),
134 mox.IgnoreArg()).AndReturn([name])
135
136 self.mox.ReplayAll()
137 returned_names = gsutil_util.GetGSNamesWithWait(
138 pattern, archive_url, msg, delay=1)
139 self.assertEqual(name, returned_names[0])
140 self.mox.VerifyAll()
141
142 def testGetGSNamesWithWaitTimeout(self):
143 """Test that we wait for the target artifacts until timeout occurs."""
144 archive_url = ('gs://chromeos-image-archive/x86-mario-release/'
145 'R17-1413.0.0-a1-b1346')
146 pattern = '_full_'
147 mock_data = 'mock data\nmock_data\nmock_data'
148 msg = 'UNIT TEST'
149
150 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
151 self.mox.StubOutWithMock(gsutil_util, '_GetGSNamesFromList')
152
153 # GSUtil cat gs://archive_url_prefix/UPLOADED.
154 gsutil_util.GSUtilRun(mox.StrContains(gsutil_util.UPLOADED_LIST),
155 mox.IgnoreArg()).AndReturn(mock_data)
156 gsutil_util._GetGSNamesFromList(mock_data.split('\n'),
157 pattern).AndReturn(None)
158
159 self.mox.ReplayAll()
160 returned_name = gsutil_util.GetGSNamesWithWait(
161 pattern, archive_url, msg, delay=2, timeout=1)
162 self.assertEqual(returned_name, None)
163 self.mox.VerifyAll()
164
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700165
166if __name__ == '__main__':
167 unittest.main()