1ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown/*
2ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown * Copyright (C) 2010 The Android Open Source Project
3ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown *
4ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown * you may not use this file except in compliance with the License.
6ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown * You may obtain a copy of the License at
7ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown *
8ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown *
10ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown * Unless required by applicable law or agreed to in writing, software
11ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown * See the License for the specific language governing permissions and
14ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown * limitations under the License.
15ebbd5d14ad3b1e762d9fcfa026e19413cc857e05Jeff Brown */
165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
17b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <androidfw/InputTransport.h>
185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <utils/Timers.h>
195c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <utils/StopWatch.h>
20b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <utils/StrongPointer.h>
215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <gtest/gtest.h>
225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <unistd.h>
235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <time.h>
24cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown#include <errno.h>
255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
2608965ec67ada98f63f8ac879cc44c8b0e7ff046dMathias Agopian#include "TestHelpers.h"
275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brownnamespace android {
295c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brownclass InputChannelTest : public testing::Test {
315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brownprotected:
325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    virtual void SetUp() { }
335c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    virtual void TearDown() { }
345c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown};
355c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
365c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
375c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, ConstructorAndDestructor_TakesOwnershipOfFileDescriptors) {
385c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Our purpose here is to verify that the input channel destructor closes the
39cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    // file descriptor provided to it.  One easy way is to provide it with one end
405c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // of a pipe and to check for EPIPE on the other end after the channel is destroyed.
41cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    Pipe pipe;
425c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
43cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    sp<InputChannel> inputChannel = new InputChannel(String8("channel name"), pipe.sendFd);
445c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
455c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    EXPECT_STREQ("channel name", inputChannel->getName().string())
465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            << "channel should have provided name";
47cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(pipe.sendFd, inputChannel->getFd())
48cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "channel should have provided fd";
495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
505c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    inputChannel.clear(); // destroys input channel
515c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
52cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(-EPIPE, pipe.readSignal())
53cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "channel should have closed fd when destroyed";
545c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
555c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // clean up fds of Pipe endpoints that were closed so we don't try to close them again
56cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    pipe.sendFd = -1;
575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown}
585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
595c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, OpenInputChannelPair_ReturnsAPairOfConnectedChannels) {
605c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    sp<InputChannel> serverChannel, clientChannel;
615c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
625c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    status_t result = InputChannel::openInputChannelPair(String8("channel name"),
635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            serverChannel, clientChannel);
645c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
655c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    ASSERT_EQ(OK, result)
665c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            << "should have successfully opened a channel pair";
675c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
685c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Name
695c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    EXPECT_STREQ("channel name (server)", serverChannel->getName().string())
705c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            << "server channel should have suffixed name";
715c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    EXPECT_STREQ("channel name (client)", clientChannel->getName().string())
725c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            << "client channel should have suffixed name";
735c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
745c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Server->Client communication
75cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    InputMessage serverMsg;
76cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    memset(&serverMsg, 0, sizeof(InputMessage));
77cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    serverMsg.header.type = InputMessage::TYPE_KEY;
78cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    serverMsg.body.key.action = AKEY_EVENT_ACTION_DOWN;
79cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(OK, serverChannel->sendMessage(&serverMsg))
80cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "server channel should be able to send message to client channel";
81cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown
82cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    InputMessage clientMsg;
83cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(OK, clientChannel->receiveMessage(&clientMsg))
84cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "client channel should be able to receive message from server channel";
85cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(serverMsg.header.type, clientMsg.header.type)
86cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "client channel should receive the correct message from server channel";
87cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(serverMsg.body.key.action, clientMsg.body.key.action)
88cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "client channel should receive the correct message from server channel";
895c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
905c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    // Client->Server communication
91cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    InputMessage clientReply;
92cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    memset(&clientReply, 0, sizeof(InputMessage));
93cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    clientReply.header.type = InputMessage::TYPE_FINISHED;
94072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    clientReply.body.finished.seq = 0x11223344;
95cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    clientReply.body.finished.handled = true;
96cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(OK, clientChannel->sendMessage(&clientReply))
97cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "client channel should be able to send message to server channel";
98cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown
99cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    InputMessage serverReply;
100cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(OK, serverChannel->receiveMessage(&serverReply))
101cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "server channel should be able to receive message from client channel";
102cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(clientReply.header.type, serverReply.header.type)
103cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "server channel should receive the correct message from client channel";
104072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown    EXPECT_EQ(clientReply.body.finished.seq, serverReply.body.finished.seq)
105072ec96a4900d4616574733646ee46311cb5d2cbJeff Brown            << "server channel should receive the correct message from client channel";
106cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(clientReply.body.finished.handled, serverReply.body.finished.handled)
107cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "server channel should receive the correct message from client channel";
1085c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown}
1095c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1105c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, ReceiveSignal_WhenNoSignalPresent_ReturnsAnError) {
1115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    sp<InputChannel> serverChannel, clientChannel;
1125c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1135c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    status_t result = InputChannel::openInputChannelPair(String8("channel name"),
1145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            serverChannel, clientChannel);
1155c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    ASSERT_EQ(OK, result)
1175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            << "should have successfully opened a channel pair";
1185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
119cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    InputMessage msg;
120cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(WOULD_BLOCK, clientChannel->receiveMessage(&msg))
121cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "receiveMessage should have returned WOULD_BLOCK";
1225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown}
1235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1245c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, ReceiveSignal_WhenPeerClosed_ReturnsAnError) {
1255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    sp<InputChannel> serverChannel, clientChannel;
1265c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    status_t result = InputChannel::openInputChannelPair(String8("channel name"),
1285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            serverChannel, clientChannel);
1295c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    ASSERT_EQ(OK, result)
1315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            << "should have successfully opened a channel pair";
1325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1335c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    serverChannel.clear(); // close server channel
1345c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
135cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    InputMessage msg;
136cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(DEAD_OBJECT, clientChannel->receiveMessage(&msg))
137cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "receiveMessage should have returned DEAD_OBJECT";
1385c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown}
1395c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1405c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, SendSignal_WhenPeerClosed_ReturnsAnError) {
1415c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    sp<InputChannel> serverChannel, clientChannel;
1425c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1435c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    status_t result = InputChannel::openInputChannelPair(String8("channel name"),
1445c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            serverChannel, clientChannel);
1455c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    ASSERT_EQ(OK, result)
1475c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown            << "should have successfully opened a channel pair";
1485c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown    serverChannel.clear(); // close server channel
1505c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
151cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    InputMessage msg;
152cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    msg.header.type = InputMessage::TYPE_KEY;
153cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown    EXPECT_EQ(DEAD_OBJECT, clientChannel->sendMessage(&msg))
154cbee6d6ede0499fb4a2c00bfc00d5db8d9ed5139Jeff Brown            << "sendMessage should have returned DEAD_OBJECT";
1555c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown}
1565c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown
1585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown} // namespace android
159