12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/base/net_log_logger.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/json/json_reader.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace net {
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetLogLoggerTest : public testing::Test {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    log_path_ = temp_dir_.path().AppendASCII("NetLogFile");
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected:
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath log_path_;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetLogLoggerTest, GeneratesValidJSONForNoEvents) {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Create and destroy a logger.
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    FILE* file = base::OpenFile(log_path_, "w");
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(file);
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<base::Value> constants(NetLogLogger::GetConstants());
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NetLogLogger logger(file, *constants);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string input;
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(log_path_, &input));
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::JSONReader reader;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> root(reader.ReadToValue(input));
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(root) << reader.GetErrorMessage();
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue* dict;
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(root->GetAsDictionary(&dict));
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue* events;
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(dict->GetList("events", &events));
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(0u, events->GetSize());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetLogLoggerTest, GeneratesValidJSONWithOneEvent) {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    FILE* file = base::OpenFile(log_path_, "w");
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(file);
55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<base::Value> constants(NetLogLogger::GetConstants());
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NetLogLogger logger(file, *constants);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int kDummyId = 1;
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NetLog::Source source(NetLog::SOURCE_SPDY_SESSION, kDummyId);
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NetLog::EntryData entry_data(NetLog::TYPE_PROXY_SERVICE,
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 source,
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 NetLog::PHASE_BEGIN,
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 base::TimeTicks::Now(),
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 NULL);
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NetLog::Entry entry(&entry_data, NetLog::LOG_ALL);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logger.OnAddEntry(entry);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string input;
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(log_path_, &input));
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::JSONReader reader;
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> root(reader.ReadToValue(input));
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(root) << reader.GetErrorMessage();
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue* dict;
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(root->GetAsDictionary(&dict));
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue* events;
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(dict->GetList("events", &events));
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(1u, events->GetSize());
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(NetLogLoggerTest, GeneratesValidJSONWithMultipleEvents) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    FILE* file = base::OpenFile(log_path_, "w");
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ASSERT_TRUE(file);
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<base::Value> constants(NetLogLogger::GetConstants());
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NetLogLogger logger(file, *constants);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const int kDummyId = 1;
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    NetLog::Source source(NetLog::SOURCE_SPDY_SESSION, kDummyId);
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NetLog::EntryData entry_data(NetLog::TYPE_PROXY_SERVICE,
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 source,
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 NetLog::PHASE_BEGIN,
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 base::TimeTicks::Now(),
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                 NULL);
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    NetLog::Entry entry(&entry_data, NetLog::LOG_ALL);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Add the entry multiple times.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logger.OnAddEntry(entry);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    logger.OnAddEntry(entry);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string input;
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(base::ReadFileToString(log_path_, &input));
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::JSONReader reader;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<base::Value> root(reader.ReadToValue(input));
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(root) << reader.GetErrorMessage();
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::DictionaryValue* dict;
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(root->GetAsDictionary(&dict));
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::ListValue* events;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(dict->GetList("events", &events));
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(2u, events->GetSize());
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace net
119