// Copyright (c) 2011 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. // This file contains test infrastructure for multiple files // (current cookie_monster_unittest.cc and cookie_monster_perftest.cc) // that need to test out CookieMonster interactions with the backing store. // It should only be included by test code. #include "net/base/cookie_monster.h" namespace base { class Time; } namespace net { // Describes a call to one of the 3 functions of PersistentCookieStore. struct CookieStoreCommand { enum Type { ADD, UPDATE_ACCESS_TIME, REMOVE, }; CookieStoreCommand(Type type, const CookieMonster::CanonicalCookie& cookie) : type(type), cookie(cookie) {} Type type; CookieMonster::CanonicalCookie cookie; }; // Implementation of PersistentCookieStore that captures the // received commands and saves them to a list. // The result of calls to Load() can be configured using SetLoadExpectation(). class MockPersistentCookieStore : public CookieMonster::PersistentCookieStore { public: typedef std::vector<CookieStoreCommand> CommandList; MockPersistentCookieStore(); virtual ~MockPersistentCookieStore(); void SetLoadExpectation( bool return_value, const std::vector<CookieMonster::CanonicalCookie*>& result); const CommandList& commands() const { return commands_; } virtual bool Load( std::vector<CookieMonster::CanonicalCookie*>* out_cookies); virtual void AddCookie(const CookieMonster::CanonicalCookie& cookie); virtual void UpdateCookieAccessTime( const CookieMonster::CanonicalCookie& cookie); virtual void DeleteCookie( const CookieMonster::CanonicalCookie& cookie); virtual void Flush(Task* completion_task); // No files are created so nothing to clear either virtual void SetClearLocalStateOnExit(bool clear_local_state); private: CommandList commands_; // Deferred result to use when Load() is called. bool load_return_value_; std::vector<CookieMonster::CanonicalCookie*> load_result_; DISALLOW_COPY_AND_ASSIGN(MockPersistentCookieStore); }; // Mock for CookieMonster::Delegate class MockCookieMonsterDelegate : public CookieMonster::Delegate { public: typedef std::pair<CookieMonster::CanonicalCookie, bool> CookieNotification; MockCookieMonsterDelegate(); const std::vector<CookieNotification>& changes() const { return changes_; } void reset() { changes_.clear(); } virtual void OnCookieChanged( const CookieMonster::CanonicalCookie& cookie, bool removed, CookieMonster::Delegate::ChangeCause cause); private: virtual ~MockCookieMonsterDelegate(); std::vector<CookieNotification> changes_; DISALLOW_COPY_AND_ASSIGN(MockCookieMonsterDelegate); }; // Helper to build a list of CanonicalCookie*s. void AddCookieToList( const std::string& key, const std::string& cookie_line, const base::Time& creation_time, std::vector<CookieMonster::CanonicalCookie*>* out_list); // Just act like a backing database. Keep cookie information from // Add/Update/Delete and regurgitate it when Load is called. class MockSimplePersistentCookieStore : public CookieMonster::PersistentCookieStore { public: MockSimplePersistentCookieStore(); virtual ~MockSimplePersistentCookieStore(); virtual bool Load( std::vector<CookieMonster::CanonicalCookie*>* out_cookies); virtual void AddCookie( const CookieMonster::CanonicalCookie& cookie); virtual void UpdateCookieAccessTime( const CookieMonster::CanonicalCookie& cookie); virtual void DeleteCookie( const CookieMonster::CanonicalCookie& cookie); virtual void Flush(Task* completion_task); virtual void SetClearLocalStateOnExit(bool clear_local_state); private: typedef std::map<int64, CookieMonster::CanonicalCookie> CanonicalCookieMap; CanonicalCookieMap cookies_; }; // Helper function for creating a CookieMonster backed by a // MockSimplePersistentCookieStore for garbage collection testing. // // Fill the store through import with |num_cookies| cookies, |num_old_cookies| // with access time Now()-days_old, the rest with access time Now(). // Do two SetCookies(). Return whether each of the two SetCookies() took // longer than |gc_perf_micros| to complete, and how many cookie were // left in the store afterwards. CookieMonster* CreateMonsterFromStoreForGC( int num_cookies, int num_old_cookies, int days_old); } // namespace net