blob: 170c3d6e79f34cc9c83c326a81e13b9804c024cb [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// This tests the performance of the C API.
#include "mojo/public/system/core.h"
#include "base/basictypes.h"
#include "base/bind.h"
#include "base/logging.h"
#include "mojo/public/tests/test_support.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace {
class SystemPerftest : public testing::Test {
public:
SystemPerftest() {}
virtual ~SystemPerftest() {}
void NoOp() {
}
void MessagePipe_CreateAndClose() {
MojoResult result;
result = MojoCreateMessagePipe(&h_0_, &h_1_);
DCHECK_EQ(result, MOJO_RESULT_OK);
result = MojoClose(h_0_);
DCHECK_EQ(result, MOJO_RESULT_OK);
result = MojoClose(h_1_);
DCHECK_EQ(result, MOJO_RESULT_OK);
}
void MessagePipe_WriteAndRead(void* buffer, uint32_t bytes) {
MojoResult result;
result = MojoWriteMessage(h_0_,
buffer, bytes,
NULL, 0,
MOJO_WRITE_MESSAGE_FLAG_NONE);
DCHECK_EQ(result, MOJO_RESULT_OK);
uint32_t read_bytes = bytes;
result = MojoReadMessage(h_1_,
buffer, &read_bytes,
NULL, NULL,
MOJO_READ_MESSAGE_FLAG_NONE);
DCHECK_EQ(result, MOJO_RESULT_OK);
}
void MessagePipe_EmptyRead() {
MojoResult result;
result = MojoReadMessage(h_0_,
NULL, NULL,
NULL, NULL,
MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
DCHECK_EQ(result, MOJO_RESULT_NOT_FOUND);
}
protected:
MojoHandle h_0_;
MojoHandle h_1_;
private:
DISALLOW_COPY_AND_ASSIGN(SystemPerftest);
};
// A no-op test so we can compare performance.
TEST_F(SystemPerftest, NoOp) {
mojo::test::IterateAndReportPerf(
"NoOp",
base::Bind(&SystemPerftest::NoOp,
base::Unretained(this)));
}
TEST_F(SystemPerftest, MessagePipe_CreateAndClose) {
mojo::test::IterateAndReportPerf(
"MessagePipe_CreateAndClose",
base::Bind(&SystemPerftest::MessagePipe_CreateAndClose,
base::Unretained(this)));
}
TEST_F(SystemPerftest, MessagePipe_WriteAndRead) {
CHECK_EQ(MojoCreateMessagePipe(&h_0_, &h_1_), MOJO_RESULT_OK);
char buffer[10000] = { 0 };
mojo::test::IterateAndReportPerf(
"MessagePipe_WriteAndRead_10bytes",
base::Bind(&SystemPerftest::MessagePipe_WriteAndRead,
base::Unretained(this),
static_cast<void*>(buffer), static_cast<uint32_t>(10)));
mojo::test::IterateAndReportPerf(
"MessagePipe_WriteAndRead_100bytes",
base::Bind(&SystemPerftest::MessagePipe_WriteAndRead,
base::Unretained(this),
static_cast<void*>(buffer), static_cast<uint32_t>(100)));
mojo::test::IterateAndReportPerf(
"MessagePipe_WriteAndRead_1000bytes",
base::Bind(&SystemPerftest::MessagePipe_WriteAndRead,
base::Unretained(this),
static_cast<void*>(buffer), static_cast<uint32_t>(1000)));
mojo::test::IterateAndReportPerf(
"MessagePipe_WriteAndRead_10000bytes",
base::Bind(&SystemPerftest::MessagePipe_WriteAndRead,
base::Unretained(this),
static_cast<void*>(buffer), static_cast<uint32_t>(10000)));
CHECK_EQ(MojoClose(h_0_), MOJO_RESULT_OK);
CHECK_EQ(MojoClose(h_1_), MOJO_RESULT_OK);
}
TEST_F(SystemPerftest, MessagePipe_EmptyRead) {
CHECK_EQ(MojoCreateMessagePipe(&h_0_, &h_1_), MOJO_RESULT_OK);
mojo::test::IterateAndReportPerf(
"MessagePipe_EmptyRead",
base::Bind(&SystemPerftest::MessagePipe_EmptyRead,
base::Unretained(this)));
CHECK_EQ(MojoClose(h_0_), MOJO_RESULT_OK);
CHECK_EQ(MojoClose(h_1_), MOJO_RESULT_OK);
}
} // namespace