• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# -*- coding: utf-8 -*-
2# Copyright 2013 Google Inc. All Rights Reserved.
3#
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-
10# lowing conditions:
11#
12# The above copyright notice and this permission notice shall be included
13# in all copies or substantial portions of the Software.
14#
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
21# IN THE SOFTWARE.
22"""Tests for gsutil utility functions."""
23
24from __future__ import absolute_import
25
26import httplib2
27from gslib import util
28import gslib.tests.testcase as testcase
29from gslib.tests.util import SetEnvironmentForTest
30from gslib.util import CompareVersions
31
32
33class TestUtil(testcase.GsUtilUnitTestCase):
34  """Tests for utility functions."""
35
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')
47
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')
59
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)
93
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')
100    self.assertTrue(g)
101    self.assertFalse(m)
102    (g, m) = CompareVersions('7', '2')
103    self.assertTrue(g)
104    self.assertTrue(m)
105    (g, m) = CompareVersions('3.32', '3.32pre')
106    self.assertTrue(g)
107    self.assertFalse(m)
108    (g, m) = CompareVersions('3.32pre', '3.31')
109    self.assertTrue(g)
110    self.assertFalse(m)
111    (g, m) = CompareVersions('3.4pre', '3.3pree')
112    self.assertTrue(g)
113    self.assertFalse(m)
114
115    (g, m) = CompareVersions('3.2', '3.37')
116    self.assertFalse(g)
117    self.assertFalse(m)
118    (g, m) = CompareVersions('2', '7')
119    self.assertFalse(g)
120    self.assertFalse(m)
121    (g, m) = CompareVersions('3.32pre', '3.32')
122    self.assertFalse(g)
123    self.assertFalse(m)
124    (g, m) = CompareVersions('3.31', '3.32pre')
125    self.assertFalse(g)
126    self.assertFalse(m)
127    (g, m) = CompareVersions('3.3pre', '3.3pre')
128    self.assertFalse(g)
129    self.assertFalse(m)
130
131    (g, m) = CompareVersions('foobar', 'baz')
132    self.assertFalse(g)
133    self.assertFalse(m)
134    (g, m) = CompareVersions('3.32', 'baz')
135    self.assertFalse(g)
136    self.assertFalse(m)
137
138    (g, m) = CompareVersions('3.4', '3.3')
139    self.assertTrue(g)
140    self.assertFalse(m)
141    (g, m) = CompareVersions('3.3', '3.4')
142    self.assertFalse(g)
143    self.assertFalse(m)
144    (g, m) = CompareVersions('4.1', '3.33')
145    self.assertTrue(g)
146    self.assertTrue(m)
147    (g, m) = CompareVersions('3.10', '3.1')
148    self.assertTrue(g)
149    self.assertFalse(m)
150
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)
158
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.
166    clear_dict = {}
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),
175                httplib2.ProxyInfo(
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',
190                                   50))
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',
198                                   proxy_pass='bar'))
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))
212