146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file. 446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_ 646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_ 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "mojo/public/cpp/system/macros.h" 946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace mojo { 1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace internal { 1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)enum ValidationError { 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // There is no validation error. 1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) VALIDATION_ERROR_NONE, 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // An object (struct or array) is not 8-byte aligned. 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) VALIDATION_ERROR_MISALIGNED_OBJECT, 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // An object is not contained inside the message data, or it overlaps other 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // objects. 2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE, 2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // A struct header doesn't make sense, for example: 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // - |num_bytes| is smaller than the size of the oldest version that we 2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // support. 2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // - |num_fields| is smaller than the field number of the oldest version that 2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // we support. 2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // - |num_bytes| and |num_fields| don't match. 2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER, 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // An array header doesn't make sense, for example: 2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // - |num_bytes| is smaller than the size of the header plus the size required 3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // to store |num_elements| elements. 3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER, 3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // An encoded handle is illegal. 3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) VALIDATION_ERROR_ILLEGAL_HANDLE, 3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // An encoded pointer is illegal. 3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) VALIDATION_ERROR_ILLEGAL_POINTER, 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |flags| in the message header is an invalid flag combination. 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAG_COMBINATION, 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // |flags| in the message header indicates that a request ID is required but 3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // there isn't one. 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID, 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char* ValidationErrorToString(ValidationError error); 4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void ReportValidationError(ValidationError error); 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Only used by validation tests and when there is only one thread doing message 4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// validation. 4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class ValidationErrorObserverForTesting { 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ValidationErrorObserverForTesting(); 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ~ValidationErrorObserverForTesting(); 5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ValidationError last_error() const { return last_error_; } 5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) void set_last_error(ValidationError error) { last_error_ = error; } 5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ValidationError last_error_; 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) MOJO_DISALLOW_COPY_AND_ASSIGN(ValidationErrorObserverForTesting); 6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}; 6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace internal 6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} // namespace mojo 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // MOJO_PUBLIC_CPP_BINDINGS_LIB_VALIDATION_ERRORS_H_ 67