| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "common/libs/fs/shared_fd.h" |
| #include "common/libs/fs/shared_select.h" |
| |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <gtest/gtest.h> |
| |
| #include <string> |
| |
| using cvd::InbandMessageHeader; |
| using cvd::SharedFD; |
| |
| char hello[] = "Hello, world!"; |
| char pipe_message[] = "Testing the pipe"; |
| |
| TEST(SendFD, Basic) { |
| char dirname[] = "/tmp/sfdtestXXXXXX"; |
| char* socket = mkdtemp(dirname); |
| EXPECT_TRUE(socket != NULL); |
| std::string path(dirname); |
| path += "/s"; |
| SharedFD server = SharedFD::SocketSeqPacketServer(path.c_str(), 0700); |
| EXPECT_TRUE(server->IsOpen()); |
| int rval = fork(); |
| EXPECT_NE(-1, rval); |
| if (!rval) { |
| struct iovec iov { hello, sizeof(hello) }; |
| SharedFD client = SharedFD::SocketSeqPacketClient(path.c_str()); |
| InbandMessageHeader hdr{}; |
| hdr.msg_iov = &iov; |
| hdr.msg_iovlen = 1; |
| SharedFD fds[2]; |
| SharedFD::Pipe(fds, fds + 1); |
| ssize_t rval = client->SendMsgAndFDs(hdr, 0, fds); |
| printf("SendMsg sent %zd (%s)\n", rval, client->StrError()); |
| exit(0); |
| } |
| server->Listen(2); |
| SharedFD peer = SharedFD::Accept(*server); |
| EXPECT_TRUE(peer->IsOpen()); |
| char buf[80]; |
| struct iovec iov { buf, sizeof(buf) }; |
| InbandMessageHeader hdr{}; |
| hdr.msg_iov = &iov; |
| hdr.msg_iovlen = 1; |
| SharedFD fds[2]; |
| peer->RecvMsgAndFDs(hdr, 0, &fds); |
| EXPECT_EQ(0, strcmp(buf, hello)); |
| EXPECT_TRUE(fds[0]->IsOpen()); |
| EXPECT_TRUE(fds[1]->IsOpen()); |
| EXPECT_EQ(sizeof(pipe_message), fds[1]->Write(pipe_message, sizeof(pipe_message))); |
| EXPECT_EQ(sizeof(pipe_message), fds[0]->Read(buf, sizeof(buf))); |
| EXPECT_EQ(0, strcmp(buf, pipe_message)); |
| } |