Index: test/WebRequest.cpp |
diff --git a/test/WebRequest.cpp b/test/WebRequest.cpp |
index d78a92756dd993ffe59940abffb226536e182b9a..2a6267552f5525d19044bab8cc3c785d10621128 100644 |
--- a/test/WebRequest.cpp |
+++ b/test/WebRequest.cpp |
@@ -25,42 +25,66 @@ using namespace AdblockPlus; |
namespace |
{ |
- class MockWebRequest : public AdblockPlus::WebRequest |
+ class DefaultWebRequestTest : public ::testing::Test |
{ |
- public: |
- AdblockPlus::ServerResponse GET(const std::string& url, const AdblockPlus::HeaderList& requestHeaders) const |
+ protected: |
+ void SetUp() |
{ |
- std::set<std::string> headerNames; |
- for (auto header : requestHeaders) |
- { |
- headerNames.insert(header.first); |
- } |
- { |
- std::lock_guard<std::mutex> lock(requestHeaderNamesMutex); |
- // we currently ignore the result. We should check it actually gets inserted. |
- requestHeaderNames.insert(std::make_pair(url, std::move(headerNames))); |
- } |
+ JsEngineCreationParameters jsEngineParams; |
+ jsEngineParams.timer.reset(new NoopTimer()); |
+ jsEngineParams.fileSystem.reset(new LazyFileSystem()); |
+ jsEngineParams.webRequest = CreateWebRequest(); |
+ jsEngine = CreateJsEngine(std::move(jsEngineParams)); |
+ } |
+ |
+ virtual WebRequestPtr CreateWebRequest() |
+ { |
+ return CreateDefaultWebRequest(); |
+ } |
- AdblockPlus::Sleep(50); |
+ JsEnginePtr jsEngine; |
+ }; |
- AdblockPlus::ServerResponse result; |
- result.status = IWebRequest::NS_OK; |
- result.responseStatus = 123; |
- result.responseHeaders.push_back(std::pair<std::string, std::string>("Foo", "Bar")); |
- result.responseText = url + "\n"; |
- if (!requestHeaders.empty()) |
+ class MockWebRequestTest : public DefaultWebRequestTest |
+ { |
+ virtual WebRequestPtr CreateWebRequest() override |
+ { |
+ return DelayedWebRequest::New(webRequestTasks); |
+ } |
+ |
+ protected: |
+ void ProcessPendingWebRequests() |
+ { |
+ for (auto iiWebTask = webRequestTasks->cbegin(); iiWebTask != webRequestTasks->cend(); |
+ webRequestTasks->erase(iiWebTask++)) |
{ |
- result.responseText += requestHeaders[0].first + "\n" + requestHeaders[0].second; |
+ const auto& webRequestTask = *iiWebTask; |
+ std::set<std::string> headerNames; |
+ for (const auto& header : webRequestTask.headers) |
+ { |
+ headerNames.insert(header.first); |
+ } |
+ // we currently ignore the result. We should check it actually gets inserted. |
+ requestHeaderNames.insert(std::make_pair(webRequestTask.url, std::move(headerNames))); |
+ |
+ AdblockPlus::ServerResponse result; |
+ result.status = IWebRequest::NS_OK; |
+ result.responseStatus = 123; |
+ result.responseHeaders.push_back(std::pair<std::string, std::string>("Foo", "Bar")); |
+ result.responseText = webRequestTask.url + "\n"; |
+ if (!webRequestTask.headers.empty()) |
+ { |
+ result.responseText += webRequestTask.headers[0].first + "\n" + webRequestTask.headers[0].second; |
+ } |
+ webRequestTask.getCallback(result); |
} |
- return result; |
} |
// Testing method |
- // Get the headers for the request. Return a pair of a bool (found |
- // or not) and the actual header names |
- std::pair<bool, std::set<std::string>> headersForRequest(const std::string& url) |
+ // Get the headers for the request. Return a pair of a bool (found or not) |
+ // and the actual header names |
+ std::pair<bool, std::set<std::string>> GetHeadersForRequest(const std::string& url) |
{ |
- std::lock_guard<std::mutex> lock(requestHeaderNamesMutex); |
auto iter = requestHeaderNames.find(url); |
if (iter != requestHeaderNames.end()) |
{ |
@@ -71,33 +95,10 @@ namespace |
return std::make_pair(false, std::set<std::string>()); |
} |
- // mutable. Very Ugly. But we are testing and need to change this in GET which is const. |
- mutable std::mutex requestHeaderNamesMutex; |
- mutable std::map<std::string, std::set<std::string>> requestHeaderNames; |
- }; |
- |
- template<class T> |
- class WebRequestTest : public ::testing::Test |
- { |
- protected: |
- void SetUp() |
- { |
- JsEngineCreationParameters jsEngineParams; |
- jsEngineParams.timer.reset(new NoopTimer()); |
- jsEngineParams.fileSystem.reset(new LazyFileSystem()); |
- jsEngine = CreateJsEngine(std::move(jsEngineParams)); |
- webRequest = std::make_shared<T>(); |
- jsEngine->SetWebRequest(webRequest); |
- } |
- |
- std::shared_ptr<T> webRequest; |
- JsEnginePtr jsEngine; |
+ DelayedWebRequest::SharedTasks webRequestTasks; |
+ std::map<std::string, std::set<std::string>> requestHeaderNames; |
}; |
- typedef WebRequestTest<MockWebRequest> MockWebRequestTest; |
- typedef WebRequestTest<AdblockPlus::DefaultWebRequestSync> DefaultWebRequestTest; |
- typedef WebRequestTest<MockWebRequest> XMLHttpRequestTest; |
- |
// we return the url of the XHR. |
std::string ResetTestXHR(const AdblockPlus::JsEnginePtr& jsEngine, const std::string& defaultUrl = "") |
{ |
@@ -144,7 +145,7 @@ TEST_F(MockWebRequestTest, SuccessfulRequest) |
{ |
jsEngine->Evaluate("_webRequest.GET('http://example.com/', {X: 'Y'}, function(result) {foo = result;} )"); |
ASSERT_TRUE(jsEngine->Evaluate("this.foo").IsUndefined()); |
- AdblockPlus::Sleep(200); |
+ ProcessPendingWebRequests(); |
ASSERT_EQ(IWebRequest::NS_OK, jsEngine->Evaluate("foo.status").AsInt()); |
ASSERT_EQ(123, jsEngine->Evaluate("foo.responseStatus").AsInt()); |
ASSERT_EQ("http://example.com/\nX\nY", jsEngine->Evaluate("foo.responseText").AsString()); |
@@ -247,7 +248,7 @@ namespace |
typedef std::shared_ptr<CatchLogSystem> CatchLogSystemPtr; |
} |
-TEST_F(XMLHttpRequestTest, RequestHeaderValidation) |
+TEST_F(MockWebRequestTest, RequestHeaderValidation) |
{ |
auto catchLogSystem = CatchLogSystemPtr(new CatchLogSystem()); |
jsEngine->SetLogSystem(catchLogSystem); |
@@ -267,9 +268,9 @@ TEST_F(XMLHttpRequestTest, RequestHeaderValidation) |
request.setRequestHeader('Accept-Encoding', 'gzip');\nrequest.send();"); |
EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel); |
EXPECT_EQ(msg + "Accept-Encoding", catchLogSystem->lastMessage); |
- WaitForVariable("result", jsEngine); |
+ ProcessPendingWebRequests(); |
{ |
- auto headersRequest = webRequest->headersForRequest(url); |
+ auto headersRequest = GetHeadersForRequest(url); |
EXPECT_TRUE(headersRequest.first); |
const auto& headers = headersRequest.second; |
EXPECT_TRUE(headers.cend() == headers.find("Accept-Encoding")); |
@@ -282,9 +283,9 @@ TEST_F(XMLHttpRequestTest, RequestHeaderValidation) |
request.setRequestHeader('DNT', '1');\nrequest.send();"); |
EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel); |
EXPECT_EQ(msg + "DNT", catchLogSystem->lastMessage); |
- WaitForVariable("result", jsEngine); |
+ ProcessPendingWebRequests(); |
{ |
- auto headersRequest = webRequest->headersForRequest(url); |
+ auto headersRequest = GetHeadersForRequest(url); |
EXPECT_TRUE(headersRequest.first); |
const auto& headers = headersRequest.second; |
EXPECT_TRUE(headers.cend() == headers.find("DNT")); |
@@ -297,9 +298,9 @@ TEST_F(XMLHttpRequestTest, RequestHeaderValidation) |
request.setRequestHeader('X', 'y');\nrequest.send();"); |
EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_TRACE, catchLogSystem->lastLogLevel); |
EXPECT_EQ("", catchLogSystem->lastMessage); |
- WaitForVariable("result", jsEngine); |
+ ProcessPendingWebRequests(); |
{ |
- auto headersRequest = webRequest->headersForRequest(url); |
+ auto headersRequest = GetHeadersForRequest(url); |
EXPECT_TRUE(headersRequest.first); |
const auto& headers = headersRequest.second; |
EXPECT_FALSE(headers.cend() == headers.find("X")); |
@@ -312,9 +313,9 @@ TEST_F(XMLHttpRequestTest, RequestHeaderValidation) |
request.setRequestHeader('Proxy-foo', 'bar');\nrequest.send();"); |
EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel); |
EXPECT_EQ(msg + "Proxy-foo", catchLogSystem->lastMessage); |
- WaitForVariable("result", jsEngine); |
+ ProcessPendingWebRequests(); |
{ |
- auto headersRequest = webRequest->headersForRequest(url); |
+ auto headersRequest = GetHeadersForRequest(url); |
EXPECT_TRUE(headersRequest.first); |
const auto& headers = headersRequest.second; |
EXPECT_TRUE(headers.cend() == headers.find("Proxy-foo")); |
@@ -327,9 +328,9 @@ TEST_F(XMLHttpRequestTest, RequestHeaderValidation) |
request.setRequestHeader('Sec-foo', 'bar');\nrequest.send();"); |
EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_WARN, catchLogSystem->lastLogLevel); |
EXPECT_EQ(msg + "Sec-foo", catchLogSystem->lastMessage); |
- WaitForVariable("result", jsEngine); |
+ ProcessPendingWebRequests(); |
{ |
- auto headersRequest = webRequest->headersForRequest(url); |
+ auto headersRequest = GetHeadersForRequest(url); |
EXPECT_TRUE(headersRequest.first); |
const auto& headers = headersRequest.second; |
EXPECT_TRUE(headers.cend() == headers.find("Sec-foo")); |
@@ -342,9 +343,9 @@ TEST_F(XMLHttpRequestTest, RequestHeaderValidation) |
request.setRequestHeader('Security', 'theater');\nrequest.send();"); |
EXPECT_EQ(AdblockPlus::LogSystem::LOG_LEVEL_TRACE, catchLogSystem->lastLogLevel); |
EXPECT_EQ("", catchLogSystem->lastMessage); |
- WaitForVariable("result", jsEngine); |
+ ProcessPendingWebRequests(); |
{ |
- auto headersRequest = webRequest->headersForRequest(url); |
+ auto headersRequest = GetHeadersForRequest(url); |
EXPECT_TRUE(headersRequest.first); |
const auto& headers = headersRequest.second; |
EXPECT_FALSE(headers.cend() == headers.find("Security")); |