| 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 "ppapi/tests/test_file_io.h" | 5 #include "ppapi/tests/test_file_io.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <stdio.h> | 9 #include <stdio.h> |
| 10 #include <string.h> | 10 #include <string.h> |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 143 } | 143 } |
| 144 | 144 |
| 145 int32_t WriteEntireBuffer(PP_Instance instance, | 145 int32_t WriteEntireBuffer(PP_Instance instance, |
| 146 pp::FileIO* file_io, | 146 pp::FileIO* file_io, |
| 147 int32_t offset, | 147 int32_t offset, |
| 148 const std::string& data, | 148 const std::string& data, |
| 149 CallbackType callback_type) { | 149 CallbackType callback_type) { |
| 150 TestCompletionCallback callback(instance, callback_type); | 150 TestCompletionCallback callback(instance, callback_type); |
| 151 int32_t write_offset = offset; | 151 int32_t write_offset = offset; |
| 152 const char* buf = data.c_str(); | 152 const char* buf = data.c_str(); |
| 153 int32_t size = data.size(); | 153 int32_t size = static_cast<int32_t>(data.size()); |
| 154 | 154 |
| 155 while (write_offset < offset + size) { | 155 while (write_offset < offset + size) { |
| 156 callback.WaitForResult(file_io->Write(write_offset, | 156 callback.WaitForResult(file_io->Write(write_offset, |
| 157 &buf[write_offset - offset], | 157 &buf[write_offset - offset], |
| 158 size - write_offset + offset, | 158 size - write_offset + offset, |
| 159 callback.GetCallback())); | 159 callback.GetCallback())); |
| 160 if (callback.result() < 0) | 160 if (callback.result() < 0) |
| 161 return callback.result(); | 161 return callback.result(); |
| 162 if (callback.result() == 0) | 162 if (callback.result() == 0) |
| 163 return PP_ERROR_FAILED; | 163 return PP_ERROR_FAILED; |
| (...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 CHECK_CALLBACK_BEHAVIOR(callback); | 774 CHECK_CALLBACK_BEHAVIOR(callback); |
| 775 ASSERT_EQ(PP_OK, callback.result()); | 775 ASSERT_EQ(PP_OK, callback.result()); |
| 776 | 776 |
| 777 // Set up testing contents. | 777 // Set up testing contents. |
| 778 int32_t rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, | 778 int32_t rv = WriteEntireBuffer(instance_->pp_instance(), &file_io, 0, |
| 779 "abcdefghijkl", callback_type()); | 779 "abcdefghijkl", callback_type()); |
| 780 ASSERT_EQ(PP_OK, rv); | 780 ASSERT_EQ(PP_OK, rv); |
| 781 | 781 |
| 782 // Parallel read operations. | 782 // Parallel read operations. |
| 783 const char* border = "__border__"; | 783 const char* border = "__border__"; |
| 784 const int32_t border_size = strlen(border); | 784 const int32_t border_size = static_cast<int32_t>(strlen(border)); |
| 785 | 785 |
| 786 TestCompletionCallback callback_1(instance_->pp_instance(), callback_type()); | 786 TestCompletionCallback callback_1(instance_->pp_instance(), callback_type()); |
| 787 int32_t read_offset_1 = 0; | 787 int32_t read_offset_1 = 0; |
| 788 int32_t size_1 = 3; | 788 int32_t size_1 = 3; |
| 789 std::vector<char> extended_buf_1(border_size * 2 + size_1); | 789 std::vector<char> extended_buf_1(border_size * 2 + size_1); |
| 790 char* buf_1 = &extended_buf_1[border_size]; | 790 char* buf_1 = &extended_buf_1[border_size]; |
| 791 memcpy(&extended_buf_1[0], border, border_size); | 791 memcpy(&extended_buf_1[0], border, border_size); |
| 792 memcpy(buf_1 + size_1, border, border_size); | 792 memcpy(buf_1 + size_1, border, border_size); |
| 793 | 793 |
| 794 TestCompletionCallback callback_2(instance_->pp_instance(), callback_type()); | 794 TestCompletionCallback callback_2(instance_->pp_instance(), callback_type()); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 858 PP_FILEOPENFLAG_READ | | 858 PP_FILEOPENFLAG_READ | |
| 859 PP_FILEOPENFLAG_WRITE, | 859 PP_FILEOPENFLAG_WRITE, |
| 860 callback.GetCallback())); | 860 callback.GetCallback())); |
| 861 CHECK_CALLBACK_BEHAVIOR(callback); | 861 CHECK_CALLBACK_BEHAVIOR(callback); |
| 862 ASSERT_EQ(PP_OK, callback.result()); | 862 ASSERT_EQ(PP_OK, callback.result()); |
| 863 | 863 |
| 864 // Parallel write operations. | 864 // Parallel write operations. |
| 865 TestCompletionCallback callback_1(instance_->pp_instance(), callback_type()); | 865 TestCompletionCallback callback_1(instance_->pp_instance(), callback_type()); |
| 866 int32_t write_offset_1 = 0; | 866 int32_t write_offset_1 = 0; |
| 867 const char* buf_1 = "abc"; | 867 const char* buf_1 = "abc"; |
| 868 int32_t size_1 = strlen(buf_1); | 868 int32_t size_1 = static_cast<int32_t>(strlen(buf_1)); |
| 869 | 869 |
| 870 TestCompletionCallback callback_2(instance_->pp_instance(), callback_type()); | 870 TestCompletionCallback callback_2(instance_->pp_instance(), callback_type()); |
| 871 int32_t write_offset_2 = size_1; | 871 int32_t write_offset_2 = size_1; |
| 872 const char* buf_2 = "defghijkl"; | 872 const char* buf_2 = "defghijkl"; |
| 873 int32_t size_2 = strlen(buf_2); | 873 int32_t size_2 = static_cast<int32_t>(strlen(buf_2)); |
| 874 | 874 |
| 875 int32_t rv_1 = PP_OK; | 875 int32_t rv_1 = PP_OK; |
| 876 int32_t rv_2 = PP_OK; | 876 int32_t rv_2 = PP_OK; |
| 877 while (size_1 >= 0 && size_2 >= 0 && size_1 + size_2 > 0) { | 877 while (size_1 >= 0 && size_2 >= 0 && size_1 + size_2 > 0) { |
| 878 if (size_1 > 0) { | 878 if (size_1 > 0) { |
| 879 // Copy the buffer so we can erase it below. | 879 // Copy the buffer so we can erase it below. |
| 880 std::string str_1(buf_1); | 880 std::string str_1(buf_1); |
| 881 rv_1 = file_io.Write( | 881 rv_1 = file_io.Write( |
| 882 write_offset_1, &str_1[0], str_1.size(), callback_1.GetCallback()); | 882 write_offset_1, &str_1[0], static_cast<int32_t>(str_1.size()), |
| 883 callback_1.GetCallback()); |
| 883 // Erase the buffer to test that async writes copy it. | 884 // Erase the buffer to test that async writes copy it. |
| 884 std::fill(str_1.begin(), str_1.end(), 0); | 885 std::fill(str_1.begin(), str_1.end(), 0); |
| 885 } | 886 } |
| 886 if (size_2 > 0) { | 887 if (size_2 > 0) { |
| 887 // Copy the buffer so we can erase it below. | 888 // Copy the buffer so we can erase it below. |
| 888 std::string str_2(buf_2); | 889 std::string str_2(buf_2); |
| 889 rv_2 = file_io.Write( | 890 rv_2 = file_io.Write( |
| 890 write_offset_2, &str_2[0], str_2.size(), callback_2.GetCallback()); | 891 write_offset_2, &str_2[0], static_cast<int32_t>(str_2.size()), |
| 892 callback_2.GetCallback()); |
| 891 // Erase the buffer to test that async writes copy it. | 893 // Erase the buffer to test that async writes copy it. |
| 892 std::fill(str_2.begin(), str_2.end(), 0); | 894 std::fill(str_2.begin(), str_2.end(), 0); |
| 893 } | 895 } |
| 894 | 896 |
| 895 if (size_1 > 0) { | 897 if (size_1 > 0) { |
| 896 callback_1.WaitForResult(rv_1); | 898 callback_1.WaitForResult(rv_1); |
| 897 CHECK_CALLBACK_BEHAVIOR(callback_1); | 899 CHECK_CALLBACK_BEHAVIOR(callback_1); |
| 898 ASSERT_TRUE(callback_1.result() > 0); | 900 ASSERT_TRUE(callback_1.result() > 0); |
| 899 write_offset_1 += callback_1.result(); | 901 write_offset_1 += callback_1.result(); |
| 900 buf_1 += callback_1.result(); | 902 buf_1 += callback_1.result(); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 944 PP_FILEOPENFLAG_TRUNCATE | | 946 PP_FILEOPENFLAG_TRUNCATE | |
| 945 PP_FILEOPENFLAG_READ | | 947 PP_FILEOPENFLAG_READ | |
| 946 PP_FILEOPENFLAG_WRITE, | 948 PP_FILEOPENFLAG_WRITE, |
| 947 callback.GetCallback())); | 949 callback.GetCallback())); |
| 948 CHECK_CALLBACK_BEHAVIOR(callback); | 950 CHECK_CALLBACK_BEHAVIOR(callback); |
| 949 ASSERT_EQ(PP_OK, callback.result()); | 951 ASSERT_EQ(PP_OK, callback.result()); |
| 950 | 952 |
| 951 TestCompletionCallback callback_1(instance_->pp_instance(), PP_REQUIRED); | 953 TestCompletionCallback callback_1(instance_->pp_instance(), PP_REQUIRED); |
| 952 int32_t write_offset_1 = 0; | 954 int32_t write_offset_1 = 0; |
| 953 const char* buf_1 = "mnopqrstuvw"; | 955 const char* buf_1 = "mnopqrstuvw"; |
| 954 int32_t rv_1 = file_io.Write(write_offset_1, buf_1, strlen(buf_1), | 956 int32_t rv_1 = file_io.Write(write_offset_1, buf_1, |
| 957 static_cast<int32_t>(strlen(buf_1)), |
| 955 callback_1.GetCallback()); | 958 callback_1.GetCallback()); |
| 956 ASSERT_EQ(PP_OK_COMPLETIONPENDING, rv_1); | 959 ASSERT_EQ(PP_OK_COMPLETIONPENDING, rv_1); |
| 957 | 960 |
| 958 TestCompletionCallback callback_2(instance_->pp_instance(), callback_type()); | 961 TestCompletionCallback callback_2(instance_->pp_instance(), callback_type()); |
| 959 int32_t read_offset_2 = 4; | 962 int32_t read_offset_2 = 4; |
| 960 char buf_2[3]; | 963 char buf_2[3]; |
| 961 callback_2.WaitForResult(file_io.Read(read_offset_2, buf_2, sizeof(buf_2), | 964 callback_2.WaitForResult(file_io.Read(read_offset_2, buf_2, sizeof(buf_2), |
| 962 callback_2.GetCallback())); | 965 callback_2.GetCallback())); |
| 963 CHECK_CALLBACK_BEHAVIOR(callback_2); | 966 CHECK_CALLBACK_BEHAVIOR(callback_2); |
| 964 ASSERT_EQ(PP_ERROR_INPROGRESS, callback_2.result()); | 967 ASSERT_EQ(PP_ERROR_INPROGRESS, callback_2.result()); |
| 965 callback_1.WaitForResult(rv_1); | 968 callback_1.WaitForResult(rv_1); |
| 966 CHECK_CALLBACK_BEHAVIOR(callback_1); | 969 CHECK_CALLBACK_BEHAVIOR(callback_1); |
| 967 | 970 |
| 968 // Cannot query while a write is pending. | 971 // Cannot query while a write is pending. |
| 969 rv_1 = file_io.Write(write_offset_1, buf_1, strlen(buf_1), | 972 rv_1 = file_io.Write(write_offset_1, buf_1, |
| 973 static_cast<int32_t>(strlen(buf_1)), |
| 970 callback_1.GetCallback()); | 974 callback_1.GetCallback()); |
| 971 ASSERT_EQ(PP_OK_COMPLETIONPENDING, rv_1); | 975 ASSERT_EQ(PP_OK_COMPLETIONPENDING, rv_1); |
| 972 PP_FileInfo info; | 976 PP_FileInfo info; |
| 973 callback_2.WaitForResult(file_io.Query(&info, callback_2.GetCallback())); | 977 callback_2.WaitForResult(file_io.Query(&info, callback_2.GetCallback())); |
| 974 CHECK_CALLBACK_BEHAVIOR(callback_2); | 978 CHECK_CALLBACK_BEHAVIOR(callback_2); |
| 975 ASSERT_EQ(PP_ERROR_INPROGRESS, callback_2.result()); | 979 ASSERT_EQ(PP_ERROR_INPROGRESS, callback_2.result()); |
| 976 callback_1.WaitForResult(rv_1); | 980 callback_1.WaitForResult(rv_1); |
| 977 CHECK_CALLBACK_BEHAVIOR(callback_1); | 981 CHECK_CALLBACK_BEHAVIOR(callback_1); |
| 978 | 982 |
| 979 // Cannot touch while a write is pending. | 983 // Cannot touch while a write is pending. |
| 980 rv_1 = file_io.Write(write_offset_1, buf_1, strlen(buf_1), | 984 rv_1 = file_io.Write(write_offset_1, buf_1, |
| 985 static_cast<int32_t>(strlen(buf_1)), |
| 981 callback_1.GetCallback()); | 986 callback_1.GetCallback()); |
| 982 ASSERT_EQ(PP_OK_COMPLETIONPENDING, rv_1); | 987 ASSERT_EQ(PP_OK_COMPLETIONPENDING, rv_1); |
| 983 callback_2.WaitForResult(file_io.Touch(1234.0, 5678.0, | 988 callback_2.WaitForResult(file_io.Touch(1234.0, 5678.0, |
| 984 callback_2.GetCallback())); | 989 callback_2.GetCallback())); |
| 985 CHECK_CALLBACK_BEHAVIOR(callback_2); | 990 CHECK_CALLBACK_BEHAVIOR(callback_2); |
| 986 ASSERT_EQ(PP_ERROR_INPROGRESS, callback_2.result()); | 991 ASSERT_EQ(PP_ERROR_INPROGRESS, callback_2.result()); |
| 987 callback_1.WaitForResult(rv_1); | 992 callback_1.WaitForResult(rv_1); |
| 988 CHECK_CALLBACK_BEHAVIOR(callback_1); | 993 CHECK_CALLBACK_BEHAVIOR(callback_1); |
| 989 | 994 |
| 990 // Cannot set length while a write is pending. | 995 // Cannot set length while a write is pending. |
| 991 rv_1 = file_io.Write(write_offset_1, buf_1, strlen(buf_1), | 996 rv_1 = file_io.Write(write_offset_1, buf_1, |
| 997 static_cast<int32_t>(strlen(buf_1)), |
| 992 callback_1.GetCallback()); | 998 callback_1.GetCallback()); |
| 993 ASSERT_EQ(PP_OK_COMPLETIONPENDING, rv_1); | 999 ASSERT_EQ(PP_OK_COMPLETIONPENDING, rv_1); |
| 994 callback_2.WaitForResult(file_io.SetLength(123, callback_2.GetCallback())); | 1000 callback_2.WaitForResult(file_io.SetLength(123, callback_2.GetCallback())); |
| 995 CHECK_CALLBACK_BEHAVIOR(callback_2); | 1001 CHECK_CALLBACK_BEHAVIOR(callback_2); |
| 996 ASSERT_EQ(PP_ERROR_INPROGRESS, callback_2.result()); | 1002 ASSERT_EQ(PP_ERROR_INPROGRESS, callback_2.result()); |
| 997 callback_1.WaitForResult(rv_1); | 1003 callback_1.WaitForResult(rv_1); |
| 998 CHECK_CALLBACK_BEHAVIOR(callback_1); | 1004 CHECK_CALLBACK_BEHAVIOR(callback_1); |
| 999 | 1005 |
| 1000 PASS(); | 1006 PASS(); |
| 1001 } | 1007 } |
| (...skipping 29 matching lines...) Expand all Loading... |
| 1031 int fd = _open_osfhandle(reinterpret_cast<intptr_t>(handle), | 1037 int fd = _open_osfhandle(reinterpret_cast<intptr_t>(handle), |
| 1032 _O_RDWR | _O_BINARY); | 1038 _O_RDWR | _O_BINARY); |
| 1033 #else | 1039 #else |
| 1034 int fd = handle; | 1040 int fd = handle; |
| 1035 #endif | 1041 #endif |
| 1036 if (fd < 0) | 1042 if (fd < 0) |
| 1037 return "FileIO::RequestOSFileHandle() returned a bad file descriptor."; | 1043 return "FileIO::RequestOSFileHandle() returned a bad file descriptor."; |
| 1038 | 1044 |
| 1039 // Check write(2) for the native FD. | 1045 // Check write(2) for the native FD. |
| 1040 const std::string msg = "foobar"; | 1046 const std::string msg = "foobar"; |
| 1041 ssize_t cnt = write(fd, msg.data(), msg.size()); | 1047 ssize_t cnt = write(fd, msg.data(), static_cast<unsigned>(msg.size())); |
| 1042 if (cnt < 0) | 1048 if (cnt < 0) |
| 1043 return ReportError("write for native FD returned error", errno); | 1049 return ReportError("write for native FD returned error", errno); |
| 1044 if (cnt != static_cast<ssize_t>(msg.size())) | 1050 if (cnt != static_cast<ssize_t>(msg.size())) |
| 1045 return ReportError("write for native FD count mismatch", cnt); | 1051 return ReportError("write for native FD count mismatch", cnt); |
| 1046 | 1052 |
| 1047 // Check lseek(2) for the native FD. | 1053 // Check lseek(2) for the native FD. |
| 1048 off_t off = lseek(fd, 0, SEEK_CUR); | 1054 off_t off = lseek(fd, 0, SEEK_CUR); |
| 1049 if (off == static_cast<off_t>(-1)) | 1055 if (off == static_cast<off_t>(-1)) |
| 1050 return ReportError("lseek for native FD returned error", errno); | 1056 return ReportError("lseek for native FD returned error", errno); |
| 1051 if (off != static_cast<off_t>(msg.size())) | 1057 if (off != static_cast<off_t>(msg.size())) |
| 1052 return ReportError("lseek for native FD offset mismatch", off); | 1058 return ReportError("lseek for native FD offset mismatch", off); |
| 1053 | 1059 |
| 1054 off = lseek(fd, 0, SEEK_SET); | 1060 off = lseek(fd, 0, SEEK_SET); |
| 1055 if (off == static_cast<off_t>(-1)) | 1061 if (off == static_cast<off_t>(-1)) |
| 1056 return ReportError("lseek for native FD returned error", errno); | 1062 return ReportError("lseek for native FD returned error", errno); |
| 1057 if (off != 0) | 1063 if (off != 0) |
| 1058 return ReportError("lseek for native FD offset mismatch", off); | 1064 return ReportError("lseek for native FD offset mismatch", off); |
| 1059 | 1065 |
| 1060 // Check read(2) for the native FD. | 1066 // Check read(2) for the native FD. |
| 1061 std::string buf(msg.size(), '\0'); | 1067 std::string buf(msg.size(), '\0'); |
| 1062 cnt = read(fd, &buf[0], msg.size()); | 1068 cnt = read(fd, &buf[0], static_cast<unsigned>(msg.size())); |
| 1063 if (cnt < 0) | 1069 if (cnt < 0) |
| 1064 return ReportError("read for native FD returned error", errno); | 1070 return ReportError("read for native FD returned error", errno); |
| 1065 if (cnt != static_cast<ssize_t>(msg.size())) | 1071 if (cnt != static_cast<ssize_t>(msg.size())) |
| 1066 return ReportError("read for native FD count mismatch", cnt); | 1072 return ReportError("read for native FD count mismatch", cnt); |
| 1067 if (msg != buf) | 1073 if (msg != buf) |
| 1068 return ReportMismatch("read for native FD", buf, msg); | 1074 return ReportMismatch("read for native FD", buf, msg); |
| 1069 PASS(); | 1075 PASS(); |
| 1070 } | 1076 } |
| 1071 | 1077 |
| 1072 // Calling RequestOSFileHandle with the FileIO that is opened with | 1078 // Calling RequestOSFileHandle with the FileIO that is opened with |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1267 // END mmap(2) test with a file handle opened in READONLY mode. | 1273 // END mmap(2) test with a file handle opened in READONLY mode. |
| 1268 | 1274 |
| 1269 if (close(fd) < 0) | 1275 if (close(fd) < 0) |
| 1270 return ReportError("close for native FD returned error", errno); | 1276 return ReportError("close for native FD returned error", errno); |
| 1271 #endif // !defined(PPAPI_OS_WIN) | 1277 #endif // !defined(PPAPI_OS_WIN) |
| 1272 | 1278 |
| 1273 PASS(); | 1279 PASS(); |
| 1274 } | 1280 } |
| 1275 | 1281 |
| 1276 std::string TestFileIO::MatchOpenExpectations(pp::FileSystem* file_system, | 1282 std::string TestFileIO::MatchOpenExpectations(pp::FileSystem* file_system, |
| 1277 size_t open_flags, | 1283 int32_t open_flags, |
| 1278 size_t expectations) { | 1284 int32_t expectations) { |
| 1279 std::string bad_argument = | 1285 std::string bad_argument = |
| 1280 "TestFileIO::MatchOpenExpectations has invalid input arguments."; | 1286 "TestFileIO::MatchOpenExpectations has invalid input arguments."; |
| 1281 bool invalid_combination = !!(expectations & INVALID_FLAG_COMBINATION); | 1287 bool invalid_combination = !!(expectations & INVALID_FLAG_COMBINATION); |
| 1282 if (invalid_combination) { | 1288 if (invalid_combination) { |
| 1283 if (expectations != INVALID_FLAG_COMBINATION) | 1289 if (expectations != INVALID_FLAG_COMBINATION) |
| 1284 return bad_argument; | 1290 return bad_argument; |
| 1285 } else { | 1291 } else { |
| 1286 // Validate that one and only one of <some_expectation> and | 1292 // Validate that one and only one of <some_expectation> and |
| 1287 // DONT_<some_expectation> is specified. | 1293 // DONT_<some_expectation> is specified. |
| 1288 for (size_t remains = expectations, end = END_OF_OPEN_EXPECATION_PAIRS; | 1294 for (size_t remains = expectations, end = END_OF_OPEN_EXPECATION_PAIRS; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1352 if ((invalid_combination && callback.result() == PP_OK) || | 1358 if ((invalid_combination && callback.result() == PP_OK) || |
| 1353 (!invalid_combination && | 1359 (!invalid_combination && |
| 1354 ((callback.result() == PP_OK) != create_if_doesnt_exist))) { | 1360 ((callback.result() == PP_OK) != create_if_doesnt_exist))) { |
| 1355 return ReportOpenError(open_flags); | 1361 return ReportOpenError(open_flags); |
| 1356 } | 1362 } |
| 1357 | 1363 |
| 1358 return std::string(); | 1364 return std::string(); |
| 1359 } | 1365 } |
| 1360 | 1366 |
| 1361 // TODO(viettrungluu): Test Close(). crbug.com/69457 | 1367 // TODO(viettrungluu): Test Close(). crbug.com/69457 |
| OLD | NEW |