// Copyright (c) 2012 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. #ifndef NET_BASE_CAPTURING_NET_LOG_H_ #define NET_BASE_CAPTURING_NET_LOG_H_ #include #include #include "base/atomicops.h" #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/synchronization/lock.h" #include "base/time.h" #include "net/base/net_log.h" namespace base { class DictionaryValue; } namespace net { // CapturingNetLog is an implementation of NetLog that saves messages to a // bounded buffer. It is intended for testing only, and is part of the // net_test_support project. class CapturingNetLog : public NetLog { public: struct CapturedEntry { CapturedEntry(EventType type, const base::TimeTicks& time, Source source, EventPhase phase, scoped_ptr params); // Copy constructor needed to store in a std::vector because of the // scoped_ptr. CapturedEntry(const CapturedEntry& entry); ~CapturedEntry(); // Equality operator needed to store in a std::vector because of the // scoped_ptr. CapturedEntry& operator=(const CapturedEntry& entry); // Attempt to retrieve an value of the specified type with the given name // from |params|. Returns true on success, false on failure. Does not // modify |value| on failure. bool GetStringValue(const std::string& name, std::string* value) const; bool GetIntegerValue(const std::string& name, int* value) const; // Same as GetIntegerValue, but returns the error code associated with a // log entry. bool GetNetErrorCode(int* value) const; // Returns the parameters as a JSON string, or empty string if there are no // parameters. std::string GetParamsJson() const; EventType type; base::TimeTicks time; Source source; EventPhase phase; scoped_ptr params; }; // Ordered set of entries that were logged. typedef std::vector CapturedEntryList; CapturingNetLog(); virtual ~CapturingNetLog(); // Returns the list of all entries in the log. void GetEntries(CapturedEntryList* entry_list) const; // Returns number of entries in the log. size_t GetSize() const; void Clear(); void SetLogLevel(NetLog::LogLevel log_level); // NetLog implementation: virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE; virtual uint32 NextID() OVERRIDE; virtual LogLevel GetLogLevel() const OVERRIDE; virtual void AddThreadSafeObserver(ThreadSafeObserver* observer, LogLevel log_level) OVERRIDE; virtual void SetObserverLogLevel(ThreadSafeObserver* observer, LogLevel log_level) OVERRIDE; virtual void RemoveThreadSafeObserver(ThreadSafeObserver* observer) OVERRIDE; private: // Needs to be "mutable" so can use it in GetEntries(). mutable base::Lock lock_; // Last assigned source ID. Incremented to get the next one. base::subtle::Atomic32 last_id_; CapturedEntryList captured_entries_; NetLog::LogLevel log_level_; DISALLOW_COPY_AND_ASSIGN(CapturingNetLog); }; // Helper class that exposes a similar API as BoundNetLog, but uses a // CapturingNetLog rather than the more generic NetLog. // // CapturingBoundNetLog can easily be converted to a BoundNetLog using the // bound() method. class CapturingBoundNetLog { public: CapturingBoundNetLog(); ~CapturingBoundNetLog(); // The returned BoundNetLog is only valid while |this| is alive. BoundNetLog bound() const { return net_log_; } // Fills |entry_list| with all entries in the log. void GetEntries(CapturingNetLog::CapturedEntryList* entry_list) const; // Returns number of entries in the log. size_t GetSize() const; void Clear(); // Sets the log level of the underlying CapturingNetLog. void SetLogLevel(NetLog::LogLevel log_level); private: CapturingNetLog capturing_net_log_; const BoundNetLog net_log_; DISALLOW_COPY_AND_ASSIGN(CapturingBoundNetLog); }; } // namespace net #endif // NET_BASE_CAPTURING_NET_LOG_H_