18d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# -*- coding: utf-8 -*- 28d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# Copyright 2013 Google Inc. All Rights Reserved. 38d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 48d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# Licensed under the Apache License, Version 2.0 (the "License"); 58d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# you may not use this file except in compliance with the License. 68d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# You may obtain a copy of the License at 78d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 88d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# http://www.apache.org/licenses/LICENSE-2.0 98d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# 108d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# Unless required by applicable law or agreed to in writing, software 118d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# distributed under the License is distributed on an "AS IS" BASIS, 128d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# See the License for the specific language governing permissions and 148d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# limitations under the License. 158d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi"""Unit tests for FilePart class.""" 168d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 178d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom __future__ import absolute_import 188d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 198d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiimport os 208d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 218d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoifrom gslib.file_part import FilePart 228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiimport gslib.tests.testcase as testcase 238d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 248d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi# pylint: disable=protected-access 268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoiclass TestFilePart(testcase.GsUtilUnitTestCase): 278d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi """Unit tests for FilePart class.""" 288d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 298d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_tell(self): 308d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi filename = 'test_tell' 318d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi contents = 100 * 'x' 328d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fpath = self.CreateTempFile(file_name=filename, contents=contents) 338d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi part_length = 23 348d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi start_pos = 50 358d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fp = FilePart(fpath, start_pos, part_length) 368d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(start_pos, fp._fp.tell()) 378d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(0, fp.tell()) 388d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 398d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_seek(self): 408d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi """Tests seeking in a FilePart.""" 418d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi filename = 'test_seek' 428d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi contents = 100 * 'x' 438d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi part_length = 23 448d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi start_pos = 50 458d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fpath = self.CreateTempFile(file_name=filename, contents=contents) 468d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fp = FilePart(fpath, start_pos, part_length) 478d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi offset = 10 488d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 498d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Absolute positioning. 508d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fp.seek(offset) 518d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(start_pos + offset, fp._fp.tell()) 528d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(offset, fp.tell()) 538d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 548d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Relative positioning. 558d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fp.seek(offset, whence=os.SEEK_CUR) 568d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(start_pos + 2 * offset, fp._fp.tell()) 578d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(2 * offset, fp.tell()) 588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 598d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Absolute positioning from EOF. 608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fp.seek(-offset, whence=os.SEEK_END) 618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(start_pos + part_length - offset, fp._fp.tell()) 628d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(part_length - offset, fp.tell()) 638d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Seek past EOF. 658d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fp.seek(1, whence=os.SEEK_END) 668d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(start_pos + part_length + 1, fp._fp.tell()) 678d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(part_length + 1, fp.tell()) 688d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 698d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi def test_read(self): 708d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi """Tests various reaad operations with FilePart.""" 718d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi filename = 'test_read' 728d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi contents = '' 738d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi for i in range(1, 256): 748d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi contents += str(i) 758d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi part_length = 23 768d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi start_pos = 50 778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fpath = self.CreateTempFile(file_name=filename, contents=contents) 788d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 798d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Read in the whole file. 808d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fp = FilePart(fpath, start_pos, part_length) 818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi whole_file = fp.read() 828d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual(contents[start_pos:(start_pos + part_length)], whole_file) 838d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 848d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Read in a piece of the file from the beginning. 858d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi fp.seek(0) 868d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi offset = 10 878d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi partial_file = fp.read(offset) 888d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual( 898d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi contents[start_pos:(start_pos + offset)], 908d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi partial_file) 918d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 928d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Read in the rest of the file. 938d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi remaining_file = fp.read(part_length - offset) 948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual( 958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi contents[(start_pos + offset):(start_pos + part_length)], 968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi remaining_file) 978d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual( 988d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi contents[start_pos:(start_pos + part_length)], 998d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi partial_file + remaining_file) 1008d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1018d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi # Try to read after reaching EOF. 1028d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi empty_file = fp.read(100) 1038d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual('', empty_file) 1048d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 1058d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi empty_file = fp.read() 1068d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi self.assertEqual('', empty_file) 107