1 // Copyright 2014 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 #ifndef MOJO_PUBLIC_CPP_BINDINGS_TESTS_VALIDATION_TEST_INPUT_PARSER_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_TESTS_VALIDATION_TEST_INPUT_PARSER_H_ 7 8 #include <stdint.h> 9 10 #include <string> 11 #include <vector> 12 13 namespace mojo { 14 namespace test { 15 16 // Input Format of Mojo Message Validation Tests. 17 // 18 // Data items are separated by whitespaces: 19 // - ' ' (0x20) space; 20 // - '\t' (0x09) horizontal tab; 21 // - '\n' (0x0a) newline; 22 // - '\r' (0x0d) carriage return. 23 // A comment starts with //, extending to the end of the line. 24 // Each data item is of the format [<type>]<value>. The types defined and the 25 // corresponding value formats are described below. 26 // 27 // Type: u1 / u2 / u4 / u8 28 // Description: Little-endian 1/2/4/8-byte unsigned integer. 29 // Value Format: 30 // - Decimal integer: 0|[1-9][0-9]* 31 // - Hexadecimal integer: 0[xX][0-9a-fA-F]+ 32 // - The type prefix (including the square brackets) of 1-byte unsigned 33 // integer is optional. 34 // 35 // Type: s1 / s2 / s4 / s8 36 // Description: Little-endian 1/2/4/8-byte signed integer. 37 // Value Format: 38 // - Decimal integer: [-+]?(0|[1-9][0-9]*) 39 // - Hexadecimal integer: [-+]?0[xX][0-9a-fA-F]+ 40 // 41 // Type: b 42 // Description: Binary sequence of 1 byte. 43 // Value Format: [01]{8} 44 // 45 // Type: f / d 46 // Description: Little-endian IEEE-754 format of float (4 bytes) and double (8 47 // bytes). 48 // Value Format: [-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)? 49 // 50 // Type: dist4 / dist8 51 // Description: Little-endian 4/8-byte unsigned integer. The actual value is set 52 // to the byte distance from the location of this integer to the location of the 53 // anchr item with the same ID. A dist8 and anchr pair can be used to easily 54 // represent an encoded pointer. A dist4 and anchr pair can be used to easily 55 // calculate struct/array size. 56 // Value Format: The value is an ID: [0-9a-zA-Z_]+ 57 // 58 // Type: anchr 59 // Description: Mark an anchor location. It doesn’t translate into any actual 60 // data. 61 // Value Format: The value is an ID of the same format as that of dist4/8. 62 // 63 // Type: handles 64 // Description: The number of handles that are associated with the message. This 65 // special item is not part of the message data. If specified, it should be the 66 // first item. 67 // Value Format: The same format as u1/2/4/8. 68 // 69 // EXAMPLE: 70 // 71 // Suppose you have the following Mojo types defined: 72 // struct Bar { 73 // int32 a; 74 // bool b; 75 // bool c; 76 // }; 77 // struct Foo { 78 // Bar x; 79 // uint32 y; 80 // }; 81 // 82 // The following describes a valid message whose payload is a Foo struct: 83 // // message header 84 // [dist4]message_header // num_bytes 85 // [u4]3 // num_fields 86 // [u4]0 // type 87 // [u4]1 // flags 88 // [u8]1234 // request_id 89 // [anchr]message_header 90 // 91 // // payload 92 // [dist4]foo // num_bytes 93 // [u4]2 // num_fields 94 // [dist8]bar_ptr // x 95 // [u4]0xABCD // y 96 // [u4]0 // padding 97 // [anchr]foo 98 // 99 // [anchr]bar_ptr 100 // [dist4]bar // num_bytes 101 // [u4]3 // num_fields 102 // [s4]-1 // a 103 // [b]00000010 // b and c 104 // 0 0 0 // padding 105 // [anchr]bar 106 107 // Parses validation test input. 108 // On success, |data| and |num_handles| store the parsing result, 109 // |error_message| is cleared; on failure, |error_message| is set to a message 110 // describing the error, |data| is cleared and |num_handles| set to 0. 111 // Note: For now, this method only works on little-endian platforms. 112 bool ParseValidationTestInput(const std::string& input, 113 std::vector<uint8_t>* data, 114 size_t* num_handles, 115 std::string* error_message); 116 117 } // namespace test 118 } // namespace mojo 119 120 #endif // MOJO_PUBLIC_CPP_BINDINGS_TESTS_VALIDATION_TEST_INPUT_PARSER_H_ 121