# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests for tarfile_utils."""

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import StringIO
import subprocess
import tarfile
import unittest

import tarfile_utils


class TarfileUtilsTest(unittest.TestCase):
  """Tests of tarfile_utils."""

  def test_list_tar_members_empty_file(self):
    """Test listing file member of an empty tar."""
    tar_tvR = StringIO.StringIO('block 0: ** Block of NULs **\n')
    self.assertFalse(list(tarfile_utils.list_tar_members(tar_tvR)))

  def test_list_tar_members_non_empty_file(self):
    """Test listing file member of an non-empty tar."""
    tar_tvR = StringIO.StringIO(
        'block 0: mode owner 1 date hour:min\tfilename\n'
        'block 2: mode owner 123 date hour:min\tfile name with spaces\n'
        'block 4: mode owner 0 date hour:min\tdirectory/\n'
        'block 5: mode owner 0 date hour:min\tdirectory/symbol link -> filename'
        '\n'
        'block 6: ** Block of NULs **\n'
    )
    result = list(tarfile_utils.list_tar_members(tar_tvR))
    self.assertEquals(result, [
        ('filename', 0, 1024, 512, 1),
        ('file name with spaces', 512 * 2, 1024, 512 * 3, 123),
        ('directory/', 512 * 4, 512, 512 * 5, 0),
        ('directory/symbol link -> filename', 512 * 5, 512, 512 * 6, 0)
    ])

  def test_list_tar_member_with_real_tar_file(self):
    """Using a real tar file to test listing tar member."""
    tar_name = os.path.join(os.path.dirname(__file__),
                            'index_tar_member_testing.tgz')
    tar_tvR = StringIO.StringIO(
        subprocess.check_output(['tar', 'tvRzf', tar_name]))
    members = tarfile_utils.list_tar_members(tar_tvR)
    with tarfile.open(tar_name, 'r:gz') as tar:
      for tar_info, result in zip(tar, members):
        if tar_info.isreg():
          name = tar_info.name

        if tar_info.isdir():
          name = '%s/' % tar_info.name

        if tar_info.issym():
          name = '%s -> %s' % (tar_info.name, tar_info.linkname)

        self.assertEquals(name, result.filename)
        self.assertEquals(tar_info.offset_data, result.content_start)
        self.assertEquals(tar_info.size, result.size)


if __name__ == '__main__':
  unittest.main()
