diff mbox

[1/4] selftest: split out named_temp_file from temp_source_file

Message ID 1472087632-20519-2-git-send-email-dmalcolm@redhat.com
State New
Headers show

Commit Message

David Malcolm Aug. 25, 2016, 1:13 a.m. UTC
Split out a new base class for temp_source_file, named_temp_file,
moving the deletion to the base class dtor, so that we can write
out temporary files in other ways in selftests.

gcc/ChangeLog:
	* selftest.c (selftest::named_temp_file::named_temp_file): New
	ctor.
	(selftest::temp_source_file::~temp_source_file): Move to...
	(selftest::named_temp_file::~named_temp_file): ...here.
	(selftest::test_named_temp_file): New function.
	(selftest::selftest_c_tests): Call test_named_temp_file.
	* selftest.h (class named_temp_file): New class.
	(class temp_source_file): Convert to a subclass of named_temp_file.
---
 gcc/selftest.c | 49 +++++++++++++++++++++++++++++++++++--------------
 gcc/selftest.h | 24 +++++++++++++++++-------
 2 files changed, 52 insertions(+), 21 deletions(-)

Comments

Bernd Schmidt Aug. 29, 2016, 9:53 p.m. UTC | #1
On 08/25/2016 03:13 AM, David Malcolm wrote:
> Split out a new base class for temp_source_file, named_temp_file,
> moving the deletion to the base class dtor, so that we can write
> out temporary files in other ways in selftests.
>
> gcc/ChangeLog:
> 	* selftest.c (selftest::named_temp_file::named_temp_file): New
> 	ctor.
> 	(selftest::temp_source_file::~temp_source_file): Move to...
> 	(selftest::named_temp_file::~named_temp_file): ...here.
> 	(selftest::test_named_temp_file): New function.
> 	(selftest::selftest_c_tests): Call test_named_temp_file.
> 	* selftest.h (class named_temp_file): New class.
> 	(class temp_source_file): Convert to a subclass of named_temp_file.

Ok.

> +selftest::named_temp_file::named_temp_file (const char *suffix)

Any reason these aren't inside namespace selftest to shorten these 
declarations?


Bernd
diff mbox

Patch

diff --git a/gcc/selftest.c b/gcc/selftest.c
index 629db98..e6c9510 100644
--- a/gcc/selftest.c
+++ b/gcc/selftest.c
@@ -120,34 +120,40 @@  selftest::assert_str_contains (const location &loc,
 	 desc_haystack, desc_needle, val_haystack, val_needle);
 }
 
-/* Constructor.  Create a tempfile using SUFFIX, and write CONTENT to
-   it.  Abort if anything goes wrong, using LOC as the effective
-   location in the problem report.  */
+/* Constructor.  Generate a name for the file.  */
 
-selftest::temp_source_file::temp_source_file (const location &loc,
-					      const char *suffix,
-					      const char *content)
+selftest::named_temp_file::named_temp_file (const char *suffix)
 {
   m_filename = make_temp_file (suffix);
   ASSERT_NE (m_filename, NULL);
-
-  FILE *out = fopen (m_filename, "w");
-  if (!out)
-    ::selftest::fail_formatted (loc, "unable to open tempfile: %s",
-				m_filename);
-  fprintf (out, "%s", content);
-  fclose (out);
 }
 
 /* Destructor.  Delete the tempfile.  */
 
-selftest::temp_source_file::~temp_source_file ()
+selftest::named_temp_file::~named_temp_file ()
 {
   unlink (m_filename);
   diagnostics_file_cache_forcibly_evict_file (m_filename);
   free (m_filename);
 }
 
+/* Constructor.  Create a tempfile using SUFFIX, and write CONTENT to
+   it.  Abort if anything goes wrong, using LOC as the effective
+   location in the problem report.  */
+
+selftest::temp_source_file::temp_source_file (const location &loc,
+					      const char *suffix,
+					      const char *content)
+: named_temp_file (suffix)
+{
+  FILE *out = fopen (get_filename (), "w");
+  if (!out)
+    ::selftest::fail_formatted (loc, "unable to open tempfile: %s",
+				get_filename ());
+  fprintf (out, "%s", content);
+  fclose (out);
+}
+
 /* Selftests for the selftest system itself.  */
 
 namespace selftest {
@@ -167,12 +173,27 @@  test_assertions ()
   ASSERT_STR_CONTAINS ("foo bar baz", "bar");
 }
 
+/* Verify named_temp_file.  */
+
+static void
+test_named_temp_file ()
+{
+  named_temp_file t (".txt");
+  FILE *f = fopen (t.get_filename (), "w");
+  if (!f)
+    selftest::fail_formatted (SELFTEST_LOCATION,
+			      "unable to open %s for writing",
+			      t.get_filename ());
+  fclose (f);
+}
+
 /* Run all of the selftests within this file.  */
 
 void
 selftest_c_tests ()
 {
   test_assertions ();
+  test_named_temp_file ();
 }
 
 } // namespace selftest
diff --git a/gcc/selftest.h b/gcc/selftest.h
index b073ed6..fd3c6b0 100644
--- a/gcc/selftest.h
+++ b/gcc/selftest.h
@@ -77,22 +77,32 @@  extern void assert_str_contains (const location &loc,
 				 const char *val_haystack,
 				 const char *val_needle);
 
-/* A class for writing out a temporary sourcefile for use in selftests
-   of input handling.  */
+/* A named temporary file for use in selftests.
+   Usable for writing out files, and as the base class for
+   temp_source_file.
+   The file is unlinked in the destructor.  */
 
-class temp_source_file
+class named_temp_file
 {
  public:
-  temp_source_file (const location &loc, const char *suffix,
-		    const char *content);
-  ~temp_source_file ();
-
+  named_temp_file (const char *suffix);
+  ~named_temp_file ();
   const char *get_filename () const { return m_filename; }
 
  private:
   char *m_filename;
 };
 
+/* A class for writing out a temporary sourcefile for use in selftests
+   of input handling.  */
+
+class temp_source_file : public named_temp_file
+{
+ public:
+  temp_source_file (const location &loc, const char *suffix,
+		    const char *content);
+};
+
 /* Various selftests involving location-handling require constructing a
    line table and one or more line maps within it.