From ea9dc4ae608a5d1956e9fa7bb59677660e4c9f2c Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Sun, 7 May 2017 21:41:58 +0000 Subject: [PATCH] Fix Windows test failures caused by identical temp file names. This patch fixes test failures that occur on Windows because the tests attempt to generate two distinct temp file names but get the same name both time. The fix for this is to create the first temp file before requesting a second temporary file name. This ensures that the second name will be unique. llvm-svn: 302382 --- .../fstream.assign/member_swap.pass.cpp | 24 ++++++++++++++++-- .../fstream.assign/nonmember_swap.pass.cpp | 25 +++++++++++++++++-- .../ofstream.assign/member_swap.pass.cpp | 24 ++++++++++++++++-- .../ofstream.assign/nonmember_swap.pass.cpp | 24 ++++++++++++++++-- 4 files changed, 89 insertions(+), 8 deletions(-) diff --git a/libcxx/test/std/input.output/file.streams/fstreams/fstream.assign/member_swap.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/fstream.assign/member_swap.pass.cpp index fcc86a13ffa1..949ea50d08a2 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/fstream.assign/member_swap.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/fstream.assign/member_swap.pass.cpp @@ -15,13 +15,33 @@ // void swap(basic_fstream& rhs); #include +#include #include #include "platform_support.h" +std::pair get_temp_file_names() { + std::pair names; + names.first = get_temp_file_name(); + + // Create the file so the next call to `get_temp_file_name()` doesn't + // return the same file. + std::FILE *fd1 = std::fopen(names.first.c_str(), "w"); + + names.second = get_temp_file_name(); + assert(names.first != names.second); + + std::fclose(fd1); + std::remove(names.first.c_str()); + + return names; +} + int main() { - std::string temp1 = get_temp_file_name(); - std::string temp2 = get_temp_file_name(); + std::pair temp_files = get_temp_file_names(); + std::string& temp1 = temp_files.first; + std::string& temp2 = temp_files.second; + assert(temp1 != temp2); { std::fstream fs1(temp1.c_str(), std::ios_base::in | std::ios_base::out | std::ios_base::trunc); diff --git a/libcxx/test/std/input.output/file.streams/fstreams/fstream.assign/nonmember_swap.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/fstream.assign/nonmember_swap.pass.cpp index 0a4f7240daa1..4ff84f26cfa4 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/fstream.assign/nonmember_swap.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/fstream.assign/nonmember_swap.pass.cpp @@ -16,13 +16,34 @@ // void swap(basic_fstream& x, basic_fstream& y); #include +#include #include #include "platform_support.h" + +std::pair get_temp_file_names() { + std::pair names; + names.first = get_temp_file_name(); + + // Create the file so the next call to `get_temp_file_name()` doesn't + // return the same file. + std::FILE *fd1 = std::fopen(names.first.c_str(), "w"); + + names.second = get_temp_file_name(); + assert(names.first != names.second); + + std::fclose(fd1); + std::remove(names.first.c_str()); + + return names; +} + int main() { - std::string temp1 = get_temp_file_name(); - std::string temp2 = get_temp_file_name(); + std::pair temp_files = get_temp_file_names(); + std::string& temp1 = temp_files.first; + std::string& temp2 = temp_files.second; + assert(temp1 != temp2); { std::fstream fs1(temp1.c_str(), std::ios_base::in | std::ios_base::out | std::ios_base::trunc); diff --git a/libcxx/test/std/input.output/file.streams/fstreams/ofstream.assign/member_swap.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/ofstream.assign/member_swap.pass.cpp index 519b84fb1abe..95224774c67e 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/ofstream.assign/member_swap.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/ofstream.assign/member_swap.pass.cpp @@ -15,13 +15,33 @@ // void swap(basic_ofstream& rhs); #include +#include #include #include "platform_support.h" +std::pair get_temp_file_names() { + std::pair names; + names.first = get_temp_file_name(); + + // Create the file so the next call to `get_temp_file_name()` doesn't + // return the same file. + std::FILE *fd1 = std::fopen(names.first.c_str(), "w"); + + names.second = get_temp_file_name(); + assert(names.first != names.second); + + std::fclose(fd1); + std::remove(names.first.c_str()); + + return names; +} + int main() { - std::string temp1 = get_temp_file_name(); - std::string temp2 = get_temp_file_name(); + std::pair temp_files = get_temp_file_names(); + std::string& temp1 = temp_files.first; + std::string& temp2 = temp_files.second; + assert(temp1 != temp2); { std::ofstream fs1(temp1.c_str()); std::ofstream fs2(temp2.c_str()); diff --git a/libcxx/test/std/input.output/file.streams/fstreams/ofstream.assign/nonmember_swap.pass.cpp b/libcxx/test/std/input.output/file.streams/fstreams/ofstream.assign/nonmember_swap.pass.cpp index d58f5f256004..31f2153ebd4c 100644 --- a/libcxx/test/std/input.output/file.streams/fstreams/ofstream.assign/nonmember_swap.pass.cpp +++ b/libcxx/test/std/input.output/file.streams/fstreams/ofstream.assign/nonmember_swap.pass.cpp @@ -16,13 +16,33 @@ // void swap(basic_ofstream& x, basic_ofstream& y); #include +#include #include #include "platform_support.h" +std::pair get_temp_file_names() { + std::pair names; + names.first = get_temp_file_name(); + + // Create the file so the next call to `get_temp_file_name()` doesn't + // return the same file. + std::FILE *fd1 = std::fopen(names.first.c_str(), "w"); + + names.second = get_temp_file_name(); + assert(names.first != names.second); + + std::fclose(fd1); + std::remove(names.first.c_str()); + + return names; +} + int main() { - std::string temp1 = get_temp_file_name(); - std::string temp2 = get_temp_file_name(); + std::pair temp_files = get_temp_file_names(); + std::string& temp1 = temp_files.first; + std::string& temp2 = temp_files.second; + assert(temp1 != temp2); { std::ofstream fs1(temp1.c_str()); std::ofstream fs2(temp2.c_str());