|  | # Copyright 2019 The Bazel Authors. All rights reserved. | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #    http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  |  | 
|  | import unittest | 
|  | from src.test.py.bazel import test_base | 
|  |  | 
|  |  | 
|  | class BazelWindowsSymlinksTest(test_base.TestBase): | 
|  |  | 
|  | def createProjectFiles(self): | 
|  | self.CreateWorkspaceWithDefaultRepos('WORKSPACE') | 
|  | self.ScratchFile('foo/BUILD', [ | 
|  | 'genrule(', | 
|  | '    name = "x",', | 
|  | '    srcs = ["sample"],', | 
|  | '    outs = ["link"],', | 
|  | '    exec_tools = ["sym.bat"],', | 
|  | '    cmd = "$(location sym.bat) $< $@",', | 
|  | ')', | 
|  | 'genrule(', | 
|  | '    name = "y",', | 
|  | '    outs = ["dangling-link"],', | 
|  | '    exec_tools = ["sym.bat"],', | 
|  | '    cmd = "$(location sym.bat) does-not-exist $@",', | 
|  | ')', | 
|  | ]) | 
|  | self.ScratchFile( | 
|  | 'foo/sym.bat', [ | 
|  | '@set IN=%1', | 
|  | '@set OUT=%2', | 
|  | r'@mklink %OUT:/=\% %cd%\%IN:/=\%', | 
|  | ], | 
|  | executable=True) | 
|  | self.ScratchFile('foo/sample', [ | 
|  | 'sample', | 
|  | ]) | 
|  |  | 
|  | def testWindowsSymlinkedOutput(self): | 
|  | self.createProjectFiles() | 
|  |  | 
|  | exit_code, _, stderr = self.RunBazel(['build', '//foo:x']) | 
|  | self.AssertExitCode(exit_code, 0, stderr) | 
|  |  | 
|  | exit_code, _, stderr = self.RunBazel(['build', '//foo:y']) | 
|  | self.AssertNotExitCode(exit_code, 0, stderr) | 
|  |  | 
|  | if not any(['is a dangling symbolic link' in l for l in stderr]): | 
|  | self.fail('FAIL:\n | stderr:\n | %s' % '\n | '.join(stderr)) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | unittest.main() |