OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |