1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "remoting/protocol/clipboard_echo_filter.h" 6 7 #include "remoting/proto/event.pb.h" 8 #include "remoting/protocol/protocol_mock_objects.h" 9 #include "testing/gmock/include/gmock/gmock.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 using ::testing::_; 13 using ::testing::InSequence; 14 15 namespace remoting { 16 namespace protocol { 17 18 MATCHER_P2(EqualsClipboardEvent, mime_type, data, "") { 19 return arg.mime_type() == mime_type && arg.data() == data; 20 } 21 22 static ClipboardEvent MakeClipboardEvent(const std::string& mime_type, 23 const std::string& data) { 24 ClipboardEvent event; 25 event.set_mime_type(mime_type); 26 event.set_data(data); 27 return event; 28 } 29 30 // Check that the filter only filters out events identical to the latest 31 // clipboard item from the client. 32 TEST(ClipboardEchoFilterTest, FromClientBlocksIdenticalEventToClient) { 33 MockClipboardStub client_stub; 34 MockClipboardStub host_stub; 35 36 { 37 InSequence s; 38 EXPECT_CALL(host_stub, 39 InjectClipboardEvent(EqualsClipboardEvent("text", "a"))); 40 EXPECT_CALL(host_stub, 41 InjectClipboardEvent(EqualsClipboardEvent("text", "b"))); 42 EXPECT_CALL(client_stub, 43 InjectClipboardEvent(EqualsClipboardEvent("text", "a"))); 44 EXPECT_CALL(host_stub, 45 InjectClipboardEvent(EqualsClipboardEvent("image", "a"))); 46 EXPECT_CALL(client_stub, 47 InjectClipboardEvent(EqualsClipboardEvent("text", "a"))); 48 } 49 50 ClipboardEchoFilter filter; 51 filter.set_client_stub(&client_stub); 52 filter.set_host_stub(&host_stub); 53 54 filter.host_filter()->InjectClipboardEvent( 55 MakeClipboardEvent("text", "a")); 56 // The client has sent ("text", "a") to the host, so make sure the filter 57 // will stop the host echoing that item back to the client. 58 filter.client_filter()->InjectClipboardEvent( 59 MakeClipboardEvent("text", "a")); 60 filter.host_filter()->InjectClipboardEvent( 61 MakeClipboardEvent("text", "b")); 62 filter.client_filter()->InjectClipboardEvent( 63 MakeClipboardEvent("text", "a")); 64 filter.host_filter()->InjectClipboardEvent( 65 MakeClipboardEvent("image", "a")); 66 filter.client_filter()->InjectClipboardEvent( 67 MakeClipboardEvent("text", "a")); 68 } 69 70 // Check that the filter will drop events sent to the host, if there is no host 71 // stub, whether or not there is a client stub. 72 TEST(ClipboardEchoFilterTest, NoHostStub) { 73 MockClipboardStub client_stub; 74 MockClipboardStub host_stub; 75 76 EXPECT_CALL(host_stub, 77 InjectClipboardEvent(EqualsClipboardEvent("text", "a"))); 78 79 ClipboardEchoFilter filter; 80 ClipboardEvent event = MakeClipboardEvent("text", "a"); 81 filter.host_filter()->InjectClipboardEvent(event); 82 83 filter.set_client_stub(&client_stub); 84 filter.host_filter()->InjectClipboardEvent(event); 85 86 filter.set_host_stub(&host_stub); 87 filter.host_filter()->InjectClipboardEvent(event); 88 } 89 90 // Check that the filter will drop events sent to the client, if there is no 91 // client stub, whether or not there is a host stub. 92 TEST(ClipboardEchoFilter, NoClientStub) { 93 MockClipboardStub client_stub; 94 MockClipboardStub host_stub; 95 96 EXPECT_CALL(client_stub, 97 InjectClipboardEvent(EqualsClipboardEvent("text", "a"))); 98 99 ClipboardEchoFilter filter; 100 ClipboardEvent event = MakeClipboardEvent("text", "a"); 101 filter.client_filter()->InjectClipboardEvent(event); 102 103 filter.set_host_stub(&host_stub); 104 filter.client_filter()->InjectClipboardEvent(event); 105 106 filter.set_client_stub(&client_stub); 107 filter.client_filter()->InjectClipboardEvent(event); 108 } 109 110 } // namespace protocol 111 } // namespace remoting 112