NDBT_Test.hpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:12k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef NDBT_TEST_HPP
  14. #define NDBT_TEST_HPP
  15. #include "NDBT_ReturnCodes.h"
  16. #include <Properties.hpp>
  17. #include <NdbThread.h>
  18. #include <NdbSleep.h>
  19. #include <NdbCondition.h>
  20. #include <NdbTimer.hpp>
  21. #include <Vector.hpp>
  22. #include <NdbDictionary.hpp>
  23. class NDBT_Step;
  24. class NDBT_TestCase;
  25. class NDBT_TestSuite;
  26. class NDBT_TestCaseImpl1;
  27. class NDBT_Context {
  28. public:
  29.   NDBT_Context();
  30.   ~NDBT_Context();
  31.   const NdbDictionary::Table* getTab();
  32.   NDBT_TestSuite* getSuite();
  33.   NDBT_TestCase* getCase();
  34.   // Get arguments
  35.   int getNumRecords() const;
  36.   int getNumLoops() const;
  37.   char * getRemoteMgm() const;
  38.   // Common place to store state between 
  39.   // steps, for example information from one step to the 
  40.   // verifier about how many records have been inserted
  41.   Uint32 getProperty(const char*, Uint32 = 0 );
  42.   const char* getProperty(const char*, const char* );
  43.   void setProperty(const char*, Uint32);
  44.   void setProperty(const char*, const char*);
  45.   // Signal that a property value that another 
  46.   // thread might be waiting for has changed
  47.   void broadcast();
  48.   // Wait for the signal that a property has changed
  49.   void wait();
  50.   void wait_timeout(int msec);
  51.   // Wait until the property has been set to a certain value
  52.   bool getPropertyWait(const char*, Uint32);
  53.   const char* getPropertyWait(const char*, const char* );
  54.   void decProperty(const char *);
  55.   void incProperty(const char *);
  56.   // Communicate with other tests
  57.   void stopTest();
  58.   bool isTestStopped();
  59.   // Communicate with tests in other API nodes
  60.   // This is done using a "system" table in the database
  61.   Uint32 getDbProperty(const char*);
  62.   bool setDbProperty(const char*, Uint32);
  63.   void setTab(const NdbDictionary::Table*);
  64.   void setRemoteMgm(char * mgm);
  65.   /**
  66.    * Get no of steps running/completed
  67.    */
  68.   int getNoOfRunningSteps() const ;
  69.   int getNoOfCompletedSteps() const ;
  70.   /**
  71.    * Thread sync
  72.    */
  73.   void sync_down(const char * key);
  74.   void sync_up_and_wait(const char * key, Uint32 count = 0);
  75. private:
  76.   friend class NDBT_Step;
  77.   friend class NDBT_TestSuite;
  78.   friend class NDBT_TestCase;
  79.   friend class NDBT_TestCaseImpl1;
  80.   void setSuite(NDBT_TestSuite*);
  81.   void setCase(NDBT_TestCase*);
  82.   void setNumRecords(int);
  83.   void setNumLoops(int);
  84.   const NdbDictionary::Table* tab;
  85.   NDBT_TestSuite* suite;
  86.   NDBT_TestCase* testcase;
  87.   Ndb* ndb;
  88.   int records;
  89.   int loops;
  90.   bool stopped;
  91.   char * remote_mgm;
  92.   Properties props;
  93.   NdbMutex* propertyMutexPtr;
  94.   NdbCondition* propertyCondPtr;
  95. };
  96. typedef int (NDBT_TESTFUNC)(NDBT_Context*, NDBT_Step*);
  97. class NDBT_Step {
  98. public:
  99.   NDBT_Step(NDBT_TestCase* ptest, 
  100. const char* pname,
  101. NDBT_TESTFUNC* pfunc);
  102.   virtual ~NDBT_Step() {}
  103.   int execute(NDBT_Context*);
  104.   virtual int setUp() = 0;
  105.   virtual void tearDown() = 0;
  106.   void setContext(NDBT_Context*);
  107.   NDBT_Context* getContext();
  108.   void print();
  109.   const char* getName() { return name; }
  110.   int getStepNo() { return step_no; }
  111.   void setStepNo(int n) { step_no = n; }
  112. protected:
  113.   NDBT_Context* m_ctx;
  114.   const char* name;
  115.   NDBT_TESTFUNC* func;
  116.   NDBT_TestCase* testcase;
  117.   int step_no;
  118. };
  119. class NDBT_NdbApiStep : public NDBT_Step {
  120. public:
  121.   NDBT_NdbApiStep(NDBT_TestCase* ptest,
  122.   const char* pname,
  123.   NDBT_TESTFUNC* pfunc);
  124.   virtual ~NDBT_NdbApiStep() {}
  125.   virtual int setUp();
  126.   virtual void tearDown();
  127.   Ndb* getNdb();
  128. protected:
  129.   Ndb* ndb;
  130. };
  131. class NDBT_ParallelStep : public NDBT_NdbApiStep {
  132. public:
  133.   NDBT_ParallelStep(NDBT_TestCase* ptest,
  134.     const char* pname,
  135.     NDBT_TESTFUNC* pfunc);
  136.   virtual ~NDBT_ParallelStep() {}
  137. };
  138. class NDBT_Verifier : public NDBT_NdbApiStep {
  139. public:
  140.   NDBT_Verifier(NDBT_TestCase* ptest,
  141. const char* name,
  142. NDBT_TESTFUNC* func);
  143.   virtual ~NDBT_Verifier() {}
  144. };
  145. class NDBT_Initializer  : public NDBT_NdbApiStep {
  146. public:
  147.   NDBT_Initializer(NDBT_TestCase* ptest,
  148.    const char* name,
  149.    NDBT_TESTFUNC* func);
  150.   virtual ~NDBT_Initializer() {}
  151. };
  152. class NDBT_Finalizer  : public NDBT_NdbApiStep {
  153. public:
  154.   NDBT_Finalizer(NDBT_TestCase* ptest,
  155.  const char* name,
  156.  NDBT_TESTFUNC* func);
  157.   virtual ~NDBT_Finalizer() {}
  158. };
  159. class NDBT_TestCase {
  160. public:
  161.   NDBT_TestCase(NDBT_TestSuite* psuite, 
  162. const char* name, 
  163. const char* comment);
  164.   virtual ~NDBT_TestCase() {}
  165.   // This is the default executor of a test case
  166.   // When a test case is executed it will need to be suplied with a number of 
  167.   // different parameters and settings, these are passed to the test in the 
  168.   // NDBT_Context object
  169.   virtual int execute(NDBT_Context*);
  170.   void setProperty(const char*, Uint32);
  171.   void setProperty(const char*, const char*);
  172.   virtual void print() = 0;
  173.   virtual void printHTML() = 0;
  174.   const char* getName(){return name;};
  175.   virtual bool tableExists(NdbDictionary::Table* aTable) = 0;
  176.   virtual bool isVerify(const NdbDictionary::Table* aTable) = 0;
  177.   virtual void saveTestResult(const NdbDictionary::Table* ptab, int result) = 0;
  178.   virtual void printTestResult() = 0;
  179.   void initBeforeTest(){ timer.doReset();};
  180.   /**
  181.    * Get no of steps running/completed
  182.    */
  183.   virtual int getNoOfRunningSteps() const = 0;
  184.   virtual int getNoOfCompletedSteps() const = 0;
  185. protected:
  186.   virtual int runInit(NDBT_Context* ctx) = 0;
  187.   virtual int runSteps(NDBT_Context* ctx) = 0;
  188.   virtual int runVerifier(NDBT_Context* ctx) = 0;
  189.   virtual int runFinal(NDBT_Context* ctx) = 0;
  190.   virtual void addTable(const char* aTableName, bool isVerify=true) = 0;
  191.   void startTimer(NDBT_Context*);
  192.   void stopTimer(NDBT_Context*);
  193.   void printTimer(NDBT_Context*);
  194.   BaseString _name;
  195.   BaseString _comment;
  196.   const char* name;
  197.   const char* comment;
  198.   NDBT_TestSuite* suite;
  199.   Properties props;
  200.   NdbTimer timer;
  201.   bool isVerifyTables;
  202. };
  203. static const int FAILED_TO_CREATE = 1000;
  204. static const int FAILED_TO_DISCOVER = 1001;
  205. class NDBT_TestCaseResult{
  206. public: 
  207.   NDBT_TestCaseResult(const char* name, int _result, NDB_TICKS _ticks):
  208.     m_result(_result){
  209.     m_name.assign(name); 
  210.     m_ticks = _ticks;
  211.     
  212.   };
  213.   const char* getName(){return m_name.c_str(); };
  214.   int getResult(){return m_result; };
  215.   const char* getTimeStr(){
  216.       // Convert to Uint32 in order to be able to print it to screen
  217.     Uint32 lapTime = (Uint32)m_ticks;
  218.     Uint32 secTime = lapTime/1000;
  219.     BaseString::snprintf(buf, 255, "%d secs (%d ms)", secTime, lapTime);
  220.     return buf;
  221.   }
  222. private:
  223.   char buf[255];
  224.   int m_result;
  225.   BaseString m_name;
  226.   NDB_TICKS m_ticks;
  227. };
  228. class NDBT_TestCaseImpl1 : public NDBT_TestCase {
  229. public:
  230.   NDBT_TestCaseImpl1(NDBT_TestSuite* psuite, 
  231. const char* name, 
  232. const char* comment);
  233.   virtual ~NDBT_TestCaseImpl1();
  234.   int addStep(NDBT_Step*);
  235.   int addVerifier(NDBT_Verifier*);
  236.   int addInitializer(NDBT_Initializer*);
  237.   int addFinalizer(NDBT_Finalizer*);
  238.   void addTable(const char*, bool);
  239.   bool tableExists(NdbDictionary::Table*);
  240.   bool isVerify(const NdbDictionary::Table*);
  241.   void reportStepResult(const NDBT_Step*, int result);
  242.   //  int execute(NDBT_Context* ctx);
  243.   int runInit(NDBT_Context* ctx);
  244.   int runSteps(NDBT_Context* ctx);
  245.   int runVerifier(NDBT_Context* ctx);
  246.   int runFinal(NDBT_Context* ctx);
  247.   void print();
  248.   void printHTML();
  249.   virtual int getNoOfRunningSteps() const;
  250.   virtual int getNoOfCompletedSteps() const;
  251. private:
  252.   static const int  NORESULT = 999;
  253.   
  254.   void saveTestResult(const NdbDictionary::Table* ptab, int result);
  255.   void printTestResult();
  256.   void startStepInThread(int stepNo, NDBT_Context* ctx);
  257.   void waitSteps();
  258.   Vector<NDBT_Step*> steps;
  259.   Vector<NdbThread*> threads;
  260.   Vector<int> results;
  261.   Vector<NDBT_Verifier*> verifiers; 
  262.   Vector<NDBT_Initializer*> initializers; 
  263.   Vector<NDBT_Finalizer*> finalizers; 
  264.   Vector<const NdbDictionary::Table*> testTables; 
  265.   Vector<NDBT_TestCaseResult*> testResults;
  266.   unsigned numStepsFail;
  267.   unsigned numStepsOk;
  268.   unsigned numStepsCompleted;
  269.   NdbMutex* waitThreadsMutexPtr;
  270.   NdbCondition* waitThreadsCondPtr;
  271. };
  272. // A NDBT_TestSuite is a collection of TestCases
  273. // the test suite will know how to execute the test cases
  274. class NDBT_TestSuite {
  275. public:
  276.   NDBT_TestSuite(const char* name);
  277.   ~NDBT_TestSuite();
  278.   // Default executor of a test suite
  279.   // supply argc and argv as parameters
  280.   int execute(int, const char**);
  281.   // These function can be used from main in the test program 
  282.   // to control the behaviour of the testsuite
  283.   void setCreateTable(bool);     // Create table before test func is called
  284.   void setCreateAllTables(bool); // Create all tables before testsuite is executed 
  285.   // Prints the testsuite, testcases and teststeps
  286.   void printExecutionTree();
  287.   void printExecutionTreeHTML();
  288.   // Prints list of testcases
  289.   void printCases();
  290.   // Print summary of executed tests
  291.   void printTestCaseSummary(const char* tcname = NULL);
  292.   /**
  293.    * Returns current date and time in the format of 2002-12-04 10:00:01
  294.    */
  295.   const char* getDate();
  296.   // Returns true if timing info should be printed
  297.   bool timerIsOn();
  298.   int addTest(NDBT_TestCase* pTest);
  299. private:
  300.   int executeOne(const char* _tabname, const char* testname = NULL);
  301.   int executeAll(const char* testname = NULL);
  302.   void execute(Ndb*, const NdbDictionary::Table*, const char* testname = NULL);
  303.   int report(const char* _tcname = NULL);
  304.   int reportAllTables(const char* );
  305.   const char* name;
  306.   char* remote_mgm;
  307.   int numTestsOk;
  308.   int numTestsFail;
  309.   int numTestsExecuted;
  310.   Vector<NDBT_TestCase*> tests;
  311.   NDBT_Context* ctx;
  312.   int records;
  313.   int loops;
  314.   int timer;
  315.   NdbTimer testSuiteTimer;
  316.   bool createTable;
  317. };
  318. #define NDBT_TESTSUITE(suitname) 
  319. class C##suitname : public NDBT_TestSuite { 
  320. public: 
  321. C##suitname():NDBT_TestSuite(#suitname){ 
  322.  NDBT_TestCaseImpl1* pt; pt = NULL; 
  323.  NDBT_Step* pts; pts = NULL; 
  324.  NDBT_Verifier* ptv; ptv = NULL; 
  325.  NDBT_Initializer* pti; pti = NULL; 
  326.  NDBT_Finalizer* ptf; ptf = NULL; 
  327. #define TESTCASE(testname, comment) 
  328.   pt = new NDBT_TestCaseImpl1(this, testname, comment); 
  329.   addTest(pt);
  330. #define TC_PROPERTY(propname, propval) 
  331.   pt->setProperty(propname, propval);
  332. #define STEP(stepfunc) 
  333.   pts = new NDBT_ParallelStep(pt, #stepfunc, stepfunc); 
  334.   pt->addStep(pts);
  335. // Add a number of equal steps to the testcase
  336. #define STEPS(stepfunc, num) 
  337.   { int i; for (i = 0; i < num; i++){ 
  338.     pts = new NDBT_ParallelStep(pt, #stepfunc, stepfunc); 
  339.     pt->addStep(pts);
  340.   } }
  341. #define VERIFIER(stepfunc) 
  342.   ptv = new NDBT_Verifier(pt, #stepfunc, stepfunc); 
  343.   pt->addVerifier(ptv);
  344. #define INITIALIZER(stepfunc) 
  345.   pti = new NDBT_Initializer(pt, #stepfunc, stepfunc); 
  346.   pt->addInitializer(pti);
  347. #define FINALIZER(stepfunc) 
  348.   ptf = new NDBT_Finalizer(pt, #stepfunc, stepfunc); 
  349.   pt->addFinalizer(ptf);
  350. // Test case can be run only on this table(s), can be multiple tables
  351. // Ex TABLE("T1")
  352. //    TABLE("T3")
  353. // Means test will only be run on T1 and T3
  354. #define TABLE(tableName) 
  355.   pt->addTable(tableName, true);
  356. // Test case can be run on all tables except
  357. // Ex NOT_TABLE("T10")
  358. // Means test will be run on all tables execept T10
  359. #define NOT_TABLE(tableName) 
  360.   pt->addTable(tableName, false);
  361. #define NDBT_TESTSUITE_END(suitname) 
  362.  } } ; C##suitname suitname
  363. // Helper functions for retrieving variables from NDBT_Step
  364. #define GETNDB(ps) ((NDBT_NdbApiStep*)ps)->getNdb()
  365. #endif