Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 #include "chrome/browser/net/net_log_temp_file.h" | |
| 6 | |
| 7 #include "base/basictypes.h" | |
| 8 #include "base/file_path.h" | |
| 9 #include "base/file_util.h" | |
| 10 #include "base/message_loop.h" | |
| 11 #include "base/values.h" | |
| 12 #include "build/build_config.h" | |
| 13 #include "chrome/browser/net/chrome_net_log.h" | |
| 14 #include "content/public/test/test_browser_thread.h" | |
| 15 #include "testing/gtest/include/gtest/gtest.h" | |
| 16 | |
| 17 using content::BrowserThread; | |
| 18 | |
| 19 class TestNetLogTempFile : public NetLogTempFile { | |
| 20 public: | |
| 21 explicit TestNetLogTempFile(ChromeNetLog* chrome_net_log) | |
| 22 : NetLogTempFile(chrome_net_log), | |
| 23 lie_about_file_existence_(false) { | |
| 24 } | |
| 25 | |
| 26 // NetLogTempFile implementation: | |
| 27 virtual bool NetExportLogExists() OVERRIDE { | |
| 28 if (lie_about_file_existence_) | |
| 29 return false; | |
| 30 return NetLogTempFile::NetExportLogExists(); | |
| 31 } | |
| 32 | |
| 33 void set_lie_about_file_existence(bool lie_about_file_existence) { | |
| 34 lie_about_file_existence_ = lie_about_file_existence; | |
| 35 } | |
| 36 | |
| 37 private: | |
| 38 bool lie_about_file_existence_; | |
| 39 }; | |
| 40 | |
| 41 class NetLogTempFileTest : public ::testing::Test { | |
| 42 protected: | |
| 43 NetLogTempFileTest() | |
| 44 : file_user_blocking_thread_(BrowserThread::FILE_USER_BLOCKING, | |
| 45 &message_loop_) { | |
| 46 net_log_.reset(new ChromeNetLog); | |
| 47 net_log_temp_file_ = new TestNetLogTempFile(net_log_.get()); | |
|
mmenke
2013/01/25 17:39:12
Can put these in the initializer list.
ramant (doing other things)
2013/01/25 20:05:24
Done.
| |
| 48 } | |
| 49 | |
| 50 // ::testing::Test implementation: | |
| 51 virtual void SetUp() OVERRIDE { | |
| 52 // Get a temporary file name for unit tests. | |
| 53 FilePath net_log_dir; | |
| 54 ASSERT_TRUE(net_log_temp_file_->GetNetExportLogDirectory(&net_log_dir)); | |
| 55 ASSERT_TRUE(file_util::CreateTemporaryFileInDir(net_log_dir, | |
| 56 &net_export_log_)); | |
| 57 | |
| 58 net_log_temp_file_->log_filename_ = net_export_log_.BaseName().value(); | |
| 59 | |
| 60 // We can't compare entire paths because GetTemporaryFile on Windows may | |
| 61 // convert the path to include legacy 8.3 filenames. Get | |
| 62 // net_log_temp_file_->log_path_ to test the path during unit tests. | |
| 63 net_log_temp_file_->GetNetExportLog(); | |
| 64 net_export_log_ = net_log_temp_file_->log_path_; | |
| 65 } | |
| 66 | |
| 67 // ::testing::Test implementation: | |
|
mmenke
2013/01/25 17:39:12
nit: Not needed. Generally just have one comment
ramant (doing other things)
2013/01/25 20:05:24
Done.
| |
| 68 virtual void TearDown() OVERRIDE { | |
| 69 // Delete the temporary file we have created. | |
| 70 ASSERT_TRUE(file_util::Delete(net_export_log_, false)); | |
| 71 } | |
| 72 | |
| 73 std::string GetStateString() const { | |
| 74 scoped_ptr<base::DictionaryValue> dict(net_log_temp_file_->GetState()); | |
| 75 std::string state; | |
| 76 EXPECT_TRUE(dict->GetString("state", &state)); | |
| 77 return state; | |
| 78 } | |
| 79 | |
| 80 void VerifyNetExportLog() { | |
|
mmenke
2013/01/25 17:39:12
Think the three "verify" functions are worth comme
ramant (doing other things)
2013/01/25 20:05:24
Done.
| |
| 81 // We can't compare entire paths because GetTemporaryFile on Windows may | |
| 82 // convert the path to include legacy 8.3 filenames. | |
|
mmenke
2013/01/25 17:39:12
Looks like we are comparing entire paths here now.
ramant (doing other things)
2013/01/25 20:05:24
Deleted the comment.
Done.
| |
| 83 EXPECT_EQ(net_export_log_, net_log_temp_file_->log_path_); | |
| 84 EXPECT_TRUE(file_util::PathExists(net_export_log_)); | |
| 85 int64 file_size; | |
| 86 // file_util::GetFileSize returns proper file size on open handles. | |
| 87 EXPECT_TRUE(file_util::GetFileSize(net_export_log_, &file_size)); | |
| 88 EXPECT_GT(file_size, 0); | |
| 89 } | |
| 90 | |
| 91 void VerifyStateAfterDoStart() { | |
|
mmenke
2013/01/25 17:39:12
Suggest "VertifyFileAndStateAfterDoStart()", and t
ramant (doing other things)
2013/01/25 20:05:24
Done.
| |
| 92 // Verfiy that we have transitioned to STATE_ALLOW_STOP state. | |
| 93 EXPECT_EQ("ALLOW_STOP", GetStateString()); | |
| 94 EXPECT_EQ(NetLogTempFile::STATE_ALLOW_STOP, net_log_temp_file_->state()); | |
| 95 VerifyNetExportLog(); | |
| 96 } | |
| 97 | |
| 98 void VerifyStateAfterDoStop() { | |
| 99 // Verfiy that we have transitioned to STATE_ALLOW_START_SEND state. | |
| 100 EXPECT_EQ("ALLOW_START_SEND", GetStateString()); | |
| 101 EXPECT_EQ(NetLogTempFile::STATE_ALLOW_START_SEND, | |
| 102 net_log_temp_file_->state()); | |
| 103 VerifyNetExportLog(); | |
| 104 } | |
| 105 | |
| 106 scoped_ptr<ChromeNetLog> net_log_; | |
| 107 TestNetLogTempFile* net_log_temp_file_; | |
|
mmenke
2013/01/25 17:39:12
Should have a note that this must go after the net
mmenke
2013/01/25 17:39:12
This should be a scoped_ptr. Currently, it leaks.
ramant (doing other things)
2013/01/25 20:05:24
Done.
ramant (doing other things)
2013/01/25 20:05:24
Done.
| |
| 108 FilePath net_export_log_; | |
| 109 | |
| 110 private: | |
| 111 MessageLoop message_loop_; | |
| 112 content::TestBrowserThread file_user_blocking_thread_; | |
| 113 }; | |
| 114 | |
| 115 TEST_F(NetLogTempFileTest, InitAllowStart) { | |
| 116 net_log_temp_file_->set_lie_about_file_existence(true); | |
| 117 EXPECT_TRUE(net_log_temp_file_->Init()); | |
| 118 | |
| 119 EXPECT_EQ("ALLOW_START", GetStateString()); | |
| 120 EXPECT_EQ(NetLogTempFile::STATE_ALLOW_START, net_log_temp_file_->state()); | |
| 121 | |
| 122 FilePath net_export_file_path; | |
| 123 EXPECT_FALSE(net_log_temp_file_->GetFilePath(&net_export_file_path)); | |
| 124 EXPECT_FALSE(net_log_temp_file_->NetExportLogExists()); | |
| 125 } | |
| 126 | |
| 127 TEST_F(NetLogTempFileTest, InitAllowStartOrSend) { | |
| 128 EXPECT_TRUE(net_log_temp_file_->Init()); | |
| 129 | |
| 130 EXPECT_EQ("ALLOW_START_SEND", GetStateString()); | |
| 131 EXPECT_EQ(NetLogTempFile::STATE_ALLOW_START_SEND, | |
| 132 net_log_temp_file_->state()); | |
| 133 EXPECT_EQ(net_export_log_, net_log_temp_file_->log_path_); | |
| 134 EXPECT_TRUE(file_util::PathExists(net_export_log_)); | |
| 135 | |
| 136 FilePath net_export_file_path; | |
| 137 EXPECT_TRUE(net_log_temp_file_->GetFilePath(&net_export_file_path)); | |
| 138 EXPECT_TRUE(file_util::PathExists(net_export_file_path)); | |
| 139 } | |
| 140 | |
| 141 TEST_F(NetLogTempFileTest, ProcessCommandDoStartAndStop) { | |
| 142 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_START); | |
| 143 VerifyStateAfterDoStart(); | |
| 144 | |
| 145 // Check GetFilePath returns false, if we are still writing to file. | |
| 146 FilePath net_export_file_path; | |
| 147 EXPECT_FALSE(net_log_temp_file_->GetFilePath(&net_export_file_path)); | |
| 148 | |
| 149 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_STOP); | |
| 150 VerifyStateAfterDoStop(); | |
| 151 | |
| 152 EXPECT_TRUE(net_log_temp_file_->GetFilePath(&net_export_file_path)); | |
| 153 EXPECT_TRUE(file_util::PathExists(net_export_file_path)); | |
| 154 | |
| 155 // TODO(rtenneti): Add check for the contents of the file, by adding a random | |
| 156 // NetLog event and verify it is there. | |
| 157 } | |
| 158 | |
| 159 TEST_F(NetLogTempFileTest, DoStartClearsFile) { | |
| 160 // Verify file sizes after two consecutives start/stop are the same (even if | |
| 161 // we add some junk data in between). | |
| 162 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_START); | |
| 163 VerifyStateAfterDoStart(); | |
| 164 | |
| 165 int64 start_file_size; | |
| 166 EXPECT_TRUE(file_util::GetFileSize(net_export_log_, &start_file_size)); | |
| 167 | |
| 168 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_STOP); | |
| 169 VerifyStateAfterDoStop(); | |
| 170 | |
| 171 int64 stop_file_size; | |
| 172 EXPECT_TRUE(file_util::GetFileSize(net_export_log_, &stop_file_size)); | |
| 173 EXPECT_GE(stop_file_size, start_file_size); | |
| 174 | |
| 175 // Add some junk at the end of the file. | |
| 176 std::string junk_data("Hello"); | |
| 177 EXPECT_GT(file_util::AppendToFile( | |
| 178 net_export_log_, junk_data.c_str(), junk_data.size()), 0); | |
| 179 | |
| 180 int64 junk_file_size; | |
| 181 EXPECT_TRUE(file_util::GetFileSize(net_export_log_, &junk_file_size)); | |
| 182 EXPECT_GT(junk_file_size, stop_file_size); | |
| 183 | |
| 184 // Execute DO_START/DO_STOP commands and make sure the file is back to the | |
| 185 // size before addition of junk data. | |
| 186 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_START); | |
| 187 VerifyStateAfterDoStart(); | |
| 188 | |
| 189 int64 new_start_file_size; | |
| 190 EXPECT_TRUE(file_util::GetFileSize(net_export_log_, &new_start_file_size)); | |
| 191 EXPECT_EQ(new_start_file_size, start_file_size); | |
| 192 | |
| 193 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_STOP); | |
| 194 VerifyStateAfterDoStop(); | |
| 195 | |
| 196 int64 new_stop_file_size; | |
| 197 EXPECT_TRUE(file_util::GetFileSize(net_export_log_, &new_stop_file_size)); | |
| 198 EXPECT_EQ(new_stop_file_size, stop_file_size); | |
| 199 } | |
| 200 | |
| 201 TEST_F(NetLogTempFileTest, CheckAddEvent) { | |
| 202 // Add an event to |net_log_| and then test to make sure that, after we stop | |
| 203 // logging, the file is larger than the file created without that event. | |
| 204 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_START); | |
| 205 VerifyStateAfterDoStart(); | |
| 206 | |
| 207 // Get file size without the event. | |
| 208 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_STOP); | |
| 209 VerifyStateAfterDoStop(); | |
| 210 | |
| 211 int64 stop_file_size; | |
| 212 EXPECT_TRUE(file_util::GetFileSize(net_export_log_, &stop_file_size)); | |
| 213 | |
| 214 // Perform DO_START and add an Event and then DO_STOP and then compare | |
| 215 // file sizes. | |
| 216 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_START); | |
| 217 VerifyStateAfterDoStart(); | |
| 218 | |
| 219 // Log an event. | |
| 220 net_log_->AddGlobalEntry(net::NetLog::TYPE_CANCELLED); | |
| 221 | |
| 222 net_log_temp_file_->ProcessCommand(NetLogTempFile::DO_STOP); | |
| 223 VerifyStateAfterDoStop(); | |
| 224 | |
| 225 int64 new_stop_file_size; | |
| 226 EXPECT_TRUE(file_util::GetFileSize(net_export_log_, &new_stop_file_size)); | |
| 227 EXPECT_GE(new_stop_file_size, stop_file_size); | |
| 228 } | |
| OLD | NEW |