Home | History | Annotate | Download | only in deutil
      1 /*-------------------------------------------------------------------------
      2  * drawElements Utility Library
      3  * ----------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Periodic timer test.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "deTimerTest.h"
     25 
     26 #include "deTimer.h"
     27 #include "deRandom.h"
     28 #include "deThread.h"
     29 
     30 #include <stdio.h>
     31 
     32 static void timerCallback (void* arg)
     33 {
     34 	volatile int* numCalls = (volatile int*)arg;
     35 	++(*numCalls);
     36 }
     37 
     38 void deTimer_selfTest (void)
     39 {
     40 	const int		numIters				= 25;
     41 	const int		minInterval				= 1;
     42 	const int		maxInterval				= 100;
     43 	const int		intervalSleepMultiplier	= 5;
     44 	int				iter;
     45 	deRandom		rnd;
     46 	deTimer*		timer					= DE_NULL;
     47 	volatile int	numCalls				= 0;
     48 
     49 	deRandom_init(&rnd, 6789);
     50 
     51 	timer = deTimer_create(timerCallback, (void*)&numCalls);
     52 	DE_TEST_ASSERT(timer);
     53 
     54 	for (iter = 0; iter < numIters; iter++)
     55 	{
     56 		deBool	isSingle		= deRandom_getFloat(&rnd) < 0.25f;
     57 		int		interval		= minInterval + (int)(deRandom_getUint32(&rnd) % (deUint32)(maxInterval-minInterval+1));
     58 		int		expectedCalls	= isSingle ? 1 : intervalSleepMultiplier;
     59 		deBool	scheduleOk		= DE_FALSE;
     60 
     61 		printf("Iter %d / %d: %d ms %s timer\n", iter+1, numIters, interval, (isSingle ? "single" : "interval"));
     62 		numCalls = 0;
     63 
     64 		if (isSingle)
     65 			scheduleOk = deTimer_scheduleSingle(timer, interval);
     66 		else
     67 			scheduleOk = deTimer_scheduleInterval(timer, interval);
     68 
     69 		DE_TEST_ASSERT(scheduleOk);
     70 
     71 		deSleep((deUint32)(interval*intervalSleepMultiplier));
     72 		deTimer_disable(timer);
     73 		deSleep((deUint32)interval);
     74 
     75 		printf("  timer fired %d times, expected %d\n", numCalls, expectedCalls);
     76 		DE_TEST_ASSERT(!isSingle || numCalls == 1);
     77 	}
     78 
     79 	deTimer_destroy(timer);
     80 }
     81