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