Upstreaming browser/ui/uikit_ui_util from iOS.
[chromium-blink-merge.git] / content / public / test / test_file_error_injector.h
blob306c7e29b807c9f223d81bc11830b65dc239fd56
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.
5 #ifndef CONTENT_PUBLIC_TEST_TEST_FILE_ERROR_INJECTOR_H_
6 #define CONTENT_PUBLIC_TEST_TEST_FILE_ERROR_INJECTOR_H_
8 #include <map>
9 #include <set>
10 #include <string>
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/memory/ref_counted.h"
15 #include "content/public/browser/download_interrupt_reasons.h"
16 #include "url/gurl.h"
18 namespace content {
20 class DownloadId;
21 class DownloadFileWithErrorsFactory;
22 class DownloadManager;
23 class DownloadManagerImpl;
25 // Test helper for injecting errors into download file operations.
26 // All errors for a download must be injected before it starts.
27 // This class needs to be |RefCountedThreadSafe| because the implementation
28 // is referenced by other classes that live past the time when the user is
29 // nominally done with it. These classes are internal to content/.
31 // NOTE: No more than one download with the same URL can be in progress at
32 // the same time. You can have multiple simultaneous downloads as long as the
33 // URLs are different, as the URLs are used as keys to get information about
34 // the download.
36 // Example:
38 // FileErrorInfo a = { url1, ... };
39 // FileErrorInfo b = { url2, ... };
41 // scoped_refptr<TestFileErrorInjector> injector =
42 // TestFileErrorInjector::Create(download_manager);
44 // injector->AddError(a);
45 // injector->AddError(b);
46 // injector->InjectErrors();
48 // download_manager->DownloadUrl(url1, ...);
49 // download_manager->DownloadUrl(url2, ...);
50 // ... wait for downloads to finish or get an injected error ...
51 class TestFileErrorInjector
52 : public base::RefCountedThreadSafe<TestFileErrorInjector> {
53 public:
54 enum FileOperationCode {
55 FILE_OPERATION_INITIALIZE,
56 FILE_OPERATION_WRITE,
57 FILE_OPERATION_RENAME_UNIQUIFY,
58 FILE_OPERATION_RENAME_ANNOTATE,
61 // Structure that encapsulates the information needed to inject a file error.
62 struct FileErrorInfo {
63 std::string url; // Full URL of the download. Identifies the download.
64 FileOperationCode code; // Operation to affect.
65 int operation_instance; // 0-based count of operation calls, for each code.
66 DownloadInterruptReason error; // Error to inject.
69 typedef std::map<std::string, FileErrorInfo> ErrorMap;
71 // Creates an instance. May only be called once.
72 // Lives until all callbacks (in the implementation) are complete and the
73 // creator goes out of scope.
74 // TODO(rdsmith): Allow multiple calls for different download managers.
75 static scoped_refptr<TestFileErrorInjector> Create(
76 DownloadManager* download_manager);
78 // Adds an error.
79 // Must be called before |InjectErrors()| for a particular download file.
80 // It is an error to call |AddError()| more than once for the same file
81 // (URL), unless you call |ClearErrors()| in between them.
82 bool AddError(const FileErrorInfo& error_info);
84 // Clears all errors.
85 // Only affects files created after the next call to InjectErrors().
86 void ClearErrors();
88 // Injects the errors such that new download files will be affected.
89 // The download system must already be initialized before calling this.
90 // Multiple calls are allowed, but only useful if the errors have changed.
91 // Replaces the injected error list.
92 bool InjectErrors();
94 // Tells how many files are currently open.
95 size_t CurrentFileCount() const;
97 // Tells how many files have ever been open (since construction or the
98 // last call to |ClearFoundFiles()|).
99 size_t TotalFileCount() const;
101 // Returns whether or not a file matching |url| has been created.
102 bool HadFile(const GURL& url) const;
104 // Resets the found file list.
105 void ClearFoundFiles();
107 static std::string DebugString(FileOperationCode code);
109 private:
110 friend class base::RefCountedThreadSafe<TestFileErrorInjector>;
112 typedef std::set<GURL> FileSet;
114 explicit TestFileErrorInjector(DownloadManager* download_manager);
116 virtual ~TestFileErrorInjector();
118 // Callbacks from the download file, to record lifetimes.
119 // These may be called on any thread.
120 void RecordDownloadFileConstruction(const GURL& url);
121 void RecordDownloadFileDestruction(const GURL& url);
123 // These run on the UI thread.
124 void DownloadFileCreated(GURL url);
125 void DestroyingDownloadFile(GURL url);
127 // All the data is used on the UI thread.
128 // Our injected error list, mapped by URL. One per file.
129 ErrorMap injected_errors_;
131 // Keep track of active DownloadFiles.
132 FileSet files_;
134 // Keep track of found DownloadFiles.
135 FileSet found_files_;
137 // The factory we created. May outlive this class.
138 DownloadFileWithErrorsFactory* created_factory_;
140 // The download manager we set the factory on.
141 DownloadManagerImpl* download_manager_;
143 DISALLOW_COPY_AND_ASSIGN(TestFileErrorInjector);
146 } // namespace content
148 #endif // CONTENT_PUBLIC_TEST_TEST_FILE_ERROR_INJECTOR_H_