| Index: third_party/gsutil/gslib/tests/test_setmeta.py
|
| diff --git a/third_party/gsutil/gslib/tests/test_setmeta.py b/third_party/gsutil/gslib/tests/test_setmeta.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5e83cf85669dd42ad6fa47e1119863eba7e454ea
|
| --- /dev/null
|
| +++ b/third_party/gsutil/gslib/tests/test_setmeta.py
|
| @@ -0,0 +1,108 @@
|
| +# -*- coding: utf-8 -*-
|
| +# Copyright 2013 Google Inc. All Rights Reserved.
|
| +#
|
| +# Licensed under the Apache License, Version 2.0 (the "License");
|
| +# you may not use this file except in compliance with the License.
|
| +# You may obtain a copy of the License at
|
| +#
|
| +# http://www.apache.org/licenses/LICENSE-2.0
|
| +#
|
| +# Unless required by applicable law or agreed to in writing, software
|
| +# distributed under the License is distributed on an "AS IS" BASIS,
|
| +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +# See the License for the specific language governing permissions and
|
| +# limitations under the License.
|
| +
|
| +import gslib.tests.testcase as testcase
|
| +from gslib.util import Retry
|
| +from gslib.tests.util import ObjectToURI as suri
|
| +
|
| +
|
| +class TestSetMeta(testcase.GsUtilIntegrationTestCase):
|
| + """Integration tests for setmeta command."""
|
| +
|
| + def test_initial_metadata(self):
|
| + objuri = suri(self.CreateObject(contents='foo'))
|
| + inpath = self.CreateTempFile()
|
| + ct = 'image/gif'
|
| + self.RunGsUtil(['-h', 'x-goog-meta-xyz:abc', '-h', 'Content-Type:%s' % ct,
|
| + 'cp', inpath, objuri])
|
| + # Use @Retry as hedge against bucket listing eventual consistency.
|
| + @Retry(AssertionError, tries=3, delay=1, backoff=1)
|
| + def _Check1():
|
| + stdout = self.RunGsUtil(['ls', '-L', objuri], return_stdout=True)
|
| + self.assertIn('Content-Type:\t%s' % ct, stdout)
|
| + self.assertIn('x-goog-meta-xyz:\tabc', stdout)
|
| + _Check1()
|
| +
|
| + def test_overwrite_existing(self):
|
| + objuri = suri(self.CreateObject(contents='foo'))
|
| + inpath = self.CreateTempFile()
|
| + self.RunGsUtil(['-h', 'x-goog-meta-xyz:abc', '-h', 'Content-Type:image/gif',
|
| + 'cp', inpath, objuri])
|
| + self.RunGsUtil(['setmeta', '-n', '-h', 'Content-Type:text/html', '-h',
|
| + 'x-goog-meta-xyz', objuri])
|
| + # Use @Retry as hedge against bucket listing eventual consistency.
|
| + @Retry(AssertionError, tries=3, delay=1, backoff=1)
|
| + def _Check1():
|
| + stdout = self.RunGsUtil(['ls', '-L', objuri], return_stdout=True)
|
| + self.assertIn('Content-Type:\ttext/html', stdout)
|
| + self.assertNotIn('xyz', stdout)
|
| + _Check1()
|
| +
|
| + def test_missing_header(self):
|
| + stderr = self.RunGsUtil(['setmeta', '"Content-Type"', 'gs://foo/bar'],
|
| + expected_status=1, return_stderr=True)
|
| + self.assertIn('Fields being added must include values', stderr)
|
| +
|
| + def test_minus_header_value(self):
|
| + stderr = self.RunGsUtil(['setmeta', '"-Content-Type:text/html"',
|
| + 'gs://foo/bar'], expected_status=1,
|
| + return_stderr=True)
|
| + self.assertIn('Removal spec may not contain ":"', stderr)
|
| +
|
| + def test_plus_and_minus(self):
|
| + stderr = self.RunGsUtil(['setmeta', ('"Content-Type:text/html",'
|
| + '"-Content-Type"'), 'gs://foo/bar'],
|
| + expected_status=1, return_stderr=True)
|
| + self.assertIn('Each header must appear at most once', stderr)
|
| +
|
| + def test_non_ascii_custom_header(self):
|
| + stderr = self.RunGsUtil(['setmeta', '"x-goog-meta-soufflé:5"',
|
| + 'gs://foo/bar'], expected_status=1,
|
| + return_stderr=True)
|
| + self.assertIn('Invalid non-ASCII header', stderr)
|
| +
|
| + def test_disallowed_header(self):
|
| + stderr = self.RunGsUtil(['setmeta', '"Content-Length:5"',
|
| + 'gs://foo/bar'], expected_status=1,
|
| + return_stderr=True)
|
| + self.assertIn('Invalid or disallowed header', stderr)
|
| +
|
| + def test_deprecated_syntax(self):
|
| + objuri = suri(self.CreateObject(contents='foo'))
|
| + inpath = self.CreateTempFile()
|
| + self.RunGsUtil(['-h', 'x-goog-meta-xyz:abc', '-h', 'Content-Type:image/gif',
|
| + 'cp', inpath, objuri])
|
| +
|
| + # Use @Retry as hedge against bucket listing eventual consistency.
|
| + @Retry(AssertionError, tries=3, delay=1, backoff=1)
|
| + def _Check1():
|
| + stdout = self.RunGsUtil(['ls', '-L', objuri], return_stdout=True)
|
| + self.assertIn('Content-Type:\timage/gif', stdout)
|
| + self.assertIn('x-goog-meta-xyz:\tabc', stdout)
|
| + _Check1()
|
| +
|
| + stderr = self.RunGsUtil(
|
| + ['setmeta', '-n', '"Content-Type:text/html","-x-goog-meta-xyz"',
|
| + objuri],
|
| + return_stderr=True)
|
| + self.assertIn('WARNING: metadata spec syntax', stderr)
|
| + self.assertIn('is deprecated and will eventually be removed', stderr)
|
| + # Use @Retry as hedge against bucket listing eventual consistency.
|
| + @Retry(AssertionError, tries=3, delay=1, backoff=1)
|
| + def _Check2():
|
| + stdout = self.RunGsUtil(['ls', '-L', objuri], return_stdout=True)
|
| + self.assertIn('Content-Type:\ttext/html', stdout)
|
| + self.assertNotIn('xyz', stdout)
|
| + _Check2()
|
|
|