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 <string>
6
7 #include "base/basictypes.h"
8 #include "remoting/base/constants.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 // X11 headers must be #included after gtest.h, since the X11 headers define
12 // some macros that cause errors in gtest-type-util.h.
13 #include <X11/Xlib.h>
14 #include "remoting/host/linux/x_server_clipboard.h"
15
16 namespace remoting {
17
18 namespace {
19
20 class ClipboardTestClient {
21 public:
ClipboardTestClient()22 ClipboardTestClient() : display_(NULL) {}
~ClipboardTestClient()23 ~ClipboardTestClient() {}
24
Init(Display * display)25 void Init(Display* display) {
26 display_ = display;
27 clipboard_.Init(display,
28 base::Bind(&ClipboardTestClient::OnClipboardChanged,
29 base::Unretained(this)));
30 }
31
SetClipboardData(const std::string & clipboard_data)32 void SetClipboardData(const std::string& clipboard_data) {
33 clipboard_data_ = clipboard_data;
34 clipboard_.SetClipboard(kMimeTypeTextUtf8, clipboard_data);
35 }
36
OnClipboardChanged(const std::string & mime_type,const std::string & data)37 void OnClipboardChanged(const std::string& mime_type,
38 const std::string& data) {
39 clipboard_data_ = data;
40 }
41
42 // Process X events on the connection, returning true if any events were
43 // processed.
PumpXEvents()44 bool PumpXEvents() {
45 bool result = false;
46 while (XPending(display_)) {
47 XEvent event;
48 XNextEvent(display_, &event);
49 clipboard_.ProcessXEvent(&event);
50 result = true;
51 }
52 return result;
53 }
54
clipboard_data() const55 const std::string& clipboard_data() const { return clipboard_data_; }
display() const56 Display* display() const { return display_; }
57
58 private:
59 std::string clipboard_data_;
60 XServerClipboard clipboard_;
61 Display* display_;
62
63 DISALLOW_COPY_AND_ASSIGN(ClipboardTestClient);
64 };
65
66 } // namespace
67
68 class XServerClipboardTest : public testing::Test {
69 public:
SetUp()70 virtual void SetUp() OVERRIDE {
71 // XSynchronize() ensures that PumpXEvents() fully processes all X server
72 // requests and responses before returning to the caller.
73 Display* display1 = XOpenDisplay(NULL);
74 XSynchronize(display1, True);
75 client1_.Init(display1);
76 Display* display2 = XOpenDisplay(NULL);
77 XSynchronize(display2, True);
78 client2_.Init(display2);
79 }
80
TearDown()81 virtual void TearDown() OVERRIDE {
82 XCloseDisplay(client1_.display());
83 XCloseDisplay(client2_.display());
84 }
85
PumpXEvents()86 void PumpXEvents() {
87 while (true) {
88 if (!client1_.PumpXEvents() && !client2_.PumpXEvents()) {
89 break;
90 }
91 }
92 }
93
94 ClipboardTestClient client1_;
95 ClipboardTestClient client2_;
96 };
97
98 // http://crbug.com/163428
TEST_F(XServerClipboardTest,DISABLED_CopyPaste)99 TEST_F(XServerClipboardTest, DISABLED_CopyPaste) {
100 // Verify clipboard data can be transferred more than once. Then verify that
101 // the code continues to function in the opposite direction (so client1_ will
102 // send then receive, and client2_ will receive then send).
103 client1_.SetClipboardData("Text1");
104 PumpXEvents();
105 EXPECT_EQ("Text1", client2_.clipboard_data());
106
107 client1_.SetClipboardData("Text2");
108 PumpXEvents();
109 EXPECT_EQ("Text2", client2_.clipboard_data());
110
111 client2_.SetClipboardData("Text3");
112 PumpXEvents();
113 EXPECT_EQ("Text3", client1_.clipboard_data());
114
115 client2_.SetClipboardData("Text4");
116 PumpXEvents();
117 EXPECT_EQ("Text4", client1_.clipboard_data());
118 }
119
120 } // namespace remoting
121