Bazel-如何获得一个简短但密封的临时目录进行测试?

时间:2017-07-19 20:10:59

标签: bazel

我有一个试图启动嵌入式mysql的测试 它尝试将套接字文件写入Files.createTempFile(null, ".sock"),返回时出现以下错误: mysql start failed with error: [ERROR] The socket file path is too long (> 103): /private/var/tmp/_bazel_user/1c8ed8d84f6cb79483aa3cc4da758c86/bazel-sandbox/2478112867584790357/execroot/some_workspace/_tmp/dfebe48cda4dfdc8739653efedfa4933/394798020705754292.sock
我通过使用/tmp将java temp dir重新指向jvm_flags来解决这个问题,但是当我尝试使用沙盒时,这并不起作用,因为我猜测测试isn&允许写在那里。

我尝试过设置java代码中的符号链接(例如Files.createSymbolicLink(Paths.get("/tmp/foo"),Paths.get(System.getProperty("java.io.tmpdir"))),但这似乎没什么帮助。

我也试过设置output_base,但这也没有帮助。

非常感谢指针和提示,因为我目前无法在沙盒下运行我的测试,因此无法将它们并行化。

2 个答案:

答案 0 :(得分:3)

我认为你将Java重新指向/ tmp的方法应该有效。 macOS沙箱始终允许写入多个目录和/ tmp和/ private / tmp are included in this set。我尝试用genrule重现失败:genrule(name = "write_to_tmp", outs = ["out.txt"], cmd = "touch /tmp/something.sock && touch $@"),它可以正常工作并创建文件/tmp/something.sock。

我认为通常使用/tmp应该可以正常工作,尽管它在macOS上似乎有点不寻常。 $TMPDIR被设置为一个特定于用户的文件夹,操作系统在/ var / folders下面有一个随机名称,似乎通常鼓励使用它而不是/ tmp。但如果你知道自己在做什么,我就不会发现真正的问题。

请注意,我们没有在macOS上提供tmpfs或类似机制,因此我们无法自动保证您通过操作使用/tmp这样的可写文件夹是密封的,赢得了'运行之间的泄漏状态或文件名不会发生冲突。确保通过mkstemp或类似方式以安全的方式生成文件名。

答案 1 :(得分:0)

在bazel测试中,您可以将TEST_TMPDIR环境变量用于测试专用可写区域。

请参阅https://docs.bazel.build/versions/master/test-encyclopedia.html