Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / extensions / renderer / messaging_utils_unittest.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/strings/stringprintf.h"
6 #include "extensions/renderer/module_system_test.h"
7 #include "grit/extensions_renderer_resources.h"
8
9 namespace extensions {
10 namespace {
11
12 class MessagingUtilsUnittest : public ModuleSystemTest {
13  protected:
14   void RegisterTestModule(const char* code) {
15     env()->RegisterModule(
16         "test",
17         base::StringPrintf(
18             "var assert = requireNative('assert');\n"
19             "var AssertTrue = assert.AssertTrue;\n"
20             "var AssertFalse = assert.AssertFalse;\n"
21             "var messagingUtils = require('messaging_utils');\n"
22             "%s",
23             code));
24   }
25
26  private:
27   virtual void SetUp() OVERRIDE {
28     ModuleSystemTest::SetUp();
29
30     env()->RegisterModule("messaging_utils", IDR_MESSAGING_UTILS_JS);
31   }
32 };
33
34 TEST_F(MessagingUtilsUnittest, TestNothing) {
35   ExpectNoAssertionsMade();
36 }
37
38 TEST_F(MessagingUtilsUnittest, NoArguments) {
39   ModuleSystem::NativesEnabledScope natives_enabled_scope(
40       env()->module_system());
41   RegisterTestModule(
42       "var args = messagingUtils.alignSendMessageArguments();\n"
43       "AssertTrue(args === null);");
44   env()->module_system()->Require("test");
45 }
46
47 TEST_F(MessagingUtilsUnittest, ZeroArguments) {
48   ModuleSystem::NativesEnabledScope natives_enabled_scope(
49       env()->module_system());
50   RegisterTestModule(
51       "var args = messagingUtils.alignSendMessageArguments([]);"
52       "AssertTrue(args === null);");
53   env()->module_system()->Require("test");
54 }
55
56 TEST_F(MessagingUtilsUnittest, TooManyArgumentsNoOptions) {
57   ModuleSystem::NativesEnabledScope natives_enabled_scope(
58       env()->module_system());
59   RegisterTestModule(
60       "var args = messagingUtils.alignSendMessageArguments(\n"
61       "    ['a', 'b', 'c', 'd']);\n"
62       "AssertTrue(args === null);");
63   env()->module_system()->Require("test");
64 }
65
66 TEST_F(MessagingUtilsUnittest, TooManyArgumentsWithOptions) {
67   ModuleSystem::NativesEnabledScope natives_enabled_scope(
68       env()->module_system());
69   RegisterTestModule(
70       "var args = messagingUtils.alignSendMessageArguments(\n"
71       "    ['a', 'b', 'c', 'd', 'e'], true);\n"
72       "AssertTrue(args === null);");
73   env()->module_system()->Require("test");
74 }
75
76 TEST_F(MessagingUtilsUnittest, FinalArgumentIsNotAFunctionNoOptions) {
77   ModuleSystem::NativesEnabledScope natives_enabled_scope(
78       env()->module_system());
79   RegisterTestModule(
80       "var args = messagingUtils.alignSendMessageArguments(\n"
81       "    ['a', 'b', 'c']);\n"
82       "AssertTrue(args === null);");
83   env()->module_system()->Require("test");
84 }
85
86 TEST_F(MessagingUtilsUnittest, FinalArgumentIsNotAFunctionWithOptions) {
87   ModuleSystem::NativesEnabledScope natives_enabled_scope(
88       env()->module_system());
89   RegisterTestModule(
90       "var args = messagingUtils.alignSendMessageArguments(\n"
91       "    ['a', 'b', 'c', 'd'], true);\n"
92       "AssertTrue(args === null);");
93   env()->module_system()->Require("test");
94 }
95
96 TEST_F(MessagingUtilsUnittest, OneStringArgument) {
97   ModuleSystem::NativesEnabledScope natives_enabled_scope(
98       env()->module_system());
99   // Because the request argument is required, a single argument must get
100   // mapped to it rather than to the optional targetId argument.
101   RegisterTestModule(
102       "var args = messagingUtils.alignSendMessageArguments(['a']);\n"
103       "AssertTrue(args.length == 3);\n"
104       "AssertTrue(args[0] === null);\n"
105       "AssertTrue(args[1] == 'a');\n"
106       "AssertTrue(args[2] === null);");
107   env()->module_system()->Require("test");
108 }
109
110 TEST_F(MessagingUtilsUnittest, OneStringAndOneNullArgument) {
111   ModuleSystem::NativesEnabledScope natives_enabled_scope(
112       env()->module_system());
113   // Explicitly specifying null as the request is allowed.
114   RegisterTestModule(
115       "var args = messagingUtils.alignSendMessageArguments(['a', null]);\n"
116       "AssertTrue(args.length == 3);\n"
117       "AssertTrue(args[0] == 'a');\n"
118       "AssertTrue(args[1] === null);\n"
119       "AssertTrue(args[2] === null);");
120   env()->module_system()->Require("test");
121 }
122
123 TEST_F(MessagingUtilsUnittest, OneNullAndOneStringArgument) {
124   ModuleSystem::NativesEnabledScope natives_enabled_scope(
125       env()->module_system());
126   RegisterTestModule(
127       "var args = messagingUtils.alignSendMessageArguments([null, 'a']);\n"
128       "AssertTrue(args.length == 3);\n"
129       "AssertTrue(args[0] === null);\n"
130       "AssertTrue(args[1] == 'a');\n"
131       "AssertTrue(args[2] === null);");
132   env()->module_system()->Require("test");
133 }
134
135 TEST_F(MessagingUtilsUnittest, OneStringAndOneFunctionArgument) {
136   ModuleSystem::NativesEnabledScope natives_enabled_scope(
137       env()->module_system());
138   // When the arguments are a string and a function, the function is
139   // unambiguously the responseCallback. Because the request argument is
140   // required, the remaining argument must get mapped to it rather than to the
141   // optional targetId argument.
142   RegisterTestModule(
143       "var cb = function() {};\n"
144       "var args = messagingUtils.alignSendMessageArguments(['a', cb]);\n"
145       "AssertTrue(args.length == 3);\n"
146       "AssertTrue(args[0] === null);\n"
147       "AssertTrue(args[1] == 'a');\n"
148       "AssertTrue(args[2] == cb);");
149   env()->module_system()->Require("test");
150 }
151
152 TEST_F(MessagingUtilsUnittest, OneStringAndOneObjectArgument) {
153   ModuleSystem::NativesEnabledScope natives_enabled_scope(
154       env()->module_system());
155   // This tests an ambiguous set of arguments when options are present:
156   // chrome.runtime.sendMessage('target', {'msg': 'this is a message'});
157   // vs.
158   // chrome.runtime.sendMessage('request', {'includeTlsChannelId': true});
159   //
160   // The question is whether the string should map to the target and the
161   // dictionary to the message, or whether the string should map to the message
162   // and the dictionary to the options. Because the target and message arguments
163   // predate the options argument, we bind the string in this case to the
164   // targetId.
165   RegisterTestModule(
166       "var obj = {'b': true};\n"
167       "var args = messagingUtils.alignSendMessageArguments(['a', obj], true);\n"
168       "AssertTrue(args.length == 4);\n"
169       "AssertTrue(args[0] == 'a');\n"
170       "AssertTrue(args[1] == obj);\n"
171       "AssertTrue(args[2] === null);\n"
172       "AssertTrue(args[3] === null);");
173   env()->module_system()->Require("test");
174 }
175
176 TEST_F(MessagingUtilsUnittest, TwoObjectArguments) {
177   ModuleSystem::NativesEnabledScope natives_enabled_scope(
178       env()->module_system());
179   // When two non-string arguments are provided and options are present, the
180   // two arguments must match request and options, respectively, because
181   // targetId must be a string.
182   RegisterTestModule(
183       "var obj1 = {'a': 'foo'};\n"
184       "var obj2 = {'b': 'bar'};\n"
185       "var args = messagingUtils.alignSendMessageArguments(\n"
186       "    [obj1, obj2], true);\n"
187       "AssertTrue(args.length == 4);\n"
188       "AssertTrue(args[0] === null);\n"
189       "AssertTrue(args[1] == obj1);\n"
190       "AssertTrue(args[2] == obj2);\n"
191       "AssertTrue(args[3] === null);");
192   env()->module_system()->Require("test");
193 }
194
195 }  // namespace
196 }  // namespace extensions