Home | History | Annotate | Download | only in disk_cache
      1 // Copyright (c) 2006-2008 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 "base/basictypes.h"
      6 #include "base/file_util.h"
      7 #include "base/string_util.h"
      8 #include "net/disk_cache/disk_cache_test_base.h"
      9 #include "net/disk_cache/disk_cache_test_util.h"
     10 #include "net/disk_cache/mapped_file.h"
     11 #include "testing/gtest/include/gtest/gtest.h"
     12 
     13 namespace {
     14 
     15 int g_cache_tests_max_id;
     16 volatile int g_cache_tests_received;
     17 volatile bool g_cache_tests_error;
     18 
     19 // Implementation of FileIOCallback for the tests.
     20 class FileCallbackTest: public disk_cache::FileIOCallback {
     21  public:
     22   explicit FileCallbackTest(int id) : id_(id) {}
     23   ~FileCallbackTest() {}
     24 
     25   virtual void OnFileIOComplete(int bytes_copied);
     26  private:
     27   int id_;
     28 };
     29 
     30 void FileCallbackTest::OnFileIOComplete(int bytes_copied) {
     31   if (id_ > g_cache_tests_max_id) {
     32     NOTREACHED();
     33     g_cache_tests_error = true;
     34   }
     35 
     36   g_cache_tests_received++;
     37 }
     38 
     39 }  // namespace
     40 
     41 TEST_F(DiskCacheTest, MappedFile_SyncIO) {
     42   FilePath filename = GetCacheFilePath().AppendASCII("a_test");
     43   scoped_refptr<disk_cache::MappedFile> file(new disk_cache::MappedFile);
     44   ASSERT_TRUE(CreateCacheTestFile(filename));
     45   ASSERT_TRUE(file->Init(filename, 8192));
     46 
     47   char buffer1[20];
     48   char buffer2[20];
     49   CacheTestFillBuffer(buffer1, sizeof(buffer1), false);
     50   base::strlcpy(buffer1, "the data", arraysize(buffer1));
     51   EXPECT_TRUE(file->Write(buffer1, sizeof(buffer1), 8192));
     52   EXPECT_TRUE(file->Read(buffer2, sizeof(buffer2), 8192));
     53   EXPECT_STREQ(buffer1, buffer2);
     54 }
     55 
     56 TEST_F(DiskCacheTest, MappedFile_AsyncIO) {
     57   FilePath filename = GetCacheFilePath().AppendASCII("a_test");
     58   scoped_refptr<disk_cache::MappedFile> file(new disk_cache::MappedFile);
     59   ASSERT_TRUE(CreateCacheTestFile(filename));
     60   ASSERT_TRUE(file->Init(filename, 8192));
     61 
     62   FileCallbackTest callback(1);
     63   g_cache_tests_error = false;
     64   g_cache_tests_max_id = 0;
     65   g_cache_tests_received = 0;
     66 
     67   MessageLoopHelper helper;
     68 
     69   char buffer1[20];
     70   char buffer2[20];
     71   CacheTestFillBuffer(buffer1, sizeof(buffer1), false);
     72   base::strlcpy(buffer1, "the data", arraysize(buffer1));
     73   bool completed;
     74   EXPECT_TRUE(file->Write(buffer1, sizeof(buffer1), 1024 * 1024, &callback,
     75               &completed));
     76   int expected = completed ? 0 : 1;
     77 
     78   g_cache_tests_max_id = 1;
     79   helper.WaitUntilCacheIoFinished(expected);
     80 
     81   EXPECT_TRUE(file->Read(buffer2, sizeof(buffer2), 1024 * 1024, &callback,
     82               &completed));
     83   if (!completed)
     84     expected++;
     85 
     86   helper.WaitUntilCacheIoFinished(expected);
     87 
     88   EXPECT_EQ(expected, g_cache_tests_received);
     89   EXPECT_FALSE(g_cache_tests_error);
     90   EXPECT_STREQ(buffer1, buffer2);
     91 }
     92