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

Unified Diff: mojo/public/cpp/bindings/tests/validation_test_input_parser.cc

Issue 327323003: Support [handles] in validation test input format and add handle-related tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: mojo/public/cpp/bindings/tests/validation_test_input_parser.cc
diff --git a/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc b/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc
index 382c4847a0709a8a2f93393020317e52ff5a134b..49544ee61215b6ec0278d7eb7e3eff3afaa2b65b 100644
--- a/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc
+++ b/mojo/public/cpp/bindings/tests/validation_test_input_parser.cc
@@ -21,7 +21,8 @@ namespace {
class ValidationTestInputParser {
public:
ValidationTestInputParser(const std::string& input,
- std::vector<uint8_t>* parsed_input,
+ std::vector<uint8_t>* data,
+ size_t* num_handles,
std::string* error_message);
~ValidationTestInputParser();
@@ -44,7 +45,7 @@ class ValidationTestInputParser {
// A dist4/8 item that hasn't been matched with an anchr item.
struct PendingDistanceItem {
- // Where this data item is located in |parsed_input_|.
+ // Where this data item is located in |data_|.
size_t pos;
// Either 4 or 8 (bytes).
size_t data_size;
@@ -64,14 +65,18 @@ class ValidationTestInputParser {
const std::string& value_string);
bool ParseDistance(const DataType& type, const std::string& value_string);
bool ParseAnchor(const DataType& type, const std::string& value_string);
+ bool ParseHandles(const DataType& type, const std::string& value_string);
bool StartsWith(const Range& range, const char* prefix, size_t prefix_length);
+ bool ConvertToUnsignedInteger(const std::string& value_string,
+ unsigned long long int* value);
+
template <typename T>
void AppendData(T data) {
- size_t pos = parsed_input_->size();
- parsed_input_->resize(pos + sizeof(T));
- memcpy(&(*parsed_input_)[pos], &data, sizeof(T));
+ size_t pos = data_->size();
+ data_->resize(pos + sizeof(T));
+ memcpy(&(*data_)[pos], &data, sizeof(T));
}
template <typename TargetType, typename InputType>
@@ -91,8 +96,8 @@ class ValidationTestInputParser {
return false;
}
TargetType target_value = static_cast<TargetType>(value);
- assert(pos + sizeof(TargetType) <= parsed_input_->size());
- memcpy(&(*parsed_input_)[pos], &target_value, sizeof(TargetType));
+ assert(pos + sizeof(TargetType) <= data_->size());
+ memcpy(&(*data_)[pos], &target_value, sizeof(TargetType));
return true;
}
@@ -102,7 +107,8 @@ class ValidationTestInputParser {
const std::string& input_;
size_t input_cursor_;
- std::vector<uint8_t>* parsed_input_;
+ std::vector<uint8_t>* data_;
+ size_t* num_handles_;
std::string* error_message_;
std::map<std::string, PendingDistanceItem> pending_distance_items_;
@@ -126,7 +132,8 @@ const ValidationTestInputParser::DataType
DATA_TYPE("[d]", 8, &ValidationTestInputParser::ParseDouble),
DATA_TYPE("[dist4]", 4, &ValidationTestInputParser::ParseDistance),
DATA_TYPE("[dist8]", 8, &ValidationTestInputParser::ParseDistance),
- DATA_TYPE("[anchr]", 0, &ValidationTestInputParser::ParseAnchor)
+ DATA_TYPE("[anchr]", 0, &ValidationTestInputParser::ParseAnchor),
+ DATA_TYPE("[handles]", 0, &ValidationTestInputParser::ParseHandles)
};
const size_t ValidationTestInputParser::kDataTypeCount =
@@ -135,15 +142,19 @@ const size_t ValidationTestInputParser::kDataTypeCount =
ValidationTestInputParser::ValidationTestInputParser(
const std::string& input,
- std::vector<uint8_t>* parsed_input,
+ std::vector<uint8_t>* data,
+ size_t* num_handles,
std::string* error_message)
: input_(input),
input_cursor_(0),
- parsed_input_(parsed_input),
+ data_(data),
+ num_handles_(num_handles),
error_message_(error_message) {
- assert(parsed_input_);
+ assert(data_);
+ assert(num_handles_);
assert(error_message_);
- parsed_input_->clear();
+ data_->clear();
+ *num_handles_ = 0;
error_message_->clear();
}
@@ -165,10 +176,12 @@ bool ValidationTestInputParser::Run() {
*error_message_ = "Error occurred when matching [dist4/8] and [anchr].";
result = false;
}
- if (!result)
- parsed_input_->clear();
- else
+ if (!result) {
+ data_->clear();
+ *num_handles_ = 0;
+ } else {
assert(error_message_->empty());
+ }
return result;
}
@@ -219,12 +232,7 @@ bool ValidationTestInputParser::ParseItem(const Range& range) {
bool ValidationTestInputParser::ParseUnsignedInteger(
const DataType& type, const std::string& value_string) {
unsigned long long int value;
- const char* format = NULL;
- if (value_string.find_first_of("xX") != std::string::npos)
- format = "%llx";
- else
- format = "%llu";
- if (sscanf(value_string.c_str(), format, &value) != 1)
+ if (!ConvertToUnsignedInteger(value_string, &value))
return false;
switch (type.data_size) {
@@ -312,8 +320,8 @@ bool ValidationTestInputParser::ParseDistance(const DataType& type,
pending_distance_items_.end())
return false;
- PendingDistanceItem item = {parsed_input_->size(), type.data_size};
- parsed_input_->resize(parsed_input_->size() + type.data_size);
+ PendingDistanceItem item = {data_->size(), type.data_size};
+ data_->resize(data_->size() + type.data_size);
pending_distance_items_[value_string] = item;
return true;
@@ -329,7 +337,7 @@ bool ValidationTestInputParser::ParseAnchor(const DataType& type,
PendingDistanceItem dist_item = iter->second;
pending_distance_items_.erase(iter);
- size_t distance = parsed_input_->size() - dist_item.pos;
+ size_t distance = data_->size() - dist_item.pos;
switch (dist_item.data_size) {
case 4:
return ConvertAndFillData<uint32_t>(dist_item.pos, distance);
@@ -341,6 +349,23 @@ bool ValidationTestInputParser::ParseAnchor(const DataType& type,
}
}
+bool ValidationTestInputParser::ParseHandles(const DataType& type,
+ const std::string& value_string) {
+ // It should be the first item.
+ if (!data_->empty())
+ return false;
+
+ unsigned long long int value;
+ if (!ConvertToUnsignedInteger(value_string, &value))
+ return false;
+
+ if (value > std::numeric_limits<size_t>::max())
+ return false;
+
+ *num_handles_ = static_cast<size_t>(value);
+ return true;
+}
+
bool ValidationTestInputParser::StartsWith(const Range& range,
const char* prefix,
size_t prefix_length) {
@@ -350,12 +375,24 @@ bool ValidationTestInputParser::StartsWith(const Range& range,
return memcmp(range.first, prefix, prefix_length) == 0;
}
+bool ValidationTestInputParser::ConvertToUnsignedInteger(
+ const std::string& value_string,
+ unsigned long long int* value) {
+ const char* format = NULL;
+ if (value_string.find_first_of("xX") != std::string::npos)
+ format = "%llx";
+ else
+ format = "%llu";
+ return sscanf(value_string.c_str(), format, value) == 1;
+}
+
} // namespace
bool ParseValidationTestInput(const std::string& input,
- std::vector<uint8_t>* parsed_input,
+ std::vector<uint8_t>* data,
+ size_t* num_handles,
std::string* error_message) {
- ValidationTestInputParser parser(input, parsed_input, error_message);
+ ValidationTestInputParser parser(input, data, num_handles, error_message);
return parser.Run();
}
« no previous file with comments | « mojo/public/cpp/bindings/tests/validation_test_input_parser.h ('k') | mojo/public/cpp/bindings/tests/validation_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698