#!/usr/bin/env python

# Copyright (c) 2013 Google Inc. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
Test that the generator output can be written to a different drive on Windows.
"""

import os
import TestGyp
import string
import subprocess
import sys


if sys.platform == 'win32':
  import win32api

  test = TestGyp.TestGyp(formats=['msvs', 'ninja'])

  def GetFirstFreeDriveLetter():
    """ Returns the first unused Windows drive letter in [A, Z] """
    all_letters = [c for c in string.uppercase]
    in_use = win32api.GetLogicalDriveStrings()
    free = list(set(all_letters) - set(in_use))
    return free[0]

  output_dir = os.path.join('different-drive', 'output')
  if not os.path.isdir(os.path.abspath(output_dir)):
    os.makedirs(os.path.abspath(output_dir))
  output_drive = GetFirstFreeDriveLetter()
  subprocess.call(['subst', '%c:' % output_drive, os.path.abspath(output_dir)])
  try:
    test.run_gyp('prog.gyp', '--generator-output=%s' % (
        os.path.join(output_drive, 'output')))
    test.build('prog.gyp', test.ALL, chdir=os.path.join(output_drive, 'output'))
    test.built_file_must_exist('program', chdir=os.path.join(output_drive,
                                                             'output'),
                               type=test.EXECUTABLE)
    test.pass_test()
  finally:
    subprocess.call(['subst', '%c:' % output_drive, '/D'])
