Home | History | Annotate | Download | only in file_system
      1 // Copyright 2013 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 "chrome/browser/chromeos/drive/file_system/search_operation.h"
      6 
      7 #include "chrome/browser/chromeos/drive/change_list_loader.h"
      8 #include "chrome/browser/chromeos/drive/file_system/operation_test_base.h"
      9 #include "chrome/browser/drive/fake_drive_service.h"
     10 #include "chrome/browser/google_apis/gdata_wapi_parser.h"
     11 #include "chrome/browser/google_apis/test_util.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 namespace drive {
     15 namespace file_system {
     16 
     17 namespace {
     18 
     19 struct SearchResultPair {
     20   const char* path;
     21   const bool is_directory;
     22 };
     23 
     24 }  // namespace
     25 
     26 typedef OperationTestBase SearchOperationTest;
     27 
     28 TEST_F(SearchOperationTest, ContentSearch) {
     29   SearchOperation operation(blocking_task_runner(), scheduler(), metadata());
     30 
     31   const SearchResultPair kExpectedResults[] = {
     32     { "drive/root/Directory 1/Sub Directory Folder/Sub Sub Directory Folder",
     33       true },
     34     { "drive/root/Directory 1/Sub Directory Folder", true },
     35     { "drive/root/Directory 1/SubDirectory File 1.txt", false },
     36     { "drive/root/Directory 1", true },
     37     { "drive/root/Directory 2 excludeDir-test", true },
     38   };
     39 
     40   FileError error = FILE_ERROR_FAILED;
     41   GURL next_url;
     42   scoped_ptr<std::vector<SearchResultInfo> > results;
     43 
     44   operation.Search("Directory", GURL(),
     45                    google_apis::test_util::CreateCopyResultCallback(
     46                        &error, &next_url, &results));
     47   test_util::RunBlockingPoolTask();
     48 
     49   EXPECT_EQ(FILE_ERROR_OK, error);
     50   EXPECT_EQ(GURL(), next_url);
     51   EXPECT_EQ(ARRAYSIZE_UNSAFE(kExpectedResults), results->size());
     52   for (size_t i = 0; i < results->size(); i++) {
     53     EXPECT_EQ(kExpectedResults[i].path, results->at(i).path.AsUTF8Unsafe());
     54     EXPECT_EQ(kExpectedResults[i].is_directory,
     55               results->at(i).entry.file_info().is_directory());
     56   }
     57 }
     58 
     59 TEST_F(SearchOperationTest, ContentSearchWithNewEntry) {
     60   SearchOperation operation(blocking_task_runner(), scheduler(), metadata());
     61 
     62   // Create a new directory in the drive service.
     63   google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR;
     64   scoped_ptr<google_apis::ResourceEntry> resource_entry;
     65   fake_service()->AddNewDirectory(
     66       fake_service()->GetRootResourceId(),
     67       "New Directory 1!",
     68       google_apis::test_util::CreateCopyResultCallback(
     69           &gdata_error, &resource_entry));
     70   test_util::RunBlockingPoolTask();
     71   ASSERT_EQ(google_apis::HTTP_CREATED, gdata_error);
     72 
     73   // As the result of the first Search(), only entries in the current file
     74   // system snapshot are expected to be returned in the "right" path. New
     75   // entries like "New Directory 1!" is temporarily added to "drive/other".
     76   const SearchResultPair kExpectedResultsBeforeLoad[] = {
     77       { "drive/root/Directory 1", true },
     78       { "drive/other/New Directory 1!", true },
     79   };
     80 
     81   FileError error = FILE_ERROR_FAILED;
     82   GURL next_url;
     83   scoped_ptr<std::vector<SearchResultInfo> > results;
     84 
     85   operation.Search("\"Directory 1\"", GURL(),
     86                    google_apis::test_util::CreateCopyResultCallback(
     87                        &error, &next_url, &results));
     88   test_util::RunBlockingPoolTask();
     89 
     90   EXPECT_EQ(FILE_ERROR_OK, error);
     91   EXPECT_EQ(GURL(), next_url);
     92   ASSERT_EQ(ARRAYSIZE_UNSAFE(kExpectedResultsBeforeLoad), results->size());
     93   for (size_t i = 0; i < results->size(); i++) {
     94     EXPECT_EQ(kExpectedResultsBeforeLoad[i].path,
     95               results->at(i).path.AsUTF8Unsafe());
     96     EXPECT_EQ(kExpectedResultsBeforeLoad[i].is_directory,
     97               results->at(i).entry.file_info().is_directory());
     98   }
     99 
    100   // Load the change from FakeDriveService.
    101   internal::ChangeListLoader change_list_loader(
    102       blocking_task_runner(), metadata(), scheduler());
    103   change_list_loader.CheckForUpdates(
    104       google_apis::test_util::CreateCopyResultCallback(&error));
    105   test_util::RunBlockingPoolTask();
    106 
    107   // Now the new entry must be reported to be in the right directory.
    108   const SearchResultPair kExpectedResultsAfterLoad[] = {
    109       { "drive/root/Directory 1", true },
    110       { "drive/root/New Directory 1!", true },
    111   };
    112   error = FILE_ERROR_FAILED;
    113   operation.Search("\"Directory 1\"", GURL(),
    114                    google_apis::test_util::CreateCopyResultCallback(
    115                        &error, &next_url, &results));
    116   test_util::RunBlockingPoolTask();
    117 
    118   EXPECT_EQ(FILE_ERROR_OK, error);
    119   EXPECT_EQ(GURL(), next_url);
    120   ASSERT_EQ(ARRAYSIZE_UNSAFE(kExpectedResultsAfterLoad), results->size());
    121   for (size_t i = 0; i < results->size(); i++) {
    122     EXPECT_EQ(kExpectedResultsAfterLoad[i].path,
    123               results->at(i).path.AsUTF8Unsafe());
    124     EXPECT_EQ(kExpectedResultsAfterLoad[i].is_directory,
    125               results->at(i).entry.file_info().is_directory());
    126   }
    127 }
    128 
    129 TEST_F(SearchOperationTest, ContentSearchEmptyResult) {
    130   SearchOperation operation(blocking_task_runner(), scheduler(), metadata());
    131 
    132   FileError error = FILE_ERROR_FAILED;
    133   GURL next_url;
    134   scoped_ptr<std::vector<SearchResultInfo> > results;
    135 
    136   operation.Search("\"no-match query\"", GURL(),
    137                    google_apis::test_util::CreateCopyResultCallback(
    138                        &error, &next_url, &results));
    139   test_util::RunBlockingPoolTask();
    140 
    141   EXPECT_EQ(FILE_ERROR_OK, error);
    142   EXPECT_EQ(GURL(), next_url);
    143   EXPECT_EQ(0U, results->size());
    144 }
    145 
    146 }  // namespace file_system
    147 }  // namespace drive
    148