Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(312)

Side by Side Diff: net/disk_cache/entry_unittest.cc

Issue 786123002: Update from https://crrev.com/307330 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/disk_cache/blockfile/sparse_control.cc ('k') | net/ftp/ftp_network_transaction.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/bind_helpers.h" 7 #include "base/bind_helpers.h"
8 #include "base/files/file.h" 8 #include "base/files/file.h"
9 #include "base/files/file_util.h" 9 #include "base/files/file_util.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 1780 matching lines...) Expand 10 before | Expand all | Expand 10 after
1791 InitCache(); 1791 InitCache();
1792 GetAvailableRange(); 1792 GetAvailableRange();
1793 } 1793 }
1794 1794
1795 TEST_F(DiskCacheEntryTest, MemoryOnlyGetAvailableRange) { 1795 TEST_F(DiskCacheEntryTest, MemoryOnlyGetAvailableRange) {
1796 SetMemoryOnlyMode(); 1796 SetMemoryOnlyMode();
1797 InitCache(); 1797 InitCache();
1798 GetAvailableRange(); 1798 GetAvailableRange();
1799 } 1799 }
1800 1800
1801 // Tests that non-sequential writes that are not aligned with the minimum sparse
1802 // data granularity (1024 bytes) do in fact result in dropped data.
1803 TEST_F(DiskCacheEntryTest, SparseWriteDropped) {
1804 InitCache();
1805 std::string key("the first key");
1806 disk_cache::Entry* entry;
1807 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1808
1809 const int kSize = 180;
1810 scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(kSize));
1811 scoped_refptr<net::IOBuffer> buf_2(new net::IOBuffer(kSize));
1812 CacheTestFillBuffer(buf_1->data(), kSize, false);
1813
1814 // Do small writes (180 bytes) that get increasingly close to a 1024-byte
1815 // boundary. All data should be dropped until a boundary is crossed, at which
1816 // point the data after the boundary is saved (at least for a while).
1817 int offset = 1024 - 500;
1818 int rv = 0;
1819 net::TestCompletionCallback cb;
1820 int64 start;
1821 for (int i = 0; i < 5; i++) {
1822 // Check result of last GetAvailableRange.
1823 EXPECT_EQ(0, rv);
1824
1825 rv = entry->WriteSparseData(offset, buf_1.get(), kSize, cb.callback());
1826 EXPECT_EQ(kSize, cb.GetResult(rv));
1827
1828 rv = entry->GetAvailableRange(offset - 100, kSize, &start, cb.callback());
1829 EXPECT_EQ(0, cb.GetResult(rv));
1830
1831 rv = entry->GetAvailableRange(offset, kSize, &start, cb.callback());
1832 rv = cb.GetResult(rv);
1833 if (!rv) {
1834 rv = entry->ReadSparseData(offset, buf_2.get(), kSize, cb.callback());
1835 EXPECT_EQ(0, cb.GetResult(rv));
1836 rv = 0;
1837 }
1838 offset += 1024 * i + 100;
1839 }
1840
1841 // The last write started 100 bytes below a bundary, so there should be 80
1842 // bytes after the boundary.
1843 EXPECT_EQ(80, rv);
1844 EXPECT_EQ(1024 * 7, start);
1845 rv = entry->ReadSparseData(start, buf_2.get(), kSize, cb.callback());
1846 EXPECT_EQ(80, cb.GetResult(rv));
1847 EXPECT_EQ(0, memcmp(buf_1.get()->data() + 100, buf_2.get()->data(), 80));
1848
1849 // And even that part is dropped when another write changes the offset.
1850 offset = start;
1851 rv = entry->WriteSparseData(0, buf_1.get(), kSize, cb.callback());
1852 EXPECT_EQ(kSize, cb.GetResult(rv));
1853
1854 rv = entry->GetAvailableRange(offset, kSize, &start, cb.callback());
1855 EXPECT_EQ(0, cb.GetResult(rv));
1856 entry->Close();
1857 }
1858
1859 // Tests that small sequential writes are not dropped.
1860 TEST_F(DiskCacheEntryTest, SparseSquentialWriteNotDropped) {
1861 InitCache();
1862 std::string key("the first key");
1863 disk_cache::Entry* entry;
1864 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1865
1866 const int kSize = 180;
1867 scoped_refptr<net::IOBuffer> buf_1(new net::IOBuffer(kSize));
1868 scoped_refptr<net::IOBuffer> buf_2(new net::IOBuffer(kSize));
1869 CacheTestFillBuffer(buf_1->data(), kSize, false);
1870
1871 // Any starting offset is fine as long as it is 1024-bytes aligned.
1872 int rv = 0;
1873 net::TestCompletionCallback cb;
1874 int64 start;
1875 int64 offset = 1024 * 11;
1876 for (; offset < 20000; offset += kSize) {
1877 rv = entry->WriteSparseData(offset, buf_1.get(), kSize, cb.callback());
1878 EXPECT_EQ(kSize, cb.GetResult(rv));
1879
1880 rv = entry->GetAvailableRange(offset, kSize, &start, cb.callback());
1881 EXPECT_EQ(kSize, cb.GetResult(rv));
1882 EXPECT_EQ(offset, start);
1883
1884 rv = entry->ReadSparseData(offset, buf_2.get(), kSize, cb.callback());
1885 EXPECT_EQ(kSize, cb.GetResult(rv));
1886 EXPECT_EQ(0, memcmp(buf_1.get()->data(), buf_2.get()->data(), kSize));
1887 }
1888
1889 entry->Close();
1890 FlushQueueForTest();
1891
1892 // Verify again the last write made.
1893 ASSERT_EQ(net::OK, OpenEntry(key, &entry));
1894 offset -= kSize;
1895 rv = entry->GetAvailableRange(offset, kSize, &start, cb.callback());
1896 EXPECT_EQ(kSize, cb.GetResult(rv));
1897 EXPECT_EQ(offset, start);
1898
1899 rv = entry->ReadSparseData(offset, buf_2.get(), kSize, cb.callback());
1900 EXPECT_EQ(kSize, cb.GetResult(rv));
1901 EXPECT_EQ(0, memcmp(buf_1.get()->data(), buf_2.get()->data(), kSize));
1902
1903 entry->Close();
1904 }
1905
1801 void DiskCacheEntryTest::CouldBeSparse() { 1906 void DiskCacheEntryTest::CouldBeSparse() {
1802 std::string key("the first key"); 1907 std::string key("the first key");
1803 disk_cache::Entry* entry; 1908 disk_cache::Entry* entry;
1804 ASSERT_EQ(net::OK, CreateEntry(key, &entry)); 1909 ASSERT_EQ(net::OK, CreateEntry(key, &entry));
1805 1910
1806 const int kSize = 16 * 1024; 1911 const int kSize = 16 * 1024;
1807 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize)); 1912 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kSize));
1808 CacheTestFillBuffer(buf->data(), kSize, false); 1913 CacheTestFillBuffer(buf->data(), kSize, false);
1809 1914
1810 // Write at offset 0x20F0000 (33 MB - 64 KB). 1915 // Write at offset 0x20F0000 (33 MB - 64 KB).
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
2126 2231
2127 scoped_refptr<net::IOBuffer> buf2(new net::IOBuffer(kSize)); 2232 scoped_refptr<net::IOBuffer> buf2(new net::IOBuffer(kSize));
2128 memset(buf2->data(), 0, kSize); 2233 memset(buf2->data(), 0, kSize);
2129 EXPECT_EQ(0, ReadSparseData(entry, 8000, buf2.get(), kSize)); 2234 EXPECT_EQ(0, ReadSparseData(entry, 8000, buf2.get(), kSize));
2130 2235
2131 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2.get(), kSize)); 2236 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2.get(), kSize));
2132 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500)); 2237 EXPECT_EQ(0, memcmp(buf2->data(), buf1->data() + kSize - 500, 500));
2133 EXPECT_EQ(0, ReadSparseData(entry, 0, buf2.get(), kSize)); 2238 EXPECT_EQ(0, ReadSparseData(entry, 0, buf2.get(), kSize));
2134 2239
2135 // This read should not change anything. 2240 // This read should not change anything.
2136 EXPECT_EQ(96, ReadSparseData(entry, 24000, buf2.get(), kSize)); 2241 if (memory_only_ || simple_cache_mode_)
2242 EXPECT_EQ(96, ReadSparseData(entry, 24000, buf2.get(), kSize));
2243 else
2244 EXPECT_EQ(0, ReadSparseData(entry, 24000, buf2.get(), kSize));
2245
2137 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2.get(), kSize)); 2246 EXPECT_EQ(500, ReadSparseData(entry, kSize, buf2.get(), kSize));
2138 EXPECT_EQ(0, ReadSparseData(entry, 99, buf2.get(), kSize)); 2247 EXPECT_EQ(0, ReadSparseData(entry, 99, buf2.get(), kSize));
2139 2248
2140 int rv; 2249 int rv;
2141 int64 start; 2250 int64 start;
2142 net::TestCompletionCallback cb; 2251 net::TestCompletionCallback cb;
2143 if (memory_only_ || simple_cache_mode_) { 2252 if (memory_only_ || simple_cache_mode_) {
2144 rv = entry->GetAvailableRange(0, 600, &start, cb.callback()); 2253 rv = entry->GetAvailableRange(0, 600, &start, cb.callback());
2145 EXPECT_EQ(100, cb.GetResult(rv)); 2254 EXPECT_EQ(100, cb.GetResult(rv));
2146 EXPECT_EQ(500, start); 2255 EXPECT_EQ(500, start);
2147 } else { 2256 } else {
2148 rv = entry->GetAvailableRange(0, 2048, &start, cb.callback()); 2257 rv = entry->GetAvailableRange(0, 2048, &start, cb.callback());
2149 EXPECT_EQ(1024, cb.GetResult(rv)); 2258 EXPECT_EQ(1024, cb.GetResult(rv));
2150 EXPECT_EQ(1024, start); 2259 EXPECT_EQ(1024, start);
2151 } 2260 }
2152 rv = entry->GetAvailableRange(kSize, kSize, &start, cb.callback()); 2261 rv = entry->GetAvailableRange(kSize, kSize, &start, cb.callback());
2153 EXPECT_EQ(500, cb.GetResult(rv)); 2262 EXPECT_EQ(500, cb.GetResult(rv));
2154 EXPECT_EQ(kSize, start); 2263 EXPECT_EQ(kSize, start);
2155 rv = entry->GetAvailableRange(20 * 1024, 10000, &start, cb.callback()); 2264 rv = entry->GetAvailableRange(20 * 1024, 10000, &start, cb.callback());
2156 EXPECT_EQ(3616, cb.GetResult(rv)); 2265 if (memory_only_ || simple_cache_mode_)
2266 EXPECT_EQ(3616, cb.GetResult(rv));
2267 else
2268 EXPECT_EQ(3072, cb.GetResult(rv));
2269
2157 EXPECT_EQ(20 * 1024, start); 2270 EXPECT_EQ(20 * 1024, start);
2158 2271
2159 // 1. Query before a filled 1KB block. 2272 // 1. Query before a filled 1KB block.
2160 // 2. Query within a filled 1KB block. 2273 // 2. Query within a filled 1KB block.
2161 // 3. Query beyond a filled 1KB block. 2274 // 3. Query beyond a filled 1KB block.
2162 if (memory_only_ || simple_cache_mode_) { 2275 if (memory_only_ || simple_cache_mode_) {
2163 rv = entry->GetAvailableRange(19400, kSize, &start, cb.callback()); 2276 rv = entry->GetAvailableRange(19400, kSize, &start, cb.callback());
2164 EXPECT_EQ(3496, cb.GetResult(rv)); 2277 EXPECT_EQ(3496, cb.GetResult(rv));
2165 EXPECT_EQ(20000, start); 2278 EXPECT_EQ(20000, start);
2166 } else { 2279 } else {
(...skipping 1883 matching lines...) Expand 10 before | Expand all | Expand 10 after
4050 4163
4051 ret = entry->ReadSparseData(kSize, buffer.get(), kSize, callback.callback()); 4164 ret = entry->ReadSparseData(kSize, buffer.get(), kSize, callback.callback());
4052 EXPECT_EQ(kSize, callback.GetResult(ret)); 4165 EXPECT_EQ(kSize, callback.GetResult(ret));
4053 4166
4054 // Make sure the first range was removed when the second was written. 4167 // Make sure the first range was removed when the second was written.
4055 ret = entry->ReadSparseData(0, buffer.get(), kSize, callback.callback()); 4168 ret = entry->ReadSparseData(0, buffer.get(), kSize, callback.callback());
4056 EXPECT_EQ(0, callback.GetResult(ret)); 4169 EXPECT_EQ(0, callback.GetResult(ret));
4057 4170
4058 entry->Close(); 4171 entry->Close();
4059 } 4172 }
OLDNEW
« no previous file with comments | « net/disk_cache/blockfile/sparse_control.cc ('k') | net/ftp/ftp_network_transaction.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698