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