cef/tests/ceftests/message_router_binary_unittest.cc

137 lines
4.2 KiB
C++

// Copyright (c) 2023 The Chromium Embedded Framework Authors. All rights
// reserved. Use of this source code is governed by a BSD-style license that
// can be found in the LICENSE file.
#include "tests/ceftests/message_router_unittest_utils.h"
namespace {
constexpr size_t kMsgSizeThresholdInBytes = 16000;
class BinaryTestHandler final : public SingleLoadTestHandler {
public:
explicit BinaryTestHandler(size_t message_size)
: message_size_(message_size) {}
std::string GetMainHTML() override {
return "<html><body><script>\n"
"function generateRandomArrayBuffer(size) {\n"
" const buffer = new ArrayBuffer(size);\n"
" const uint8Array = new Uint8Array(buffer);\n"
" for (let i = 0; i < uint8Array.length; i++) {\n"
" uint8Array[i] = Math.floor(Math.random() * 256);\n"
" }\n"
" return buffer;\n"
"}\n"
"function isEqualArrayBuffers(left, right) {\n"
" if (left.byteLength !== right.byteLength) { return false; }\n"
" const leftView = new DataView(left);\n"
" const rightView = new DataView(right);\n"
" for (let i = 0; i < left.byteLength; i++) {\n"
" if (leftView.getUint8(i) !== rightView.getUint8(i)) {\n"
" return false;\n"
" }\n"
" }\n"
" return true;\n"
"}\n"
"const request = generateRandomArrayBuffer(" +
std::to_string(message_size_) +
")\n"
"window." +
std::string(kJSQueryFunc) +
"({\n request: request,\n"
" persistent: false,\n"
" onSuccess: (response) => {\n"
" if (!isEqualArrayBuffers(request, response)) {\n"
" window.mrtNotify('error-ArrayBuffersDiffer');\n"
" } else {\n"
" window.mrtNotify('success');\n"
" }\n"
" },\n"
" onFailure: (errorCode, errorMessage) => {\n"
" window.mrtNotify('error-onFailureCalled');\n"
" }\n"
"});\n</script></body></html>";
}
void OnNotify(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
const std::string& message) override {
AssertMainBrowser(browser);
AssertMainFrame(frame);
// OnNotify only be called once.
EXPECT_FALSE(got_notify_);
got_notify_.yes();
EXPECT_EQ("success", message);
DestroyTest();
}
bool OnQuery(CefRefPtr<CefBrowser> browser,
CefRefPtr<CefFrame> frame,
int64_t query_id,
CefRefPtr<const CefBinaryBuffer> request,
bool persistent,
CefRefPtr<Callback> callback) override {
AssertMainBrowser(browser);
AssertMainFrame(frame);
EXPECT_NE(0, query_id);
EXPECT_FALSE(persistent);
EXPECT_EQ(message_size_, request->GetSize());
got_on_query_.yes();
callback->Success(request->GetData(), request->GetSize());
return true;
}
void DestroyTest() override {
EXPECT_TRUE(got_notify_);
EXPECT_TRUE(got_on_query_);
TestHandler::DestroyTest();
}
private:
const size_t message_size_;
TrackCallback got_on_query_;
TrackCallback got_notify_;
};
using TestHandlerPtr = CefRefPtr<BinaryTestHandler>;
} // namespace
TEST(MessageRouterTest, BinaryMessageEmpty) {
const auto message_size = 0;
TestHandlerPtr handler = new BinaryTestHandler(message_size);
handler->SetMessageSizeThreshold(kMsgSizeThresholdInBytes);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(MessageRouterTest, BinaryMessageUnderThresholdSize) {
const auto under_threshold = kMsgSizeThresholdInBytes - 1;
TestHandlerPtr handler = new BinaryTestHandler(under_threshold);
handler->SetMessageSizeThreshold(kMsgSizeThresholdInBytes);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}
TEST(MessageRouterTest, BinaryMessageOverThresholdSize) {
const auto over_threshold = kMsgSizeThresholdInBytes + 1;
TestHandlerPtr handler = new BinaryTestHandler(over_threshold);
handler->SetMessageSizeThreshold(kMsgSizeThresholdInBytes);
handler->ExecuteTest();
ReleaseAndWaitForDestructor(handler);
}