diff mbox series

[v2] Add support/ code for checking file contents

Message ID 7b92f80-3281-78c0-c674-1628498ab1ef@redhat.com
State New
Headers show
Series [v2] Add support/ code for checking file contents | expand

Commit Message

Joseph Myers Sept. 2, 2024, 9:50 p.m. UTC
On Mon, 2 Sep 2024, Florian Weimer wrote:

> The support/ changes should be in a separate commit, so that we can
> backport them independently if necessary.

Split out here.

> > +/* Check that an already-open file has exactly the given bytes,
> > +   starting at the current offset.  */
> > +int support_compare_file_bytes (FILE *fp, const char *contents, size_t length);
> 
> The comment should say if the file position indicator is updated or not.
> Missing description of the sense of the return value (0 apparently means
> equal, 1 means unequal or read error).  Should this report read errors
> via process termination?

I've updated various comments as indicated.  I'm wary of reporting read 
errors via process termination at this level of nesting (they wouldn't say 
anything much useful about which subtest was executing at the time of the 
error, unless the interfaces are changed to pass in __FILE__ and __LINE__ 
- an advantage of detecting them the same as comparison failures, in the 
caller, is that this means better diagnostics).

I did make the code treat a read error when EOF is expected the same as a 
comparison failure.



Add support/ code for checking file contents

For use in freopen tests, add various support/ helper interfaces for
use in checking file contents.

Tested for x86_64.

---

Changed in v2: split out from freopen tests; expanded / improved
comments documenting interfaces; fail comparison if a read error
occurs when EOF is expected.

Comments

Florian Weimer Sept. 3, 2024, 7:57 a.m. UTC | #1
* Joseph Myers:

> I've updated various comments as indicated.  I'm wary of reporting read 
> errors via process termination at this level of nesting (they wouldn't say 
> anything much useful about which subtest was executing at the time of the 
> error, unless the interfaces are changed to pass in __FILE__ and __LINE__ 
> - an advantage of detecting them the same as comparison failures, in the 
> caller, is that this means better diagnostics).

Good point, makes sense.

> I did make the code treat a read error when EOF is expected the same as a 
> comparison failure.
>
>
>
> Add support/ code for checking file contents
>
> For use in freopen tests, add various support/ helper interfaces for
> use in checking file contents.
>
> Tested for x86_64.

This version looks good to me, thanks.

Reviewed-by: Florian Weimer <fweimer@redhat.com>

Florian
diff mbox series

Patch

diff --git a/support/Makefile b/support/Makefile
index 6e3c55394f..26bd3d38e4 100644
--- a/support/Makefile
+++ b/support/Makefile
@@ -49,6 +49,8 @@  libsupport-routines = \
   support_check_stat_fd \
   support_check_stat_path \
   support_chroot \
+  support_compare_file_bytes \
+  support_compare_file_string \
   support_copy_file \
   support_copy_file_range \
   support_create_timer \
@@ -65,6 +67,8 @@  libsupport-routines = \
   support_isolate_in_subprocess \
   support_mutex_pi_monotonic \
   support_need_proc \
+  support_open_and_compare_file_bytes \
+  support_open_and_compare_file_string \
   support_openpty \
   support_path_support_time64 \
   support_paths \
diff --git a/support/file_contents.h b/support/file_contents.h
new file mode 100644
index 0000000000..9b2d750aae
--- /dev/null
+++ b/support/file_contents.h
@@ -0,0 +1,63 @@ 
+/* Functionality for checking file contents.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#ifndef SUPPORT_FILE_CONTENTS_H
+#define SUPPORT_FILE_CONTENTS_H
+
+#include <support/check.h>
+#include <stdio.h>
+
+__BEGIN_DECLS
+
+/* Check that an already-open file has exactly the given bytes,
+   starting at the current location in the file.  The file position
+   indicator is updated to point after the bytes compared.  Return 0
+   if equal, 1 otherwise or on read error.  */
+int support_compare_file_bytes (FILE *fp, const char *contents, size_t length);
+
+/* Check that an already-open file has exactly the given string as
+   contents, starting at the current offset.  The file position
+   indicator is updated to point after the bytes compared.  Return 0
+   if equal, 1 otherwise or on read error.  */
+int support_compare_file_string (FILE *fp, const char *contents);
+
+/* Check that a not-currently-open file has exactly the given bytes.
+   Return 0 if equal, 1 otherwise or on read error.  */
+int support_open_and_compare_file_bytes (const char *file,
+					 const char *contents,
+					 size_t length);
+
+/* Check that a not-currently-open file has exactly the given string
+   as contents, starting at the current offset.  Return 0 if equal, 1
+   otherwise or on read error.  */
+int support_open_and_compare_file_string (const char *file,
+					  const char *contents);
+
+/* Compare bytes read from an open file with the given string.  The
+   file position indicator is updated to point after the bytes
+   compared.  */
+#define TEST_COMPARE_FILE_STRING(FP, CONTENTS)			\
+  TEST_COMPARE (support_compare_file_string (FP, CONTENTS), 0)
+
+/* Read a file and compare bytes read from it with the given string.  */
+#define TEST_OPEN_AND_COMPARE_FILE_STRING(FILE, CONTENTS)		\
+  TEST_COMPARE (support_open_and_compare_file_string (FILE, CONTENTS), 0)
+
+__END_DECLS
+
+#endif /* SUPPORT_FILE_CONTENTS_H */
diff --git a/support/support_compare_file_bytes.c b/support/support_compare_file_bytes.c
new file mode 100644
index 0000000000..e261e1da8f
--- /dev/null
+++ b/support/support_compare_file_bytes.c
@@ -0,0 +1,42 @@ 
+/* Compare bytes from an open file.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+
+#include <support/file_contents.h>
+
+/* Check that an already-open file has exactly the given bytes,
+   starting at the current offset.  */
+
+int
+support_compare_file_bytes (FILE *fp, const char *contents, size_t length)
+{
+  int c;
+  while (length > 0)
+    {
+      c = getc (fp);
+      if (c == EOF || (unsigned char) c != (unsigned char) contents[0])
+	return 1;
+      contents++;
+      length--;
+    }
+  c = getc (fp);
+  if (c != EOF || ferror (fp))
+    return 1;
+  return 0;
+}
diff --git a/support/support_compare_file_string.c b/support/support_compare_file_string.c
new file mode 100644
index 0000000000..04513c3af1
--- /dev/null
+++ b/support/support_compare_file_string.c
@@ -0,0 +1,28 @@ 
+/* Compare string from an open file.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <support/file_contents.h>
+
+int
+support_compare_file_string (FILE *fp, const char *contents)
+{
+  return support_compare_file_bytes (fp, contents, strlen (contents));
+}
diff --git a/support/support_open_and_compare_file_bytes.c b/support/support_open_and_compare_file_bytes.c
new file mode 100644
index 0000000000..f804ed8e46
--- /dev/null
+++ b/support/support_open_and_compare_file_bytes.c
@@ -0,0 +1,33 @@ 
+/* Compare bytes from a file.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <support/file_contents.h>
+#include <support/xstdio.h>
+
+/* Check that a not-currently-open file has exactly the given
+   bytes.  */
+
+int
+support_open_and_compare_file_bytes (const char *file, const char *contents,
+				     size_t length)
+{
+  FILE *fp = xfopen (file, "r");
+  int ret = support_compare_file_bytes (fp, contents, length);
+  xfclose (fp);
+  return ret;
+}
diff --git a/support/support_open_and_compare_file_string.c b/support/support_open_and_compare_file_string.c
new file mode 100644
index 0000000000..2b596d4c88
--- /dev/null
+++ b/support/support_open_and_compare_file_string.c
@@ -0,0 +1,32 @@ 
+/* Compare string from a file.
+   Copyright (C) 2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <string.h>
+
+#include <support/file_contents.h>
+#include <support/xstdio.h>
+
+/* Check that a not-currently-open file has exactly the given string
+   as contents, starting at the current offset.  */
+
+int
+support_open_and_compare_file_string (const char *file, const char *contents)
+{
+  return support_open_and_compare_file_bytes (file, contents,
+					      strlen (contents));
+}