1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <stdio.h> 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <algorithm> 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <string> 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include <vector> 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/c/system/macros.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/bindings/interface_impl.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/bindings/interface_ptr.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/bindings/lib/connector.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/bindings/lib/filter_chain.h" 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/public/cpp/bindings/lib/message_header_validator.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/bindings/lib/router.h" 1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "mojo/public/cpp/bindings/lib/validation_errors.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/bindings/message.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/bindings/tests/validation_test_input_parser.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/environment/environment.h" 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/system/core.h" 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/public/cpp/test_support/test_support.h" 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/cpp/utility/run_loop.h" 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "mojo/public/interfaces/bindings/tests/validation_test_interfaces.mojom.h" 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace mojo { 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace test { 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <typename T> 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void Append(std::vector<uint8_t>* data_vector, T data) { 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t pos = data_vector->size(); 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) data_vector->resize(pos + sizeof(T)); 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) memcpy(&(*data_vector)[pos], &data, sizeof(T)); 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool TestInputParser(const std::string& input, 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool expected_result, 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::vector<uint8_t>& expected_data, 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t expected_num_handles) { 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> data; 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t num_handles; 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string error_message; 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool result = ParseValidationTestInput(input, &data, &num_handles, 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &error_message); 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (expected_result) { 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (result && error_message.empty() && 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) expected_data == data && expected_num_handles == num_handles) { 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Compare with an empty string instead of checking |error_message.empty()|, 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // so that the message will be printed out if the two are not equal. 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(std::string(), error_message); 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected_data, data); 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected_num_handles, num_handles); 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(error_message.empty()); 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return !result && !error_message.empty(); 6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)std::vector<std::string> GetMatchingTests(const std::vector<std::string>& names, 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string& prefix) { 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string suffix = ".data"; 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<std::string> tests; 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < names.size(); ++i) { 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (names[i].size() >= suffix.size() && 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) names[i].substr(0, prefix.size()) == prefix && 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) names[i].substr(names[i].size() - suffix.size()) == suffix) 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) tests.push_back(names[i].substr(0, names[i].size() - suffix.size())); 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return tests; 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ReadFile(const std::string& path, std::string* result) { 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) FILE* fp = OpenSourceRootRelativeFile(path.c_str()); 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!fp) { 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ADD_FAILURE() << "File not found: " << path; 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) fseek(fp, 0, SEEK_END); 87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t size = static_cast<size_t>(ftell(fp)); 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (size == 0) { 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result->clear(); 90010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) fclose(fp); 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) fseek(fp, 0, SEEK_SET); 94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result->resize(size); 95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t size_read = fread(&result->at(0), 1, size, fp); 96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) fclose(fp); 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return size == size_read; 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ReadAndParseDataFile(const std::string& path, 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t>* data, 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t* num_handles) { 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string input; 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!ReadFile(path, &input)) 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string error_message; 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!ParseValidationTestInput(input, data, num_handles, &error_message)) { 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ADD_FAILURE() << error_message; 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ReadResultFile(const std::string& path, std::string* result) { 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!ReadFile(path, result)) 118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return false; 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Result files are new-line delimited text files. Remove any CRs. 121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result->erase(std::remove(result->begin(), result->end(), '\r'), 122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) result->end()); 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Remove trailing LFs. 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t pos = result->find_last_not_of('\n'); 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (pos == std::string::npos) 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result->clear(); 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) else 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result->resize(pos + 1); 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; 132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)std::string GetPath(const std::string& root, const std::string& suffix) { 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return "mojo/public/interfaces/bindings/tests/data/validation/" + 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) root + suffix; 137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// |message| should be a newly created object. 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ReadTestCase(const std::string& test, 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Message* message, 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string* expected) { 143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::vector<uint8_t> data; 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t num_handles; 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!ReadAndParseDataFile(GetPath(test, ".data"), &data, &num_handles) || 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !ReadResultFile(GetPath(test, ".expected"), expected)) { 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) message->AllocUninitializedData(static_cast<uint32_t>(data.size())); 151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!data.empty()) 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) memcpy(message->mutable_data(), &data[0], data.size()); 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) message->mutable_handles()->resize(num_handles); 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void RunValidationTests(const std::string& prefix, 159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MessageReceiver* test_message_receiver) { 160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<std::string> names = 161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EnumerateSourceRootRelativeDirectory(GetPath("", "")); 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<std::string> tests = GetMatchingTests(names, prefix); 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; i < tests.size(); ++i) { 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Message message; 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string expected; 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(ReadTestCase(tests[i], &message, &expected)); 168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string result; 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mojo::internal::ValidationErrorObserverForTesting observer; 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool unused MOJO_ALLOW_UNUSED = test_message_receiver->Accept(&message); 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (observer.last_error() == mojo::internal::VALIDATION_ERROR_NONE) 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result = "PASS"; 174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) else 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result = mojo::internal::ValidationErrorToString(observer.last_error()); 176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected, result) << "failed test: " << tests[i]; 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class DummyMessageReceiver : public MessageReceiver { 182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual bool Accept(Message* message) MOJO_OVERRIDE { 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return true; // Any message is OK. 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ValidationTest : public testing::Test { 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~ValidationTest() { 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Environment env_; 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ValidationIntegrationTest : public ValidationTest { 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ValidationIntegrationTest() : test_message_receiver_(NULL) { 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~ValidationIntegrationTest() { 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void SetUp() MOJO_OVERRIDE { 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ScopedMessagePipeHandle tester_endpoint; 207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(MOJO_RESULT_OK, 208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CreateMessagePipe(NULL, &tester_endpoint, &testee_endpoint_)); 209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_message_receiver_ = 210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new TestMessageReceiver(this, tester_endpoint.Pass()); 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void TearDown() MOJO_OVERRIDE { 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) delete test_message_receiver_; 215f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_message_receiver_ = NULL; 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Make sure that the other end receives the OnConnectionError() 218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // notification. 219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PumpMessages(); 220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MessageReceiver* test_message_receiver() { 223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return test_message_receiver_; 224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ScopedMessagePipeHandle testee_endpoint() { 227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return testee_endpoint_.Pass(); 228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) class TestMessageReceiver : public MessageReceiver { 232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestMessageReceiver(ValidationIntegrationTest* owner, 234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ScopedMessagePipeHandle handle) 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : owner_(owner), 236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) connector_(handle.Pass()) { 237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~TestMessageReceiver() { 239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual bool Accept(Message* message) MOJO_OVERRIDE { 242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool rv = connector_.Accept(message); 243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) owner_->PumpMessages(); 244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return rv; 245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 246f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 247f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ValidationIntegrationTest* owner_; 249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mojo::internal::Connector connector_; 250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void PumpMessages() { 253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) loop_.RunUntilIdle(); 254f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RunLoop loop_; 257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) TestMessageReceiver* test_message_receiver_; 258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ScopedMessagePipeHandle testee_endpoint_; 259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 260f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 261f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class IntegrationTestInterface1Client : public IntegrationTestInterface1 { 262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~IntegrationTestInterface1Client() { 264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 266f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void Method0(BasicStructPtr param0) MOJO_OVERRIDE { 267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 268f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class IntegrationTestInterface1Impl 271f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : public InterfaceImpl<IntegrationTestInterface1> { 272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~IntegrationTestInterface1Impl() { 274f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 275f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 276f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void Method0(BasicStructPtr param0) MOJO_OVERRIDE { 277f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 280116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ValidationTest, InputParser) { 281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The parser, as well as Append() defined above, assumes that this code is 283f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // running on a little-endian platform. Test whether that is true. 284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint16_t x = 1; 285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1, *(reinterpret_cast<char*>(&x))); 286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 287f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 288f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Test empty input. 289f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string input; 290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> expected; 291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 295f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Test input that only consists of comments and whitespaces. 296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string input = " \t // hello world \n\r \t// the answer is 42 "; 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> expected; 298f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 300f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 302f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string input = "[u1]0x10// hello world !! \n\r \t [u2]65535 \n" 303f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[u4]65536 [u8]0xFFFFFFFFFFFFFFFF 0 0Xff"; 304f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> expected; 305f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint8_t>(0x10)); 306f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint16_t>(65535)); 307f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint32_t>(65536)); 308f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint64_t>(0xffffffffffffffff)); 309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint8_t>(0)); 310f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint8_t>(0xff)); 311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 314f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 315f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string input = "[s8]-0x800 [s1]-128\t[s2]+0 [s4]-40"; 316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> expected; 317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, -static_cast<int64_t>(0x800)); 318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<int8_t>(-128)); 319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<int16_t>(0)); 320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<int32_t>(-40)); 321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 323f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string input = "[b]00001011 [b]10000000 // hello world\r [b]00000000"; 326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> expected; 327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint8_t>(11)); 328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint8_t>(128)); 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint8_t>(0)); 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string input = "[f]+.3e9 [d]-10.03"; 335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> expected; 336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, +.3e9f); 337f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, -10.03); 338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string input = "[dist4]foo 0 [dist8]bar 0 [anchr]foo [anchr]bar"; 343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> expected; 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint32_t>(14)); 345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint8_t>(0)); 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint64_t>(9)); 347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint8_t>(0)); 348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(TestInputParser(input, true, expected, 0)); 350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string input = "// This message has handles! \n[handles]50 [u8]2"; 353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> expected; 354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Append(&expected, static_cast<uint64_t>(2)); 355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(TestInputParser(input, true, expected, 50)); 357f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Test some failure cases. 360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const char* error_inputs[] = { 362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "/ hello world", 363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[u1]x", 364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[u2]-1000", 365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[u1]0x100", 366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[s2]-0x8001", 367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[b]1", 368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[b]1111111k", 369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[dist4]unmatched", 370f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[anchr]hello [dist8]hello", 371f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[dist4]a [dist4]a [anchr]a", 372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "[dist4]a [anchr]a [dist4]a [anchr]a", 373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "0 [handles]50", 374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NULL 375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) }; 376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (size_t i = 0; error_inputs[i]; ++i) { 378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<uint8_t> expected; 379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!TestInputParser(error_inputs[i], false, expected, 0)) 380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ADD_FAILURE() << "Unexpected test result for: " << error_inputs[i]; 381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 383010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 385116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(ValidationTest, Conformance) { 386f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DummyMessageReceiver dummy_receiver; 387f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mojo::internal::FilterChain validators(&dummy_receiver); 388f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) validators.Append<mojo::internal::MessageHeaderValidator>(); 389f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) validators.Append<ConformanceTestInterface::RequestValidator_>(); 390f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 391f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RunValidationTests("conformance_", validators.GetHead()); 392f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 393f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(ValidationTest, NotImplemented) { 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DummyMessageReceiver dummy_receiver; 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mojo::internal::FilterChain validators(&dummy_receiver); 3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci validators.Append<mojo::internal::MessageHeaderValidator>(); 3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci validators.Append<ConformanceTestInterface::RequestValidator_>(); 3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci RunValidationTests("not_implemented_", validators.GetHead()); 4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 403f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(ValidationIntegrationTest, InterfacePtr) { 404f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Test that InterfacePtr<X> applies the correct validators and they don't 405f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // conflict with each other: 406f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // - MessageHeaderValidator 407f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // - X::Client::RequestValidator_ 408f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // - X::ResponseValidator_ 409f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 410f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IntegrationTestInterface1Client interface1_client; 411f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IntegrationTestInterface2Ptr interface2_ptr = 412f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) MakeProxy<IntegrationTestInterface2>(testee_endpoint().Pass()); 413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) interface2_ptr.set_client(&interface1_client); 414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch interface2_ptr.internal_state()->router_for_testing()->EnableTestingMode(); 415f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 416f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RunValidationTests("integration_", test_message_receiver()); 417f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 418f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 419f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(ValidationIntegrationTest, InterfaceImpl) { 420f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Test that InterfaceImpl<X> applies the correct validators and they don't 421f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // conflict with each other: 422f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // - MessageHeaderValidator 423f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // - X::RequestValidator_ 424f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // - X::Client::ResponseValidator_ 425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 426f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // |interface1_impl| will delete itself when the pipe is closed. 427f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IntegrationTestInterface1Impl* interface1_impl = 428f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) BindToPipe(new IntegrationTestInterface1Impl(), testee_endpoint().Pass()); 429f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) interface1_impl->internal_state()->router()->EnableTestingMode(); 430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 431f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) RunValidationTests("integration_", test_message_receiver()); 432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace test 436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace mojo 437