| Index: extensions/renderer/api_signature_unittest.cc
|
| diff --git a/extensions/renderer/api_signature_unittest.cc b/extensions/renderer/api_signature_unittest.cc
|
| index 380008b92250499ada75e9379527de702fa0c665..1b479125f29ea783bda14415e6ab68f50edd7d5a 100644
|
| --- a/extensions/renderer/api_signature_unittest.cc
|
| +++ b/extensions/renderer/api_signature_unittest.cc
|
| @@ -8,6 +8,7 @@
|
| #include "base/values.h"
|
| #include "extensions/renderer/api_binding_test.h"
|
| #include "extensions/renderer/api_binding_test_util.h"
|
| +#include "extensions/renderer/api_invocation_errors.h"
|
| #include "extensions/renderer/api_type_reference_map.h"
|
| #include "extensions/renderer/argument_spec.h"
|
| #include "gin/converter.h"
|
| @@ -174,12 +175,15 @@ class APISignatureTest : public APIBindingTest {
|
| base::StringPiece arg_values,
|
| base::StringPiece expected_parsed_args,
|
| bool expect_callback) {
|
| - RunTest(signature, arg_values, expected_parsed_args, expect_callback, true);
|
| + RunTest(signature, arg_values, expected_parsed_args, expect_callback, true,
|
| + std::string());
|
| }
|
|
|
| void ExpectFailure(const APISignature& signature,
|
| - base::StringPiece arg_values) {
|
| - RunTest(signature, arg_values, base::StringPiece(), false, false);
|
| + base::StringPiece arg_values,
|
| + const std::string& expected_error) {
|
| + RunTest(signature, arg_values, base::StringPiece(), false, false,
|
| + expected_error);
|
| }
|
|
|
| private:
|
| @@ -187,7 +191,8 @@ class APISignatureTest : public APIBindingTest {
|
| base::StringPiece arg_values,
|
| base::StringPiece expected_parsed_args,
|
| bool expect_callback,
|
| - bool should_succeed) {
|
| + bool should_succeed,
|
| + const std::string& expected_error) {
|
| SCOPED_TRACE(arg_values);
|
| v8::Local<v8::Context> context = MainContext();
|
| v8::Local<v8::Value> v8_args = V8ValueFromScriptSource(context, arg_values);
|
| @@ -207,6 +212,8 @@ class APISignatureTest : public APIBindingTest {
|
| if (should_succeed) {
|
| EXPECT_EQ(ReplaceSingleQuotes(expected_parsed_args),
|
| ValueToString(*result));
|
| + } else {
|
| + EXPECT_EQ(expected_error, error);
|
| }
|
| }
|
|
|
| @@ -216,65 +223,83 @@ class APISignatureTest : public APIBindingTest {
|
| };
|
|
|
| TEST_F(APISignatureTest, Foo) {
|
| + using namespace api_errors;
|
| +
|
| v8::HandleScope handle_scope(isolate());
|
|
|
| {
|
| auto signature = OneString();
|
| ExpectPass(*signature, "['foo']", "['foo']", false);
|
| ExpectPass(*signature, "['']", "['']", false);
|
| - ExpectFailure(*signature, "[1]");
|
| - ExpectFailure(*signature, "[]");
|
| - ExpectFailure(*signature, "[{}]");
|
| - ExpectFailure(*signature, "['foo', 'bar']");
|
| + ExpectFailure(
|
| + *signature, "[1]",
|
| + ArgumentError("string", InvalidType(kTypeString, kTypeInteger)));
|
| + ExpectFailure(*signature, "[]", MissingRequiredArgument("string"));
|
| + ExpectFailure(
|
| + *signature, "[{}]",
|
| + ArgumentError("string", InvalidType(kTypeString, kTypeObject)));
|
| + ExpectFailure(*signature, "['foo', 'bar']", TooManyArguments());
|
| }
|
|
|
| {
|
| auto signature = StringAndInt();
|
| ExpectPass(*signature, "['foo', 42]", "['foo',42]", false);
|
| ExpectPass(*signature, "['foo', -1]", "['foo',-1]", false);
|
| - ExpectFailure(*signature, "[1]");
|
| - ExpectFailure(*signature, "['foo'];");
|
| - ExpectFailure(*signature, "[1, 'foo']");
|
| - ExpectFailure(*signature, "['foo', 'foo']");
|
| - ExpectFailure(*signature, "['foo', '1']");
|
| - ExpectFailure(*signature, "['foo', 2.3]");
|
| + ExpectFailure(
|
| + *signature, "[1]",
|
| + ArgumentError("string", InvalidType(kTypeString, kTypeInteger)));
|
| + ExpectFailure(*signature, "['foo'];", MissingRequiredArgument("int"));
|
| + ExpectFailure(
|
| + *signature, "[1, 'foo']",
|
| + ArgumentError("string", InvalidType(kTypeString, kTypeInteger)));
|
| + ExpectFailure(*signature, "['foo', 'foo']",
|
| + ArgumentError("int", InvalidType(kTypeInteger, kTypeString)));
|
| + ExpectFailure(*signature, "['foo', '1']",
|
| + ArgumentError("int", InvalidType(kTypeInteger, kTypeString)));
|
| + ExpectFailure(*signature, "['foo', 2.3]",
|
| + ArgumentError("int", InvalidType(kTypeInteger, kTypeDouble)));
|
| }
|
|
|
| {
|
| auto signature = StringOptionalIntAndBool();
|
| ExpectPass(*signature, "['foo', 42, true]", "['foo',42,true]", false);
|
| ExpectPass(*signature, "['foo', true]", "['foo',null,true]", false);
|
| - ExpectFailure(*signature, "['foo', 'bar', true]");
|
| + ExpectFailure(
|
| + *signature, "['foo', 'bar', true]",
|
| + ArgumentError("bool", InvalidType(kTypeBoolean, kTypeString)));
|
| }
|
|
|
| {
|
| auto signature = OneObject();
|
| ExpectPass(*signature, "[{prop1: 'foo'}]", "[{'prop1':'foo'}]", false);
|
| ExpectFailure(*signature,
|
| - "[{ get prop1() { throw new Error('Badness'); } }]");
|
| + "[{ get prop1() { throw new Error('Badness'); } }]",
|
| + ArgumentError("obj", ScriptThrewError()));
|
| }
|
|
|
| {
|
| auto signature = NoArgs();
|
| ExpectPass(*signature, "[]", "[]", false);
|
| - ExpectFailure(*signature, "[0]");
|
| - ExpectFailure(*signature, "['']");
|
| - ExpectFailure(*signature, "[null]");
|
| - ExpectFailure(*signature, "[undefined]");
|
| + ExpectFailure(*signature, "[0]", TooManyArguments());
|
| + ExpectFailure(*signature, "['']", TooManyArguments());
|
| + ExpectFailure(*signature, "[null]", TooManyArguments());
|
| + ExpectFailure(*signature, "[undefined]", TooManyArguments());
|
| }
|
|
|
| {
|
| auto signature = IntAndCallback();
|
| ExpectPass(*signature, "[1, function() {}]", "[1]", true);
|
| - ExpectFailure(*signature, "[function() {}]");
|
| - ExpectFailure(*signature, "[1]");
|
| + ExpectFailure(
|
| + *signature, "[function() {}]",
|
| + ArgumentError("int", InvalidType(kTypeInteger, kTypeFunction)));
|
| + ExpectFailure(*signature, "[1]", MissingRequiredArgument("callback"));
|
| }
|
|
|
| {
|
| auto signature = OptionalIntAndCallback();
|
| ExpectPass(*signature, "[1, function() {}]", "[1]", true);
|
| ExpectPass(*signature, "[function() {}]", "[null]", true);
|
| - ExpectFailure(*signature, "[1]");
|
| + ExpectFailure(*signature, "[1]", MissingRequiredArgument("callback"));
|
| }
|
|
|
| {
|
| @@ -282,7 +307,9 @@ TEST_F(APISignatureTest, Foo) {
|
| ExpectPass(*signature, "[function() {}]", "[]", true);
|
| ExpectPass(*signature, "[]", "[]", false);
|
| ExpectPass(*signature, "[undefined]", "[]", false);
|
| - ExpectFailure(*signature, "[0]");
|
| + ExpectFailure(
|
| + *signature, "[0]",
|
| + ArgumentError("callback", InvalidType(kTypeFunction, kTypeInteger)));
|
| }
|
|
|
| {
|
| @@ -293,12 +320,15 @@ TEST_F(APISignatureTest, Foo) {
|
| false);
|
| ExpectPass(*signature, "[4, {foo: 'bar'}, {}]", "[4,{'foo':'bar'},{}]",
|
| false);
|
| - ExpectFailure(*signature, "[4, function() {}]");
|
| - ExpectFailure(*signature, "[4]");
|
| + ExpectFailure(*signature, "[4, function() {}]",
|
| + ArgumentError("any", UnserializableValue()));
|
| + ExpectFailure(*signature, "[4]", MissingRequiredArgument("any"));
|
| }
|
| }
|
|
|
| TEST_F(APISignatureTest, TypeRefsTest) {
|
| + using namespace api_errors;
|
| +
|
| v8::HandleScope handle_scope(isolate());
|
|
|
| {
|
| @@ -306,14 +336,18 @@ TEST_F(APISignatureTest, TypeRefsTest) {
|
| ExpectPass(*signature, "[{prop1: 'foo'}]", "[{'prop1':'foo'}]", false);
|
| ExpectPass(*signature, "[{prop1: 'foo', prop2: 2}]",
|
| "[{'prop1':'foo','prop2':2}]", false);
|
| - ExpectFailure(*signature, "[{prop1: 'foo', prop2: 'a'}]");
|
| + ExpectFailure(
|
| + *signature, "[{prop1: 'foo', prop2: 'a'}]",
|
| + ArgumentError("obj", PropertyError("prop2", InvalidType(kTypeInteger,
|
| + kTypeString))));
|
| }
|
|
|
| {
|
| auto signature = RefEnum();
|
| ExpectPass(*signature, "['alpha']", "['alpha']", false);
|
| ExpectPass(*signature, "['beta']", "['beta']", false);
|
| - ExpectFailure(*signature, "['gamma']");
|
| + ExpectFailure(*signature, "['gamma']",
|
| + ArgumentError("enum", InvalidEnumValue({"alpha", "beta"})));
|
| }
|
| }
|
|
|
|
|