blob: 3fa98acc64fe56819de3cf76424097effed5cc77 [file] [log] [blame]
// Copyright 2015 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.
#include "remoting/client/empty_cursor_filter.h"
#include <ostream>
#include "remoting/proto/control.pb.h"
#include "remoting/protocol/cursor_shape_stub.h"
#include "remoting/protocol/protocol_mock_objects.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace remoting {
namespace {
// Chromoting cursors are always RGBA.
const int kBytesPerPixel = 4;
const int kTestCursorWidth = 100;
const int kTestCursorHeight = 64;
const int kTestCursorHotspotX = 10;
const int kTestCursorHotspotY = 30;
const int kTestCursorDataSize =
kTestCursorWidth * kTestCursorHeight * kBytesPerPixel;
protocol::CursorShapeInfo CreateTransparentCursorShape() {
protocol::CursorShapeInfo transparent_cursor;
transparent_cursor.set_width(kTestCursorWidth);
transparent_cursor.set_height(kTestCursorHeight);
transparent_cursor.set_hotspot_x(kTestCursorHotspotX);
transparent_cursor.set_hotspot_y(kTestCursorHotspotY);
transparent_cursor.mutable_data()->resize(kTestCursorDataSize, 0);
return transparent_cursor;
}
protocol::CursorShapeInfo CreateOpaqueCursorShape() {
protocol::CursorShapeInfo cursor = CreateTransparentCursorShape();
cursor.mutable_data()->assign(kTestCursorDataSize, 0x01);
return cursor;
}
MATCHER_P(EqualsCursorShape, cursor_shape, "") {
// TODO(wez): Should not assume that all fields were set.
return arg.data() == cursor_shape.data() &&
arg.width() == cursor_shape.width() &&
arg.height() == cursor_shape.height() &&
arg.hotspot_x() == cursor_shape.hotspot_x() &&
arg.hotspot_y() == cursor_shape.hotspot_y();
}
} // namespace
namespace protocol {
// This pretty-printer must be defined under remoting::protocol to be used.
::std::ostream& operator<<(::std::ostream& os, const CursorShapeInfo& cursor) {
return os << "[w:" << cursor.width() << ", h:" << cursor.height()
<< ", h.x:" << cursor.hotspot_x() << ", h.y:" << cursor.hotspot_y()
<< ", data.size:" << cursor.data().size() << "]";
}
} // namespace protocol
// Verify that EmptyCursorShape() generates a normalized empty cursor.
TEST(EmptyCursorFilterTest, EmptyCursorShape) {
const protocol::CursorShapeInfo& empty_cursor = EmptyCursorShape();
// TODO(wez): Replace these individual asserts with IsCursorShapeValid()?
ASSERT_TRUE(empty_cursor.has_data());
ASSERT_TRUE(empty_cursor.has_width());
ASSERT_TRUE(empty_cursor.has_height());
ASSERT_TRUE(empty_cursor.has_hotspot_x());
ASSERT_TRUE(empty_cursor.has_hotspot_y());
EXPECT_EQ(0, empty_cursor.width());
EXPECT_EQ(0, empty_cursor.height());
EXPECT_EQ(0, empty_cursor.hotspot_x());
EXPECT_EQ(0, empty_cursor.hotspot_y());
EXPECT_TRUE(empty_cursor.data().empty());
}
// Verify that IsCursorShapeEmpty returns true only for normalized empty
// cursors, not for opaque or transparent non-empty cursors.
TEST(EmptyCursorFilterTest, IsCursorShapeEmpty) {
const protocol::CursorShapeInfo& kEmptyCursor = EmptyCursorShape();
EXPECT_TRUE(IsCursorShapeEmpty(kEmptyCursor));
const protocol::CursorShapeInfo& kOpaqueCursor = CreateOpaqueCursorShape();
EXPECT_FALSE(IsCursorShapeEmpty(kOpaqueCursor));
const protocol::CursorShapeInfo& kTransparentCursor =
CreateTransparentCursorShape();
EXPECT_FALSE(IsCursorShapeEmpty(kTransparentCursor));
}
// Verify that EmptyCursorFilter behaves correctly for normalized empty cursors.
TEST(EmptyCursorFilterTest, EmptyCursor) {
const protocol::CursorShapeInfo& kEmptyCursor = EmptyCursorShape();
protocol::MockCursorShapeStub cursor_stub;
EmptyCursorFilter cursor_filter(&cursor_stub);
EXPECT_CALL(cursor_stub, SetCursorShape(EqualsCursorShape(kEmptyCursor)));
cursor_filter.SetCursorShape(kEmptyCursor);
}
// Verify that EmptyCursorFilter turns transparent cursors into empty ones.
TEST(EmptyCursorFilterTest, TransparentCursor) {
const protocol::CursorShapeInfo& kEmptyCursor = EmptyCursorShape();
protocol::MockCursorShapeStub cursor_stub;
EmptyCursorFilter cursor_filter(&cursor_stub);
EXPECT_CALL(cursor_stub, SetCursorShape(EqualsCursorShape(kEmptyCursor)));
cursor_filter.SetCursorShape(CreateTransparentCursorShape());
}
// Verify that EmptyCursorFilter leaves non-transparent cursors alone.
TEST(EmptyCursorFilterTest, NonTransparentCursor) {
const protocol::CursorShapeInfo& kOpaqueCursor = CreateOpaqueCursorShape();
protocol::MockCursorShapeStub cursor_stub;
EmptyCursorFilter cursor_filter(&cursor_stub);
EXPECT_CALL(cursor_stub, SetCursorShape(EqualsCursorShape(kOpaqueCursor)));
cursor_filter.SetCursorShape(kOpaqueCursor);
}
} // namespace remoting