1#!/usr/bin/env python
2
3# Copyright (c) 2014 Google Inc. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""
8Make sure overwriting read-only files works as expected (via win-tool).
9"""
10
11import TestGyp
12
13import filecmp
14import os
15import stat
16import sys
17
18if sys.platform == 'win32':
19  test = TestGyp.TestGyp(formats=['ninja'])
20
21  # First, create the source files.
22  os.makedirs('subdir')
23  read_only_files = ['read-only-file', 'subdir/A', 'subdir/B', 'subdir/C']
24  for f in read_only_files:
25    test.write(f, 'source_contents')
26    test.chmod(f, stat.S_IREAD)
27    if os.access(f, os.W_OK):
28      test.fail_test()
29
30  # Second, create the read-only destination files. Note that we are creating
31  # them where the ninja and win-tool will try to copy them to, in order to test
32  # that copies overwrite the files.
33  os.makedirs(test.built_file_path('dest/subdir'))
34  for f in read_only_files:
35    f = os.path.join('dest', f)
36    test.write(test.built_file_path(f), 'SHOULD BE OVERWRITTEN')
37    test.chmod(test.built_file_path(f), stat.S_IREAD)
38    # Ensure not writable.
39    if os.access(test.built_file_path(f), os.W_OK):
40      test.fail_test()
41
42  test.run_gyp('copies_readonly_files.gyp')
43  test.build('copies_readonly_files.gyp')
44
45  # Check the destination files were overwritten by ninja.
46  for f in read_only_files:
47    f = os.path.join('dest', f)
48    test.must_contain(test.built_file_path(f), 'source_contents')
49
50  # This will fail if the files are not the same mode or contents.
51  for f in read_only_files:
52    if not filecmp.cmp(f, test.built_file_path(os.path.join('dest', f))):
53      test.fail_test()
54
55  test.pass_test()
56