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