y2ktmo.c revision 677833bc953b6cb418c701facbdcf4aa18d6c44e
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Netscape Portable Runtime (NSPR).
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1999-2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
/*
* Test: y2ktmo
*
* Description:
* This test tests the interval time facilities in NSPR for Y2K
* compliance. All the functions that take a timeout argument
* are tested: PR_Sleep, socket I/O (PR_Accept is taken as a
* representative), PR_Poll, PR_WaitCondVar, PR_Wait, and
* PR_CWait. A thread of each thread scope (local, global, and
* global bound) is created to call each of these functions.
* The test should be started at the specified number of seconds
* (called the lead time) before a Y2K rollover test date. The
* timeout values for these threads will span over the rollover
* date by at least the specified number of seconds. For
* example, if the lead time is 5 seconds, the test should
* be started at time (D - 5), where D is a rollover date, and
* the threads will time out at or after time (D + 5). The
* timeout values for the threads are spaced one second apart.
*
* When a thread times out, it calls PR_IntervalNow() to verify
* that it did wait for the specified time. In addition, it
* calls a platform-native function to verify the actual elapsed
* time again, to rule out the possibility that PR_IntervalNow()
* is broken. We allow the actual elapsed time to deviate from
* the specified timeout by a certain tolerance (in milliseconds).
*/
#include "nspr.h"
#include "plgetopt.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(XP_UNIX)
#endif
#if defined(WIN32)
#endif
#define DEFAULT_LEAD_TIME_SECS 5
#define DEFAULT_TOLERANCE_MSECS 500
static PRIntervalTime start_time;
static PRIntervalTime tolerance;
#if defined(XP_UNIX)
static struct timeval start_time_tv;
#endif
#if defined(WIN32)
static struct _timeb start_time_tb;
#endif
static void SleepThread(void *arg)
{
#endif
#if defined(XP_UNIX)
struct timeval end_time_tv;
#endif
#if defined(WIN32)
struct _timeb end_time_tb;
#endif
exit(1);
}
exit(1);
}
#if defined(XP_UNIX)
#endif
#if defined(WIN32)
#endif
exit(1);
}
#endif
if (debug_mode) {
}
}
static void AcceptThread(void *arg)
{
#endif
#if defined(XP_UNIX)
struct timeval end_time_tv;
#endif
#if defined(WIN32)
struct _timeb end_time_tb;
#endif
sock = PR_NewTCPSocket();
exit(1);
}
exit(1);
}
exit(1);
}
exit(1);
}
exit(1);
}
#if defined(XP_UNIX)
#endif
#if defined(WIN32)
#endif
exit(1);
}
#endif
exit(1);
}
if (debug_mode) {
}
}
static void PollThread(void *arg)
{
#endif
#if defined(XP_UNIX)
struct timeval end_time_tv;
#endif
#if defined(WIN32)
struct _timeb end_time_tb;
#endif
sock = PR_NewTCPSocket();
exit(1);
}
exit(1);
}
exit(1);
}
if (rv != 0) {
exit(1);
}
exit(1);
}
#if defined(XP_UNIX)
#endif
#if defined(WIN32)
#endif
exit(1);
}
#endif
exit(1);
}
if (debug_mode) {
}
}
static void WaitCondVarThread(void *arg)
{
#endif
#if defined(XP_UNIX)
struct timeval end_time_tv;
#endif
#if defined(WIN32)
struct _timeb end_time_tb;
#endif
ml = PR_NewLock();
exit(1);
}
exit(1);
}
exit(1);
}
#if defined(XP_UNIX)
#endif
#if defined(WIN32)
#endif
exit(1);
}
#endif
if (debug_mode) {
}
}
static void WaitMonitorThread(void *arg)
{
#endif
#if defined(XP_UNIX)
struct timeval end_time_tv;
#endif
#if defined(WIN32)
struct _timeb end_time_tb;
#endif
mon = PR_NewMonitor();
exit(1);
}
exit(1);
}
#if defined(XP_UNIX)
#endif
#if defined(WIN32)
#endif
exit(1);
}
#endif
if (debug_mode) {
}
}
static void WaitCMonitorThread(void *arg)
{
#endif
#if defined(XP_UNIX)
struct timeval end_time_tv;
#endif
#if defined(WIN32)
struct _timeb end_time_tb;
#endif
int dummy;
exit(1);
}
#if defined(XP_UNIX)
#endif
#if defined(WIN32)
#endif
exit(1);
}
#endif
if (debug_mode) {
}
}
typedef void (*NSPRThreadFunc)(void*);
static NSPRThreadFunc threadFuncs[] = {
static PRThreadScope threadScopes[] = {
static void Help(void)
{
} /* Help */
{
int i, j;
int idx;
if (PL_OPT_BAD == os) continue;
case 'd': /* debug mode */
break;
case 'l': /* lead time */
break;
case 't': /* tolerance */
break;
case 'h':
default:
Help();
return 2;
}
}
if (debug_mode) {
}
start_time = PR_IntervalNow();
#if defined(XP_UNIX)
#endif
#if defined(WIN32)
#endif
exit(1);
}
/* start to time out 5 seconds after a rollover date */
idx = 0;
for (i = 0; i < num_thread_scopes; i++) {
for (j = 0; j < num_thread_funcs; j++) {
threadScopes[i], PR_JOINABLE_THREAD, 0);
exit(1);
}
secs++;
idx++;
}
}
exit(1);
}
}
printf("PASS\n");
return 0;
}