1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "fuse_adb_provider.h" 18 19 #include <gtest/gtest.h> 20 21 #include <errno.h> 22 #include <fcntl.h> 23 #include <sys/socket.h> 24 25 #include <string> 26 27 #include "adb_io.h" 28 29 TEST(fuse_adb_provider, read_block_adb) { 30 adb_data data = {}; 31 int sockets[2]; 32 33 ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sockets)); 34 data.sfd = sockets[0]; 35 36 int host_socket = sockets[1]; 37 fcntl(host_socket, F_SETFL, O_NONBLOCK); 38 39 const char expected_data[] = "foobar"; 40 char block_data[sizeof(expected_data)] = {}; 41 42 // If we write the result of read_block_adb's request before the request is 43 // actually made we can avoid needing an extra thread for this test. 44 ASSERT_TRUE(WriteFdExactly(host_socket, expected_data, 45 strlen(expected_data))); 46 47 uint32_t block = 1234U; 48 const char expected_block[] = "00001234"; 49 ASSERT_EQ(0, read_block_adb(reinterpret_cast<void*>(&data), block, 50 reinterpret_cast<uint8_t*>(block_data), 51 sizeof(expected_data) - 1)); 52 53 // Check that read_block_adb requested the right block. 54 char block_req[sizeof(expected_block)] = {}; 55 ASSERT_TRUE(ReadFdExactly(host_socket, block_req, 8)); 56 ASSERT_EQ(0, block_req[8]); 57 ASSERT_EQ(8U, strlen(block_req)); 58 ASSERT_STREQ(expected_block, block_req); 59 60 // Check that read_block_adb returned the right data. 61 ASSERT_EQ(0, block_req[8]); 62 ASSERT_STREQ(expected_data, block_data); 63 64 // Check that nothing else was written to the socket. 65 char tmp; 66 errno = 0; 67 ASSERT_EQ(-1, read(host_socket, &tmp, 1)); 68 ASSERT_EQ(EWOULDBLOCK, errno); 69 70 close(sockets[0]); 71 close(sockets[1]); 72 } 73 74 TEST(fuse_adb_provider, read_block_adb_fail_write) { 75 adb_data data = {}; 76 int sockets[2]; 77 78 ASSERT_EQ(0, socketpair(AF_UNIX, SOCK_STREAM, 0, sockets)); 79 data.sfd = sockets[0]; 80 81 ASSERT_EQ(0, close(sockets[1])); 82 83 char buf[1]; 84 ASSERT_EQ(-EIO, read_block_adb(reinterpret_cast<void*>(&data), 0, 85 reinterpret_cast<uint8_t*>(buf), 1)); 86 87 close(sockets[0]); 88 } 89