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