kerneltest/e32test/prime/t_semutx.cpp
branchRCL_3
changeset 28 5b5d147c7838
parent 0 a41df078684a
child 43 c1f20ce4abcf
--- a/kerneltest/e32test/prime/t_semutx.cpp	Tue May 11 17:28:22 2010 +0300
+++ b/kerneltest/e32test/prime/t_semutx.cpp	Tue May 25 14:09:55 2010 +0300
@@ -38,7 +38,10 @@
 // 
 //
 
+#define __E32TEST_EXTENSION__
 #include <e32test.h>
+#include <u32std.h>
+#include <e32svr.h>
 
 const TInt KMaxBufferSize=10;
 const TInt KMaxArraySize=10;
@@ -221,7 +224,7 @@
 void StartWaitSemThread(RThread& aT, SWaitSem& aW, TThreadPriority aP=EPriorityLess)
 	{
 	TInt r = aT.Create(KNullDesC, &WaitSemThread, 0x1000, 0x1000, 0x1000, &aW);
-	test(r==KErrNone);
+	test_KErrNone(r);
 	aT.SetPriority(aP);
 	aT.Resume();
 	}
@@ -231,9 +234,9 @@
 	TRequestStatus s;
 	aT.Logon(s);
 	User::WaitForRequest(s);
-	test(aT.ExitType()==EExitKill);
-	test(aT.ExitReason()==aResult);
-	test(s.Int()==aResult);
+	test_Equal(EExitKill, aT.ExitType());
+	test_Equal(aResult, aT.ExitReason());
+	test_Equal(aResult, s.Int());
 	CLOSE_AND_WAIT(aT);
 	}
 
@@ -251,7 +254,7 @@
 	TTime final;
 	TInt elapsed=0;
 	TInt r = ws.iSem.CreateLocal(0);
-	test(r==KErrNone);
+	test_KErrNone(r);
 
 	RThread().SetPriority(EPriorityAbsoluteVeryLow);
 	TInt threadcount=0;
@@ -259,7 +262,7 @@
 	while (elapsed<1000000)
 		{
 		r = t.Create(KNullDesC, &DummyThread, 0x1000, NULL, NULL);
-		test(r==KErrNone);
+		test_KErrNone(r);
 		t.SetPriority(EPriorityMore);
 		t.Resume();
 		t.Close();
@@ -307,7 +310,7 @@
 	User::After(200000);
 	t.Resume();
 	WaitForWaitSemThread(t, KErrTimedOut);
-	test(ws.iSem.Wait(1)==KErrNone);
+	test_KErrNone(ws.iSem.Wait(1));
 
 	ws.iTimeout=100000;
 	StartWaitSemThread(t, ws, EPriorityMore);
@@ -316,7 +319,7 @@
 	User::After(50000);
 	t.Resume();
 	WaitForWaitSemThread(t, KErrNone);
-	test(ws.iSem.Wait(1)==KErrTimedOut);
+	test_Equal(KErrTimedOut, ws.iSem.Wait(1));
 
 	RThread t2;
 	ws.iTimeout=100000;
@@ -324,12 +327,12 @@
 	StartWaitSemThread(t2, ws, EPriorityMore);
 	t.Suspend();
 	ws.iSem.Signal();
-	test(t2.ExitType()==EExitKill);
-	test(t.ExitType()==EExitPending);
+	test_Equal(EExitKill, t2.ExitType());
+	test_Equal(EExitPending, t.ExitType());
 	t.Resume();
 	WaitForWaitSemThread(t, KErrTimedOut);
 	WaitForWaitSemThread(t2, KErrNone);
-	test(ws.iSem.Wait(1)==KErrTimedOut);
+	test_Equal(KErrTimedOut, ws.iSem.Wait(1));
 
 	ws.iTimeout=1000000;
 	initial.HomeTime();
@@ -376,11 +379,11 @@
 	initial.HomeTime();
 	StartWaitSemThread(t, ws, EPriorityMore);
 	StartWaitSemThread(t2, ws, EPriorityMuchMore);
-	test(t.ExitType()==EExitPending);
-	test(t2.ExitType()==EExitPending);
+	test_Equal(EExitPending, t.ExitType());
+	test_Equal(EExitPending, t2.ExitType());
 	ws.iSem.Close();
-	test(t.ExitType()==EExitKill);
-	test(t2.ExitType()==EExitKill);
+	test_Equal(EExitKill, t.ExitType());
+	test_Equal(EExitKill, t2.ExitType());
 	WaitForWaitSemThread(t2, KErrGeneral);
 	WaitForWaitSemThread(t, KErrGeneral);
 	final.HomeTime();
@@ -414,23 +417,23 @@
 	test.Next(_L("Producer/Consumer scenario"));
 	// Test Rsemaphore with the producer/consumer scenario	RThread thread1, thread2;
 	TRequestStatus stat1, stat2;
-	test(mutex.CreateLocal()==KErrNone);
-	test(slotAvailable.CreateLocal(KMaxBufferSize)==KErrNone);
-	test(itemAvailable.CreateLocal(0)==KErrNone);
-	test(thread1.Create(_L("Thread1"),Producer,KDefaultStackSize,0x200,0x200,NULL)==KErrNone);
-	test(thread2.Create(_L("Thread2"),Consumer,KDefaultStackSize,0x200,0x200,NULL)==KErrNone);
+	test_KErrNone(mutex.CreateLocal());
+	test_KErrNone(slotAvailable.CreateLocal(KMaxBufferSize));
+	test_KErrNone(itemAvailable.CreateLocal(0));
+	test_KErrNone(thread1.Create(_L("Thread1"),Producer,KDefaultStackSize,0x200,0x200,NULL));
+	test_KErrNone(thread2.Create(_L("Thread2"),Consumer,KDefaultStackSize,0x200,0x200,NULL));
 	thread1.Logon(stat1);
 	thread2.Logon(stat2);
-	test(stat1==KRequestPending);
-	test(stat2==KRequestPending);
+	test_Equal(KRequestPending, stat1.Int());
+	test_Equal(KRequestPending, stat2.Int());
 	thread1.Resume(); 
 	thread2.Resume();
 	User::WaitForRequest(stat1);
 	User::WaitForRequest(stat2);
-	test(stat1==KErrNone);
-	test(stat2==KErrNone);
+	test_KErrNone(stat1.Int());
+	test_KErrNone(stat2.Int());
 	for(TInt jj=0;jj<KNumProducerItems;jj++)
-		test(consumerArray[jj]==jj);		
+		test_Equal(jj, consumerArray[jj]);		
 	
 	test.Next(_L("Close"));
 	mutex.Close();
@@ -443,7 +446,7 @@
 	{
 	RMutex m;
 	test.Start(_L("Create"));
-	test(m.CreateLocal()==KErrNone);
+	test_KErrNone(m.CreateLocal());
 
 	// Test RMutex::IsHeld()
 	test.Next(_L("IsHeld ?"));
@@ -463,7 +466,7 @@
 void TestMutex()
 	{
 	test.Start(_L("Create"));
-	test(mutex.CreateLocal()==KErrNone);
+	test_KErrNone(mutex.CreateLocal());
 	
 	test.Next(_L("Threads writing to arrays test"));
 //
@@ -477,19 +480,19 @@
 //
 	arrayIndex=0;
 	RThread thread1,thread2;	
-	test(thread1.Create(_L("Thread1"),MutexThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone);
-	test(thread2.Create(_L("Thread2"),MutexThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone);			 
+	test_KErrNone(thread1.Create(_L("Thread1"),MutexThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL));
+	test_KErrNone(thread2.Create(_L("Thread2"),MutexThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL));			 
 	TRequestStatus stat1,stat2;
 	thread1.Logon(stat1);
 	thread2.Logon(stat2);
-	test(stat1==KRequestPending);
-	test(stat2==KRequestPending);
+	test_Equal(KRequestPending, stat1.Int());
+	test_Equal(KRequestPending, stat2.Int());
 	thread1.Resume(); 
 	thread2.Resume();
 	User::WaitForRequest(stat1);
 	User::WaitForRequest(stat2);
-	test(stat1==KErrNone);
-	test(stat2==KErrNone); 
+	test_KErrNone(stat1.Int());
+	test_KErrNone(stat2.Int()); 
 	TInt thread1ActualCount=0; 
 	TInt thread2ActualCount=0;
 	TInt ii=0;
@@ -502,10 +505,10 @@
 		ii++;
 		}
 	test.Printf(_L("T1 %d T1ACT %d T2 %d T2ACT %d"),thread1Count,thread1ActualCount,thread2Count,thread2ActualCount);
-	test(thread1ActualCount==thread1Count);
-	test(thread2ActualCount==thread2Count);
-	test(thread1Count==thread2Count);
-	test(thread1Count==(KMaxArraySize>>1));
+	test_Equal(thread1Count, thread1ActualCount);
+	test_Equal(thread2Count, thread2ActualCount);
+	test_Equal(thread2Count, thread1Count);
+	test_Equal((KMaxArraySize>>1), thread1Count);
 	
 	test.Next(_L("Close"));
 	CLOSE_AND_WAIT(thread1);
@@ -521,7 +524,7 @@
 	{
 	
 	test.Start(_L("Create"));
-	test(criticalSn.CreateLocal()==KErrNone);
+	test_KErrNone(criticalSn.CreateLocal());
 
 /***************** TO DO ***********************
 
@@ -551,19 +554,19 @@
 //
 	arrayIndex=0;
 	RThread thread1,thread2;	
-	test(thread1.Create(_L("Thread1"),CriticalSnThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone);
-	test(thread2.Create(_L("Thread2"),CriticalSnThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL)==KErrNone);			 
+	test_KErrNone(thread1.Create(_L("Thread1"),CriticalSnThreadEntryPoint1,KDefaultStackSize,0x2000,0x2000,NULL));
+	test_KErrNone(thread2.Create(_L("Thread2"),CriticalSnThreadEntryPoint2,KDefaultStackSize,0x2000,0x2000,NULL));			 
 	TRequestStatus stat1,stat2;
 	thread1.Logon(stat1);
 	thread2.Logon(stat2);
-	test(stat1==KRequestPending);
-	test(stat2==KRequestPending);
+	test_Equal(KRequestPending, stat1.Int());
+	test_Equal(KRequestPending, stat2.Int());
 	thread1.Resume(); 
 	thread2.Resume();
 	User::WaitForRequest(stat1);
 	User::WaitForRequest(stat2);
-	test(stat1==KErrNone);
-	test(stat2==KErrNone); 
+	test_KErrNone(stat1.Int());
+	test_KErrNone(stat2.Int()); 
 	TInt thread1ActualCount=0; 
 	TInt thread2ActualCount=0;
 	TInt ii=0;
@@ -575,10 +578,10 @@
 			thread2ActualCount++;
 		ii++;
 		}
-	test(thread1ActualCount==thread1Count);
-	test(thread2ActualCount==thread2Count);
-	test(thread1Count==thread2Count);
-	test(thread1Count==(KMaxArraySize>>1));
+	test_Equal(thread1Count, thread1ActualCount);
+	test_Equal(thread2Count, thread2ActualCount);
+	test_Equal(thread2Count, thread1Count);
+	test_Equal((KMaxArraySize>>1), thread1Count);
 
 	test.Next(_L("Close"));
 	CLOSE_AND_WAIT(thread1);
@@ -590,6 +593,16 @@
 
 GLDEF_C TInt E32Main()
 	{	
+	TInt cpus = UserSvr::HalFunction(EHalGroupKernel, EKernelHalNumLogicalCpus, 0, 0);
+	if (cpus != 1)
+		{
+		test(cpus>1);
+		// This test will require compatibility mode (and probably other changes)
+		// to work on SMP - it depends on explicit scheduling order.
+		test.Printf(_L("T_SEMUTX skipped, does not work on SMP\n"));
+		return KErrNone;
+		}	
+	
 
 	test.Title();
  	__UHEAP_MARK;