#!/usr/bin/env python
#
#  cat_tests.py:  testing cat cases.
#
#  Subversion is a tool for revision control.
#  See http://subversion.tigris.org for more information.
#
# ====================================================================
# Copyright (c) 2000-2007 CollabNet.  All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution.  The terms
# are also available at http://subversion.tigris.org/license-1.html.
# If newer versions of this license are posted there, you may use a
# newer version instead, at your option.
#
######################################################################

# General modules
import os

# Our testing module
import svntest


# (abbreviation)
Skip = svntest.testcase.Skip
XFail = svntest.testcase.XFail
Item = svntest.wc.StateItem


######################################################################
# Tests
#
#   Each test must return on success or raise on failure.


#----------------------------------------------------------------------

def cat_local_directory(sbox):
  "cat a local directory"
  sbox.build(read_only = True)

  A_path = os.path.join(sbox.wc_dir, 'A')

  svntest.actions.run_and_verify_svn2('No error where one is expected',
                                      None, svntest.verify.AnyOutput,
                                      0, 'cat', A_path)

def cat_remote_directory(sbox):
  "cat a remote directory"
  sbox.build(create_wc = False, read_only = True)

  A_url = sbox.repo_url + '/A'
  svntest.actions.run_and_verify_svn2('No error where one is expected',
                                      None, svntest.verify.AnyOutput,
                                      0, 'cat', A_url)

def cat_base(sbox):
  "cat a file at revision BASE"
  sbox.build(read_only = True)

  wc_dir = sbox.wc_dir

  mu_path = os.path.join(wc_dir, 'A', 'mu')
  svntest.main.file_append(mu_path, 'Appended text')

  exit_code, outlines, errlines = svntest.main.run_svn(0, 'cat', mu_path)

  # Verify the expected output
  expected_output = svntest.main.greek_state.desc['A/mu'].contents
  if len(outlines) != 1 or outlines[0] != expected_output:
    raise svntest.Failure('Cat failed: expected "%s", but received "%s"' % \
      (expected_output, outlines))

def cat_nonexistent_file(sbox):
  "cat a nonexistent file"
  sbox.build(read_only = True)

  wc_dir = sbox.wc_dir

  bogus_path = os.path.join(wc_dir, 'A', 'bogus')
  svntest.actions.run_and_verify_svn2('No error where one is expected',
                                      None, svntest.verify.AnyOutput,
                                      0, 'cat', bogus_path)

def cat_skip_uncattable(sbox):
  "cat should skip uncattable resources"
  sbox.build(read_only = True)

  wc_dir = sbox.wc_dir
  dir_path = os.path.join(wc_dir, 'A', 'D')
  new_file_path = os.path.join(dir_path, 'new')
  open(new_file_path, 'w')
  item_list = os.listdir(dir_path)

  # First we test running 'svn cat' on individual objects, expecting
  # warnings for unversioned files and for directories.  Then we try
  # running 'svn cat' on multiple targets at once, and make sure we
  # get the warnings we expect.

  # item_list has all the files and directories under 'dir_path'
  for file in item_list:
    if file == svntest.main.get_admin_name():
      continue
    item_to_cat = os.path.join(dir_path, file)
    if item_to_cat == new_file_path:
      expected_err = ["svn: warning: '" + item_to_cat + "'" + \
                     " is not under version control\n"]
      svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
                                          'cat', item_to_cat)
    elif os.path.isdir(item_to_cat):
      expected_err = ["svn: warning: '" + item_to_cat + "'" + \
                     " refers to a directory\n"]
      svntest.actions.run_and_verify_svn2(None, None, expected_err, 0,
                                          'cat', item_to_cat)
    else:
      svntest.actions.run_and_verify_svn(None,
                                         ["This is the file '"+file+"'.\n"],
                                         [], 'cat', item_to_cat)

  G_path = os.path.join(dir_path, 'G')
  rho_path = os.path.join(G_path, 'rho')

  expected_out = ["This is the file 'rho'.\n"]
  expected_err1 = ["svn: warning: '" + G_path + "'"
                   + " refers to a directory\n"]
  svntest.actions.run_and_verify_svn2(None, expected_out, expected_err1, 0,
                                      'cat', rho_path, G_path)

  expected_err2 = ["svn: warning: '" + new_file_path + "'"
                   + " is not under version control\n"]
  svntest.actions.run_and_verify_svn2(None, expected_out, expected_err2, 0,
                                      'cat', rho_path, new_file_path)

  svntest.actions.run_and_verify_svn2(None, expected_out,
                                      expected_err1 + expected_err2, 0,
                                      'cat', rho_path, G_path, new_file_path)


########################################################################
# Run the tests


# list all tests here, starting with None:
test_list = [ None,
              cat_local_directory,
              cat_remote_directory,
              cat_base,
              cat_nonexistent_file,
              cat_skip_uncattable,
             ]

if __name__ == '__main__':
  svntest.main.run_tests(test_list)
  # NOTREACHED


### End of file.
