settings_test.cc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // Copyright 2015 The Crashpad Authors. All rights reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. #include "client/settings.h"
  15. #include "build/build_config.h"
  16. #include "gtest/gtest.h"
  17. #include "test/errors.h"
  18. #include "test/scoped_temp_dir.h"
  19. #include "util/file/file_io.h"
  20. namespace crashpad {
  21. namespace test {
  22. namespace {
  23. class SettingsTest : public testing::Test {
  24. public:
  25. SettingsTest() : settings_(settings_path()) {}
  26. base::FilePath settings_path() {
  27. return temp_dir_.path().Append(FILE_PATH_LITERAL("settings"));
  28. }
  29. Settings* settings() { return &settings_; }
  30. void InitializeBadFile() {
  31. ScopedFileHandle handle(
  32. LoggingOpenFileForWrite(settings_path(),
  33. FileWriteMode::kTruncateOrCreate,
  34. FilePermissions::kWorldReadable));
  35. ASSERT_TRUE(handle.is_valid());
  36. static constexpr char kBuf[] = "test bad file";
  37. ASSERT_TRUE(LoggingWriteFile(handle.get(), kBuf, sizeof(kBuf)));
  38. handle.reset();
  39. }
  40. protected:
  41. // testing::Test:
  42. void SetUp() override {
  43. ASSERT_TRUE(settings()->Initialize());
  44. }
  45. private:
  46. ScopedTempDir temp_dir_;
  47. Settings settings_;
  48. DISALLOW_COPY_AND_ASSIGN(SettingsTest);
  49. };
  50. TEST_F(SettingsTest, ClientID) {
  51. UUID client_id;
  52. EXPECT_TRUE(settings()->GetClientID(&client_id));
  53. EXPECT_NE(client_id, UUID());
  54. Settings local_settings(settings_path());
  55. EXPECT_TRUE(local_settings.Initialize());
  56. UUID actual;
  57. EXPECT_TRUE(local_settings.GetClientID(&actual));
  58. EXPECT_EQ(actual, client_id);
  59. }
  60. TEST_F(SettingsTest, UploadsEnabled) {
  61. bool enabled = true;
  62. // Default value is false.
  63. EXPECT_TRUE(settings()->GetUploadsEnabled(&enabled));
  64. EXPECT_FALSE(enabled);
  65. EXPECT_TRUE(settings()->SetUploadsEnabled(true));
  66. EXPECT_TRUE(settings()->GetUploadsEnabled(&enabled));
  67. EXPECT_TRUE(enabled);
  68. Settings local_settings(settings_path());
  69. EXPECT_TRUE(local_settings.Initialize());
  70. enabled = false;
  71. EXPECT_TRUE(local_settings.GetUploadsEnabled(&enabled));
  72. EXPECT_TRUE(enabled);
  73. EXPECT_TRUE(settings()->SetUploadsEnabled(false));
  74. EXPECT_TRUE(settings()->GetUploadsEnabled(&enabled));
  75. EXPECT_FALSE(enabled);
  76. enabled = true;
  77. EXPECT_TRUE(local_settings.GetUploadsEnabled(&enabled));
  78. EXPECT_FALSE(enabled);
  79. }
  80. TEST_F(SettingsTest, LastUploadAttemptTime) {
  81. time_t actual = -1;
  82. EXPECT_TRUE(settings()->GetLastUploadAttemptTime(&actual));
  83. // Default value is 0.
  84. EXPECT_EQ(actual, 0);
  85. const time_t expected = time(nullptr);
  86. EXPECT_TRUE(settings()->SetLastUploadAttemptTime(expected));
  87. EXPECT_TRUE(settings()->GetLastUploadAttemptTime(&actual));
  88. EXPECT_EQ(actual, expected);
  89. Settings local_settings(settings_path());
  90. EXPECT_TRUE(local_settings.Initialize());
  91. actual = -1;
  92. EXPECT_TRUE(local_settings.GetLastUploadAttemptTime(&actual));
  93. EXPECT_EQ(actual, expected);
  94. }
  95. // The following tests write a corrupt settings file and test the recovery
  96. // operation.
  97. TEST_F(SettingsTest, BadFileOnInitialize) {
  98. InitializeBadFile();
  99. Settings settings(settings_path());
  100. EXPECT_TRUE(settings.Initialize());
  101. }
  102. TEST_F(SettingsTest, BadFileOnGet) {
  103. InitializeBadFile();
  104. UUID client_id;
  105. EXPECT_TRUE(settings()->GetClientID(&client_id));
  106. EXPECT_NE(client_id, UUID());
  107. Settings local_settings(settings_path());
  108. EXPECT_TRUE(local_settings.Initialize());
  109. UUID actual;
  110. EXPECT_TRUE(local_settings.GetClientID(&actual));
  111. EXPECT_EQ(actual, client_id);
  112. }
  113. TEST_F(SettingsTest, BadFileOnSet) {
  114. InitializeBadFile();
  115. EXPECT_TRUE(settings()->SetUploadsEnabled(true));
  116. bool enabled = false;
  117. EXPECT_TRUE(settings()->GetUploadsEnabled(&enabled));
  118. EXPECT_TRUE(enabled);
  119. }
  120. TEST_F(SettingsTest, UnlinkFile) {
  121. UUID client_id;
  122. EXPECT_TRUE(settings()->GetClientID(&client_id));
  123. EXPECT_TRUE(settings()->SetUploadsEnabled(true));
  124. EXPECT_TRUE(settings()->SetLastUploadAttemptTime(time(nullptr)));
  125. #if defined(OS_WIN)
  126. EXPECT_EQ(_wunlink(settings_path().value().c_str()), 0)
  127. << ErrnoMessage("_wunlink");
  128. #else
  129. EXPECT_EQ(unlink(settings_path().value().c_str()), 0)
  130. << ErrnoMessage("unlink");
  131. #endif
  132. Settings local_settings(settings_path());
  133. EXPECT_TRUE(local_settings.Initialize());
  134. UUID new_client_id;
  135. EXPECT_TRUE(local_settings.GetClientID(&new_client_id));
  136. EXPECT_NE(new_client_id, client_id);
  137. // Check that all values are reset.
  138. bool enabled = true;
  139. EXPECT_TRUE(local_settings.GetUploadsEnabled(&enabled));
  140. EXPECT_FALSE(enabled);
  141. time_t time = -1;
  142. EXPECT_TRUE(local_settings.GetLastUploadAttemptTime(&time));
  143. EXPECT_EQ(time, 0);
  144. }
  145. } // namespace
  146. } // namespace test
  147. } // namespace crashpad