summaryrefslogtreecommitdiffstats
path: root/chromecast/crash/linux/dummy_minidump_generator_unittest.cc
blob: c38304f270b6c32c3fa510993d7446af37740897 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <string>

#include "base/files/file_util.h"
#include "base/rand_util.h"
#include "chromecast/crash/linux/dummy_minidump_generator.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace chromecast {

namespace {
// This value should stay in sync with the internal buffer size used in
// CopyAndDelete().
const int kInternalBufferSize = 32768;
}  // namespace

TEST(DummyMinidumpGeneratorTest, GenerateFailsWithInvalidPath) {
  // Create directory in which to put minidump.
  base::FilePath minidump_dir;
  ASSERT_TRUE(base::CreateNewTempDirectory("", &minidump_dir));

  // Attempt to generate a minidump from an invalid path.
  DummyMinidumpGenerator generator("/path/does/not/exist/minidump.dmp");
  ASSERT_FALSE(generator.Generate(minidump_dir.Append("minidump.dmp").value()));
}

TEST(DummyMinidumpGeneratorTest, GenerateSucceedsWithValidPath) {
  // Create directory in which to put minidump.
  base::FilePath minidump_dir;
  ASSERT_TRUE(base::CreateNewTempDirectory("", &minidump_dir));

  // Create a fake minidump file.
  base::FilePath fake_minidump;
  ASSERT_TRUE(base::CreateTemporaryFile(&fake_minidump));
  const std::string data("Test contents of the minidump file.\n");
  ASSERT_EQ(static_cast<int>(data.size()),
            base::WriteFile(fake_minidump, data.c_str(), data.size()));

  DummyMinidumpGenerator generator(fake_minidump.value());
  base::FilePath new_minidump = minidump_dir.Append("minidump.dmp");
  EXPECT_TRUE(generator.Generate(new_minidump.value()));

  // Original file should not exist, and new file should contain original
  // contents.
  std::string copied_data;
  EXPECT_FALSE(base::PathExists(fake_minidump));
  ASSERT_TRUE(base::PathExists(new_minidump));
  EXPECT_TRUE(base::ReadFileToString(new_minidump, &copied_data));
  EXPECT_EQ(data, copied_data);
}

TEST(DummyMinidumpGeneratorTest, CopyAndDeleteFailsWithInvalidSource) {
  // Create directory in which to put minidump.
  base::FilePath minidump_dir;
  ASSERT_TRUE(base::CreateNewTempDirectory("", &minidump_dir));

  // Attempt to copy from an invalid path.
  DummyMinidumpGenerator generator("/path/does/not/exist/minidump.dmp");
  ASSERT_FALSE(generator.CopyAndDeleteForTest(
      minidump_dir.Append("minidump.dmp").value()));
}

TEST(DummyMinidumpGeneratorTest, CopyAndDeleteSucceedsWithSmallSource) {
  // Create directory in which to put minidump.
  base::FilePath minidump_dir;
  ASSERT_TRUE(base::CreateNewTempDirectory("", &minidump_dir));

  // Create a fake minidump file.
  base::FilePath fake_minidump;
  ASSERT_TRUE(base::CreateTemporaryFile(&fake_minidump));
  const std::string data("Test contents of the minidump file.\n");
  ASSERT_EQ(static_cast<int>(data.size()),
            base::WriteFile(fake_minidump, data.c_str(), data.size()));

  base::FilePath new_minidump = minidump_dir.Append("minidump.dmp");
  DummyMinidumpGenerator generator(fake_minidump.value());
  ASSERT_TRUE(generator.CopyAndDeleteForTest(new_minidump.value()));

  // Original file should not exist, and new file should contain original
  // contents.
  std::string copied_data;
  EXPECT_FALSE(base::PathExists(fake_minidump));
  ASSERT_TRUE(base::PathExists(new_minidump));
  EXPECT_TRUE(base::ReadFileToString(new_minidump, &copied_data));
  EXPECT_EQ(data, copied_data);
}

TEST(DummyMinidumpGeneratorTest, CopyAndDeleteSucceedsWithLargeSource) {
  // Create directory in which to put minidump.
  base::FilePath minidump_dir;
  ASSERT_TRUE(base::CreateNewTempDirectory("", &minidump_dir));

  // Create a large fake minidump file.
  // Note: The file must be greater than the size of the buffer used to copy the
  // file in CopyAndDelete(). Create a big string in memory.
  base::FilePath fake_minidump;
  ASSERT_TRUE(base::CreateTemporaryFile(&fake_minidump));
  size_t str_len = kInternalBufferSize * 10 + 1;
  const std::string data = base::RandBytesAsString(str_len);

  // Write the string to the file and verify that the file is big enough.
  ASSERT_EQ(static_cast<int>(data.size()),
            base::WriteFile(fake_minidump, data.c_str(), data.size()));
  int64_t filesize = 0;
  ASSERT_TRUE(base::GetFileSize(fake_minidump, &filesize));
  ASSERT_GT(filesize, kInternalBufferSize);

  base::FilePath new_minidump = minidump_dir.Append("minidump.dmp");
  DummyMinidumpGenerator generator(fake_minidump.value());
  ASSERT_TRUE(generator.CopyAndDeleteForTest(new_minidump.value()));

  // Original file should not exist, and new file should contain original
  // contents.
  std::string copied_data;
  EXPECT_FALSE(base::PathExists(fake_minidump));
  ASSERT_TRUE(base::PathExists(new_minidump));
  EXPECT_TRUE(base::ReadFileToString(new_minidump, &copied_data));
  EXPECT_EQ(data, copied_data);
}

TEST(DummyMinidumpGeneratorTest, CopyAndDeleteSucceedsWhenEOFAlignsWithBuffer) {
  // Create directory in which to put minidump.
  base::FilePath minidump_dir;
  ASSERT_TRUE(base::CreateNewTempDirectory("", &minidump_dir));

  // Create a large fake minidump file.
  // Note: The file must be greater than the size of the buffer used to copy the
  // file in CopyAndDelete(). Create a big string in memory.
  base::FilePath fake_minidump;
  ASSERT_TRUE(base::CreateTemporaryFile(&fake_minidump));
  size_t str_len = kInternalBufferSize;
  const std::string data = base::RandBytesAsString(str_len);

  // Write the string to the file and verify that the file is big enough.
  ASSERT_EQ(static_cast<int>(data.size()),
            base::WriteFile(fake_minidump, data.c_str(), data.size()));
  int64_t filesize = 0;
  ASSERT_TRUE(base::GetFileSize(fake_minidump, &filesize));
  ASSERT_EQ(kInternalBufferSize, filesize);

  base::FilePath new_minidump = minidump_dir.Append("minidump.dmp");
  DummyMinidumpGenerator generator(fake_minidump.value());
  ASSERT_TRUE(generator.CopyAndDeleteForTest(new_minidump.value()));

  // Original file should not exist, and new file should contain original
  // contents.
  std::string copied_data;
  EXPECT_FALSE(base::PathExists(fake_minidump));
  ASSERT_TRUE(base::PathExists(new_minidump));
  EXPECT_TRUE(base::ReadFileToString(new_minidump, &copied_data));
  EXPECT_EQ(data, copied_data);
}

}  // namespace chromecast