15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/download/download_item_model.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 119ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/mock_download_item.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/text/bytes_formatting.h" 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/font_list.h" 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "ui/gfx/text_utils.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::DownloadItem; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Mock; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::NiceMock; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::ReturnRefOfCopy; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::SetArgPointee; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a char array that has as many elements as there are download 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// interrupt reasons. We can then use that in a COMPILE_ASSERT to make sure 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that all the interrupt reason codes are accounted for. The reason codes are 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unfortunately sparse, making this necessary. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char kInterruptReasonCounter[] = { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, // content::DOWNLOAD_INTERRUPT_REASON_NONE 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define INTERRUPT_REASON(name,value) 0, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/download_interrupt_reason_values.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef INTERRUPT_REASON 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kInterruptReasonCount = ARRAYSIZE_UNSAFE(kInterruptReasonCounter); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Default target path for a mock download item in DownloadItemModelTest. 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kDefaultTargetFilePath[] = 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("/foo/bar/foo.bar"); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kDefaultDisplayFileName[] = 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FILE_PATH_LITERAL("foo.bar"); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Default URL for a mock download item in DownloadItemModelTest. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kDefaultURL[] = "http://example.com/foo.bar"; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadItemModelTest : public testing::Test { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemModelTest() 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : model_(&item_) {} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DownloadItemModelTest() { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets up defaults for the download item and sets |model_| to a new 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // DownloadItemModel that uses the mock download item. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetupDownloadItemDefaults() { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, GetReceivedBytes()).WillByDefault(Return(1)); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, GetTotalBytes()).WillByDefault(Return(2)); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, TimeRemaining(_)).WillByDefault(Return(false)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, GetMimeType()).WillByDefault(Return("text/html")); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, AllDataSaved()).WillByDefault(Return(false)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, GetOpenWhenComplete()).WillByDefault(Return(false)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, GetFileExternallyRemoved()).WillByDefault(Return(false)); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, GetState()) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillByDefault(Return(DownloadItem::IN_PROGRESS)); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, GetURL()) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillByDefault(ReturnRefOfCopy(GURL(kDefaultURL))); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, GetFileNameToReportUser()) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillByDefault(Return(base::FilePath(kDefaultDisplayFileName))); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ON_CALL(item_, GetTargetFilePath()) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillByDefault(ReturnRefOfCopy(base::FilePath(kDefaultTargetFilePath))); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, GetTargetDisposition()) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillByDefault( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Return(DownloadItem::TARGET_DISPOSITION_OVERWRITE)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ON_CALL(item_, IsPaused()).WillByDefault(Return(false)); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetupInterruptedDownloadItem(content::DownloadInterruptReason reason) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(item_, GetLastReason()).WillRepeatedly(Return(reason)); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(item_, GetState()) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return( 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (reason == content::DOWNLOAD_INTERRUPT_REASON_NONE) ? 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem::IN_PROGRESS : 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem::INTERRUPTED)); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::MockDownloadItem& item() { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return item_; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemModel& model() { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return model_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NiceMock<content::MockDownloadItem> item_; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItemModel model_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadItemModelTest, InterruptedStatus) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that we have the correct interrupt status message for downloads that 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are in the INTERRUPTED state. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct TestCase { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The reason. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadInterruptReason reason; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected status string. This will include the progress as well. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_status; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } kTestCases[] = { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NONE, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1/2 B" }, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Download error" }, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Insufficient permissions" }, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Disk full" }, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Path too long" }, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_TOO_LARGE, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - File too large" }, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_VIRUS_INFECTED, 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Virus detected" }, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Blocked" }, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_SECURITY_CHECK_FAILED, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Virus scan failed" }, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_TOO_SHORT, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - File truncated" }, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - System busy" }, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Network error" }, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_TIMEOUT, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Network timeout" }, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Network disconnected" }, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_SERVER_DOWN, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Server unavailable" }, 1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST, 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "Failed - Network error" }, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Server problem" }, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Download error" }, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_PRECONDITION, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Download error" }, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - No file" }, 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED, 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "Failed - Needs authorization" }, 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_CERT_PROBLEM, 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "Failed - Bad certificate" }, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Cancelled" }, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Shutdown" }, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_CRASH, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "Failed - Crash" }, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(kInterruptReasonCount == ARRAYSIZE_UNSAFE(kTestCases), 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interrupt_reason_mismatch); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupDownloadItemDefaults(); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestCase& test_case = kTestCases[i]; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupInterruptedDownloadItem(test_case.reason); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(test_case.expected_status, 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(model().GetStatusText()).c_str()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: This test is currently skipped on Android. See http://crbug.com/139398 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadItemModelTest, InterruptTooltip) { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test that we have the correct interrupt tooltip for downloads that are in 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the INTERRUPTED state. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const struct TestCase { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The reason. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::DownloadInterruptReason reason; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected tooltip text. The tooltip text for interrupted downloads 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // typically consist of two lines. One for the filename and one for the 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interrupt reason. The returned string contains a newline. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_tooltip; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } kTestCases[] = { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NONE, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo.bar" }, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_FAILED, 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nDownload error" }, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED, 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nInsufficient permissions" }, 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE, 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nDisk full" }, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG, 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nPath too long" }, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_TOO_LARGE, 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nFile too large" }, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_VIRUS_INFECTED, 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nVirus detected" }, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo.bar\nBlocked" }, 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_SECURITY_CHECK_FAILED, 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nVirus scan failed" }, 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_TOO_SHORT, 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nFile truncated" }, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR, 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nSystem busy" }, 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED, 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nNetwork error" }, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_TIMEOUT, 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nNetwork timeout" }, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED, 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nNetwork disconnected" }, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_SERVER_DOWN, 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nServer unavailable" }, 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_NETWORK_INVALID_REQUEST, 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "foo.bar\nNetwork error" }, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED, 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nServer problem" }, 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_NO_RANGE, 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nDownload error" }, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_PRECONDITION, 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nDownload error" }, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_BAD_CONTENT, 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nNo file" }, 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_UNAUTHORIZED, 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "foo.bar\nNeeds authorization" }, 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_SERVER_CERT_PROBLEM, 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "foo.bar\nBad certificate" }, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo.bar" }, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_USER_SHUTDOWN, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "foo.bar\nShutdown" }, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { content::DOWNLOAD_INTERRUPT_REASON_CRASH, 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "foo.bar\nCrash" }, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COMPILE_ASSERT(kInterruptReasonCount == ARRAYSIZE_UNSAFE(kTestCases), 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interrupt_reason_mismatch); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Large tooltip width. Should be large enough to accommodate the entire 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tooltip without truncation. 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kLargeTooltipWidth = 1000; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Small tooltip width. Small enough to require truncation of most 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // tooltips. Used to test eliding logic. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kSmallTooltipWidth = 40; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::FontList& font_list = 26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui::ResourceBundle::GetSharedInstance().GetFontList( 26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui::ResourceBundle::BaseFont); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupDownloadItemDefaults(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TestCase& test_case = kTestCases[i]; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupInterruptedDownloadItem(test_case.reason); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GetTooltipText() elides the tooltip so that the text would fit within a 27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // given width. The following test would fail if kLargeTooltipWidth isn't 27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // large enough to accomodate all the strings. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ( 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_case.expected_tooltip, 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(model().GetTooltipText(font_list, 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kLargeTooltipWidth)).c_str()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that if the width is small, the returned tooltip only contains 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lines of the given width or smaller. 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16> lines; 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 truncated_tooltip = 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) model().GetTooltipText(font_list, kSmallTooltipWidth); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Tokenize(truncated_tooltip, base::ASCIIToUTF16("\n"), &lines); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < lines.size(); ++i) 28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_GE(kSmallTooltipWidth, gfx::GetStringWidth(lines[i], font_list)); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(DownloadItemModelTest, InProgressStatus) { 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const struct TestCase { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 received_bytes; // Return value of GetReceivedBytes(). 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 total_bytes; // Return value of GetTotalBytes(). 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool time_remaining_known; // If TimeRemaining() is known. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool open_when_complete; // GetOpenWhenComplete(). 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_paused; // IsPaused(). 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_status; // Expected status text. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } kTestCases[] = { 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These are all the valid combinations of the above fields for a download 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that is in IN_PROGRESS state. Go through all of them and check the return 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value of DownloadItemModel::GetStatusText(). The point isn't to lock down 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the status strings, but to make sure we end up with something sane for 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // all the circumstances we care about. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For GetReceivedBytes()/GetTotalBytes(), we only check whether each is 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-zero. In addition, if |total_bytes| is zero, then 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |time_remaining_known| is also false. 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // .-- .TimeRemaining() is known. 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // | .-- .GetOpenWhenComplete() 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // | | .---- .IsPaused() 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 0, false, false, false, "Starting..." }, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 0, false, false, false, "1 B" }, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 2, false, false, false, "Starting..." }, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 2, false, false, false, "1/2 B" }, 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 2, true, false, false, "0/2 B, 10 secs left" }, 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 2, true, false, false, "1/2 B, 10 secs left" }, 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 0, false, true, false, "Opening when complete" }, 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 0, false, true, false, "Opening when complete" }, 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 2, false, true, false, "Opening when complete" }, 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 2, false, true, false, "Opening when complete" }, 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 2, true, true, false, "Opening in 10 secs..." }, 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 2, true, true, false, "Opening in 10 secs..." }, 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 0, false, false, true, "0 B, Paused" }, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 0, false, false, true, "1 B, Paused" }, 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 2, false, false, true, "0/2 B, Paused" }, 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 2, false, false, true, "1/2 B, Paused" }, 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 2, true, false, true, "0/2 B, Paused" }, 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 2, true, false, true, "1/2 B, Paused" }, 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 0, false, true, true, "0 B, Paused" }, 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 0, false, true, true, "1 B, Paused" }, 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 2, false, true, true, "0/2 B, Paused" }, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 2, false, true, true, "1/2 B, Paused" }, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 0, 2, true, true, true, "0/2 B, Paused" }, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 1, 2, true, true, true, "1/2 B, Paused" }, 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupDownloadItemDefaults(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) { 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TestCase& test_case = kTestCases[i]; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&item()); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&model()); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(item(), GetReceivedBytes()) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(test_case.received_bytes)); 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(item(), GetTotalBytes()) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(test_case.total_bytes)); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(item(), TimeRemaining(_)) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(testing::DoAll( 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing::SetArgPointee<0>(base::TimeDelta::FromSeconds(10)), 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Return(test_case.time_remaining_known))); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(item(), GetOpenWhenComplete()) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(test_case.open_when_complete)); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(item(), IsPaused()) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(test_case.is_paused)); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STREQ(test_case.expected_status, 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(model().GetStatusText()).c_str()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DownloadItemModelTest, ShouldShowInShelf) { 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupDownloadItemDefaults(); 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // By default the download item should be displayable on the shelf. 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(model().ShouldShowInShelf()); 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Once explicitly set, ShouldShowInShelf() should return the explicit value. 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model().SetShouldShowInShelf(false); 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(model().ShouldShowInShelf()); 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model().SetShouldShowInShelf(true); 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(model().ShouldShowInShelf()); 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(DownloadItemModelTest, ShouldRemoveFromShelfWhenComplete) { 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const struct TestCase { 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DownloadItem::DownloadState state; 377ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool is_dangerous; // Expectation for IsDangerous(). 378ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool is_auto_open; // Expectation for GetOpenWhenComplete(). 379ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool auto_opened; // Whether the download was successfully 380ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // auto-opened. Expecation for GetAutoOpened(). 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool expected_result; 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } kTestCases[] = { 383ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // All the valid combinations of state, is_dangerous, is_auto_open and 384ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // auto_opened. 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // .--- Is dangerous. 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // | .--- Auto open or temporary. 388ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // | | .--- Auto opened. 389ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch // | | | .--- Expected result. 390ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::IN_PROGRESS, false, false, false, false}, 391ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::IN_PROGRESS, false, true , false, true }, 392ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::IN_PROGRESS, true , false, false, false}, 393ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::IN_PROGRESS, true , true , false, false}, 394ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::COMPLETE, false, false, false, false}, 395ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::COMPLETE, false, true , false, false}, 396ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::COMPLETE, false, false, true , true }, 397ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::COMPLETE, false, true , true , true }, 398ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::CANCELLED, false, false, false, false}, 399ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::CANCELLED, false, true , false, false}, 400ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::CANCELLED, true , false, false, false}, 401ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::CANCELLED, true , true , false, false}, 402ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::INTERRUPTED, false, false, false, false}, 403ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::INTERRUPTED, false, true , false, false}, 404ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::INTERRUPTED, true , false, false, false}, 405ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch { DownloadItem::INTERRUPTED, true , true , false, false} 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetupDownloadItemDefaults(); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (unsigned i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); i++) { 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const TestCase& test_case = kTestCases[i]; 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(item(), GetOpenWhenComplete()) 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillRepeatedly(Return(test_case.is_auto_open)); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(item(), GetState()) 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillRepeatedly(Return(test_case.state)); 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(item(), IsDangerous()) 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .WillRepeatedly(Return(test_case.is_dangerous)); 418ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch EXPECT_CALL(item(), GetAutoOpened()) 419ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch .WillRepeatedly(Return(test_case.auto_opened)); 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(test_case.expected_result, 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model().ShouldRemoveFromShelfWhenComplete()) 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "Test case: " << i; 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mock::VerifyAndClearExpectations(&item()); 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mock::VerifyAndClearExpectations(&model()); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 428