Home | History | Annotate | Download | only in flash
      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.
      4 
      5 #include "net/disk_cache/flash/flash_cache_test_base.h"
      6 #include "net/disk_cache/flash/format.h"
      7 #include "net/disk_cache/flash/log_store.h"
      8 #include "net/disk_cache/flash/segment.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace disk_cache {
     12 
     13 TEST_F(FlashCacheTest, LogStoreCreateEntry) {
     14   LogStore log_store(path_, kStorageSize);
     15   EXPECT_TRUE(log_store.Init());
     16 
     17   const int32 kSize = 100;
     18   const std::string buf(kSize, 0);
     19 
     20   int32 id;
     21   EXPECT_TRUE(log_store.CreateEntry(kSize, &id));
     22   EXPECT_TRUE(log_store.WriteData(buf.data(), kSize/2));
     23   EXPECT_TRUE(log_store.WriteData(buf.data(), kSize/2));
     24   log_store.CloseEntry(id);
     25 
     26   EXPECT_TRUE(log_store.Close());
     27 }
     28 
     29 // Also tests reading from current segment.
     30 TEST_F(FlashCacheTest, LogStoreOpenEntry) {
     31   LogStore log_store(path_, kStorageSize);
     32   EXPECT_TRUE(log_store.Init());
     33 
     34   const int32 kSize = 100;
     35   const std::vector<char> expected(kSize, 'b');
     36 
     37   int32 id;
     38   EXPECT_TRUE(log_store.CreateEntry(kSize, &id));
     39   EXPECT_TRUE(log_store.WriteData(&expected[0], kSize));
     40   log_store.CloseEntry(id);
     41 
     42   EXPECT_TRUE(log_store.OpenEntry(id));
     43   std::vector<char> actual(kSize, 0);
     44   EXPECT_TRUE(log_store.ReadData(id, &actual[0], kSize, 0));
     45   log_store.CloseEntry(id);
     46 
     47   EXPECT_EQ(expected, actual);
     48   EXPECT_TRUE(log_store.Close());
     49 }
     50 
     51 // Also tests that writing advances segments.
     52 TEST_F(FlashCacheTest, LogStoreReadFromClosedSegment) {
     53   LogStore log_store(path_, kStorageSize);
     54   EXPECT_TRUE(log_store.Init());
     55 
     56   const int32 kSize = disk_cache::kFlashSegmentFreeSpace;
     57   const std::vector<char> expected(kSize, 'a');
     58 
     59   // First two entries go to segment 0.
     60   int32 id1;
     61   EXPECT_EQ(0, log_store.write_index_);
     62   EXPECT_TRUE(log_store.CreateEntry(kSize/2, &id1));
     63   EXPECT_TRUE(log_store.WriteData(&expected[0], kSize/2));
     64   log_store.CloseEntry(id1);
     65 
     66   int32 id2;
     67   EXPECT_EQ(0, log_store.write_index_);
     68   EXPECT_TRUE(log_store.CreateEntry(kSize/2, &id2));
     69   EXPECT_TRUE(log_store.WriteData(&expected[0], kSize/2));
     70   log_store.CloseEntry(id2);
     71 
     72   // This entry goes to segment 1.
     73   int32 id3;
     74   EXPECT_TRUE(log_store.CreateEntry(kSize, &id3));
     75   EXPECT_EQ(1, log_store.write_index_);
     76   EXPECT_TRUE(log_store.WriteData(&expected[0], kSize));
     77   log_store.CloseEntry(id3);
     78 
     79   // We read from segment 0.
     80   EXPECT_TRUE(log_store.OpenEntry(id1));
     81   std::vector<char> actual(kSize, 0);
     82   EXPECT_TRUE(log_store.ReadData(id1, &actual[0], kSize, id1));
     83   log_store.CloseEntry(id1);
     84 
     85   EXPECT_EQ(expected, actual);
     86   EXPECT_TRUE(log_store.Close());
     87 }
     88 
     89 TEST_F(FlashCacheTest, LogStoreReadFromCurrentAfterClose) {
     90   LogStore log_store(path_, kStorageSize);
     91   EXPECT_TRUE(log_store.Init());
     92 
     93   const int32 kSize = disk_cache::kFlashSegmentFreeSpace;
     94   const std::vector<char> expected(kSize, 'a');
     95 
     96   int32 id1;
     97   EXPECT_EQ(0, log_store.write_index_);
     98   EXPECT_TRUE(log_store.CreateEntry(kSize/2, &id1));
     99   EXPECT_TRUE(log_store.WriteData(&expected[0], kSize/2));
    100   log_store.CloseEntry(id1);
    101 
    102   // Create a reference to above entry.
    103   EXPECT_TRUE(log_store.OpenEntry(id1));
    104 
    105   // This entry fills the first segment.
    106   int32 id2;
    107   EXPECT_EQ(0, log_store.write_index_);
    108   EXPECT_TRUE(log_store.CreateEntry(kSize/2, &id2));
    109   EXPECT_TRUE(log_store.WriteData(&expected[0], kSize/2));
    110   log_store.CloseEntry(id2);
    111 
    112   // Creating this entry forces closing of the first segment.
    113   int32 id3;
    114   EXPECT_TRUE(log_store.CreateEntry(kSize, &id3));
    115   EXPECT_EQ(1, log_store.write_index_);
    116   EXPECT_TRUE(log_store.WriteData(&expected[0], kSize));
    117   log_store.CloseEntry(id3);
    118 
    119   // Now attempt to read from the closed segment.
    120   std::vector<char> actual(kSize, 0);
    121   EXPECT_TRUE(log_store.ReadData(id1, &actual[0], kSize, id1));
    122   log_store.CloseEntry(id1);
    123 
    124   EXPECT_EQ(expected, actual);
    125   EXPECT_TRUE(log_store.Close());
    126 }
    127 
    128 // TODO(agayev): Add a test that confirms that in-use segment is not selected as
    129 // the next write segment.
    130 
    131 }  // namespace disk_cache
    132