diff options
Diffstat (limited to 'Src/Wasabi/wasabitest.cpp')
-rw-r--r-- | Src/Wasabi/wasabitest.cpp | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/Src/Wasabi/wasabitest.cpp b/Src/Wasabi/wasabitest.cpp new file mode 100644 index 00000000..e88775cb --- /dev/null +++ b/Src/Wasabi/wasabitest.cpp @@ -0,0 +1,285 @@ +#include <precomp.h> +#include <api/api.h> +#include <api/apiinit.h> +#include <api/service/svcmgr.h> +#include <api/timer/timerclient.h> +#include <api/timer/timermul.h> +#include <api/xml/xmlreader.h> +#include <bfc/string/bigstring.h> +#include <bfc/string/stringdict.h> + +// This is the Wasabi Library Test Application + +DECLARE_MODULE_SVCMGR + +#define TIMER_TEST_DURATION (MAX_TIMER_DELAY/1000)*4 // We should at least use (MAX_TIMER_DELAY/1000)*2 here so as to test the low speed timer cycle at least twice + +int failed = 0; + +#if defined(WASABI_COMPILE_TIMERS) || defined(WASABI_COMPILE_WND) || defined(WASABI_COMPILE_TEXTMODE) + +int exitpump = 0; + +//------------------------------------------------------------------------------------------- + +void doMessagePump() { + exitpump = 0; + // Despite appearances, this is portable + MSG msg; + while (!exitpump && GetMessage( &msg, NULL, 0, 0 ) ) { +#ifdef WASABI_COMPILE_WND + TranslateMessage( &msg ); +#endif + DispatchMessage( &msg ); + } +} + +//------------------------------------------------------------------------------------------- + +void exitMessagePump() { + exitpump = 1; +} + +#endif + +//------------------------------------------------------------------------------------------- +void fail(const char *module, const char *test) { + failed++; + printf("\n\n*** FAILED *** : %s (%s)\n\n", module, test); + fflush(stdout); +} + +//------------------------------------------------------------------------------------------- + +#ifdef WASABI_COMPILE_TIMERS + +// Multiplexed timers test + +int timer[10]; + +class TestTimer : public TimerClientDI { +public: + TestTimer() { + for (int id = 0; id < 10; id++) { + timer[id] = 0; + timerclient_setTimer(id+1, id*100+100); + } + } + virtual ~TestTimer() { + for (int id = 0; id < 10; id++) { + timerclient_killTimer(id+1); + } + } + virtual void timerclient_timerCallback(int id) { + if (id >= 1 && id <= 10) { + timer[id-1]+=timerclient_getSkipped()+1; + if (id == 1 || id == 10) { + printf("\r"); + for (int i = 0; i < 10; i++) { + if (i > 0) printf(" | "); + printf("%d:%3d", i+1, timer[i]); + } + fflush(stdout); + } + if (id == 10 && timer[id-1] >= TIMER_TEST_DURATION) + exitMessagePump(); + } + } +}; +#endif + +//------------------------------------------------------------------------------------------- +#ifdef WASABI_COMPILE_XMLPARSER +// Xml parser test +enum XML_TEST_TAGS { + XML_TEST_ROOT, + XML_TEST_TEST1, + XML_TEST_TEST2, +}; + +BEGIN_STRINGDICTIONARY(_XMLTESTTAGS); +SDI("WasabiTest", XML_TEST_ROOT); +SDI("Test1", XML_TEST_TEST1); +SDI("Test2", XML_TEST_TEST2); +END_STRINGDICTIONARY(_XMLTESTTAGS, xmltesttags); + +class XmlTest : public XmlReaderCallbackI { +public: + XmlTest() : m_failed(0), m_inroot(0), m_intest1(0), m_intest2(0) { + BigString str; + str += "buf:"; + str += "<WasabiTest>\n"; + str += " <Test1>success</Test1>\n"; + str += " <Test2 result=\"success\"/>\n"; + str += "</WasabiTest>\n"; + XmlReader::registerCallback("*", static_cast<api_xmlreadercallback*>(this)); + XmlReader::loadFile(str, NULL, static_cast<api_xmlreadercallback*>(this)); + XmlReader::unregisterCallback(static_cast<api_xmlreadercallback*>(this)); + } + virtual ~XmlTest() { + } + virtual int xmlReaderDisplayErrors() { return 0; } + virtual void xmlReaderOnError(const char *filename, int linenum, const char *incpath, int errcode, const char *errstr) { + fail("XML TEST", "Parse error"); + } + virtual void xmlReaderOnStartElementCallback(const char *xmlpath, const char *xmltag, api_xmlreaderparams *params) { + switch (xmltesttags.getId(xmltag)) { + case XML_TEST_ROOT: + m_inroot++; + printf(" <WasabiTest>\n"); + fflush(stdout); + break; + case XML_TEST_TEST1: + m_intest1++; + printf(" <Test1>\n"); + fflush(stdout); + break; + case XML_TEST_TEST2: + m_intest2++; + printf(" <Test2\n"); + int _failed = 0; + for (int i=0;i<params->getNbItems();i++) { + printf(" %s = \"%s\"\n", params->getItemName(i), params->getItemValue(i)); + if (i == 1) { + if (!STRCASEEQLSAFE(params->getItemValue(i), "success")) _failed = 1; + if (!STRCASEEQLSAFE(params->getItemName(i), "result")) _failed = 1; + } + } + if (_failed) { + m_failed = 1; + fail("XML PARSER", "Not receiving the right params in Test2"); + } + fflush(stdout); + break; + } + } + virtual void xmlReaderOnEndElementCallback(const char *xmlpath, const char *xmltag) { + switch (xmltesttags.getId(xmltag)) { + case XML_TEST_ROOT: + m_inroot--; + printf(" </WasabiTest>\n"); + fflush(stdout); + break; + case XML_TEST_TEST1: + m_intest1--; + printf(" </Test1>\n"); + fflush(stdout); + break; + case XML_TEST_TEST2: + m_intest2--; + printf(" />\n"); + fflush(stdout); + break; + } + } + virtual void xmlReaderOnCharacterDataCallback(const char *xmlpath, const char *xmltag, const char *str) { + if (m_intest1) { + printf(" Character Data reads \"%s\"\n", str); + if (!STRCASEEQL(str, "success")) { + m_failed = 1; + fail("XML PARSER", "Not receiving the right character data in Test1"); + } + fflush(stdout); + } + } + int didFail() { return m_failed; } +private: + int m_failed; + int m_inroot; + int m_intest1; + int m_intest2; +}; + +#endif +//------------------------------------------------------------------------------------------- + +// 03F73CE0-987D-46fd-B2E3-DBB364A47F54 +static const GUID myappguid = { 0x3f73ce0, 0x987d, 0x46fd, { 0xb2, 0xe3, 0xdb, 0xb3, 0x64, 0xa4, 0x7f, 0x54 }}; + +int main(int argc, char **argv) { + printf("-------------------------------------------------------------------------------\n"); + printf("Initializing Wasabi API.\n"); + printf("-------------------------------------------------------------------------------\n"); + fflush(stdout); + + ApiInit::init((HINSTANCE)0, myappguid, "", (HWND)NULL); + + printf("\n- PASSED -\n\n"); + fflush(stdout); + + // Rudimentary svcmgr test: enumerate services + printf("-------------------------------------------------------------------------------\n"); + printf("Testing service manager.\n"); + printf("-------------------------------------------------------------------------------\n\n"); + int n=ServiceManager::getNumServicesByGuid(); + printf("Services running : %d\n\n", n); + fflush(stdout); + int i; + for (i=0;i<n;i++) { + waServiceFactory *factory = ServiceManager::enumService(i); + char sguid[256]; + nsGUID::toChar(factory->getGuid(), sguid); + printf(" %d : %s (%s)\n", i, factory->getServiceName(), sguid); + } + if (i > 0) { + printf("\n- PASSED -\n\n"); + } else { + fail("SVCMGR", "service enumerator returns no service present"); + } + fflush(stdout); + +#ifdef WASABI_COMPILE_TIMERS + { + DWORD ds = Std::getTickCount(); + // Multiplexed timers test + printf("-------------------------------------------------------------------------------\n"); + printf("Testing timers for %d seconds.\n", TIMER_TEST_DURATION); + printf("-------------------------------------------------------------------------------\n\n"); + fflush(stdout); + TestTimer tt; + doMessagePump(); + printf("\n"); + DWORD dt = Std::getTickCount() - ds; + // let's assume this is a VERY VERY busy cpu, we're just trying to determine if the timers have been running... + if (dt < (TIMER_TEST_DURATION-1)*1000 || dt > (TIMER_TEST_DURATION+1)*1000) { + fail("TIMERS", "Test was out of range by more than 1s"); + } else { + printf("\n- PASSED -\n\n"); + } + fflush(stdout); + } +#endif + +#ifdef WASABI_COMPILE_XMLPARSER + { + // Multiplexed timers test + printf("-------------------------------------------------------------------------------\n"); + printf("Testing XML parser.\n"); + printf("-------------------------------------------------------------------------------\n\n"); + fflush(stdout); + XmlTest xt; + if (!xt.didFail()) { + printf("\n- PASSED -\n\n"); + fflush(stdout); + } // else msg is already printed + } +#endif + + printf("-------------------------------------------------------------------------------\n"); + printf("Shutting down.\n"); + printf("-------------------------------------------------------------------------------\n"); + + ApiInit::shutdown(); + + printf("\n- PASSED -\n\n"); + printf("===============================================================================\n"); + printf("Result : "); + if (failed) + printf("*** %d FAILURE%s ***\n", failed, failed > 1 ? "S" : ""); + else + printf("- ALL PASSED -\n"); + printf("===============================================================================\n\n"); + + return 0; +} + |