summaryrefslogtreecommitdiff
path: root/sal/qa/osl/condition/osl_Condition.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sal/qa/osl/condition/osl_Condition.cxx')
-rw-r--r--sal/qa/osl/condition/osl_Condition.cxx369
1 files changed, 369 insertions, 0 deletions
diff --git a/sal/qa/osl/condition/osl_Condition.cxx b/sal/qa/osl/condition/osl_Condition.cxx
new file mode 100644
index 000000000000..415f17f6a881
--- /dev/null
+++ b/sal/qa/osl/condition/osl_Condition.cxx
@@ -0,0 +1,369 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+ /*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sal.hxx"
+
+//------------------------------------------------------------------------
+// include files
+//------------------------------------------------------------------------
+#include <osl_Condition_Const.h>
+#include <stdlib.h>
+
+using namespace osl;
+using namespace rtl;
+
+
+//------------------------------------------------------------------------
+// helper functions and classes
+//------------------------------------------------------------------------
+
+/** print Boolean value.
+*/
+inline void printBool( sal_Bool bOk )
+{
+ printf("#printBool# " );
+ ( sal_True == bOk ) ? printf("TRUE!\n" ): printf("FALSE!\n" );
+}
+
+/** print a UNI_CODE String.
+*/
+inline void printUString( const ::rtl::OUString & str )
+{
+ rtl::OString aString;
+
+ printf("#printUString_u# " );
+ aString = ::rtl::OUStringToOString( str, RTL_TEXTENCODING_ASCII_US );
+ printf("%s\n", aString.getStr( ) );
+}
+
+enum ConditionType
+{
+ thread_type_set,
+ thread_type_reset,
+ thread_type_wait,
+ thread_type_check
+};
+
+/** thread for testing Condition.
+ */
+class ConditionThread : public Thread
+{
+public:
+ //get the Condition to operate
+ ConditionThread( ::osl::Condition& Con, ConditionType tType): m_MyCon( Con ), m_MyType( tType ) { }
+
+ ~ConditionThread( )
+ {
+ // LLA: do not throw in DTors!
+ // LLA: CPPUNIT_ASSERT_MESSAGE( "#ConditionThread does not shutdown properly.\n", sal_False == this -> isRunning( ) );
+ }
+protected:
+ ::osl::Condition& m_MyCon;
+ ConditionType m_MyType;
+
+ void SAL_CALL run()
+ {
+ switch ( m_MyType )
+ {
+ case thread_type_wait:
+ m_MyCon.wait(); break;
+ case thread_type_set:
+ m_MyCon.set(); break;
+ case thread_type_reset:
+ m_MyCon.reset(); break;
+ default:
+ break;
+ }
+ }
+};
+
+
+//------------------------------------------------------------------------
+// test code start here
+//------------------------------------------------------------------------
+
+namespace osl_Condition
+{
+
+ /** testing the method:
+ Condition()
+ */
+ class ctors : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1;
+
+ void ctors_001( )
+ {
+ ::osl::Condition aCond;
+ bRes = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a condition its initial check state should be sal_False.",
+ sal_False == bRes );
+ }
+
+ void ctors_002( )
+ {
+ ::osl::Condition aCond;
+ aCond.set( );
+ bRes = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a condition and set it.",
+ sal_True == bRes );
+ }
+
+ CPPUNIT_TEST_SUITE( ctors );
+ CPPUNIT_TEST( ctors_001 );
+ CPPUNIT_TEST( ctors_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class ctors
+
+
+ /** testing the method:
+ void set()
+ */
+ class set : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1, bRes2;
+
+ void set_001( )
+ {
+ ::osl::Condition aCond;
+ aCond.set( );
+ bRes = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: check state should be sal_True after set.",
+ sal_True == bRes );
+ }
+
+ void set_002( )
+ {
+ ::osl::Condition aCond;
+ ConditionThread myThread1( aCond, thread_type_wait );
+ myThread1.create();
+ bRes = myThread1.isRunning( );
+
+ ConditionThread myThread2( aCond, thread_type_set );
+ myThread2.create();
+
+ myThread1.join( );
+ bRes1 = myThread1.isRunning( );
+ bRes2 = aCond.check( );
+ myThread2.join( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: use one thread to set the condition in order to release another thread.",
+ sal_True == bRes && sal_False == bRes1 && sal_True == bRes2 );
+ }
+
+
+ CPPUNIT_TEST_SUITE( set );
+ CPPUNIT_TEST( set_001 );
+ CPPUNIT_TEST( set_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class set
+
+
+ /** testing the method:
+ void reset()
+ */
+ class reset : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1, bRes2;
+
+ void reset_001( )
+ {
+ ::osl::Condition aCond;
+ aCond.reset( );
+
+ ConditionThread myThread( aCond, thread_type_wait );
+ myThread.create();
+ bRes = myThread.isRunning( );
+ bRes2 = aCond.check( );
+
+ aCond.set( );
+ myThread.join( );
+ bRes1 = myThread.isRunning( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: wait will cause a reset thread block, use set to release it.",
+ sal_True == bRes && sal_False == bRes1 && sal_False == bRes2 );
+ }
+
+ void reset_002( )
+ {
+ ::osl::Condition aCond;
+ aCond.reset( );
+ bRes = aCond.check( );
+ aCond.set( );
+ bRes1 = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: create a condition and reset/set it.",
+ ( sal_False == bRes && sal_True == bRes1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( reset );
+ CPPUNIT_TEST( reset_001 );
+ CPPUNIT_TEST( reset_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class reset
+
+
+ /** testing the method:
+ Result wait(const TimeValue *pTimeout = 0)
+ */
+ class wait : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1, bRes2;
+ TimeValue *tv1;
+
+ void setUp( )
+ {
+ tv1 = new TimeValue;
+ tv1->Seconds = 1;
+ tv1->Nanosec = 0;
+
+ }
+
+ void tearDown( )
+ {
+ delete tv1;
+ }
+
+
+ void wait_001( )
+ {
+ ::osl::Condition cond1;
+ ::osl::Condition cond2;
+ ::osl::Condition cond3;
+
+ cond1.set();
+ cond2.set();
+
+ osl::Condition::Result r1=cond1.wait(tv1);
+ osl::Condition::Result r2=cond2.wait();
+ osl::Condition::Result r3=cond3.wait(tv1);
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: test three types of wait.",
+ (r1 == ::osl::Condition::result_ok) &&
+ (r2 == ::osl::Condition::result_ok) &&
+ (r3 == ::osl::Condition::result_timeout) );
+ }
+
+ void wait_002( )
+ {
+ ::osl::Condition aCond;
+ ::osl::Condition::Result wRes, wRes1;
+
+ aCond.reset( );
+ bRes = aCond.check( );
+ wRes = aCond.wait( tv1 );
+
+ aCond.set( );
+ wRes1 = aCond.wait( tv1 );
+ bRes1 = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: wait a condition after set/reset.",
+ ( sal_False == bRes ) && ( sal_True == bRes1 ) &&
+ ( ::osl::Condition::result_timeout == wRes ) &&
+ ( ::osl::Condition::result_ok == wRes1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( wait );
+ CPPUNIT_TEST( wait_001 );
+ CPPUNIT_TEST( wait_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class wait
+
+
+ /** testing the method:
+ sal_Bool check()
+ */
+ class check : public CppUnit::TestFixture
+ {
+ public:
+ sal_Bool bRes, bRes1, bRes2;
+
+ void check_001( )
+ {
+ ::osl::Condition aCond;
+
+ aCond.reset( );
+ bRes = aCond.check( );
+ aCond.set( );
+ bRes1 = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: check the condition states.",
+ ( sal_False == bRes && sal_True == bRes1 ) );
+ }
+
+ void check_002( )
+ {
+ ::osl::Condition aCond;
+ aCond.reset( );
+
+ ConditionThread myThread( aCond, thread_type_set );
+ myThread.create( );
+ myThread.join( );
+ bRes = aCond.check( );
+
+ ConditionThread myThread1( aCond, thread_type_reset );
+ myThread1.create( );
+ myThread1.join( );
+ bRes1 = aCond.check( );
+
+ CPPUNIT_ASSERT_MESSAGE( "#test comment#: use threads to set/reset Condition and check it in main routine.",
+ ( sal_True == bRes && sal_False == bRes1 ) );
+ }
+
+ CPPUNIT_TEST_SUITE( check );
+ CPPUNIT_TEST( check_001 );
+ CPPUNIT_TEST( check_002 );
+ CPPUNIT_TEST_SUITE_END( );
+ }; // class check
+
+
+// -----------------------------------------------------------------------------
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Condition::ctors);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Condition::set);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Condition::reset);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Condition::wait);
+CPPUNIT_TEST_SUITE_REGISTRATION(osl_Condition::check);
+// -----------------------------------------------------------------------------
+
+} // namespace osl_Condition
+
+
+// -----------------------------------------------------------------------------
+
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */