#ifndef GLIB_DISABLE_DEPRECATION_WARNINGS
#define GLIB_DISABLE_DEPRECATION_WARNINGS
#endif

#include <glib.h>
#include <string.h>
#include <glib/gstdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

#ifdef G_OS_UNIX
#include <unistd.h>
#endif
#ifdef G_OS_WIN32
#include <io.h>
#endif

static void
test_basic (void)
{
  GMappedFile *file;
  GError *error;

  error = NULL;
  file = g_mapped_file_new (g_test_get_filename (G_TEST_DIST, "empty", NULL), FALSE, &error);
  g_assert_no_error (error);

  g_mapped_file_ref (file);
  g_mapped_file_unref (file);

  g_mapped_file_unref (file);
}

static void
test_empty (void)
{
  GMappedFile *file;
  GError *error;

  error = NULL;
  file = g_mapped_file_new (g_test_get_filename (G_TEST_DIST, "empty", NULL), FALSE, &error);
  g_assert_no_error (error);

  g_assert_null (g_mapped_file_get_contents (file));

  g_mapped_file_free (file);
}

#ifdef G_OS_UNIX
static void
test_device (void)
{
  GError *error = NULL;
  GMappedFile *file;

  file = g_mapped_file_new ("/dev/null", FALSE, &error);
  g_assert_true (g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_INVAL) ||
                 g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NODEV) ||
                 g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOMEM));
  g_assert_null (file);
  g_error_free (error);
}
#endif

static void
test_nonexisting (void)
{
  GMappedFile *file;
  GError *error;

  error = NULL;
  file = g_mapped_file_new ("no-such-file", FALSE, &error);
  g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT);
  g_clear_error (&error);
  g_assert_null (file);
}

static void
test_writable (void)
{
  GMappedFile *file;
  GError *error = NULL;
  gchar *contents;
  gsize len;
  const gchar *old = "MMMMMMMMMMMMMMMMMMMMMMMMM";
  const gchar *new = "abcdefghijklmnopqrstuvxyz";
  gchar *tmp_copy_path;

  tmp_copy_path = g_build_filename (g_get_tmp_dir (), "glib-test-4096-random-bytes", NULL);

  g_file_get_contents (g_test_get_filename (G_TEST_DIST, "4096-random-bytes", NULL), &contents, &len, &error);
  g_assert_no_error (error);
  g_file_set_contents (tmp_copy_path, contents, len, &error);
  g_assert_no_error (error);
  
  g_free (contents);

  file = g_mapped_file_new (tmp_copy_path, TRUE, &error);
  g_assert_no_error (error);

  contents = g_mapped_file_get_contents (file);
  g_assert_cmpuint (strncmp (contents, old, strlen (old)), ==, 0);

  memcpy (contents, new, strlen (new));
  g_assert_cmpuint (strncmp (contents, new, strlen (new)), ==, 0);

  g_mapped_file_free (file);

  error = NULL;
  file = g_mapped_file_new (tmp_copy_path, FALSE, &error);
  g_assert_no_error (error);

  contents = g_mapped_file_get_contents (file);
  g_assert_cmpuint (strncmp (contents, old, strlen (old)), ==, 0);

  g_mapped_file_free (file);

  g_free (tmp_copy_path);
}

static void
test_writable_fd (void)
{
  GMappedFile *file;
  GError *error = NULL;
  gchar *contents;
  const gchar *old = "MMMMMMMMMMMMMMMMMMMMMMMMM";
  const gchar *new = "abcdefghijklmnopqrstuvxyz";
  gsize len;
  int fd;
  gchar *tmp_copy_path;

  tmp_copy_path = g_build_filename (g_get_tmp_dir (), "glib-test-4096-random-bytes", NULL);

  g_file_get_contents (g_test_get_filename (G_TEST_DIST, "4096-random-bytes", NULL), &contents, &len, &error);
  g_assert_no_error (error);
  g_file_set_contents (tmp_copy_path, contents, len, &error);
  g_assert_no_error (error);
  
  g_free (contents);

  fd = g_open (tmp_copy_path, O_RDWR, 0);
  g_assert_cmpint (fd, !=, -1);
  file = g_mapped_file_new_from_fd (fd, TRUE, &error);
  g_assert_no_error (error);

  contents = g_mapped_file_get_contents (file);
  g_assert_cmpuint (strncmp (contents, old, strlen (old)), ==, 0);

  memcpy (contents, new, strlen (new));
  g_assert_cmpuint (strncmp (contents, new, strlen (new)), ==, 0);

  g_mapped_file_free (file);
  close (fd);

  error = NULL;
  fd = g_open (tmp_copy_path, O_RDWR, 0);
  g_assert_cmpint (fd, !=, -1);
  file = g_mapped_file_new_from_fd (fd, TRUE, &error);
  g_assert_no_error (error);

  contents = g_mapped_file_get_contents (file);
  g_assert_cmpuint (strncmp (contents, old, strlen (old)), ==, 0);

  g_mapped_file_free (file);

  g_free (tmp_copy_path);
}

static void
test_gbytes (void)
{
  GMappedFile *file;
  GBytes *bytes;
  GError *error;

  error = NULL;
  file = g_mapped_file_new (g_test_get_filename (G_TEST_DIST, "empty", NULL), FALSE, &error);
  g_assert_no_error (error);

  bytes = g_mapped_file_get_bytes (file);
  g_mapped_file_unref (file);

  g_assert_cmpint (g_bytes_get_size (bytes), ==, 0);
  g_bytes_unref (bytes);
}

int
main (int argc, char *argv[])
{
  g_test_init (&argc, &argv, NULL);

  g_test_add_func ("/mappedfile/basic", test_basic);
  g_test_add_func ("/mappedfile/empty", test_empty);
#ifdef G_OS_UNIX
  g_test_add_func ("/mappedfile/device", test_device);
#endif
  g_test_add_func ("/mappedfile/nonexisting", test_nonexisting);
  g_test_add_func ("/mappedfile/writable", test_writable);
  g_test_add_func ("/mappedfile/writable_fd", test_writable_fd);
  g_test_add_func ("/mappedfile/gbytes", test_gbytes);

  return g_test_run ();
}
