mock_http_client.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:4k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file mock_http_client.cpp
  3.  * @brief Framework for testing HTTP requests
  4.  *
  5.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2007-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llsdhttpserver.h"
  33. #include "lliohttpserver.h"
  34. #include "llhttpclient.h"
  35. #include "llformat.h"
  36. #include "llpipeutil.h"
  37. #include "llpumpio.h"
  38. namespace tut
  39. {
  40. struct MockHttpClient
  41. {
  42. public:
  43. MockHttpClient()
  44. {
  45. apr_pool_create(&mPool, NULL);
  46. mServerPump = new LLPumpIO(mPool);
  47. mClientPump = new LLPumpIO(mPool);
  48. LLHTTPClient::setPump(*mClientPump);
  49. }
  50. ~MockHttpClient()
  51. {
  52. delete mServerPump;
  53. delete mClientPump;
  54. apr_pool_destroy(mPool);
  55. }
  56. void setupTheServer()
  57. {
  58. LLHTTPNode& root = LLIOHTTPServer::create(mPool, *mServerPump, 8888);
  59. LLHTTPStandardServices::useServices();
  60. LLHTTPRegistrar::buildAllServices(root);
  61. }
  62. void runThePump(float timeout = 100.0f)
  63. {
  64. LLTimer timer;
  65. timer.setTimerExpirySec(timeout);
  66. while(!mSawCompleted && !timer.hasExpired())
  67. {
  68. if (mServerPump)
  69. {
  70. mServerPump->pump();
  71. mServerPump->callback();
  72. }
  73. if (mClientPump)
  74. {
  75. mClientPump->pump();
  76. mClientPump->callback();
  77. }
  78. }
  79. }
  80. void killServer()
  81. {
  82. delete mServerPump;
  83. mServerPump = NULL;
  84. }
  85. private:
  86. apr_pool_t* mPool;
  87. LLPumpIO* mServerPump;
  88. LLPumpIO* mClientPump;
  89. protected:
  90. void ensureStatusOK()
  91. {
  92. if (mSawError)
  93. {
  94. std::string msg =
  95. llformat("error() called when not expected, status %d",
  96. mStatus); 
  97. fail(msg);
  98. }
  99. }
  100. void ensureStatusError()
  101. {
  102. if (!mSawError)
  103. {
  104. fail("error() wasn't called");
  105. }
  106. }
  107. LLSD getResult()
  108. {
  109. return mResult;
  110. }
  111. protected:
  112. bool mSawError;
  113. U32 mStatus;
  114. std::string mReason;
  115. bool mSawCompleted;
  116. LLSD mResult;
  117. bool mResultDeleted;
  118. class Result : public LLHTTPClient::Responder
  119. {
  120. protected:
  121. Result(MockHttpClient& client)
  122. : mClient(client)
  123. {
  124. }
  125. public:
  126. static boost::intrusive_ptr<Result> build(MockHttpClient& client)
  127. {
  128. return boost::intrusive_ptr<Result>(new Result(client));
  129. }
  130. ~Result()
  131. {
  132. mClient.mResultDeleted = true;
  133. }
  134. virtual void error(U32 status, const std::string& reason)
  135. {
  136. mClient.mSawError = true;
  137. mClient.mStatus = status;
  138. mClient.mReason = reason;
  139. }
  140. virtual void result(const LLSD& content)
  141. {
  142. mClient.mResult = content;
  143. }
  144. virtual void completed(
  145. U32 status, const std::string& reason,
  146. const LLSD& content)
  147. {
  148. LLHTTPClient::Responder::completed(status, reason, content);
  149. mClient.mSawCompleted = true;
  150. }
  151. private:
  152. MockHttpClient& mClient;
  153. };
  154. friend class Result;
  155. protected:
  156. void reset()
  157. {
  158. mSawError = false;
  159. mStatus = 0;
  160. mSawCompleted = false;
  161. mResult.clear();
  162. mResultDeleted = false;
  163. }
  164. LLHTTPClient::ResponderPtr newResult()
  165. {
  166. reset();
  167. return Result::build(*this);
  168. }
  169. };
  170. }