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

Side by Side Diff: ppapi/tests/test_file_ref.cc

Issue 12817009: Add Query() support to FileRef (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Don't leak file handles, fix nits Created 7 years, 9 months 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
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "ppapi/tests/test_file_ref.h" 5 #include "ppapi/tests/test_file_ref.h"
6 6
7 #include <stdio.h> 7 #include <stdio.h>
8 #include <vector> 8 #include <vector>
9 9
10 #include "ppapi/c/pp_errors.h" 10 #include "ppapi/c/pp_errors.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 return method_name + " returned '" + returned_result + "'; '" + 42 return method_name + " returned '" + returned_result + "'; '" +
43 expected_result + "' expected."; 43 expected_result + "' expected.";
44 } 44 }
45 45
46 } // namespace 46 } // namespace
47 47
48 bool TestFileRef::Init() { 48 bool TestFileRef::Init() {
49 return CheckTestingInterface() && EnsureRunningOverHTTP(); 49 return CheckTestingInterface() && EnsureRunningOverHTTP();
50 } 50 }
51 51
52 std::string TestFileRef::MakeExternalFileRef(pp::FileRef* file_ref_ext) {
53 pp::URLRequestInfo request(instance_);
54 request.SetURL("test_url_loader_data/hello.txt");
55 request.SetStreamToFile(true);
56
57 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
dmichael (off chromium) 2013/03/27 20:20:06 callback_type()
58
59 pp::URLLoader loader(instance_);
60 int32_t rv = loader.Open(request, callback.GetCallback());
61 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
62 return ReportError("URLLoader::Open force_async", rv);
dmichael (off chromium) 2013/03/27 20:20:06 IIRC You can use ASSERT_EQ and friends in here; th
63 if (rv == PP_OK_COMPLETIONPENDING)
64 rv = callback.WaitForResult();
65 if (rv != PP_OK)
66 return "URLLoader::Open() failed.";
67
68 pp::URLResponseInfo response_info(loader.GetResponseInfo());
69 if (response_info.is_null())
70 return "URLLoader::GetResponseInfo returned null";
71 int32_t status_code = response_info.GetStatusCode();
72 if (status_code != 200)
73 return "Unexpected HTTP status code";
74
75 *file_ref_ext = pp::FileRef(response_info.GetBodyAsFileRef());
76 if (file_ref_ext->GetFileSystemType() != PP_FILESYSTEMTYPE_EXTERNAL)
77 return "file_ref_ext expected to be external.";
78 return "";
79 }
80
52 void TestFileRef::RunTests(const std::string& filter) { 81 void TestFileRef::RunTests(const std::string& filter) {
53 RUN_TEST_FORCEASYNC_AND_NOT(Create, filter); 82 RUN_TEST_FORCEASYNC_AND_NOT(Create, filter);
54 RUN_TEST_FORCEASYNC_AND_NOT(GetFileSystemType, filter); 83 RUN_TEST_FORCEASYNC_AND_NOT(GetFileSystemType, filter);
55 RUN_TEST_FORCEASYNC_AND_NOT(GetName, filter); 84 RUN_TEST_FORCEASYNC_AND_NOT(GetName, filter);
56 RUN_TEST_FORCEASYNC_AND_NOT(GetPath, filter); 85 RUN_TEST_FORCEASYNC_AND_NOT(GetPath, filter);
57 RUN_TEST_FORCEASYNC_AND_NOT(GetParent, filter); 86 RUN_TEST_FORCEASYNC_AND_NOT(GetParent, filter);
58 RUN_TEST_FORCEASYNC_AND_NOT(MakeDirectory, filter); 87 RUN_TEST_FORCEASYNC_AND_NOT(MakeDirectory, filter);
59 RUN_TEST_FORCEASYNC_AND_NOT(QueryAndTouchFile, filter); 88 RUN_TEST_FORCEASYNC_AND_NOT(QueryAndTouchFile, filter);
60 RUN_TEST_FORCEASYNC_AND_NOT(DeleteFileAndDirectory, filter); 89 RUN_TEST_FORCEASYNC_AND_NOT(DeleteFileAndDirectory, filter);
61 RUN_TEST_FORCEASYNC_AND_NOT(RenameFileAndDirectory, filter); 90 RUN_TEST_FORCEASYNC_AND_NOT(RenameFileAndDirectory, filter);
91 RUN_TEST_FORCEASYNC_AND_NOT(Query, filter);
dmichael (off chromium) 2013/03/27 20:20:06 If you want, you can use RUN_CALLBACK_TEST here. T
62 #ifndef PPAPI_OS_NACL // NaCl can't run this test yet. 92 #ifndef PPAPI_OS_NACL // NaCl can't run this test yet.
63 RUN_TEST_FORCEASYNC_AND_NOT(FileNameEscaping, filter); 93 RUN_TEST_FORCEASYNC_AND_NOT(FileNameEscaping, filter);
64 #endif 94 #endif
65 } 95 }
66 96
67 std::string TestFileRef::TestCreate() { 97 std::string TestFileRef::TestCreate() {
68 std::vector<std::string> invalid_paths; 98 std::vector<std::string> invalid_paths;
69 invalid_paths.push_back("invalid_path"); // no '/' at the first character 99 invalid_paths.push_back("invalid_path"); // no '/' at the first character
70 invalid_paths.push_back(""); // empty path 100 invalid_paths.push_back(""); // empty path
71 // The following are directory traversal checks 101 // The following are directory traversal checks
(...skipping 29 matching lines...) Expand all
101 instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); 131 instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY);
102 132
103 pp::FileRef file_ref_pers(file_system_pers, kPersFilePath); 133 pp::FileRef file_ref_pers(file_system_pers, kPersFilePath);
104 if (file_ref_pers.GetFileSystemType() != PP_FILESYSTEMTYPE_LOCALPERSISTENT) 134 if (file_ref_pers.GetFileSystemType() != PP_FILESYSTEMTYPE_LOCALPERSISTENT)
105 return "file_ref_pers expected to be persistent."; 135 return "file_ref_pers expected to be persistent.";
106 136
107 pp::FileRef file_ref_temp(file_system_temp, kTempFilePath); 137 pp::FileRef file_ref_temp(file_system_temp, kTempFilePath);
108 if (file_ref_temp.GetFileSystemType() != PP_FILESYSTEMTYPE_LOCALTEMPORARY) 138 if (file_ref_temp.GetFileSystemType() != PP_FILESYSTEMTYPE_LOCALTEMPORARY)
109 return "file_ref_temp expected to be temporary."; 139 return "file_ref_temp expected to be temporary.";
110 140
111 pp::URLRequestInfo request(instance_); 141 pp::FileRef file_ref_ext;
112 request.SetURL("test_url_loader_data/hello.txt"); 142 std::string result = MakeExternalFileRef(&file_ref_ext);
113 request.SetStreamToFile(true); 143 if (!result.empty())
114 144 return result;
115 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
116
117 pp::URLLoader loader(instance_);
118 int32_t rv = loader.Open(request, callback.GetCallback());
119 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
120 return ReportError("URLLoader::Open force_async", rv);
121 if (rv == PP_OK_COMPLETIONPENDING)
122 rv = callback.WaitForResult();
123 if (rv != PP_OK)
124 return "URLLoader::Open() failed.";
125
126 pp::URLResponseInfo response_info(loader.GetResponseInfo());
127 if (response_info.is_null())
128 return "URLLoader::GetResponseInfo returned null";
129 int32_t status_code = response_info.GetStatusCode();
130 if (status_code != 200)
131 return "Unexpected HTTP status code";
132
133 pp::FileRef file_ref_ext(response_info.GetBodyAsFileRef());
134 if (file_ref_ext.GetFileSystemType() != PP_FILESYSTEMTYPE_EXTERNAL)
135 return "file_ref_ext expected to be external.";
136
137 PASS(); 145 PASS();
138 } 146 }
139 147
140 std::string TestFileRef::TestGetName() { 148 std::string TestFileRef::TestGetName() {
141 pp::FileSystem file_system_pers( 149 pp::FileSystem file_system_pers(
142 instance_, PP_FILESYSTEMTYPE_LOCALPERSISTENT); 150 instance_, PP_FILESYSTEMTYPE_LOCALPERSISTENT);
143 pp::FileSystem file_system_temp( 151 pp::FileSystem file_system_temp(
144 instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); 152 instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY);
145 153
146 pp::FileRef file_ref_pers(file_system_pers, kPersFilePath); 154 pp::FileRef file_ref_pers(file_system_pers, kPersFilePath);
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 rv = callback.WaitForResult(); 683 rv = callback.WaitForResult();
676 if (rv != PP_ERROR_ABORTED) 684 if (rv != PP_ERROR_ABORTED)
677 return "FileSystem::Rename not aborted."; 685 return "FileSystem::Rename not aborted.";
678 } else if (rv != PP_OK) { 686 } else if (rv != PP_OK) {
679 return ReportError("FileSystem::Rename", rv); 687 return ReportError("FileSystem::Rename", rv);
680 } 688 }
681 689
682 PASS(); 690 PASS();
683 } 691 }
684 692
693 std::string TestFileRef::TestQuery() {
694 TestCompletionCallback callback(instance_->pp_instance(), callback_type());
695
696 pp::FileSystem file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY);
697 callback.WaitForResult(file_system.Open(1024, callback.GetCallback()));
698 CHECK_CALLBACK_BEHAVIOR(callback);
699 ASSERT_EQ(PP_OK, callback.result());
700
701 pp::FileRef file_ref(file_system, "/file");
702 pp::FileIO file_io(instance_);
703 callback.WaitForResult(file_io.Open(file_ref, PP_FILEOPENFLAG_CREATE,
704 callback.GetCallback()));
705 CHECK_CALLBACK_BEHAVIOR(callback);
706 ASSERT_EQ(PP_OK, callback.result());
707
708 // We touch the file so we can easily check access and modified time.
709 callback.WaitForResult(file_io.Touch(0, 0, callback.GetCallback()));
710 CHECK_CALLBACK_BEHAVIOR(callback);
711 ASSERT_EQ(PP_OK, callback.result());
712
713 TestCompletionCallbackWithOutput<PP_FileInfo> out_callback(
714 instance_->pp_instance(), callback_type());
715 out_callback.WaitForResult(file_ref.Query(
716 out_callback.GetCallbackWithOutput()));
717 CHECK_CALLBACK_BEHAVIOR(out_callback);
718 ASSERT_EQ(PP_OK, out_callback.result());
719
720 PP_FileInfo info = out_callback.output();
721 ASSERT_EQ(0, info.size);
722 ASSERT_EQ(PP_FILETYPE_REGULAR, info.type);
723 ASSERT_EQ(PP_FILESYSTEMTYPE_LOCALTEMPORARY, info.system_type);
724 ASSERT_DOUBLE_EQ(0.0, info.last_access_time);
725 ASSERT_DOUBLE_EQ(0.0, info.last_modified_time);
726
727 // Query a file ref on an external filesystem.
728 pp::FileRef file_ref_ext;
729 std::string result = MakeExternalFileRef(&file_ref_ext);
730 if (!result.empty())
731 return result;
732 out_callback.WaitForResult(file_ref_ext.Query(
733 out_callback.GetCallbackWithOutput()));
734 CHECK_CALLBACK_BEHAVIOR(out_callback);
735 if (out_callback.result() != PP_OK)
736 return ReportError("Query() result", out_callback.result());
737 ASSERT_EQ(PP_OK, out_callback.result());
738
739 info = out_callback.output();
740 ASSERT_EQ(PP_FILETYPE_REGULAR, info.type);
741 ASSERT_EQ(PP_FILESYSTEMTYPE_EXTERNAL, info.system_type);
742
743 // We can't touch the file, so just sanity check the times.
744 ASSERT_TRUE(info.creation_time >= 0.0);
745 ASSERT_TRUE(info.last_modified_time >= 0.0);
746 ASSERT_TRUE(info.last_access_time >= 0.0);
747
748 // Query a file ref for a file that doesn't exist.
749 pp::FileRef missing_file_ref(file_system, "/missing_file");
750 out_callback.WaitForResult(missing_file_ref.Query(
751 out_callback.GetCallbackWithOutput()));
752 CHECK_CALLBACK_BEHAVIOR(out_callback);
753 ASSERT_EQ(PP_ERROR_FILENOTFOUND, out_callback.result());
754
755 PASS();
756 }
757
685 #ifndef PPAPI_OS_NACL 758 #ifndef PPAPI_OS_NACL
686 std::string TestFileRef::TestFileNameEscaping() { 759 std::string TestFileRef::TestFileNameEscaping() {
687 TestCompletionCallback callback(instance_->pp_instance(), force_async_); 760 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
688 pp::FileSystem file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY); 761 pp::FileSystem file_system(instance_, PP_FILESYSTEMTYPE_LOCALTEMPORARY);
689 int32_t rv = file_system.Open(1024, callback.GetCallback()); 762 int32_t rv = file_system.Open(1024, callback.GetCallback());
690 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) 763 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
691 return ReportError("FileSystem::Open force_async", rv); 764 return ReportError("FileSystem::Open force_async", rv);
692 if (rv == PP_OK_COMPLETIONPENDING) 765 if (rv == PP_OK_COMPLETIONPENDING)
693 rv = callback.WaitForResult(); 766 rv = callback.WaitForResult();
694 if (rv != PP_OK) 767 if (rv != PP_OK)
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 return "Entry was not found."; 807 return "Entry was not found.";
735 if (entries.size() != 1) 808 if (entries.size() != 1)
736 return "Directory had too many entries."; 809 return "Directory had too many entries.";
737 if (entries.front().file_ref().GetName().AsString() != kTerribleName) 810 if (entries.front().file_ref().GetName().AsString() != kTerribleName)
738 return "Entry name did not match."; 811 return "Entry name did not match.";
739 } 812 }
740 813
741 PASS(); 814 PASS();
742 } 815 }
743 #endif 816 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698