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