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)#include "mojo/public/cpp/bindings/lib/validation_errors.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/public/cpp/environment/logging.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace mojo {
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace internal {
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace {
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ValidationErrorObserverForTesting* g_validation_error_observer = NULL;
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SerializationWarningObserverForTesting* g_serialization_warning_observer = NULL;
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char* ValidationErrorToString(ValidationError error) {
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  switch (error) {
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case VALIDATION_ERROR_NONE:
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return "VALIDATION_ERROR_NONE";
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case VALIDATION_ERROR_MISALIGNED_OBJECT:
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return "VALIDATION_ERROR_MISALIGNED_OBJECT";
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE:
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return "VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE";
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER:
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return "VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER";
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER:
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return "VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER";
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case VALIDATION_ERROR_ILLEGAL_HANDLE:
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return "VALIDATION_ERROR_ILLEGAL_HANDLE";
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE:
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE";
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case VALIDATION_ERROR_ILLEGAL_POINTER:
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return "VALIDATION_ERROR_ILLEGAL_POINTER";
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    case VALIDATION_ERROR_UNEXPECTED_NULL_POINTER:
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return "VALIDATION_ERROR_UNEXPECTED_NULL_POINTER";
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAG_COMBINATION:
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return "VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAG_COMBINATION";
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID:
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return "VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID";
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return "Unknown error";
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ReportValidationError(ValidationError error, const char* description) {
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (g_validation_error_observer) {
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    g_validation_error_observer->set_last_error(error);
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (description) {
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    MOJO_LOG(ERROR) << "Invalid message: " << ValidationErrorToString(error)
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    << " (" << description << ")";
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    MOJO_LOG(ERROR) << "Invalid message: " << ValidationErrorToString(error);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ValidationErrorObserverForTesting::ValidationErrorObserverForTesting()
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : last_error_(VALIDATION_ERROR_NONE) {
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MOJO_DCHECK(!g_validation_error_observer);
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  g_validation_error_observer = this;
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)ValidationErrorObserverForTesting::~ValidationErrorObserverForTesting() {
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MOJO_DCHECK(g_validation_error_observer == this);
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  g_validation_error_observer = NULL;
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)bool ReportSerializationWarning(ValidationError error) {
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (g_serialization_warning_observer) {
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    g_serialization_warning_observer->set_last_warning(error);
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return true;
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  return false;
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SerializationWarningObserverForTesting::SerializationWarningObserverForTesting()
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    : last_warning_(VALIDATION_ERROR_NONE) {
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MOJO_DCHECK(!g_serialization_warning_observer);
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  g_serialization_warning_observer = this;
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)SerializationWarningObserverForTesting::
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)~SerializationWarningObserverForTesting() {
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  MOJO_DCHECK(g_serialization_warning_observer == this);
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  g_serialization_warning_observer = NULL;
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace internal
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace mojo
92