Rework y4mwrite test to pass google3 tests
authorDeb Mukherjee <debargha@google.com>
Mon, 11 Aug 2014 20:44:27 +0000 (13:44 -0700)
committerDeb Mukherjee <debargha@google.com>
Tue, 12 Aug 2014 23:15:26 +0000 (16:15 -0700)
Reverts to using tmpfile() for non-Windows platforms. On google3
the test directory does not have write permissions, and hence the
Y4mWriteTest fails. This patch fixes the issue.
On Windows, a temporary file is created in the temp directory
that has write permissions.

The tests pass on linux, mingw, and MS visual studio.

Change-Id: Ibada1d80e25d8b8e5b6a9d3d597533674bd9024c

test/video_source.h
test/y4m_test.cc

index 78e7d46..c924f96 100644 (file)
@@ -53,55 +53,33 @@ static FILE *OpenTestDataFile(const std::string& file_name) {
   return fopen(path_to_source.c_str(), "rb");
 }
 
-static FILE *OpenTestOutFile(const std::string& file_name) {
-  const std::string path_to_source = GetDataPath() + "/" + file_name;
-  return fopen(path_to_source.c_str(), "wb");
-}
-
-static std::string GetTempOutFilename() {
-  std::string basename;
+static FILE *GetTempOutFile(std::string *file_name) {
+  file_name->clear();
 #if defined(_WIN32)
   char fname[MAX_PATH];
-  // Assume for now that the filename generated is unique per process
-  const UINT ret = GetTempFileNameA(
-      GetDataPath().c_str(), "lvx", 0, fname);
-  if (ret != 0) {
-    const char *slash = strrchr(fname, '\\');
-    if (slash == NULL) slash = strrchr(fname, '/');
-    if (slash == NULL)
-      basename.assign(fname);
-    else
-      basename.assign(slash + 1);
-  } else {
-    basename.clear();
+  char tmppath[MAX_PATH];
+  if (GetTempPathA(MAX_PATH, tmppath)) {
+    // Assume for now that the filename generated is unique per process
+    if (GetTempFileNameA(tmppath, "lvx", 0, fname)) {
+      file_name->assign(fname);
+      return fopen(fname, "wb+");
+    }
   }
+  return NULL;
 #else
-  char fname[256];
-  const std::string templ = GetDataPath() + "/libvpx_test_XXXXXX";
-  strncpy(fname, templ.c_str(), templ.size());
-  fname[templ.size()] = '\0';
-  const int fd = mkstemp(fname);
-  if (fd != -1) {
-    close(fd);
-    basename.assign(strrchr(fname, '/') + 1);
-  } else {
-    basename.clear();
-  }
+  return tmpfile();
 #endif
-  return basename;
 }
 
 class TempOutFile {
  public:
   TempOutFile() {
-    file_name_ = GetTempOutFilename();
-    file_ = OpenTestOutFile(file_name_);
+    file_ = GetTempOutFile(&file_name_);
   }
   ~TempOutFile() {
     CloseFile();
     if (!file_name_.empty()) {
-      const std::string path_to_source = GetDataPath() + "/" + file_name_;
-      EXPECT_EQ(0, remove(path_to_source.c_str()));
+      EXPECT_EQ(0, remove(file_name_.c_str()));
     }
   }
   FILE *file() {
@@ -110,14 +88,19 @@ class TempOutFile {
   const std::string& file_name() {
     return file_name_;
   }
+
+ protected:
   void CloseFile() {
     if (file_) {
-      fclose(file_);
+      // Close if file pointer is associated with an open file
+#if defined(_WIN32)
+      if (file_->_ptr != NULL) fclose(file_);
+#else
+      if (fileno(file_) != -1) fclose(file_);
+#endif
       file_ = NULL;
     }
   }
-
- protected:
   FILE *file_;
   std::string file_name_;
 };
index 060f8c4..d4a2ede 100644 (file)
@@ -145,6 +145,14 @@ class Y4mVideoWriteTest
     delete tmpfile_;
   }
 
+  virtual void ReplaceInputFile(FILE *input_file) {
+    CloseSource();
+    frame_ = 0;
+    input_file_ = input_file;
+    rewind(input_file_);
+    ReadSourceToStart();
+  }
+
   // Writes out a y4m file and then reads it back
   void WriteY4mAndReadBack() {
     ASSERT_TRUE(input_file_ != NULL);
@@ -163,8 +171,7 @@ class Y4mVideoWriteTest
       write_image_file(img(), tmpfile_->file());
       Next();
     }
-    tmpfile_->CloseFile();
-    Y4mVideoSourceTest::Init(tmpfile_->file_name(), limit_);
+    ReplaceInputFile(tmpfile_->file());
   }
 
   virtual void Init(const std::string &file_name, int limit) {