1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file. 4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/strings/stringprintf.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/renderer/module_system_test.h" 746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "grit/extensions_renderer_resources.h" 8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace extensions { 10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace { 11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class MessagingUtilsUnittest : public ModuleSystemTest { 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) protected: 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) void RegisterTestModule(const char* code) { 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->RegisterModule( 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "test", 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::StringPrintf( 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "var assert = requireNative('assert');\n" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "var AssertTrue = assert.AssertTrue;\n" 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "var AssertFalse = assert.AssertFalse;\n" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "var messagingUtils = require('messaging_utils');\n" 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "%s", 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch code)); 24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private: 27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void SetUp() OVERRIDE { 28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ModuleSystemTest::SetUp(); 29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->RegisterModule("messaging_utils", IDR_MESSAGING_UTILS_JS); 31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) } 32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}; 33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, TestNothing) { 35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ExpectNoAssertionsMade(); 36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, NoArguments) { 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RegisterTestModule( 42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments();\n" 43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args === null);"); 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, ZeroArguments) { 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RegisterTestModule( 51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments([]);" 52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args === null);"); 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, TooManyArgumentsNoOptions) { 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RegisterTestModule( 60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments(\n" 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) " ['a', 'b', 'c', 'd']);\n" 62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args === null);"); 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, TooManyArgumentsWithOptions) { 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RegisterTestModule( 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments(\n" 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " ['a', 'b', 'c', 'd', 'e'], true);\n" 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args === null);"); 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, FinalArgumentIsNotAFunctionNoOptions) { 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RegisterTestModule( 80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments(\n" 81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) " ['a', 'b', 'c']);\n" 82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args === null);"); 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, FinalArgumentIsNotAFunctionWithOptions) { 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RegisterTestModule( 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments(\n" 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " ['a', 'b', 'c', 'd'], true);\n" 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args === null);"); 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, OneStringArgument) { 97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Because the request argument is required, a single argument must get 100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // mapped to it rather than to the optional targetId argument. 101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RegisterTestModule( 102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments(['a']);\n" 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args.length == 3);\n" 104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[0] === null);\n" 105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[1] == 'a');\n" 106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[2] === null);"); 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, OneStringAndOneNullArgument) { 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Explicitly specifying null as the request is allowed. 114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RegisterTestModule( 115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments(['a', null]);\n" 116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args.length == 3);\n" 117d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[0] == 'a');\n" 118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[1] === null);\n" 119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[2] === null);"); 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 121d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 122d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 123d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, OneNullAndOneStringArgument) { 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RegisterTestModule( 127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments([null, 'a']);\n" 128d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args.length == 3);\n" 129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[0] === null);\n" 130d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[1] == 'a');\n" 131d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[2] === null);"); 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 133d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 134d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 135d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, OneStringAndOneFunctionArgument) { 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // When the arguments are a string and a function, the function is 139d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // unambiguously the responseCallback. Because the request argument is 140d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // required, the remaining argument must get mapped to it rather than to the 141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // optional targetId argument. 142d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) RegisterTestModule( 143d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "var cb = function() {};\n" 144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments(['a', cb]);\n" 145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args.length == 3);\n" 146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[0] === null);\n" 147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[1] == 'a');\n" 148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) "AssertTrue(args[2] == cb);"); 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, OneStringAndOneObjectArgument) { 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // This tests an ambiguous set of arguments when options are present: 1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // chrome.runtime.sendMessage('target', {'msg': 'this is a message'}); 1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // vs. 1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // chrome.runtime.sendMessage('request', {'includeTlsChannelId': true}); 1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // 1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The question is whether the string should map to the target and the 1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // dictionary to the message, or whether the string should map to the message 1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // and the dictionary to the options. Because the target and message arguments 1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // predate the options argument, we bind the string in this case to the 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // targetId. 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RegisterTestModule( 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "var obj = {'b': true};\n" 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments(['a', obj], true);\n" 1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args.length == 4);\n" 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args[0] == 'a');\n" 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args[1] == obj);\n" 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args[2] === null);\n" 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args[3] === null);"); 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(MessagingUtilsUnittest, TwoObjectArguments) { 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ModuleSystem::NativesEnabledScope natives_enabled_scope( 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()); 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // When two non-string arguments are provided and options are present, the 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // two arguments must match request and options, respectively, because 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // targetId must be a string. 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) RegisterTestModule( 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "var obj1 = {'a': 'foo'};\n" 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "var obj2 = {'b': 'bar'};\n" 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "var args = messagingUtils.alignSendMessageArguments(\n" 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " [obj1, obj2], true);\n" 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args.length == 4);\n" 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args[0] === null);\n" 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args[1] == obj1);\n" 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args[2] == obj2);\n" 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "AssertTrue(args[3] === null);"); 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch env()->module_system()->Require("test"); 1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace 196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} // namespace extensions 197