• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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 #ifndef NET_BASE_CAPTURING_NET_LOG_H_
6 #define NET_BASE_CAPTURING_NET_LOG_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "base/atomicops.h"
12 #include "base/basictypes.h"
13 #include "base/compiler_specific.h"
14 #include "base/memory/ref_counted.h"
15 #include "base/memory/scoped_ptr.h"
16 #include "base/synchronization/lock.h"
17 #include "base/time/time.h"
18 #include "net/base/net_log.h"
19 
20 namespace base {
21 class DictionaryValue;
22 }
23 
24 namespace net {
25 
26 // CapturingNetLog is a NetLog which instantiates Observer that saves messages
27 // to a bounded buffer.  It is intended for testing only, and is part of the
28 // net_test_support project. This is provided for convinience and compatilbility
29 // with the old unittests.
30 class CapturingNetLog : public NetLog {
31  public:
32   struct CapturedEntry {
33     CapturedEntry(EventType type,
34                   const base::TimeTicks& time,
35                   Source source,
36                   EventPhase phase,
37                   scoped_ptr<base::DictionaryValue> params);
38     // Copy constructor needed to store in a std::vector because of the
39     // scoped_ptr.
40     CapturedEntry(const CapturedEntry& entry);
41 
42     ~CapturedEntry();
43 
44     // Equality operator needed to store in a std::vector because of the
45     // scoped_ptr.
46     CapturedEntry& operator=(const CapturedEntry& entry);
47 
48     // Attempt to retrieve an value of the specified type with the given name
49     // from |params|.  Returns true on success, false on failure.  Does not
50     // modify |value| on failure.
51     bool GetStringValue(const std::string& name, std::string* value) const;
52     bool GetIntegerValue(const std::string& name, int* value) const;
53 
54     // Same as GetIntegerValue, but returns the error code associated with a
55     // log entry.
56     bool GetNetErrorCode(int* value) const;
57 
58     // Returns the parameters as a JSON string, or empty string if there are no
59     // parameters.
60     std::string GetParamsJson() const;
61 
62     EventType type;
63     base::TimeTicks time;
64     Source source;
65     EventPhase phase;
66     scoped_ptr<base::DictionaryValue> params;
67   };
68 
69   // Ordered set of entries that were logged.
70   typedef std::vector<CapturedEntry> CapturedEntryList;
71 
72   CapturingNetLog();
73   virtual ~CapturingNetLog();
74 
75   void SetLogLevel(LogLevel log_level);
76 
77   // Below methods are forwarded to capturing_net_log_observer_.
78   void GetEntries(CapturedEntryList* entry_list) const;
79   void GetEntriesForSource(Source source, CapturedEntryList* entry_list) const;
80   size_t GetSize() const;
81   void Clear();
82 
83  private:
84   // Observer is an implementation of NetLog::ThreadSafeObserver
85   // that saves messages to a bounded buffer. It is intended for testing only,
86   // and is part of the net_test_support project.
87   class Observer : public NetLog::ThreadSafeObserver {
88    public:
89     Observer();
90     virtual ~Observer();
91 
92     // Returns the list of all entries in the log.
93     void GetEntries(CapturedEntryList* entry_list) const;
94 
95     // Fills |entry_list| with all entries in the log from the specified Source.
96     void GetEntriesForSource(Source source,
97                              CapturedEntryList* entry_list) const;
98 
99     // Returns number of entries in the log.
100     size_t GetSize() const;
101 
102     void Clear();
103 
104    private:
105     // ThreadSafeObserver implementation:
106     virtual void OnAddEntry(const Entry& entry) OVERRIDE;
107 
108     // Needs to be "mutable" so can use it in GetEntries().
109     mutable base::Lock lock_;
110 
111     CapturedEntryList captured_entries_;
112 
113     DISALLOW_COPY_AND_ASSIGN(Observer);
114   };
115 
116   Observer capturing_net_log_observer_;
117 
118   DISALLOW_COPY_AND_ASSIGN(CapturingNetLog);
119 };
120 
121 // Helper class that exposes a similar API as BoundNetLog, but uses a
122 // CapturingNetLog rather than the more generic NetLog.
123 //
124 // CapturingBoundNetLog can easily be converted to a BoundNetLog using the
125 // bound() method.
126 class CapturingBoundNetLog {
127  public:
128   CapturingBoundNetLog();
129   ~CapturingBoundNetLog();
130 
131   // The returned BoundNetLog is only valid while |this| is alive.
bound()132   BoundNetLog bound() const { return net_log_; }
133 
134   // Fills |entry_list| with all entries in the log.
135   void GetEntries(CapturingNetLog::CapturedEntryList* entry_list) const;
136 
137   // Fills |entry_list| with all entries in the log from the specified Source.
138   void GetEntriesForSource(
139       NetLog::Source source,
140       CapturingNetLog::CapturedEntryList* entry_list) const;
141 
142   // Returns number of entries in the log.
143   size_t GetSize() const;
144 
145   void Clear();
146 
147   // Sets the log level of the underlying CapturingNetLog.
148   void SetLogLevel(NetLog::LogLevel log_level);
149 
150  private:
151   CapturingNetLog capturing_net_log_;
152   const BoundNetLog net_log_;
153 
154   DISALLOW_COPY_AND_ASSIGN(CapturingBoundNetLog);
155 };
156 
157 }  // namespace net
158 
159 #endif  // NET_BASE_CAPTURING_NET_LOG_H_
160