1 # -*- coding: utf-8 -*-
2 # Copyright 2013 Google Inc. All Rights Reserved.
4 # Permission is hereby granted, free of charge, to any person obtaining a
5 # copy of this software and associated documentation files (the
6 # "Software"), to deal in the Software without restriction, including
7 # without limitation the rights to use, copy, modify, merge, publish, dis-
8 # tribute, sublicense, and/or sell copies of the Software, and to permit
9 # persons to whom the Software is furnished to do so, subject to the fol-
12 # The above copyright notice and this permission notice shall be included
13 # in all copies or substantial portions of the Software.
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
17 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
18 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
19 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22 """Tests for gsutil utility functions."""
24 from __future__
import absolute_import
27 from gslib
import util
28 import gslib
.tests
.testcase
as testcase
29 from gslib
.tests
.util
import SetEnvironmentForTest
30 from gslib
.util
import CompareVersions
33 class TestUtil(testcase
.GsUtilUnitTestCase
):
34 """Tests for utility functions."""
36 def test_MakeHumanReadable(self
):
37 """Tests converting byte counts to human-readable strings."""
38 self
.assertEqual(util
.MakeHumanReadable(0), '0 B')
39 self
.assertEqual(util
.MakeHumanReadable(1023), '1023 B')
40 self
.assertEqual(util
.MakeHumanReadable(1024), '1 KiB')
41 self
.assertEqual(util
.MakeHumanReadable(1024 ** 2), '1 MiB')
42 self
.assertEqual(util
.MakeHumanReadable(1024 ** 3), '1 GiB')
43 self
.assertEqual(util
.MakeHumanReadable(1024 ** 3 * 5.3), '5.3 GiB')
44 self
.assertEqual(util
.MakeHumanReadable(1024 ** 4 * 2.7), '2.7 TiB')
45 self
.assertEqual(util
.MakeHumanReadable(1024 ** 5), '1 PiB')
46 self
.assertEqual(util
.MakeHumanReadable(1024 ** 6), '1 EiB')
48 def test_MakeBitsHumanReadable(self
):
49 """Tests converting bit counts to human-readable strings."""
50 self
.assertEqual(util
.MakeBitsHumanReadable(0), '0 bit')
51 self
.assertEqual(util
.MakeBitsHumanReadable(1023), '1023 bit')
52 self
.assertEqual(util
.MakeBitsHumanReadable(1024), '1 Kibit')
53 self
.assertEqual(util
.MakeBitsHumanReadable(1024 ** 2), '1 Mibit')
54 self
.assertEqual(util
.MakeBitsHumanReadable(1024 ** 3), '1 Gibit')
55 self
.assertEqual(util
.MakeBitsHumanReadable(1024 ** 3 * 5.3), '5.3 Gibit')
56 self
.assertEqual(util
.MakeBitsHumanReadable(1024 ** 4 * 2.7), '2.7 Tibit')
57 self
.assertEqual(util
.MakeBitsHumanReadable(1024 ** 5), '1 Pibit')
58 self
.assertEqual(util
.MakeBitsHumanReadable(1024 ** 6), '1 Eibit')
60 def test_HumanReadableToBytes(self
):
61 """Tests converting human-readable strings to byte counts."""
62 self
.assertEqual(util
.HumanReadableToBytes('1'), 1)
63 self
.assertEqual(util
.HumanReadableToBytes('15'), 15)
64 self
.assertEqual(util
.HumanReadableToBytes('15.3'), 15)
65 self
.assertEqual(util
.HumanReadableToBytes('15.7'), 16)
66 self
.assertEqual(util
.HumanReadableToBytes('1023'), 1023)
67 self
.assertEqual(util
.HumanReadableToBytes('1k'), 1024)
68 self
.assertEqual(util
.HumanReadableToBytes('2048'), 2048)
69 self
.assertEqual(util
.HumanReadableToBytes('1 k'), 1024)
70 self
.assertEqual(util
.HumanReadableToBytes('1 K'), 1024)
71 self
.assertEqual(util
.HumanReadableToBytes('1 KB'), 1024)
72 self
.assertEqual(util
.HumanReadableToBytes('1 KiB'), 1024)
73 self
.assertEqual(util
.HumanReadableToBytes('1 m'), 1024 ** 2)
74 self
.assertEqual(util
.HumanReadableToBytes('1 M'), 1024 ** 2)
75 self
.assertEqual(util
.HumanReadableToBytes('1 MB'), 1024 ** 2)
76 self
.assertEqual(util
.HumanReadableToBytes('1 MiB'), 1024 ** 2)
77 self
.assertEqual(util
.HumanReadableToBytes('1 g'), 1024 ** 3)
78 self
.assertEqual(util
.HumanReadableToBytes('1 G'), 1024 ** 3)
79 self
.assertEqual(util
.HumanReadableToBytes('1 GB'), 1024 ** 3)
80 self
.assertEqual(util
.HumanReadableToBytes('1 GiB'), 1024 ** 3)
81 self
.assertEqual(util
.HumanReadableToBytes('1t'), 1024 ** 4)
82 self
.assertEqual(util
.HumanReadableToBytes('1T'), 1024 ** 4)
83 self
.assertEqual(util
.HumanReadableToBytes('1TB'), 1024 ** 4)
84 self
.assertEqual(util
.HumanReadableToBytes('1TiB'), 1024 ** 4)
85 self
.assertEqual(util
.HumanReadableToBytes('1\t p'), 1024 ** 5)
86 self
.assertEqual(util
.HumanReadableToBytes('1\t P'), 1024 ** 5)
87 self
.assertEqual(util
.HumanReadableToBytes('1\t PB'), 1024 ** 5)
88 self
.assertEqual(util
.HumanReadableToBytes('1\t PiB'), 1024 ** 5)
89 self
.assertEqual(util
.HumanReadableToBytes('1e'), 1024 ** 6)
90 self
.assertEqual(util
.HumanReadableToBytes('1E'), 1024 ** 6)
91 self
.assertEqual(util
.HumanReadableToBytes('1EB'), 1024 ** 6)
92 self
.assertEqual(util
.HumanReadableToBytes('1EiB'), 1024 ** 6)
94 def test_CompareVersions(self
):
95 """Tests CompareVersions for various use cases."""
96 # CompareVersions(first, second) returns (g, m), where
97 # g is True if first known to be greater than second, else False.
98 # m is True if first known to be greater by at least 1 major version,
99 (g
, m
) = CompareVersions('3.37', '3.2')
102 (g
, m
) = CompareVersions('7', '2')
105 (g
, m
) = CompareVersions('3.32', '3.32pre')
108 (g
, m
) = CompareVersions('3.32pre', '3.31')
111 (g
, m
) = CompareVersions('3.4pre', '3.3pree')
115 (g
, m
) = CompareVersions('3.2', '3.37')
118 (g
, m
) = CompareVersions('2', '7')
121 (g
, m
) = CompareVersions('3.32pre', '3.32')
124 (g
, m
) = CompareVersions('3.31', '3.32pre')
127 (g
, m
) = CompareVersions('3.3pre', '3.3pre')
131 (g
, m
) = CompareVersions('foobar', 'baz')
134 (g
, m
) = CompareVersions('3.32', 'baz')
138 (g
, m
) = CompareVersions('3.4', '3.3')
141 (g
, m
) = CompareVersions('3.3', '3.4')
144 (g
, m
) = CompareVersions('4.1', '3.33')
147 (g
, m
) = CompareVersions('3.10', '3.1')
151 def _AssertProxyInfosEqual(self
, pi1
, pi2
):
152 self
.assertEqual(pi1
.proxy_type
, pi2
.proxy_type
)
153 self
.assertEqual(pi1
.proxy_host
, pi2
.proxy_host
)
154 self
.assertEqual(pi1
.proxy_port
, pi2
.proxy_port
)
155 self
.assertEqual(pi1
.proxy_rdns
, pi2
.proxy_rdns
)
156 self
.assertEqual(pi1
.proxy_user
, pi2
.proxy_user
)
157 self
.assertEqual(pi1
.proxy_pass
, pi2
.proxy_pass
)
159 def test_ProxyInfoFromEnvironmentVar(self
):
160 """Tests ProxyInfoFromEnvironmentVar for various cases."""
161 valid_variables
= ['http_proxy', 'https_proxy']
162 if not util
.IS_WINDOWS
:
163 # Dynamically set Windows environment variables are case-insensitive.
164 valid_variables
.append('HTTPS_PROXY')
165 # Clear any existing environment variables for the duration of the test.
167 for key
in valid_variables
:
168 clear_dict
[key
] = None
169 with
SetEnvironmentForTest(clear_dict
):
170 for env_var
in valid_variables
:
171 for url_string
in ['hostname', 'http://hostname', 'https://hostname']:
172 with
SetEnvironmentForTest({env_var
: url_string
}):
173 self
._AssertProxyInfosEqual
(
174 util
.ProxyInfoFromEnvironmentVar(env_var
),
176 httplib2
.socks
.PROXY_TYPE_HTTP
, 'hostname',
177 443 if env_var
.lower().startswith('https') else 80))
178 # Shouldn't populate info for other variables
179 for other_env_var
in valid_variables
:
180 if other_env_var
== env_var
: continue
181 self
._AssertProxyInfosEqual
(
182 util
.ProxyInfoFromEnvironmentVar(other_env_var
),
183 httplib2
.ProxyInfo(httplib2
.socks
.PROXY_TYPE_HTTP
, None, 0))
184 for url_string
in ['1.2.3.4:50', 'http://1.2.3.4:50',
185 'https://1.2.3.4:50']:
186 with
SetEnvironmentForTest({env_var
: url_string
}):
187 self
._AssertProxyInfosEqual
(
188 util
.ProxyInfoFromEnvironmentVar(env_var
),
189 httplib2
.ProxyInfo(httplib2
.socks
.PROXY_TYPE_HTTP
, '1.2.3.4',
191 for url_string
in ['foo:bar@1.2.3.4:50', 'http://foo:bar@1.2.3.4:50',
192 'https://foo:bar@1.2.3.4:50']:
193 with
SetEnvironmentForTest({env_var
: url_string
}):
194 self
._AssertProxyInfosEqual
(
195 util
.ProxyInfoFromEnvironmentVar(env_var
),
196 httplib2
.ProxyInfo(httplib2
.socks
.PROXY_TYPE_HTTP
,
197 '1.2.3.4', 50, proxy_user
='foo',
199 for url_string
in ['bar@1.2.3.4:50', 'http://bar@1.2.3.4:50',
200 'https://bar@1.2.3.4:50']:
201 with
SetEnvironmentForTest({env_var
: url_string
}):
202 self
._AssertProxyInfosEqual
(
203 util
.ProxyInfoFromEnvironmentVar(env_var
),
204 httplib2
.ProxyInfo(httplib2
.socks
.PROXY_TYPE_HTTP
, '1.2.3.4',
205 50, proxy_pass
='bar'))
206 for env_var
in ['proxy', 'noproxy', 'garbage']:
207 for url_string
in ['1.2.3.4:50', 'http://1.2.3.4:50']:
208 with
SetEnvironmentForTest({env_var
: url_string
}):
209 self
._AssertProxyInfosEqual
(
210 util
.ProxyInfoFromEnvironmentVar(env_var
),
211 httplib2
.ProxyInfo(httplib2
.socks
.PROXY_TYPE_HTTP
, None, 0))