InputChannel_test.cpp revision 5c225b1680e696ae8bbf505a1997d6f720672f74
15c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown// 25c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown// Copyright 2010 The Android Open Source Project 35c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown// 45c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 55c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <ui/InputTransport.h> 65c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <utils/Timers.h> 75c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <utils/StopWatch.h> 85c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <gtest/gtest.h> 95c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <unistd.h> 105c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <time.h> 115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <sys/mman.h> 125c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include <cutils/ashmem.h> 135c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown#include "../../utils/tests/TestHelpers.h" 155c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brownnamespace android { 175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brownclass InputChannelTest : public testing::Test { 195c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brownprotected: 205c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown virtual void SetUp() { } 215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown virtual void TearDown() { } 225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown}; 235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 245c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 255c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, ConstructorAndDestructor_TakesOwnershipOfFileDescriptors) { 265c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown // Our purpose here is to verify that the input channel destructor closes the 275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown // file descriptors provided to it. One easy way is to provide it with one end 285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown // of a pipe and to check for EPIPE on the other end after the channel is destroyed. 295c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown Pipe fakeAshmem, sendPipe, receivePipe; 305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown sp<InputChannel> inputChannel = new InputChannel(String8("channel name"), 325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown fakeAshmem.sendFd, receivePipe.receiveFd, sendPipe.sendFd); 335c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 345c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_STREQ("channel name", inputChannel->getName().string()) 355c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "channel should have provided name"; 365c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(fakeAshmem.sendFd, inputChannel->getAshmemFd()) 375c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "channel should have provided ashmem fd"; 385c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(receivePipe.receiveFd, inputChannel->getReceivePipeFd()) 395c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "channel should have provided receive pipe fd"; 405c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(sendPipe.sendFd, inputChannel->getSendPipeFd()) 415c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "channel should have provided send pipe fd"; 425c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 435c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown inputChannel.clear(); // destroys input channel 445c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 455c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(-EPIPE, fakeAshmem.readSignal()) 465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "channel should have closed ashmem fd when destroyed"; 475c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(-EPIPE, receivePipe.writeSignal()) 485c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "channel should have closed receive pipe fd when destroyed"; 495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(-EPIPE, sendPipe.readSignal()) 505c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "channel should have closed send pipe fd when destroyed"; 515c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 525c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown // clean up fds of Pipe endpoints that were closed so we don't try to close them again 535c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown fakeAshmem.sendFd = -1; 545c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown receivePipe.receiveFd = -1; 555c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown sendPipe.sendFd = -1; 565c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown} 575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 585c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, OpenInputChannelPair_ReturnsAPairOfConnectedChannels) { 595c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown sp<InputChannel> serverChannel, clientChannel; 605c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 615c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown status_t result = InputChannel::openInputChannelPair(String8("channel name"), 625c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown serverChannel, clientChannel); 635c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 645c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown ASSERT_EQ(OK, result) 655c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "should have successfully opened a channel pair"; 665c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 675c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown // Name 685c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_STREQ("channel name (server)", serverChannel->getName().string()) 695c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "server channel should have suffixed name"; 705c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_STREQ("channel name (client)", clientChannel->getName().string()) 715c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "client channel should have suffixed name"; 725c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 735c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown // Ashmem uniqueness 745c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_NE(serverChannel->getAshmemFd(), clientChannel->getAshmemFd()) 755c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "server and client channel should have different ashmem fds because it was dup'd"; 765c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 775c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown // Ashmem usability 785c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown ssize_t serverAshmemSize = ashmem_get_size_region(serverChannel->getAshmemFd()); 795c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown ssize_t clientAshmemSize = ashmem_get_size_region(clientChannel->getAshmemFd()); 805c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown uint32_t* serverAshmem = static_cast<uint32_t*>(mmap(NULL, serverAshmemSize, 815c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown PROT_READ | PROT_WRITE, MAP_SHARED, serverChannel->getAshmemFd(), 0)); 825c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown uint32_t* clientAshmem = static_cast<uint32_t*>(mmap(NULL, clientAshmemSize, 835c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown PROT_READ | PROT_WRITE, MAP_SHARED, clientChannel->getAshmemFd(), 0)); 845c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown ASSERT_TRUE(serverAshmem != NULL) 855c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "server channel ashmem should be mappable"; 865c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown ASSERT_TRUE(clientAshmem != NULL) 875c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "client channel ashmem should be mappable"; 885c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown *serverAshmem = 0xf00dd00d; 895c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(0xf00dd00d, *clientAshmem) 905c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "ashmem buffer should be shared by client and server"; 915c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown munmap(serverAshmem, serverAshmemSize); 925c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown munmap(clientAshmem, clientAshmemSize); 935c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 945c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown // Server->Client communication 955c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(OK, serverChannel->sendSignal('S')) 965c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "server channel should be able to send signal to client channel"; 975c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown char signal; 985c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(OK, clientChannel->receiveSignal(& signal)) 995c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "client channel should be able to receive signal from server channel"; 1005c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ('S', signal) 1015c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "client channel should receive the correct signal from server channel"; 1025c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1035c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown // Client->Server communication 1045c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(OK, clientChannel->sendSignal('c')) 1055c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "client channel should be able to send signal to server channel"; 1065c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(OK, serverChannel->receiveSignal(& signal)) 1075c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "server channel should be able to receive signal from client channel"; 1085c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ('c', signal) 1095c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "server channel should receive the correct signal from client channel"; 1105c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown} 1115c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1125c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, ReceiveSignal_WhenNoSignalPresent_ReturnsAnError) { 1135c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown sp<InputChannel> serverChannel, clientChannel; 1145c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1155c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown status_t result = InputChannel::openInputChannelPair(String8("channel name"), 1165c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown serverChannel, clientChannel); 1175c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1185c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown ASSERT_EQ(OK, result) 1195c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "should have successfully opened a channel pair"; 1205c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1215c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown char signal; 1225c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(WOULD_BLOCK, clientChannel->receiveSignal(& signal)) 1235c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "receiveSignal should have returned WOULD_BLOCK"; 1245c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown} 1255c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1265c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, ReceiveSignal_WhenPeerClosed_ReturnsAnError) { 1275c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown sp<InputChannel> serverChannel, clientChannel; 1285c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1295c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown status_t result = InputChannel::openInputChannelPair(String8("channel name"), 1305c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown serverChannel, clientChannel); 1315c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1325c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown ASSERT_EQ(OK, result) 1335c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "should have successfully opened a channel pair"; 1345c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1355c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown serverChannel.clear(); // close server channel 1365c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1375c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown char signal; 1385c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(DEAD_OBJECT, clientChannel->receiveSignal(& signal)) 1395c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "receiveSignal should have returned DEAD_OBJECT"; 1405c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown} 1415c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1425c225b1680e696ae8bbf505a1997d6f720672f74Jeff BrownTEST_F(InputChannelTest, SendSignal_WhenPeerClosed_ReturnsAnError) { 1435c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown sp<InputChannel> serverChannel, clientChannel; 1445c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1455c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown status_t result = InputChannel::openInputChannelPair(String8("channel name"), 1465c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown serverChannel, clientChannel); 1475c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1485c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown ASSERT_EQ(OK, result) 1495c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "should have successfully opened a channel pair"; 1505c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1515c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown serverChannel.clear(); // close server channel 1525c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1535c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown EXPECT_EQ(DEAD_OBJECT, clientChannel->sendSignal('S')) 1545c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown << "sendSignal should have returned DEAD_OBJECT"; 1555c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown} 1565c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1575c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown 1585c225b1680e696ae8bbf505a1997d6f720672f74Jeff Brown} // namespace android 159