/* Test program for POSIX clock_* functions.
   Copyright (C) 2000 Free Software Foundation, Inc.
   This file is part of the GNU C Library.
   Contributed by Ulrich Drepper <drepper@cygnus.com>, 2000.

   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, write to the Free
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   02111-1307 USA.  */

#include <stdio.h>
#include <string.h>
#include <time.h>


/* We want to see output immediately.  */
#define STDOUT_UNBUFFERED

/* We expect to run at least 10 seconds.  */
#define TIMEOUT 15

static int
clock_test (clockid_t cl)
{
  struct timespec old_ts;
  struct timespec ts;
  struct timespec waitit;
  int result = 0;
  int i;

  memset (&ts, '\0', sizeof ts);

  waitit.tv_sec = 0;
  waitit.tv_nsec = 500000000;

  /* Get and print resolution of the clock.  */
  if (clock_getres (cl, &ts) == 0)
    {
      if (ts.tv_nsec < 0 || ts.tv_nsec >= 1000000000)
	{
	  printf ("clock %d: nanosecond value of resolution wrong\n", cl);
	  result = 1;
	}
      else
	printf ("clock %d: resolution = %ld.%09ld secs\n",
		cl, ts.tv_sec, ts.tv_nsec);
    }
  else
    {
      printf ("clock %d: cannot get resolution\n", cl);
      result = 1;
    }

  memset (&ts, '\0', sizeof ts);
  memset (&old_ts, '\0', sizeof old_ts);

  /* Next get the current time value a few times.  */
  for (i = 0; i < 10; ++i)
    {
      if (clock_gettime (cl, &ts) == 0)
	{
	  if (ts.tv_nsec < 0 || ts.tv_nsec >= 1000000000)
	    {
	      printf ("clock %d: nanosecond value of time wrong (try %d)\n",
		      cl, i);
	      result = 1;
	    }
	  else
	    {
	      printf ("clock %d: time = %ld.%09ld secs\n",
		      cl, ts.tv_sec, ts.tv_nsec);

	      if (memcmp (&ts, &old_ts, sizeof ts) == 0)
		{
		  printf ("clock %d: time hasn't changed (try %d)\n", cl, i);
		  result = 1;

		  old_ts = ts;
		}
	    }
	}
      else
	{
	  printf ("clock %d: cannot get time (try %d)\n", cl, i);
	  result = 1;
	}

      /* Wait a bit before the next iteration.  */
      nanosleep (&waitit, NULL);
    }

  return result;
}

static int
do_test (void)
{
  clockid_t cl;
  int result;

  result = clock_test (CLOCK_REALTIME);

  if (clock_getcpuclockid (0, &cl) == 0)
    /* XXX It's not yet a bug when this fails.  */
    clock_test (cl);
  else
	  printf("CPU clock unavailble, skipping test\n");

  return result;
}
#define TEST_FUNCTION do_test ()


#include "../test-skeleton.c"
