Index: webrtc/modules/video_coding/utility/ivf_file_writer_unittest.cc |
diff --git a/webrtc/modules/video_coding/utility/ivf_file_writer_unittest.cc b/webrtc/modules/video_coding/utility/ivf_file_writer_unittest.cc |
index bdeef2abd5badf418e8c92c890d9a2861d517ffb..303502487d8fc590b4e210c46c3a95aad5d43295 100644 |
--- a/webrtc/modules/video_coding/utility/ivf_file_writer_unittest.cc |
+++ b/webrtc/modules/video_coding/utility/ivf_file_writer_unittest.cc |
@@ -14,6 +14,7 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
#include "webrtc/base/logging.h" |
+#include "webrtc/base/thread.h" |
#include "webrtc/base/timeutils.h" |
#include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
#include "webrtc/test/testsupport/fileutils.h" |
@@ -24,6 +25,7 @@ namespace { |
static const int kHeaderSize = 32; |
static const int kFrameHeaderSize = 12; |
static uint8_t dummy_payload[4] = {0, 1, 2, 3}; |
+static const int kMaxFileRetries = 5; |
} // namespace |
class IvfFileWriterTest : public ::testing::Test { |
@@ -36,7 +38,7 @@ class IvfFileWriterTest : public ::testing::Test { |
std::ostringstream oss; |
oss << test::OutputPath() << "ivf_test_file_" << id++ << ".ivf"; |
file_name_ = oss.str(); |
- } while (id < start_id + 100 && FileExists()); |
+ } while (id < start_id + 100 && FileExists(false)); |
ASSERT_LT(id, start_id + 100); |
} |
@@ -121,13 +123,38 @@ class IvfFileWriterTest : public ::testing::Test { |
use_capture_tims_ms); |
VerifyDummyTestFrames(out_file.get(), kNumFrames); |
+ out_file->Flush(); |
EXPECT_EQ(0, out_file->CloseFile()); |
- EXPECT_EQ(0, remove(file_name_.c_str())); |
+ |
+ bool file_removed = false; |
+ for (int i = 0; i < kMaxFileRetries; ++i) { |
+ file_removed = remove(file_name_.c_str()) == 0; |
+ if (file_removed) |
+ break; |
+ |
+ // Couldn't remove file for some reason, wait a sec and try again. |
+ rtc::Thread::SleepMs(1000); |
+ } |
+ EXPECT_TRUE(file_removed); |
} |
- bool FileExists() { |
- std::unique_ptr<FileWrapper> file_wrapper(FileWrapper::Create()); |
- return file_wrapper->OpenFile(file_name_.c_str(), true) == 0; |
+ // Check whether file exists or not, and if it does not meet expectation, |
+ // wait a bit and check again, up to kMaxFileRetries times. This is an ugly |
+ // hack to avoid flakiness on certain operating systems where antivirus |
+ // software may unexpectedly lock files and keep them from disappearing or |
+ // being reused. |
+ bool FileExists(bool expected) { |
+ bool file_exists = expected; |
+ std::unique_ptr<FileWrapper> file_wrapper; |
+ int iterations = 0; |
+ do { |
+ if (file_wrapper.get() != nullptr) |
+ rtc::Thread::SleepMs(1000); |
+ file_wrapper.reset(FileWrapper::Create()); |
+ file_exists = file_wrapper->OpenFile(file_name_.c_str(), true) == 0; |
+ file_wrapper->CloseFile(); |
+ } while (file_exists != expected && ++iterations < kMaxFileRetries); |
+ return file_exists; |
} |
std::string file_name_; |
@@ -137,9 +164,9 @@ class IvfFileWriterTest : public ::testing::Test { |
TEST_F(IvfFileWriterTest, RemovesUnusedFile) { |
file_writer_ = IvfFileWriter::Open(file_name_, kVideoCodecVP8); |
ASSERT_TRUE(file_writer_.get() != nullptr); |
- EXPECT_TRUE(FileExists()); |
+ EXPECT_TRUE(FileExists(true)); |
EXPECT_TRUE(file_writer_->Close()); |
- EXPECT_FALSE(FileExists()); |
+ EXPECT_FALSE(FileExists(false)); |
EXPECT_FALSE(file_writer_->Close()); // Can't close twice. |
} |