kernel_wrap_test.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// The linux host build of nacl_io can't do wrapping of syscalls so all 6// these tests must be disabled. 7#if !defined(__linux__) 8 9#include <unistd.h> 10 11#include <string> 12#include <vector> 13 14#include "gtest/gtest.h" 15#include "mock_kernel_proxy.h" 16#include "nacl_io/kernel_intercept.h" 17#include "nacl_io/kernel_wrap.h" 18#include "nacl_io/osmman.h" 19#include "nacl_io/ossocket.h" 20#include "nacl_io/ostermios.h" 21 22#if defined(__native_client__) && !defined(__GLIBC__) 23extern "C" { 24// TODO(sbc): remove once these get added to the newlib toolchain headers. 25int fchdir(int fd); 26int utimes(const char *filename, const struct timeval times[2]); 27} 28#endif 29 30using namespace nacl_io; 31 32using ::testing::_; 33using ::testing::DoAll; 34using ::testing::Return; 35using ::testing::StrEq; 36 37namespace { 38 39#define COMPARE_FIELD(f) \ 40 if (arg->f != statbuf->f) { \ 41 *result_listener << "mismatch of field \"" #f \ 42 "\". " \ 43 "expected: " << statbuf->f << " actual: " << arg->f; \ 44 return false; \ 45 } 46 47MATCHER_P(IsEqualToStatbuf, statbuf, "") { 48 COMPARE_FIELD(st_dev); 49 COMPARE_FIELD(st_ino); 50 COMPARE_FIELD(st_mode); 51 COMPARE_FIELD(st_nlink); 52 COMPARE_FIELD(st_uid); 53 COMPARE_FIELD(st_gid); 54 COMPARE_FIELD(st_rdev); 55 COMPARE_FIELD(st_size); 56 COMPARE_FIELD(st_atime); 57 COMPARE_FIELD(st_mtime); 58 COMPARE_FIELD(st_ctime); 59 return true; 60} 61 62#undef COMPARE_FIELD 63 64ACTION_P(SetStat, statbuf) { 65 memset(arg1, 0, sizeof(struct stat)); 66 arg1->st_dev = statbuf->st_dev; 67 arg1->st_ino = statbuf->st_ino; 68 arg1->st_mode = statbuf->st_mode; 69 arg1->st_nlink = statbuf->st_nlink; 70 arg1->st_uid = statbuf->st_uid; 71 arg1->st_gid = statbuf->st_gid; 72 arg1->st_rdev = statbuf->st_rdev; 73 arg1->st_size = statbuf->st_size; 74 arg1->st_atime = statbuf->st_atime; 75 arg1->st_mtime = statbuf->st_mtime; 76 arg1->st_ctime = statbuf->st_ctime; 77} 78 79void MakeDummyStatbuf(struct stat* statbuf) { 80 memset(&statbuf[0], 0, sizeof(struct stat)); 81 statbuf->st_dev = 1; 82 statbuf->st_ino = 2; 83 statbuf->st_mode = 3; 84 statbuf->st_nlink = 4; 85 statbuf->st_uid = 5; 86 statbuf->st_gid = 6; 87 statbuf->st_rdev = 7; 88 statbuf->st_size = 8; 89 statbuf->st_atime = 9; 90 statbuf->st_mtime = 10; 91 statbuf->st_ctime = 11; 92} 93 94const mode_t kDummyMode = 0xbeef; 95const int kDummyInt = 0xdedbeef; 96const int kDummyInt2 = 0xcabba6e; 97const int kDummyInt3 = 0xf00ba4; 98const int kDummyInt4 = 0xabacdba; 99const size_t kDummySizeT = 0x60067e; 100const char* kDummyConstChar = "foobar"; 101const char* kDummyConstChar2 = "g00gl3"; 102const char* kDummyConstChar3 = "fr00gl3"; 103const void* kDummyVoidPtr = "blahblah"; 104const uid_t kDummyUid = 1001; 105const gid_t kDummyGid = 1002; 106 107class KernelWrapTest : public ::testing::Test { 108 public: 109 KernelWrapTest() {} 110 111 virtual void SetUp() { 112 // Initializing the KernelProxy opens stdin/stdout/stderr. 113 EXPECT_CALL(mock, open(_, _)) 114 .WillOnce(Return(0)) 115 .WillOnce(Return(1)) 116 .WillOnce(Return(2)); 117 // And will call mount / and /dev. 118 EXPECT_CALL(mock, mount(_, _, _, _, _)) 119 .WillOnce(Return(0)) 120 .WillOnce(Return(0)); 121 122 ASSERT_EQ(0, ki_push_state_for_testing()); 123 ASSERT_EQ(0, ki_init(&mock)); 124 } 125 126 void TearDown() { 127 // Uninitialize the kernel proxy so wrapped functions passthrough to their 128 // unwrapped versions. 129 ki_uninit(); 130 } 131 132 133 MockKernelProxy mock; 134}; 135 136} // namespace 137 138TEST_F(KernelWrapTest, access) { 139 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(-1)); 140 EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt)); 141 142 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0)); 143 EXPECT_EQ(0, access(kDummyConstChar, kDummyInt)); 144} 145 146TEST_F(KernelWrapTest, chdir) { 147 EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(-1)); 148 EXPECT_EQ(-1, chdir(kDummyConstChar)); 149 150 EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0)); 151 EXPECT_EQ(0, chdir(kDummyConstChar)); 152} 153 154TEST_F(KernelWrapTest, chmod) { 155 EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyMode)) 156 .WillOnce(Return(kDummyInt2)); 157 EXPECT_EQ(kDummyInt2,chmod(kDummyConstChar, kDummyMode)); 158} 159 160TEST_F(KernelWrapTest, chown) { 161 EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid)) 162 .WillOnce(Return(kDummyInt)); 163 EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid)); 164} 165 166TEST_F(KernelWrapTest, close) { 167 // The way we wrap close does not support returning arbitrary values, so we 168 // test 0 and -1. 169 EXPECT_CALL(mock, close(kDummyInt)) 170 .WillOnce(Return(0)) 171 .WillOnce(Return(-1)); 172 173 EXPECT_EQ(0, close(kDummyInt)); 174 EXPECT_EQ(-1, close(kDummyInt)); 175} 176 177TEST_F(KernelWrapTest, dup) { 178 EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2)); 179 EXPECT_EQ(kDummyInt2, dup(kDummyInt)); 180} 181 182TEST_F(KernelWrapTest, dup2) { 183 // The way we wrap dup2 does not support returning aribtrary values, only -1 184 // or the value of the new fd. 185 EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2)) 186 .WillOnce(Return(kDummyInt2)) 187 .WillOnce(Return(-1)); 188 EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2)); 189 EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2)); 190} 191 192TEST_F(KernelWrapTest, fchdir) { 193 EXPECT_CALL(mock, fchdir(kDummyInt)) 194 .WillOnce(Return(-1)); 195 EXPECT_EQ(-1, fchdir(kDummyInt)); 196} 197 198TEST_F(KernelWrapTest, fchmod) { 199 EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) 200 .WillOnce(Return(-1)); 201 EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode)); 202 203 EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) .WillOnce(Return(0)); 204 EXPECT_EQ(0, fchmod(kDummyInt, kDummyMode)); 205} 206 207TEST_F(KernelWrapTest, fchown) { 208 EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid)) 209 .WillOnce(Return(kDummyInt)); 210 EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid)); 211} 212 213TEST_F(KernelWrapTest, fcntl) { 214 char buffer[] = "fcntl"; 215 EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _)) 216 .WillOnce(Return(kDummyInt3)); 217 EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer)); 218} 219 220TEST_F(KernelWrapTest, fdatasync) { 221 EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(-1)); 222 EXPECT_EQ(-1, fdatasync(kDummyInt)); 223 224 EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0)); 225 EXPECT_EQ(0, fdatasync(kDummyInt)); 226} 227 228TEST_F(KernelWrapTest, fstat) { 229 // The way we wrap fstat does not support returning aribtrary values, only 0 230 // or -1. 231 struct stat in_statbuf; 232 MakeDummyStatbuf(&in_statbuf); 233 EXPECT_CALL(mock, fstat(kDummyInt, _)) 234 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) 235 .WillOnce(Return(-1)); 236 struct stat out_statbuf; 237 EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf)); 238 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); 239 EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf)); 240} 241 242TEST_F(KernelWrapTest, ftruncate) { 243 EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2)) 244 .WillOnce(Return(kDummyInt3)); 245 EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2)); 246} 247 248TEST_F(KernelWrapTest, fsync) { 249 EXPECT_CALL(mock, fsync(kDummyInt)).WillOnce(Return(-1)); 250 EXPECT_EQ(-1, fsync(kDummyInt)); 251} 252 253TEST_F(KernelWrapTest, getcwd) { 254 char result[] = "getcwd_result"; 255 char buffer[] = "getcwd"; 256 EXPECT_CALL(mock, getcwd(buffer, kDummySizeT)).WillOnce(Return(result)); 257 EXPECT_EQ(result, getcwd(buffer, kDummySizeT)); 258} 259 260TEST_F(KernelWrapTest, getdents) { 261#if !defined( __GLIBC__) && !defined(__BIONIC__) 262 // TODO(sbc): Find a way to test the getdents wrapper under glibc. 263 // It looks like the only way to exercise it is to call readdir(2). 264 // There is an internal glibc function __getdents that will call the 265 // IRT but that cannot be accessed from here as glibc does not export it. 266 int dummy_val; 267 void* void_ptr = &dummy_val; 268 EXPECT_CALL(mock, getdents(kDummyInt, void_ptr, kDummyInt2)) 269 .WillOnce(Return(kDummyInt2)); 270 EXPECT_EQ(kDummyInt2, getdents(kDummyInt, void_ptr, kDummyInt2)); 271#endif 272} 273 274// gcc gives error: getwd is deprecated. 275#if defined(__GNUC__) 276#pragma GCC diagnostic ignored "-Wdeprecated-declarations" 277#endif 278TEST_F(KernelWrapTest, getwd) { 279 char result[] = "getwd_result"; 280 char buffer[] = "getwd"; 281 EXPECT_CALL(mock, getwd(buffer)).WillOnce(Return(result)); 282 EXPECT_EQ(result, getwd(buffer)); 283} 284#if defined(__GNUC__) 285#pragma GCC diagnostic warning "-Wdeprecated-declarations" 286#endif 287 288TEST_F(KernelWrapTest, ioctl) { 289 char buffer[] = "ioctl"; 290 EXPECT_CALL(mock, ioctl(kDummyInt, kDummyInt2, _)) 291 .WillOnce(Return(kDummyInt3)); 292 EXPECT_EQ(kDummyInt3, ioctl(kDummyInt, kDummyInt2, buffer)); 293} 294 295#if !defined(__BIONIC__) 296TEST_F(KernelWrapTest, isatty) { 297 EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(kDummyInt2)); 298 EXPECT_EQ(kDummyInt2, isatty(kDummyInt)); 299 300 // This test verifies that the IRT interception wrapper for isatty 301 // ignores the value of errno when isatty() returns 1. We had a bug 302 // where returning 1 from ki_isatty resulted in errno being returned 303 // by the IRT interface. 304 errno = kDummyInt3; 305 EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(1)); 306 EXPECT_EQ(1, isatty(kDummyInt)); 307} 308#endif 309 310TEST_F(KernelWrapTest, kill) { 311 EXPECT_CALL(mock, kill(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3)); 312 EXPECT_EQ(kDummyInt3, kill(kDummyInt, kDummyInt2)); 313} 314 315TEST_F(KernelWrapTest, lchown) { 316 EXPECT_CALL(mock, lchown(kDummyConstChar, kDummyUid, kDummyGid)) 317 .WillOnce(Return(kDummyInt)); 318 EXPECT_EQ(kDummyInt, lchown(kDummyConstChar, kDummyUid, kDummyGid)); 319} 320 321TEST_F(KernelWrapTest, link) { 322 EXPECT_CALL(mock, link(kDummyConstChar, kDummyConstChar2)) 323 .WillOnce(Return(kDummyInt)); 324 EXPECT_EQ(kDummyInt, link(kDummyConstChar, kDummyConstChar2)); 325} 326 327TEST_F(KernelWrapTest, lseek) { 328 EXPECT_CALL(mock, lseek(kDummyInt, kDummyInt2, kDummyInt3)) 329 .WillOnce(Return(kDummyInt4)); 330 EXPECT_EQ(kDummyInt4, lseek(kDummyInt, kDummyInt2, kDummyInt3)); 331} 332 333TEST_F(KernelWrapTest, mkdir) { 334#if defined(WIN32) 335 EXPECT_CALL(mock, mkdir(kDummyConstChar, 0777)).WillOnce(Return(kDummyInt2)); 336 EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar)); 337#else 338 EXPECT_CALL(mock, mkdir(kDummyConstChar, kDummyMode)) 339 .WillOnce(Return(kDummyInt2)); 340 EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar, kDummyMode)); 341#endif 342} 343 344TEST_F(KernelWrapTest, mmap) { 345 // We only wrap mmap if |flags| has the MAP_ANONYMOUS bit unset. 346 int flags = kDummyInt2 & ~MAP_ANONYMOUS; 347 348 const size_t kDummySizeT2 = 0xbadf00d; 349 int dummy1 = 123; 350 int dummy2 = 456; 351 void* kDummyVoidPtr1 = &dummy1; 352 void* kDummyVoidPtr2 = &dummy2; 353 EXPECT_CALL(mock, 354 mmap(kDummyVoidPtr1, 355 kDummySizeT, 356 kDummyInt, 357 flags, 358 kDummyInt3, 359 kDummySizeT2)).WillOnce(Return(kDummyVoidPtr2)); 360 EXPECT_EQ(kDummyVoidPtr2, 361 mmap(kDummyVoidPtr1, 362 kDummySizeT, 363 kDummyInt, 364 flags, 365 kDummyInt3, 366 kDummySizeT2)); 367} 368 369TEST_F(KernelWrapTest, mount) { 370 EXPECT_CALL(mock, 371 mount(kDummyConstChar, 372 kDummyConstChar2, 373 kDummyConstChar3, 374 kDummyInt, 375 kDummyVoidPtr)).WillOnce(Return(kDummyInt2)); 376 EXPECT_EQ(kDummyInt2, 377 mount(kDummyConstChar, 378 kDummyConstChar2, 379 kDummyConstChar3, 380 kDummyInt, 381 kDummyVoidPtr)); 382} 383 384TEST_F(KernelWrapTest, munmap) { 385 // The way we wrap munmap, calls the "real" mmap as well as the intercepted 386 // one. The result returned is from the "real" mmap. 387 int dummy1 = 123; 388 void* kDummyVoidPtr = &dummy1; 389 size_t kDummySizeT = sizeof(kDummyVoidPtr); 390 EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT)); 391 munmap(kDummyVoidPtr, kDummySizeT); 392} 393 394 395TEST_F(KernelWrapTest, open) { 396 // We pass O_RDONLY because we do not want an error in flags translation 397 EXPECT_CALL(mock, open(kDummyConstChar, 0)) 398 .WillOnce(Return(kDummyInt2)); 399 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); 400 401 EXPECT_CALL(mock, open(kDummyConstChar, 0)) 402 .WillOnce(Return(kDummyInt2)); 403 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); 404} 405 406TEST_F(KernelWrapTest, pipe) { 407 int fds[] = {1, 2}; 408 EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt)); 409 EXPECT_EQ(kDummyInt, pipe(fds)); 410} 411 412TEST_F(KernelWrapTest, read) { 413 int dummy_value; 414 void* dummy_void_ptr = &dummy_value; 415 EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2)) 416 .WillOnce(Return(kDummyInt3)); 417 EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2)); 418} 419 420TEST_F(KernelWrapTest, readlink) { 421 char buf[10]; 422 423 EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) 424 .WillOnce(Return(-1)); 425 EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10)); 426 427 EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) 428 .WillOnce(Return(kDummyInt)); 429 EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10)); 430} 431 432#ifdef __GLIBC__ 433// Under newlib there is no remove syscall. Instead it is implemented 434// in terms of unlink()/rmdir(). 435TEST_F(KernelWrapTest, remove) { 436 EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1)); 437 EXPECT_EQ(-1, remove(kDummyConstChar)); 438} 439#endif 440 441TEST_F(KernelWrapTest, rename) { 442 EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) 443 .WillOnce(Return(-1)); 444 EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2)); 445 446 EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) 447 .WillOnce(Return(0)); 448 EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2)); 449} 450 451TEST_F(KernelWrapTest, rmdir) { 452 EXPECT_CALL(mock, rmdir(kDummyConstChar)).WillOnce(Return(kDummyInt)); 453 EXPECT_EQ(kDummyInt, rmdir(kDummyConstChar)); 454} 455 456static void new_handler(int) {} 457 458TEST_F(KernelWrapTest, sigaction) { 459 struct sigaction action; 460 struct sigaction oaction; 461 EXPECT_CALL(mock, sigaction(kDummyInt, &action, &oaction)) 462 .WillOnce(Return(0)); 463 EXPECT_EQ(0, sigaction(kDummyInt, &action, &oaction)); 464} 465 466TEST_F(KernelWrapTest, sigset) { 467 EXPECT_CALL(mock, sigaction(kDummyInt, _, _)) 468 .WillOnce(Return(0)); 469 EXPECT_EQ(NULL, sigset(kDummyInt, new_handler)); 470} 471 472TEST_F(KernelWrapTest, signal) { 473 // KernelIntercept forwards calls to signal to KernelProxy::sigset. 474 EXPECT_CALL(mock, sigaction(kDummyInt, _, _)) 475 .WillOnce(Return(0)); 476 EXPECT_EQ(NULL, signal(kDummyInt, new_handler)); 477} 478 479TEST_F(KernelWrapTest, stat) { 480 // The way we wrap stat does not support returning aribtrary values, only 0 481 // or -1. 482 struct stat in_statbuf; 483 MakeDummyStatbuf(&in_statbuf); 484 EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _)) 485 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) 486 .WillOnce(Return(-1)); 487 struct stat out_statbuf; 488 EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf)); 489 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); 490 EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf)); 491} 492 493TEST_F(KernelWrapTest, symlink) { 494 EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2)) 495 .WillOnce(Return(kDummyInt)); 496 EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2)); 497} 498 499#ifndef __BIONIC__ 500TEST_F(KernelWrapTest, tcflush) { 501 EXPECT_CALL(mock, tcflush(kDummyInt, kDummyInt2)) 502 .WillOnce(Return(kDummyInt3)); 503 EXPECT_EQ(kDummyInt3, tcflush(kDummyInt, kDummyInt2)); 504} 505 506TEST_F(KernelWrapTest, tcgetattr) { 507 struct termios term; 508 EXPECT_CALL(mock, tcgetattr(kDummyInt, &term)).WillOnce(Return(kDummyInt2)); 509 EXPECT_EQ(kDummyInt2, tcgetattr(kDummyInt, &term)); 510} 511 512TEST_F(KernelWrapTest, tcsetattr) { 513 struct termios term; 514 EXPECT_CALL(mock, tcsetattr(kDummyInt, kDummyInt2, &term)) 515 .WillOnce(Return(kDummyInt3)); 516 EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term)); 517} 518#endif 519 520TEST_F(KernelWrapTest, umount) { 521 EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt)); 522 EXPECT_EQ(kDummyInt, umount(kDummyConstChar)); 523} 524 525TEST_F(KernelWrapTest, truncate) { 526 EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(-1)); 527 EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3)); 528 529 EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(0)); 530 EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3)); 531} 532 533#ifndef __BIONIC__ 534TEST_F(KernelWrapTest, lstat) { 535 struct stat buf; 536 EXPECT_CALL(mock, lstat(kDummyConstChar, &buf)).WillOnce(Return(-1)); 537 EXPECT_EQ(-1, lstat(kDummyConstChar, &buf)); 538 539 EXPECT_CALL(mock, lstat(kDummyConstChar, &buf)).WillOnce(Return(0)); 540 EXPECT_EQ(0, lstat(kDummyConstChar, &buf)); 541} 542#endif 543 544TEST_F(KernelWrapTest, unlink) { 545 EXPECT_CALL(mock, unlink(kDummyConstChar)).WillOnce(Return(kDummyInt)); 546 EXPECT_EQ(kDummyInt, unlink(kDummyConstChar)); 547} 548 549TEST_F(KernelWrapTest, utime) { 550 const struct utimbuf* times = NULL; 551 EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt)); 552 EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times)); 553} 554 555TEST_F(KernelWrapTest, utimes) { 556 struct timeval* times = NULL; 557 EXPECT_CALL(mock, utimes(kDummyConstChar, times)).WillOnce(Return(-1)); 558 EXPECT_EQ(-1, utimes(kDummyConstChar, times)); 559} 560 561TEST_F(KernelWrapTest, write) { 562 EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2)) 563 .WillOnce(Return(kDummyInt3)); 564 EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2)); 565} 566 567#if defined(PROVIDES_SOCKET_API) and !defined(__BIONIC__) 568TEST_F(KernelWrapTest, poll) { 569 struct pollfd fds; 570 EXPECT_CALL(mock, poll(&fds, kDummyInt, kDummyInt2)) 571 .WillOnce(Return(kDummyInt3)); 572 EXPECT_EQ(kDummyInt3, poll(&fds, kDummyInt, kDummyInt2)); 573} 574 575TEST_F(KernelWrapTest, select) { 576 fd_set readfds; 577 fd_set writefds; 578 fd_set exceptfds; 579 EXPECT_CALL(mock, select(kDummyInt, &readfds, &writefds, &exceptfds, NULL)) 580 .WillOnce(Return(kDummyInt2)); 581 EXPECT_EQ(kDummyInt2, 582 select(kDummyInt, &readfds, &writefds, &exceptfds, NULL)); 583} 584 585// Socket Functions 586TEST_F(KernelWrapTest, accept) { 587 struct sockaddr addr; 588 socklen_t len; 589 EXPECT_CALL(mock, accept(kDummyInt, &addr, &len)) 590 .WillOnce(Return(kDummyInt2)); 591 EXPECT_EQ(kDummyInt2, accept(kDummyInt, &addr, &len)); 592} 593 594TEST_F(KernelWrapTest, bind) { 595 struct sockaddr addr; 596 EXPECT_CALL(mock, bind(kDummyInt, &addr, kDummyInt2)) 597 .WillOnce(Return(kDummyInt2)); 598 EXPECT_EQ(kDummyInt2, bind(kDummyInt, &addr, kDummyInt2)); 599} 600 601TEST_F(KernelWrapTest, connect) { 602 struct sockaddr addr; 603 EXPECT_CALL(mock, connect(kDummyInt, &addr, kDummyInt2)) 604 .WillOnce(Return(kDummyInt2)); 605 EXPECT_EQ(kDummyInt2, connect(kDummyInt, &addr, kDummyInt2)); 606} 607 608TEST_F(KernelWrapTest, gethostbyname) { 609 struct hostent result; 610 EXPECT_CALL(mock, gethostbyname(kDummyConstChar)).WillOnce(Return(&result)); 611 EXPECT_EQ(&result, gethostbyname(kDummyConstChar)); 612} 613 614TEST_F(KernelWrapTest, getpeername) { 615 struct sockaddr addr; 616 socklen_t len; 617 EXPECT_CALL(mock, getpeername(kDummyInt, &addr, &len)) 618 .WillOnce(Return(kDummyInt2)); 619 EXPECT_EQ(kDummyInt2, getpeername(kDummyInt, &addr, &len)); 620} 621 622TEST_F(KernelWrapTest, getsockname) { 623 struct sockaddr addr; 624 socklen_t len; 625 EXPECT_CALL(mock, getsockname(kDummyInt, &addr, &len)) 626 .WillOnce(Return(kDummyInt2)); 627 EXPECT_EQ(kDummyInt2, getsockname(kDummyInt, &addr, &len)); 628} 629 630TEST_F(KernelWrapTest, getsockopt) { 631 int dummy_val; 632 void* dummy_void_ptr = &dummy_val; 633 socklen_t len; 634 EXPECT_CALL( 635 mock, getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len)) 636 .WillOnce(Return(kDummyInt4)); 637 EXPECT_EQ( 638 kDummyInt4, 639 getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len)); 640} 641 642TEST_F(KernelWrapTest, listen) { 643 EXPECT_CALL(mock, listen(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3)); 644 EXPECT_EQ(kDummyInt3, listen(kDummyInt, kDummyInt2)); 645} 646 647TEST_F(KernelWrapTest, recv) { 648 int dummy_val; 649 void* dummy_void_ptr = &dummy_val; 650 EXPECT_CALL(mock, recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2)) 651 .WillOnce(Return(kDummyInt3)); 652 EXPECT_EQ(kDummyInt3, 653 recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2)); 654} 655 656TEST_F(KernelWrapTest, recvfrom) { 657 int dummy_val; 658 void* dummy_void_ptr = &dummy_val; 659 struct sockaddr addr; 660 socklen_t len; 661 EXPECT_CALL( 662 mock, 663 recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len)) 664 .WillOnce(Return(kDummyInt4)); 665 EXPECT_EQ( 666 kDummyInt4, 667 recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len)); 668} 669 670#ifndef __BIONIC__ 671TEST_F(KernelWrapTest, recvmsg) { 672 struct msghdr msg; 673 EXPECT_CALL(mock, recvmsg(kDummyInt, &msg, kDummyInt2)) 674 .WillOnce(Return(kDummyInt3)); 675 EXPECT_EQ(kDummyInt3, recvmsg(kDummyInt, &msg, kDummyInt2)); 676} 677#endif 678 679TEST_F(KernelWrapTest, send) { 680 EXPECT_CALL(mock, send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2)) 681 .WillOnce(Return(kDummyInt3)); 682 EXPECT_EQ(kDummyInt3, 683 send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2)); 684} 685 686TEST_F(KernelWrapTest, sendto) { 687 const socklen_t kDummySockLen = 0x50cc5; 688 struct sockaddr addr; 689 EXPECT_CALL(mock, 690 sendto(kDummyInt, 691 kDummyVoidPtr, 692 kDummyInt2, 693 kDummyInt3, 694 &addr, 695 kDummySockLen)).WillOnce(Return(kDummyInt4)); 696 EXPECT_EQ(kDummyInt4, 697 sendto(kDummyInt, 698 kDummyVoidPtr, 699 kDummyInt2, 700 kDummyInt3, 701 &addr, 702 kDummySockLen)); 703} 704 705TEST_F(KernelWrapTest, sendmsg) { 706 struct msghdr msg; 707 EXPECT_CALL(mock, sendmsg(kDummyInt, &msg, kDummyInt2)) 708 .WillOnce(Return(kDummyInt3)); 709 EXPECT_EQ(kDummyInt3, sendmsg(kDummyInt, &msg, kDummyInt2)); 710} 711 712TEST_F(KernelWrapTest, setsockopt) { 713 const socklen_t kDummySockLen = 0x50cc5; 714 EXPECT_CALL( 715 mock, 716 setsockopt( 717 kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen)) 718 .WillOnce(Return(kDummyInt4)); 719 EXPECT_EQ( 720 kDummyInt4, 721 setsockopt( 722 kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen)); 723} 724 725TEST_F(KernelWrapTest, shutdown) { 726 EXPECT_CALL(mock, shutdown(kDummyInt, kDummyInt2)) 727 .WillOnce(Return(kDummyInt3)); 728 EXPECT_EQ(kDummyInt3, shutdown(kDummyInt, kDummyInt2)); 729} 730 731TEST_F(KernelWrapTest, socket) { 732 EXPECT_CALL(mock, socket(kDummyInt, kDummyInt2, kDummyInt3)) 733 .WillOnce(Return(kDummyInt4)); 734 EXPECT_EQ(kDummyInt4, socket(kDummyInt, kDummyInt2, kDummyInt3)); 735} 736 737TEST_F(KernelWrapTest, socketpair) { 738 int dummy_val; 739 EXPECT_CALL(mock, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)) 740 .WillOnce(Return(kDummyInt4)); 741 EXPECT_EQ(kDummyInt4, 742 socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)); 743} 744 745#endif // PROVIDES_SOCKET_API 746 747#endif // __linux__ 748