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