Skip to content

Commit a343244

Browse files
Treehugger RobotAndroid (Google) Code Review
authored andcommitted
Merge "Add unit tests to check that BufferReleaseChannel is unidirectional" into main
2 parents 9a81509 + 603c2ea commit a343244

2 files changed

Lines changed: 31 additions & 23 deletions

File tree

libs/gui/BufferReleaseChannel.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -339,13 +339,6 @@ status_t BufferReleaseChannel::open(std::string name,
339339
return -errno;
340340
}
341341

342-
// Make the producer write-only
343-
if (shutdown(producerFd.get(), SHUT_RD) == -1) {
344-
ALOGE("[%s] Failed to shutdown reading on producer socket. errno=%d message='%s'",
345-
name.c_str(), errno, strerror(errno));
346-
return -errno;
347-
}
348-
349342
outConsumer = std::make_unique<ConsumerEndpoint>(name, std::move(consumerFd));
350343
outProducer = std::make_shared<ProducerEndpoint>(std::move(name), std::move(producerFd));
351344
return STATUS_OK;

libs/gui/tests/BufferReleaseChannel_test.cpp

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ namespace {
2929

3030
// Helper function to check if two file descriptors point to the same file.
3131
bool is_same_file(int fd1, int fd2) {
32-
struct stat stat1;
32+
struct stat stat1 {};
3333
if (fstat(fd1, &stat1) != 0) {
3434
return false;
3535
}
36-
struct stat stat2;
36+
struct stat stat2 {};
3737
if (fstat(fd2, &stat2) != 0) {
3838
return false;
3939
}
@@ -42,7 +42,18 @@ bool is_same_file(int fd1, int fd2) {
4242

4343
} // namespace
4444

45-
TEST(BufferReleaseChannelTest, MessageFlattenable) {
45+
class BufferReleaseChannelTest : public testing::Test {
46+
protected:
47+
std::unique_ptr<BufferReleaseChannel::ConsumerEndpoint> mConsumer;
48+
std::shared_ptr<BufferReleaseChannel::ProducerEndpoint> mProducer;
49+
50+
void SetUp() override {
51+
ASSERT_EQ(OK,
52+
BufferReleaseChannel::open("BufferReleaseChannelTest"s, mConsumer, mProducer));
53+
}
54+
};
55+
56+
TEST_F(BufferReleaseChannelTest, MessageFlattenable) {
4657
ReleaseCallbackId releaseCallbackId{1, 2};
4758
sp<Fence> releaseFence = sp<Fence>::make(memfd_create("fake-fence-fd", 0));
4859
uint32_t maxAcquiredBufferCount = 5;
@@ -92,31 +103,23 @@ TEST(BufferReleaseChannelTest, MessageFlattenable) {
92103

93104
// Verify that the BufferReleaseChannel consume returns WOULD_BLOCK when there's no message
94105
// available.
95-
TEST(BufferReleaseChannelTest, ConsumerEndpointIsNonBlocking) {
96-
std::unique_ptr<BufferReleaseChannel::ConsumerEndpoint> consumer;
97-
std::shared_ptr<BufferReleaseChannel::ProducerEndpoint> producer;
98-
ASSERT_EQ(OK, BufferReleaseChannel::open("test-channel"s, consumer, producer));
99-
106+
TEST_F(BufferReleaseChannelTest, ConsumerEndpointIsNonBlocking) {
100107
ReleaseCallbackId releaseCallbackId;
101108
sp<Fence> releaseFence;
102109
uint32_t maxAcquiredBufferCount;
103110
ASSERT_EQ(WOULD_BLOCK,
104-
consumer->readReleaseFence(releaseCallbackId, releaseFence, maxAcquiredBufferCount));
111+
mConsumer->readReleaseFence(releaseCallbackId, releaseFence, maxAcquiredBufferCount));
105112
}
106113

107114
// Verify that we can write a message to the BufferReleaseChannel producer and read that message
108115
// using the BufferReleaseChannel consumer.
109-
TEST(BufferReleaseChannelTest, ProduceAndConsume) {
110-
std::unique_ptr<BufferReleaseChannel::ConsumerEndpoint> consumer;
111-
std::shared_ptr<BufferReleaseChannel::ProducerEndpoint> producer;
112-
ASSERT_EQ(OK, BufferReleaseChannel::open("test-channel"s, consumer, producer));
113-
116+
TEST_F(BufferReleaseChannelTest, ProduceAndConsume) {
114117
sp<Fence> fence = sp<Fence>::make(memfd_create("fake-fence-fd", 0));
115118

116119
for (uint64_t i = 0; i < 64; i++) {
117120
ReleaseCallbackId producerId{i, i + 1};
118121
uint32_t maxAcquiredBufferCount = i + 2;
119-
ASSERT_EQ(OK, producer->writeReleaseFence(producerId, fence, maxAcquiredBufferCount));
122+
ASSERT_EQ(OK, mProducer->writeReleaseFence(producerId, fence, maxAcquiredBufferCount));
120123
}
121124

122125
for (uint64_t i = 0; i < 64; i++) {
@@ -127,12 +130,24 @@ TEST(BufferReleaseChannelTest, ProduceAndConsume) {
127130
sp<Fence> consumerFence;
128131
uint32_t maxAcquiredBufferCount;
129132
ASSERT_EQ(OK,
130-
consumer->readReleaseFence(consumerId, consumerFence, maxAcquiredBufferCount));
133+
mConsumer->readReleaseFence(consumerId, consumerFence, maxAcquiredBufferCount));
131134

132135
ASSERT_EQ(expectedId, consumerId);
133136
ASSERT_TRUE(is_same_file(fence->get(), consumerFence->get()));
134137
ASSERT_EQ(expectedMaxAcquiredBufferCount, maxAcquiredBufferCount);
135138
}
136139
}
137140

141+
// Verify that BufferReleaseChannel::ConsumerEndpoint's socket can't be written to.
142+
TEST_F(BufferReleaseChannelTest, ConsumerSocketReadOnly) {
143+
uint64_t data = 0;
144+
ASSERT_EQ(-1, write(mConsumer->getFd().get(), &data, sizeof(uint64_t)));
145+
ASSERT_EQ(errno, EPIPE);
146+
}
147+
148+
// Verify that BufferReleaseChannel::ProducerEndpoint's socket can't be read from.
149+
TEST_F(BufferReleaseChannelTest, ProducerSocketWriteOnly) {
150+
ASSERT_EQ(0, read(mProducer->getFd().get(), nullptr, sizeof(uint64_t)));
151+
}
152+
138153
} // namespace android

0 commit comments

Comments
 (0)