1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2014 The Chromium Authors. All rights reserved. 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file. 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stddef.h> 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stdint.h> 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <stdio.h> 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <algorithm> 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <string> 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <utility> 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <vector> 12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/message_loop/message_loop.h" 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/run_loop.h" 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "base/threading/thread_task_runner_handle.h" 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/c/system/macros.h" 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/binding.h" 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/connector.h" 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/interface_ptr.h" 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/lib/filter_chain.h" 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/lib/router.h" 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/lib/validation_errors.h" 23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/message.h" 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/message_header_validator.h" 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/tests/validation_test_input_parser.h" 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/system/core.h" 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/test_support/test_support.h" 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/interfaces/bindings/tests/validation_test_associated_interfaces.mojom.h" 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom.h" 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "testing/gtest/include/gtest/gtest.h" 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo { 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace test { 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace { 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <typename T> 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid Append(std::vector<uint8_t>* data_vector, T data) { 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t pos = data_vector->size(); 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez data_vector->resize(pos + sizeof(T)); 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez memcpy(&(*data_vector)[pos], &data, sizeof(T)); 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool TestInputParser(const std::string& input, 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bool expected_result, 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const std::vector<uint8_t>& expected_data, 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t expected_num_handles) { 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> data; 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_handles; 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string error_message; 50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bool result = 52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ParseValidationTestInput(input, &data, &num_handles, &error_message); 53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (expected_result) { 54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (result && error_message.empty() && expected_data == data && 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez expected_num_handles == num_handles) { 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Compare with an empty string instead of checking |error_message.empty()|, 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // so that the message will be printed out if the two are not equal. 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(std::string(), error_message); 62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(expected_data, data); 63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(expected_num_handles, num_handles); 64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(error_message.empty()); 68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return !result && !error_message.empty(); 69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstd::vector<std::string> GetMatchingTests(const std::vector<std::string>& names, 72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const std::string& prefix) { 73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const std::string suffix = ".data"; 74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<std::string> tests; 75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < names.size(); ++i) { 76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (names[i].size() >= suffix.size() && 77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez names[i].substr(0, prefix.size()) == prefix && 78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez names[i].substr(names[i].size() - suffix.size()) == suffix) 79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez tests.push_back(names[i].substr(0, names[i].size() - suffix.size())); 80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return tests; 82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool ReadFile(const std::string& path, std::string* result) { 85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez FILE* fp = OpenSourceRootRelativeFile(path.c_str()); 86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!fp) { 87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ADD_FAILURE() << "File not found: " << path; 88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez fseek(fp, 0, SEEK_END); 91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t size = static_cast<size_t>(ftell(fp)); 92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (size == 0) { 93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez result->clear(); 94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez fclose(fp); 95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez fseek(fp, 0, SEEK_SET); 98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez result->resize(size); 99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t size_read = fread(&result->at(0), 1, size, fp); 100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez fclose(fp); 101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return size == size_read; 102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool ReadAndParseDataFile(const std::string& path, 105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t>* data, 106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t* num_handles) { 107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string input; 108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadFile(path, &input)) 109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string error_message; 112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ParseValidationTestInput(input, data, num_handles, &error_message)) { 113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ADD_FAILURE() << error_message; 114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 115645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 116645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 117645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 118645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 119645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 120645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool ReadResultFile(const std::string& path, std::string* result) { 121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadFile(path, result)) 122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Result files are new-line delimited text files. Remove any CRs. 125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez result->erase(std::remove(result->begin(), result->end(), '\r'), 126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez result->end()); 127645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 128645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Remove trailing LFs. 129645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t pos = result->find_last_not_of('\n'); 130645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (pos == std::string::npos) 131645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez result->clear(); 132645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez else 133645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez result->resize(pos + 1); 134645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 135645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 136645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 137645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 138645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstd::string GetPath(const std::string& root, const std::string& suffix) { 139645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return "mojo/public/interfaces/bindings/tests/data/validation/" + root + 140645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez suffix; 141645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 142645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 143645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// |message| should be a newly created object. 144645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezbool ReadTestCase(const std::string& test, 145645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Message* message, 146645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string* expected) { 147645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> data; 148645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez size_t num_handles; 149645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!ReadAndParseDataFile(GetPath(test, ".data"), &data, &num_handles) || 150645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez !ReadResultFile(GetPath(test, ".expected"), expected)) { 151645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return false; 152645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 153645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 154645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message->Initialize(static_cast<uint32_t>(data.size()), 155645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez false /* zero_initialized */); 156645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!data.empty()) 157645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez memcpy(message->mutable_data(), &data[0], data.size()); 158645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez message->mutable_handles()->resize(num_handles); 159645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 160645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; 161645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 162645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 163645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid RunValidationTests(const std::string& prefix, 164645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MessageReceiver* test_message_receiver) { 165645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<std::string> names = 166645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EnumerateSourceRootRelativeDirectory(GetPath("", "")); 167645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<std::string> tests = GetMatchingTests(names, prefix); 168645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ASSERT_FALSE(tests.empty()); 169645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 170645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; i < tests.size(); ++i) { 171645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Message message; 172645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string expected; 173645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ASSERT_TRUE(ReadTestCase(tests[i], &message, &expected)); 174645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 175645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string result; 176645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::RunLoop run_loop; 177645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::internal::ValidationErrorObserverForTesting observer( 178645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez run_loop.QuitClosure()); 179645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ignore_result(test_message_receiver->Accept(&message)); 180645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (expected != "PASS") // Observer only gets called on errors. 181645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez run_loop.Run(); 182645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (observer.last_error() == mojo::internal::VALIDATION_ERROR_NONE) 183645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez result = "PASS"; 184645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez else 185645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez result = mojo::internal::ValidationErrorToString(observer.last_error()); 186645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 187645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_EQ(expected, result) << "failed test: " << tests[i]; 188645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 189645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 190645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 191645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass DummyMessageReceiver : public MessageReceiver { 192645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public: 193645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bool Accept(Message* message) override { 194645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return true; // Any message is OK. 195645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 196645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 197645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 198645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass ValidationTest : public testing::Test { 199645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public: 200645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ValidationTest() {} 201645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 202645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez protected: 203645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::MessageLoop loop_; 204645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 205645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 206645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass ValidationIntegrationTest : public ValidationTest { 207645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public: 208645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ValidationIntegrationTest() : test_message_receiver_(nullptr) {} 209645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 210645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ~ValidationIntegrationTest() override {} 211645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 212645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void SetUp() override { 213645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ScopedMessagePipeHandle tester_endpoint; 214645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ASSERT_EQ(MOJO_RESULT_OK, 215645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez CreateMessagePipe(nullptr, &tester_endpoint, &testee_endpoint_)); 216645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez test_message_receiver_ = 217645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez new TestMessageReceiver(this, std::move(tester_endpoint)); 218645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 219645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 220645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void TearDown() override { 221645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez delete test_message_receiver_; 222645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez test_message_receiver_ = nullptr; 223645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 224645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Make sure that the other end receives the OnConnectionError() 225645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // notification. 226645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez PumpMessages(); 227645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 228645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 229645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MessageReceiver* test_message_receiver() { return test_message_receiver_; } 230645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 231645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ScopedMessagePipeHandle testee_endpoint() { 232645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return std::move(testee_endpoint_); 233645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 234645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 235645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez private: 236645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez class TestMessageReceiver : public MessageReceiver { 237645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public: 238645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez TestMessageReceiver(ValidationIntegrationTest* owner, 239645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ScopedMessagePipeHandle handle) 240645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez : owner_(owner), 241645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez connector_(std::move(handle), 242645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::Connector::SINGLE_THREADED_SEND, 243645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez base::ThreadTaskRunnerHandle::Get()) { 244645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez connector_.set_enforce_errors_from_incoming_receiver(false); 245645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 246645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ~TestMessageReceiver() override {} 247645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 248645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez bool Accept(Message* message) override { 249645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return connector_.Accept(message); 250645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 251645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 252645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public: 253645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ValidationIntegrationTest* owner_; 254645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::Connector connector_; 255645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez }; 256645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 257645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void PumpMessages() { base::RunLoop().RunUntilIdle(); } 258645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 259645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez TestMessageReceiver* test_message_receiver_; 260645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ScopedMessagePipeHandle testee_endpoint_; 261645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 262645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 263645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezclass IntegrationTestInterfaceImpl : public IntegrationTestInterface { 264645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez public: 265645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ~IntegrationTestInterfaceImpl() override {} 266645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 267645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez void Method0(BasicStructPtr param0, 268645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const Method0Callback& callback) override { 269645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez callback.Run(Array<uint8_t>::New(0u)); 270645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 271645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}; 272645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 273645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(ValidationTest, InputParser) { 274645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 275645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // The parser, as well as Append() defined above, assumes that this code is 276645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // running on a little-endian platform. Test whether that is true. 277645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez uint16_t x = 1; 278645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ASSERT_EQ(1, *(reinterpret_cast<char*>(&x))); 279645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 280645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 281645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Test empty input. 282645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string input; 283645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> expected; 284645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 285645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 286645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 287645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 288645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Test input that only consists of comments and whitespaces. 289645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string input = " \t // hello world \n\r \t// the answer is 42 "; 290645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> expected; 291645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 292645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 293645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 294645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 295645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string input = 296645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[u1]0x10// hello world !! \n\r \t [u2]65535 \n" 297645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[u4]65536 [u8]0xFFFFFFFFFFFFFFFF 0 0Xff"; 298645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> expected; 299645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint8_t>(0x10)); 300645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint16_t>(65535)); 301645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint32_t>(65536)); 302645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint64_t>(0xffffffffffffffff)); 303645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint8_t>(0)); 304645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint8_t>(0xff)); 305645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 306645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 307645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 308645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 309645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string input = "[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40"; 310645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> expected; 311645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, -static_cast<int64_t>(0x800)); 312645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<int8_t>(-128)); 313645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<int16_t>(0)); 314645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<int32_t>(-40)); 315645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 316645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 317645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 318645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 319645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string input = "[b]00001011 [b]10000000 // hello world\r [b]00000000"; 320645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> expected; 321645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint8_t>(11)); 322645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint8_t>(128)); 323645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint8_t>(0)); 324645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 325645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 326645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 327645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 328645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string input = "[f]+.3e9 [d]-10.03"; 329645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> expected; 330645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, +.3e9f); 331645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, -10.03); 332645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 333645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 334645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 335645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 336645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string input = "[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar"; 337645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> expected; 338645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint32_t>(14)); 339645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint8_t>(0)); 340645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint64_t>(9)); 341645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint8_t>(0)); 342645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 343645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 344645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 345645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 346645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::string input = "// This message has handles! \n[handles]50 [u8]2"; 347645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> expected; 348645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Append(&expected, static_cast<uint64_t>(2)); 349645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 350645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(TestInputParser(input, true, expected, 50)); 351645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 352645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 353645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // Test some failure cases. 354645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez { 355645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const char* error_inputs[] = {"/ hello world", 356645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[u1]x", 357645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[u2]-1000", 358645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[u1]0x100", 359645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[s2]-0x8001", 360645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[b]1", 361645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[b]1111111k", 362645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[dist4]unmatched", 363645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[anchr]hello [dist8]hello", 364645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[dist4]a [dist4]a [anchr]a", 365645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "[dist4]a [anchr]a [dist4]a [anchr]a", 366645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez "0 [handles]50", 367645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez nullptr}; 368645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 369645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for (size_t i = 0; error_inputs[i]; ++i) { 370645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez std::vector<uint8_t> expected; 371645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (!TestInputParser(error_inputs[i], false, expected, 0)) 372645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez ADD_FAILURE() << "Unexpected test result for: " << error_inputs[i]; 373645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 374645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 375645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 376645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 377645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(ValidationTest, Conformance) { 378645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez DummyMessageReceiver dummy_receiver; 379645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::internal::FilterChain validators(&dummy_receiver); 380645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<mojo::MessageHeaderValidator>(); 381645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<ConformanceTestInterface::RequestValidator_>(); 382645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 383645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez RunValidationTests("conformance_", validators.GetHead()); 384645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 385645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 386645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(ValidationTest, AssociatedConformace) { 387645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez DummyMessageReceiver dummy_receiver; 388645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::internal::FilterChain validators(&dummy_receiver); 389645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<mojo::MessageHeaderValidator>(); 390645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<AssociatedConformanceTestInterface::RequestValidator_>(); 391645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 392645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez RunValidationTests("associated_conformance_", validators.GetHead()); 393645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 394645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 395645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// This test is similar to Conformance test but its goal is specifically 396645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// do bounds-check testing of message validation. For example we test the 397645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// detection of off-by-one errors in method ordinals. 398645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(ValidationTest, BoundsCheck) { 399645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez DummyMessageReceiver dummy_receiver; 400645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::internal::FilterChain validators(&dummy_receiver); 401645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<mojo::MessageHeaderValidator>(); 402645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<BoundsCheckTestInterface::RequestValidator_>(); 403645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 404645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez RunValidationTests("boundscheck_", validators.GetHead()); 405645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 406645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 407645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// This test is similar to the Conformance test but for responses. 408645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(ValidationTest, ResponseConformance) { 409645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez DummyMessageReceiver dummy_receiver; 410645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::internal::FilterChain validators(&dummy_receiver); 411645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<mojo::MessageHeaderValidator>(); 412645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<ConformanceTestInterface::ResponseValidator_>(); 413645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 414645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez RunValidationTests("resp_conformance_", validators.GetHead()); 415645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 416645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 417645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// This test is similar to the BoundsCheck test but for responses. 418645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(ValidationTest, ResponseBoundsCheck) { 419645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez DummyMessageReceiver dummy_receiver; 420645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez mojo::internal::FilterChain validators(&dummy_receiver); 421645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<mojo::MessageHeaderValidator>(); 422645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez validators.Append<BoundsCheckTestInterface::ResponseValidator_>(); 423645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 424645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez RunValidationTests("resp_boundscheck_", validators.GetHead()); 425645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 426645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 427645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Test that InterfacePtr<X> applies the correct validators and they don't 428645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// conflict with each other: 429645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// - MessageHeaderValidator 430645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// - X::ResponseValidator_ 431645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(ValidationIntegrationTest, InterfacePtr) { 432645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IntegrationTestInterfacePtr interface_ptr = MakeProxy( 433645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez InterfacePtrInfo<IntegrationTestInterface>(testee_endpoint(), 0u)); 434645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez interface_ptr.internal_state()->EnableTestingMode(); 435645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 436645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez RunValidationTests("integration_intf_resp", test_message_receiver()); 437645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez RunValidationTests("integration_msghdr", test_message_receiver()); 438645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 439645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 440645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Test that Binding<X> applies the correct validators and they don't 441645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// conflict with each other: 442645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// - MessageHeaderValidator 443645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// - X::RequestValidator_ 444645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(ValidationIntegrationTest, Binding) { 445645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez IntegrationTestInterfaceImpl interface_impl; 446645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Binding<IntegrationTestInterface> binding( 447645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez &interface_impl, 448645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez MakeRequest<IntegrationTestInterface>(testee_endpoint())); 449645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez binding.EnableTestingMode(); 450645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 451645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez RunValidationTests("integration_intf_rqst", test_message_receiver()); 452645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez RunValidationTests("integration_msghdr", test_message_receiver()); 453645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 454645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 455645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Test pointer validation (specifically, that the encoded offset is 32-bit) 456645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST_F(ValidationTest, ValidateEncodedPointer) { 457645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez uint64_t offset; 458645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 459645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez offset = 0ULL; 460645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(mojo::internal::ValidateEncodedPointer(&offset)); 461645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 462645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez offset = 1ULL; 463645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(mojo::internal::ValidateEncodedPointer(&offset)); 464645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 465645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // offset must be <= 32-bit. 466645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez offset = std::numeric_limits<uint32_t>::max() + 1ULL; 467645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(mojo::internal::ValidateEncodedPointer(&offset)); 468645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 469645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 470645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Tests the IsKnownEnumValue() function generated for BasicEnum. 471645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST(EnumValueValidationTest, BasicEnum) { 472645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // BasicEnum can have -3,0,1,10 as possible integral values. 473645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(-4))); 474645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(-3))); 475645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(-2))); 476645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(-1))); 477645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(0))); 478645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(1))); 479645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(2))); 480645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(9))); 481645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // In the mojom, we represent this value as hex (0xa). 482645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(IsKnownEnumValue(static_cast<BasicEnum>(10))); 483645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(IsKnownEnumValue(static_cast<BasicEnum>(11))); 484645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 485645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 486645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Tests the IsKnownEnumValue() method generated for StructWithEnum. 487645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTEST(EnumValueValidationTest, EnumWithin) { 488645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez // StructWithEnum::EnumWithin can have [0,4] as possible integral values. 489645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(-1))); 490645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(0))); 491645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(1))); 492645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(2))); 493645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_TRUE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(3))); 494645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez EXPECT_FALSE(IsKnownEnumValue(static_cast<StructWithEnum::EnumWithin>(4))); 495645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 496645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 497645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace 498645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace test 499645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} // namespace mojo 500