15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/at_exit.h"
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/files/file_path.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/message_loop/message_loop.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/run_loop.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/strings/utf_string_conversions.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "gin/array_buffer.h"
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "gin/public/isolate_holder.h"
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "mojo/apps/js/mojo_runner_delegate.h"
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "mojo/apps/js/test/js_to_cpp.mojom.h"
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "mojo/common/common_type_converters.h"
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "mojo/common/test/test_utils.h"
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "mojo/public/cpp/system/core.h"
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "mojo/public/cpp/system/macros.h"
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "testing/gtest/include/gtest/gtest.h"
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace mojo {
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace js {
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Global value updated by some checks to prevent compilers from optimizing
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// reads out of existence.
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)uint32 g_waste_accumulator = 0;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace {
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Negative numbers with different values in each byte, the last of
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// which can survive promotion to double and back.
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int8  kExpectedInt8Value = -65;
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int16 kExpectedInt16Value = -16961;
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int32 kExpectedInt32Value = -1145258561;
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const int64 kExpectedInt64Value = -77263311946305LL;
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Positive numbers with different values in each byte, the last of
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// which can survive promotion to double and back.
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const uint8  kExpectedUInt8Value = 65;
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const uint16 kExpectedUInt16Value = 16961;
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const uint32 kExpectedUInt32Value = 1145258561;
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const uint64 kExpectedUInt64Value = 77263311946305LL;
43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Double/float values, including special case constants.
45010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const double kExpectedDoubleVal = 3.14159265358979323846;
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const double kExpectedDoubleInf = std::numeric_limits<double>::infinity();
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const double kExpectedDoubleNan = std::numeric_limits<double>::quiet_NaN();
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const float kExpectedFloatVal = static_cast<float>(kExpectedDoubleVal);
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const float kExpectedFloatInf = std::numeric_limits<float>::infinity();
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const float kExpectedFloatNan = std::numeric_limits<float>::quiet_NaN();
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// NaN has the property that it is not equal to itself.
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#define EXPECT_NAN(x) EXPECT_NE(x, x)
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool IsRunningOnIsolatedBot() {
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // TODO(yzshen): Remove this check once isolated tests are supported on the
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Chromium waterfall. (http://crbug.com/351214)
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const base::FilePath test_file_path(
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      test::GetFilePathForJSResource(
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom"));
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (!base::PathExists(test_file_path)) {
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    LOG(WARNING) << "Mojom binding files don't exist. Skipping the test.";
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return true;
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return false;
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CheckDataPipe(MojoHandle data_pipe_handle) {
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  unsigned char buffer[100];
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MojoResult result = MojoReadData(
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      data_pipe_handle, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE);
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(MOJO_RESULT_OK, result);
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(64u, buffer_size);
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (int i = 0; i < 64; ++i) {
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(i, buffer[i]);
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CheckMessagePipe(MojoHandle message_pipe_handle) {
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  unsigned char buffer[100];
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MojoResult result = MojoReadMessage(
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      message_pipe_handle, buffer, &buffer_size, 0, 0, 0);
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(MOJO_RESULT_OK, result);
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(64u, buffer_size);
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (int i = 0; i < 64; ++i) {
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(255 - i, buffer[i]);
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)js_to_cpp::EchoArgsPtr BuildSampleEchoArgs() {
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  js_to_cpp::EchoArgsPtr args(js_to_cpp::EchoArgs::New());
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->si64 = kExpectedInt64Value;
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->si32 = kExpectedInt32Value;
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->si16 = kExpectedInt16Value;
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->si8 = kExpectedInt8Value;
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->ui64 = kExpectedUInt64Value;
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->ui32 = kExpectedUInt32Value;
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->ui16 = kExpectedUInt16Value;
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->ui8 = kExpectedUInt8Value;
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->float_val = kExpectedFloatVal;
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->float_inf = kExpectedFloatInf;
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->float_nan = kExpectedFloatNan;
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->double_val = kExpectedDoubleVal;
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->double_inf = kExpectedDoubleInf;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->double_nan = kExpectedDoubleNan;
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->name = "coming";
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Array<String> string_array(3);
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  string_array[0] = "one";
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  string_array[1] = "two";
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  string_array[2] = "three";
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  args->string_array = string_array.Pass();
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return args.Pass();
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void CheckSampleEchoArgs(const js_to_cpp::EchoArgs& arg) {
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedInt64Value, arg.si64);
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedInt32Value, arg.si32);
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedInt16Value, arg.si16);
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedInt8Value, arg.si8);
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedUInt64Value, arg.ui64);
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedUInt32Value, arg.ui32);
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedUInt16Value, arg.ui16);
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedUInt8Value, arg.ui8);
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedFloatVal, arg.float_val);
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedFloatInf, arg.float_inf);
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NAN(arg.float_nan);
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedDoubleVal, arg.double_val);
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kExpectedDoubleInf, arg.double_inf);
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NAN(arg.double_nan);
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(std::string("coming"), arg.name.get());
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(std::string("one"), arg.string_array[0].get());
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(std::string("two"), arg.string_array[1].get());
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(std::string("three"), arg.string_array[2].get());
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckDataPipe(arg.data_handle.get().value());
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckMessagePipe(arg.message_handle.get().value());
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CheckSampleEchoArgsList(const js_to_cpp::EchoArgsListPtr& list) {
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (list.is_null())
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckSampleEchoArgs(*list->item);
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckSampleEchoArgsList(list->next);
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// More forgiving checks are needed in the face of potentially corrupt
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// messages. The values don't matter so long as all accesses are within
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// bounds.
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CheckCorruptedString(const String& arg) {
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (arg.is_null())
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < arg.size(); ++i)
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    g_waste_accumulator += arg[i];
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CheckCorruptedStringArray(const Array<String>& string_array) {
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (string_array.is_null())
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < string_array.size(); ++i)
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CheckCorruptedString(string_array[i]);
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CheckCorruptedDataPipe(MojoHandle data_pipe_handle) {
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  unsigned char buffer[100];
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MojoResult result = MojoReadData(
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      data_pipe_handle, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE);
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (result != MOJO_RESULT_OK)
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (uint32_t i = 0; i < buffer_size; ++i)
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    g_waste_accumulator += buffer[i];
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CheckCorruptedMessagePipe(MojoHandle message_pipe_handle) {
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  unsigned char buffer[100];
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  uint32_t buffer_size = static_cast<uint32_t>(sizeof(buffer));
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MojoResult result = MojoReadMessage(
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      message_pipe_handle, buffer, &buffer_size, 0, 0, 0);
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (result != MOJO_RESULT_OK)
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (uint32_t i = 0; i < buffer_size; ++i)
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    g_waste_accumulator += buffer[i];
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CheckCorruptedEchoArgs(const js_to_cpp::EchoArgsPtr& arg) {
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (arg.is_null())
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckCorruptedString(arg->name);
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckCorruptedStringArray(arg->string_array);
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (arg->data_handle.is_valid())
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CheckCorruptedDataPipe(arg->data_handle.get().value());
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (arg->message_handle.is_valid())
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CheckCorruptedMessagePipe(arg->message_handle.get().value());
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void CheckCorruptedEchoArgsList(const js_to_cpp::EchoArgsListPtr& list) {
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (list.is_null())
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckCorruptedEchoArgs(list->item);
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckCorruptedEchoArgsList(list->next);
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Base Provider implementation class. It's expected that tests subclass and
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// override the appropriate Provider functions. When test is done quit the
2065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// run_loop().
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class CppSideConnection : public js_to_cpp::CppSide {
2085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CppSideConnection() :
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      run_loop_(NULL),
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      js_side_(NULL),
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      mishandled_messages_(0) {
2135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~CppSideConnection() {}
2155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void set_run_loop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::RunLoop* run_loop() { return run_loop_; }
2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2190de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  void set_js_side(js_to_cpp::JsSide* js_side) { js_side_ = js_side; }
2200de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  js_to_cpp::JsSide* js_side() { return js_side_; }
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // js_to_cpp::CppSide:
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void StartTest() OVERRIDE {
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    NOTREACHED();
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
227010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void TestFinished() OVERRIDE {
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    NOTREACHED();
2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
230010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
231010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void PingResponse() OVERRIDE {
232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    mishandled_messages_ += 1;
2335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
234010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void EchoResponse(js_to_cpp::EchoArgsListPtr list) OVERRIDE {
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    mishandled_messages_ += 1;
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void BitFlipResponse(js_to_cpp::EchoArgsListPtr list) OVERRIDE {
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    mishandled_messages_ += 1;
241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void BackPointerResponse(
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      js_to_cpp::EchoArgsListPtr list) OVERRIDE {
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    mishandled_messages_ += 1;
246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
247010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
248010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) protected:
2495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::RunLoop* run_loop_;
2500de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)  js_to_cpp::JsSide* js_side_;
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int mishandled_messages_;
252010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
253010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
254010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CppSideConnection);
255010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
256010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
257010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Trivial test to verify a message sent from JS is received.
258010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class PingCppSideConnection : public CppSideConnection {
259010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PingCppSideConnection() : got_message_(false) {}
261010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~PingCppSideConnection() {}
262010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
263010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // js_to_cpp::CppSide:
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void StartTest() OVERRIDE {
2650de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    js_side_->Ping();
266010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
267010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void PingResponse() OVERRIDE {
269010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    got_message_ = true;
270010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    run_loop()->Quit();
271010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
272010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
273010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool DidSucceed() {
274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return got_message_ && !mishandled_messages_;
275010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
277010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
278010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool got_message_;
279010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PingCppSideConnection);
280010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test that parameters are passed with correct values.
283010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class EchoCppSideConnection : public CppSideConnection {
284010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EchoCppSideConnection() :
286010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      message_count_(0),
287010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      termination_seen_(false) {
288010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
289010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~EchoCppSideConnection() {}
290010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // js_to_cpp::CppSide:
292010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void StartTest() OVERRIDE {
2930de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    js_side_->Echo(kExpectedMessageCount, BuildSampleEchoArgs());
294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void EchoResponse(js_to_cpp::EchoArgsListPtr list) OVERRIDE {
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const js_to_cpp::EchoArgsPtr& special_arg = list->item;
298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    message_count_ += 1;
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(-1, special_arg->si64);
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(-1, special_arg->si32);
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(-1, special_arg->si16);
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(-1, special_arg->si8);
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(std::string("going"), special_arg->name.To<std::string>());
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CheckSampleEchoArgsList(list->next);
305010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void TestFinished() OVERRIDE {
308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    termination_seen_ = true;
309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    run_loop()->Quit();
310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
311010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
312010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool DidSucceed() {
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return termination_seen_ &&
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        !mishandled_messages_ &&
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        message_count_ == kExpectedMessageCount;
316010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
317010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
318010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const int kExpectedMessageCount = 10;
320010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int message_count_;
321010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool termination_seen_;
322010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(EchoCppSideConnection);
323010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)};
324010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
325010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Test that corrupted messages don't wreak havoc.
326010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class BitFlipCppSideConnection : public CppSideConnection {
327010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public:
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BitFlipCppSideConnection() : termination_seen_(false) {}
329010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual ~BitFlipCppSideConnection() {}
330010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
331010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // js_to_cpp::CppSide:
332010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void StartTest() OVERRIDE {
3330de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    js_side_->BitFlip(BuildSampleEchoArgs());
334010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
335010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void BitFlipResponse(js_to_cpp::EchoArgsListPtr list) OVERRIDE {
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CheckCorruptedEchoArgsList(list);
338010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
339010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
340010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void TestFinished() OVERRIDE {
341010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    termination_seen_ = true;
342010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    run_loop()->Quit();
343010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
344010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
345010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool DidSucceed() {
346010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return termination_seen_;
347010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
348010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
349010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
350010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool termination_seen_;
351010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BitFlipCppSideConnection);
3525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
3535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that severely random messages don't wreak havoc.
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class BackPointerCppSideConnection : public CppSideConnection {
356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BackPointerCppSideConnection() : termination_seen_(false) {}
358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~BackPointerCppSideConnection() {}
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // js_to_cpp::CppSide:
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void StartTest() OVERRIDE {
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    js_side_->BackPointer(BuildSampleEchoArgs());
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void BackPointerResponse(
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      js_to_cpp::EchoArgsListPtr list) OVERRIDE {
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CheckCorruptedEchoArgsList(list);
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void TestFinished() OVERRIDE {
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    termination_seen_ = true;
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop()->Quit();
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool DidSucceed() {
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return termination_seen_;
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool termination_seen_;
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BackPointerCppSideConnection);
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
384010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}  // namespace
385010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
3865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass JsToCppTest : public testing::Test {
3875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public:
3885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  JsToCppTest() {}
3895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
390010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void RunTest(const std::string& test, CppSideConnection* cpp_side) {
391010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    cpp_side->set_run_loop(&run_loop_);
3920de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
3930de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    MessagePipe pipe;
3940de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    js_to_cpp::JsSidePtr js_side =
3950de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)        MakeProxy<js_to_cpp::JsSide>(pipe.handle0.Pass());
396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    js_side.set_client(cpp_side);
3970de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    js_side.internal_state()->router_for_testing()->EnableTestingMode();
3990de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)
4000de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    cpp_side->set_js_side(js_side.get());
4015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gin::IsolateHolder::Initialize(gin::IsolateHolder::kStrictMode,
4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   gin::ArrayBufferAllocator::SharedInstance());
4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gin::IsolateHolder instance;
4055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    apps::MojoRunnerDelegate delegate;
4065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    gin::ShellRunner runner(&delegate, instance.isolate());
4070de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)    delegate.Start(&runner, pipe.handle1.release().value(), test);
4085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    run_loop_.Run();
4105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
4115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu private:
413f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::ShadowingAtExitManager at_exit_;
4145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::MessageLoop loop;
4155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::RunLoop run_loop_;
4165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
4175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DISALLOW_COPY_AND_ASSIGN(JsToCppTest);
4185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
4195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
420010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(JsToCppTest, Ping) {
421010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (IsRunningOnIsolatedBot())
422010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
4235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
424010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  PingCppSideConnection cpp_side_connection;
425010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunTest("mojo/apps/js/test/js_to_cpp_unittest", &cpp_side_connection);
426010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(cpp_side_connection.DidSucceed());
427010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
4285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
429010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)TEST_F(JsToCppTest, Echo) {
430010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (IsRunningOnIsolatedBot())
431010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
4325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EchoCppSideConnection cpp_side_connection;
434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunTest("mojo/apps/js/test/js_to_cpp_unittest", &cpp_side_connection);
435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(cpp_side_connection.DidSucceed());
436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
4375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(JsToCppTest, BitFlip) {
439010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (IsRunningOnIsolatedBot())
4405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return;
4415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
442010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  BitFlipCppSideConnection cpp_side_connection;
443010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  RunTest("mojo/apps/js/test/js_to_cpp_unittest", &cpp_side_connection);
444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_TRUE(cpp_side_connection.DidSucceed());
4455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
4465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
44746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(JsToCppTest, BackPointer) {
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (IsRunningOnIsolatedBot())
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  BackPointerCppSideConnection cpp_side_connection;
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RunTest("mojo/apps/js/test/js_to_cpp_unittest", &cpp_side_connection);
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(cpp_side_connection.DidSucceed());
454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
4565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace js
4575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}  // namespace mojo
458