| Index: trunk/src/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc
|
| ===================================================================
|
| --- trunk/src/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc (revision 192578)
|
| +++ trunk/src/chrome/browser/extensions/api/downloads/downloads_api_unittest.cc (working copy)
|
| @@ -36,9 +36,9 @@
|
| #include "content/public/browser/notification_service.h"
|
| #include "content/public/browser/storage_partition.h"
|
| #include "content/public/browser/web_contents.h"
|
| -#include "content/public/common/content_switches.h"
|
| #include "content/public/common/page_transition_types.h"
|
| #include "content/public/test/download_test_observer.h"
|
| +#include "content/public/test/test_file_error_injector.h"
|
| #include "content/test/net/url_request_slow_download_job.h"
|
| #include "net/base/data_url.h"
|
| #include "net/base/net_util.h"
|
| @@ -86,11 +86,6 @@
|
| STLDeleteElements(&events_);
|
| }
|
|
|
| - void ClearEvents() {
|
| - STLDeleteElements(&events_);
|
| - events_.clear();
|
| - }
|
| -
|
| class Event {
|
| public:
|
| Event(Profile* profile,
|
| @@ -340,10 +335,6 @@
|
| expected_error));
|
| }
|
|
|
| - void ClearEvents() {
|
| - events_listener_->ClearEvents();
|
| - }
|
| -
|
| std::string GetExtensionURL() {
|
| return extension_->url().spec();
|
| }
|
| @@ -3105,154 +3096,108 @@
|
| result_id)));
|
| }
|
|
|
| -// TODO(benjhayden) Merge this with the other TestObservers.
|
| -class JustInProgressDownloadObserver
|
| - : public content::DownloadTestObserverInProgress {
|
| - public:
|
| - JustInProgressDownloadObserver(
|
| - DownloadManager* download_manager, size_t wait_count)
|
| - : content::DownloadTestObserverInProgress(download_manager, wait_count) {
|
| - }
|
| -
|
| - virtual ~JustInProgressDownloadObserver() {}
|
| -
|
| - private:
|
| - virtual bool IsDownloadInFinalState(DownloadItem* item) OVERRIDE {
|
| - return item->GetState() == DownloadItem::IN_PROGRESS;
|
| - }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(JustInProgressDownloadObserver);
|
| -};
|
| -
|
| -// Test download interruption while extensions determining filename. Should not
|
| -// re-dispatch onDeterminingFilename.
|
| -#if defined(OS_CHROMEOS)
|
| -#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \
|
| - DISABLED_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume
|
| -#else
|
| -#define MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume \
|
| - DownloadExtensionTest_OnDeterminingFilename_InterruptedResume
|
| -#endif
|
| +// Test download interruption while extensions determining filename, re-run
|
| +// through fan-out and fan-in.
|
| +// TODO(rdsmith): FILE_OPERATION_INITIALIZE is not right for this test.
|
| IN_PROC_BROWSER_TEST_F(
|
| DownloadExtensionTest,
|
| - MAYBE_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume) {
|
| - CommandLine::ForCurrentProcess()->AppendSwitch(
|
| - switches::kEnableDownloadResumption);
|
| + DISABLED_DownloadExtensionTest_OnDeterminingFilename_InterruptedResume) {
|
| LoadExtension("downloads_split");
|
| CHECK(StartTestServer());
|
| + std::string download_url = test_server()->GetURL("slow?0").spec();
|
| GoOnTheRecord();
|
| AddFilenameDeterminer();
|
|
|
| + // TODO Interrupt the download instead of responding to onDeterminingFilename.
|
| + scoped_refptr<content::TestFileErrorInjector> injector(
|
| + content::TestFileErrorInjector::Create(
|
| + GetCurrentManager()));
|
| + content::TestFileErrorInjector::FileErrorInfo error_info = {
|
| + download_url,
|
| + content::TestFileErrorInjector::FILE_OPERATION_INITIALIZE,
|
| + 0,
|
| + content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE};
|
| + injector->AddError(error_info);
|
| + injector->InjectErrors();
|
| +
|
| // Start a download.
|
| - DownloadItem* item = NULL;
|
| - {
|
| - DownloadManager* manager = GetCurrentManager();
|
| - scoped_ptr<content::DownloadTestObserver> observer(
|
| - new JustInProgressDownloadObserver(manager, 1));
|
| - ASSERT_EQ(0, manager->InProgressCount());
|
| - // Tabs created just for a download are automatically closed, invalidating
|
| - // the download's WebContents. Downloads without WebContents cannot be
|
| - // resumed. http://crbug.com/225901
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - current_browser(),
|
| - GURL(URLRequestSlowDownloadJob::kUnknownSizeUrl),
|
| - CURRENT_TAB,
|
| - ui_test_utils::BROWSER_TEST_NONE);
|
| - observer->WaitForFinished();
|
| - EXPECT_EQ(1u, observer->NumDownloadsSeenInState(DownloadItem::IN_PROGRESS));
|
| - DownloadManager::DownloadVector items;
|
| - manager->GetAllDownloads(&items);
|
| - for (DownloadManager::DownloadVector::iterator iter = items.begin();
|
| - iter != items.end(); ++iter) {
|
| - if ((*iter)->GetState() == DownloadItem::IN_PROGRESS) {
|
| - // There should be only one IN_PROGRESS item.
|
| - EXPECT_EQ(NULL, item);
|
| - item = *iter;
|
| - }
|
| - }
|
| - ASSERT_TRUE(item);
|
| - }
|
| + scoped_ptr<base::Value> result(RunFunctionAndReturnResult(
|
| + new DownloadsDownloadFunction(), base::StringPrintf(
|
| + "[{\"url\": \"%s\"}]", download_url.c_str())));
|
| + ASSERT_TRUE(result.get());
|
| + int result_id = -1;
|
| + ASSERT_TRUE(result->GetAsInteger(&result_id));
|
| + DownloadItem* item = GetCurrentManager()->GetDownload(result_id);
|
| + ASSERT_TRUE(item);
|
| ScopedCancellingItem canceller(item);
|
| + ASSERT_EQ(download_url, item->GetOriginalUrl().spec());
|
|
|
| // Wait for the onCreated and onDeterminingFilename event.
|
| ASSERT_TRUE(WaitFor(events::kOnDownloadCreated,
|
| base::StringPrintf("[{\"danger\": \"safe\","
|
| - " \"incognito\": false,"
|
| - " \"id\": %d,"
|
| - " \"mime\": \"application/octet-stream\","
|
| - " \"paused\": false}]",
|
| - item->GetId())));
|
| + " \"incognito\": false,"
|
| + " \"id\": %d,"
|
| + " \"mime\": \"text/plain\","
|
| + " \"paused\": false,"
|
| + " \"url\": \"%s\"}]",
|
| + result_id,
|
| + download_url.c_str())));
|
| ASSERT_TRUE(WaitFor(
|
| events::kOnDownloadDeterminingFilename,
|
| base::StringPrintf("[{\"id\": %d,"
|
| " \"incognito\": false,"
|
| - " \"filename\":\"download-unknown-size\"}]",
|
| - item->GetId())));
|
| + " \"filename\":\"slow.txt\"}]",
|
| + result_id)));
|
| ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| ASSERT_TRUE(item->IsInProgress());
|
|
|
| - ClearEvents();
|
| - ui_test_utils::NavigateToURLWithDisposition(
|
| - current_browser(),
|
| - GURL(URLRequestSlowDownloadJob::kErrorDownloadUrl),
|
| - NEW_BACKGROUND_TAB,
|
| - ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
|
| + ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| + base::StringPrintf("[{\"id\": %d,"
|
| + " \"state\": {"
|
| + " \"previous\": \"in_progress\","
|
| + " \"current\": \"interrupted\"}}]",
|
| + result_id)));
|
| + ASSERT_TRUE(item->IsInterrupted());
|
| + item->ResumeInterruptedDownload();
|
|
|
| - // Errors caught before filename determination are delayed until after
|
| - // filename determination.
|
| + // Wait for and respond to the onDeterminingFilename event.
|
| + ASSERT_TRUE(WaitFor(
|
| + events::kOnDownloadDeterminingFilename,
|
| + base::StringPrintf("[{\"id\": %d,"
|
| + " \"incognito\": false,"
|
| + " \"filename\":\"slow.txt\"}]",
|
| + result_id)));
|
| + ASSERT_TRUE(item->GetTargetFilePath().empty());
|
| + ASSERT_TRUE(item->IsInProgress());
|
| std::string error;
|
| ASSERT_TRUE(ExtensionDownloadsEventRouter::DetermineFilename(
|
| current_browser()->profile(),
|
| false,
|
| GetExtensionId(),
|
| - item->GetId(),
|
| + result_id,
|
| base::FilePath(FILE_PATH_LITERAL("42.txt")),
|
| false,
|
| - &error)) << error;
|
| + &error));
|
| EXPECT_EQ("", error);
|
|
|
| + // The download should complete successfully.
|
| ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| base::StringPrintf("[{\"id\": %d,"
|
| - " \"error\":{\"current\":20},"
|
| - " \"state\":{"
|
| - " \"previous\":\"in_progress\","
|
| - " \"current\":\"interrupted\"}}]",
|
| - item->GetId())));
|
| - // TODO(benjhayden) These next two lines fail on chromeos.
|
| - EXPECT_EQ(DownloadItem::INTERRUPTED, item->GetState());
|
| - ASSERT_TRUE(item->IsInterrupted());
|
| -
|
| - ClearEvents();
|
| - item->ResumeInterruptedDownload();
|
| -
|
| - // Errors caught before filename determination is complete are delayed until
|
| - // after filename determination so that, on resumption, filename determination
|
| - // does not need to be re-done. So, there will not be a second
|
| - // onDeterminingFilename event.
|
| -
|
| + " \"filename\": {"
|
| + " \"previous\": \"%s\","
|
| + " \"current\": \"%s\"},"
|
| + " \"state\": {"
|
| + " \"previous\": \"in_progress\","
|
| + " \"current\": \"complete\"}}]",
|
| + result_id,
|
| + GetFilename("42.txt.crdownload").c_str(),
|
| + GetFilename("42.txt").c_str())));
|
| ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| base::StringPrintf("[{\"id\": %d,"
|
| - " \"error\":{\"previous\":20},"
|
| - " \"state\":{"
|
| - " \"previous\":\"interrupted\","
|
| - " \"current\":\"in_progress\"}}]",
|
| - item->GetId())));
|
| -
|
| - ClearEvents();
|
| - FinishPendingSlowDownloads();
|
| -
|
| - // The download should complete successfully.
|
| - ASSERT_TRUE(WaitFor(events::kOnDownloadChanged,
|
| - base::StringPrintf("[{\"id\": %d,"
|
| - " \"filename\": {"
|
| - " \"previous\": \"%s\","
|
| - " \"current\": \"%s\"},"
|
| " \"state\": {"
|
| " \"previous\": \"in_progress\","
|
| " \"current\": \"complete\"}}]",
|
| - item->GetId(),
|
| - GetFilename("42.txt.crdownload").c_str(),
|
| - GetFilename("42.txt").c_str())));
|
| + result_id)));
|
| }
|
|
|
| // TODO(benjhayden) Figure out why DisableExtension() does not fire
|
|
|