1c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// Copyright (c) 2011, Google Inc.
2c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// All rights reserved.
3c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org//
4c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// Redistribution and use in source and binary forms, with or without
5c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// modification, are permitted provided that the following conditions are
6c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// met:
7c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org//
8c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org//     * Redistributions of source code must retain the above copyright
9c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// notice, this list of conditions and the following disclaimer.
10c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org//     * Redistributions in binary form must reproduce the above
11c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// copyright notice, this list of conditions and the following disclaimer
12c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// in the documentation and/or other materials provided with the
13c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// distribution.
14c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org//     * Neither the name of Google Inc. nor the names of its
15c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// contributors may be used to endorse or promote products derived from
16c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// this software without specific prior written permission.
17c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org//
18c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
30c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org// safe_readlink_unittest.cc: Unit tests for google_breakpad::SafeReadLink.
31c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
32c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org#include "breakpad_googletest_includes.h"
33c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org#include "common/linux/safe_readlink.h"
34c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
35c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.orgusing google_breakpad::SafeReadLink;
36c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
37c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.orgTEST(SafeReadLinkTest, ZeroBufferSize) {
38c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char buffer[1];
39c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_FALSE(SafeReadLink("/proc/self/exe", buffer, 0));
40c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org}
41c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
42c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.orgTEST(SafeReadLinkTest, BufferSizeTooSmall) {
43c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char buffer[1];
44c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_FALSE(SafeReadLink("/proc/self/exe", buffer, 1));
45c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org}
46c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
47c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.orgTEST(SafeReadLinkTest, BoundaryBufferSize) {
48c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char buffer[PATH_MAX];
49c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_TRUE(SafeReadLink("/proc/self/exe", buffer, sizeof(buffer)));
50c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  size_t path_length = strlen(buffer);
512971a050754f48aaa807db47a29e0d0beddbdcf7ivan.penkov@gmail.com  EXPECT_LT(0U, path_length);
52c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_GT(sizeof(buffer), path_length);
53c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
54c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  // Buffer size equals to the expected path length plus 1 for the NULL byte.
55c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char buffer2[PATH_MAX];
56c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_TRUE(SafeReadLink("/proc/self/exe", buffer2, path_length + 1));
57c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_EQ(path_length, strlen(buffer2));
58c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_EQ(0, strncmp(buffer, buffer2, PATH_MAX));
59c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
60c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  // Buffer size equals to the expected path length.
61c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_FALSE(SafeReadLink("/proc/self/exe", buffer, path_length));
62c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org}
63c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
64c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.orgTEST(SafeReadLinkTest, NonexistentPath) {
65c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char buffer[PATH_MAX];
66c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_FALSE(SafeReadLink("nonexistent_path", buffer, sizeof(buffer)));
67c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org}
68c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
69c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.orgTEST(SafeReadLinkTest, NonSymbolicLinkPath) {
70c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char actual_path[PATH_MAX];
71c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_TRUE(SafeReadLink("/proc/self/exe", actual_path, sizeof(actual_path)));
72c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
73c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char buffer[PATH_MAX];
74c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_FALSE(SafeReadLink(actual_path, buffer, sizeof(buffer)));
75c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org}
76c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
77c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.orgTEST(SafeReadLinkTest, DeduceBufferSizeFromCharArray) {
78c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char buffer[PATH_MAX];
79c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char* buffer_pointer = buffer;
80c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_TRUE(SafeReadLink("/proc/self/exe", buffer_pointer, sizeof(buffer)));
81c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  size_t path_length = strlen(buffer);
82c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org
83c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  // Use the template version of SafeReadLink to deduce the buffer size
84c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  // from the char array.
85c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  char buffer2[PATH_MAX];
86c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_TRUE(SafeReadLink("/proc/self/exe", buffer2));
87c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_EQ(path_length, strlen(buffer2));
88c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org  EXPECT_EQ(0, strncmp(buffer, buffer2, PATH_MAX));
89c9fb1f6e7400b2f7198e62e09d7ac0a2aa68c84cbenchan@chromium.org}
90