15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/* 25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2010 The Android Open Source Project 35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License. 65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at 75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * http://www.apache.org/licenses/LICENSE-2.0 95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * 105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software 115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and 145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License. 155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */ 165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include "TestHelpers.h" 185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <unistd.h> 205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <time.h> 215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <errno.h> 225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <gtest/gtest.h> 245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/InputTransport.h> 255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Timers.h> 265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/StopWatch.h> 275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/StrongPointer.h> 285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android { 305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass InputChannelTest : public testing::Test { 325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected: 335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown virtual void SetUp() { } 345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown virtual void TearDown() { } 355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}; 365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputChannelTest, ConstructorAndDestructor_TakesOwnershipOfFileDescriptors) { 395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Our purpose here is to verify that the input channel destructor closes the 405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // file descriptor provided to it. One easy way is to provide it with one end 415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // of a pipe and to check for EPIPE on the other end after the channel is destroyed. 425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown Pipe pipe; 435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 44f93fcf4c403fa4181536821680d495824a4290c5Siarhei Vishniakou sp<InputChannel> inputChannel = new InputChannel("channel name", pipe.sendFd); 455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 46f93fcf4c403fa4181536821680d495824a4290c5Siarhei Vishniakou EXPECT_STREQ("channel name", inputChannel->getName().c_str()) 475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "channel should have provided name"; 485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(pipe.sendFd, inputChannel->getFd()) 495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "channel should have provided fd"; 505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown inputChannel.clear(); // destroys input channel 525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(-EPIPE, pipe.readSignal()) 545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "channel should have closed fd when destroyed"; 555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // clean up fds of Pipe endpoints that were closed so we don't try to close them again 575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown pipe.sendFd = -1; 585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} 595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputChannelTest, OpenInputChannelPair_ReturnsAPairOfConnectedChannels) { 615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown sp<InputChannel> serverChannel, clientChannel; 625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 63f93fcf4c403fa4181536821680d495824a4290c5Siarhei Vishniakou status_t result = InputChannel::openInputChannelPair("channel name", 645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown serverChannel, clientChannel); 655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ASSERT_EQ(OK, result) 675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "should have successfully opened a channel pair"; 685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Name 70f93fcf4c403fa4181536821680d495824a4290c5Siarhei Vishniakou EXPECT_STREQ("channel name (server)", serverChannel->getName().c_str()) 715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "server channel should have suffixed name"; 72f93fcf4c403fa4181536821680d495824a4290c5Siarhei Vishniakou EXPECT_STREQ("channel name (client)", clientChannel->getName().c_str()) 735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "client channel should have suffixed name"; 745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Server->Client communication 765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown InputMessage serverMsg; 775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown memset(&serverMsg, 0, sizeof(InputMessage)); 785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown serverMsg.header.type = InputMessage::TYPE_KEY; 795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown serverMsg.body.key.action = AKEY_EVENT_ACTION_DOWN; 805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(OK, serverChannel->sendMessage(&serverMsg)) 815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "server channel should be able to send message to client channel"; 825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown InputMessage clientMsg; 845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(OK, clientChannel->receiveMessage(&clientMsg)) 855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "client channel should be able to receive message from server channel"; 865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(serverMsg.header.type, clientMsg.header.type) 875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "client channel should receive the correct message from server channel"; 885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(serverMsg.body.key.action, clientMsg.body.key.action) 895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "client channel should receive the correct message from server channel"; 905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown // Client->Server communication 925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown InputMessage clientReply; 935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown memset(&clientReply, 0, sizeof(InputMessage)); 945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown clientReply.header.type = InputMessage::TYPE_FINISHED; 955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown clientReply.body.finished.seq = 0x11223344; 965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown clientReply.body.finished.handled = true; 975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(OK, clientChannel->sendMessage(&clientReply)) 985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "client channel should be able to send message to server channel"; 995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown InputMessage serverReply; 1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(OK, serverChannel->receiveMessage(&serverReply)) 1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "server channel should be able to receive message from client channel"; 1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(clientReply.header.type, serverReply.header.type) 1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "server channel should receive the correct message from client channel"; 1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(clientReply.body.finished.seq, serverReply.body.finished.seq) 1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "server channel should receive the correct message from client channel"; 1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(clientReply.body.finished.handled, serverReply.body.finished.handled) 1085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "server channel should receive the correct message from client channel"; 1095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} 1105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputChannelTest, ReceiveSignal_WhenNoSignalPresent_ReturnsAnError) { 1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown sp<InputChannel> serverChannel, clientChannel; 1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 114f93fcf4c403fa4181536821680d495824a4290c5Siarhei Vishniakou status_t result = InputChannel::openInputChannelPair("channel name", 1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown serverChannel, clientChannel); 1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ASSERT_EQ(OK, result) 1185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "should have successfully opened a channel pair"; 1195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown InputMessage msg; 1215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(WOULD_BLOCK, clientChannel->receiveMessage(&msg)) 1225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "receiveMessage should have returned WOULD_BLOCK"; 1235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} 1245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputChannelTest, ReceiveSignal_WhenPeerClosed_ReturnsAnError) { 1265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown sp<InputChannel> serverChannel, clientChannel; 1275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 128f93fcf4c403fa4181536821680d495824a4290c5Siarhei Vishniakou status_t result = InputChannel::openInputChannelPair("channel name", 1295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown serverChannel, clientChannel); 1305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ASSERT_EQ(OK, result) 1325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "should have successfully opened a channel pair"; 1335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown serverChannel.clear(); // close server channel 1355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown InputMessage msg; 1375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(DEAD_OBJECT, clientChannel->receiveMessage(&msg)) 1385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "receiveMessage should have returned DEAD_OBJECT"; 1395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} 1405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputChannelTest, SendSignal_WhenPeerClosed_ReturnsAnError) { 1425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown sp<InputChannel> serverChannel, clientChannel; 1435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 144f93fcf4c403fa4181536821680d495824a4290c5Siarhei Vishniakou status_t result = InputChannel::openInputChannelPair("channel name", 1455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown serverChannel, clientChannel); 1465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown ASSERT_EQ(OK, result) 1485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "should have successfully opened a channel pair"; 1495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown serverChannel.clear(); // close server channel 1515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown InputMessage msg; 1535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown msg.header.type = InputMessage::TYPE_KEY; 1545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown EXPECT_EQ(DEAD_OBJECT, clientChannel->sendMessage(&msg)) 1555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown << "sendMessage should have returned DEAD_OBJECT"; 1565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} 1575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown 1595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android 160