| Index: chrome/browser/profile_resetter/jtl_interpreter_unittest.cc
|
| diff --git a/chrome/browser/profile_resetter/jtl_interpreter_unittest.cc b/chrome/browser/profile_resetter/jtl_interpreter_unittest.cc
|
| deleted file mode 100644
|
| index 67d89df4bcf442a9c44ad1c62e8841fd9cd195b7..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/profile_resetter/jtl_interpreter_unittest.cc
|
| +++ /dev/null
|
| @@ -1,689 +0,0 @@
|
| -// Copyright 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/profile_resetter/jtl_interpreter.h"
|
| -
|
| -#include <numeric>
|
| -
|
| -#include "base/strings/string_util.h"
|
| -#include "base/test/values_test_util.h"
|
| -#include "chrome/browser/profile_resetter/jtl_foundation.h"
|
| -#include "chrome/browser/profile_resetter/jtl_instructions.h"
|
| -#include "crypto/hmac.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace {
|
| -
|
| -const char seed[] = "foobar";
|
| -
|
| -#define KEY_HASH_1 GetHash("KEY_HASH_1")
|
| -#define KEY_HASH_2 GetHash("KEY_HASH_2")
|
| -#define KEY_HASH_3 GetHash("KEY_HASH_3")
|
| -#define KEY_HASH_4 GetHash("KEY_HASH_4")
|
| -
|
| -#define VALUE_HASH_1 GetHash("VALUE_HASH_1")
|
| -#define VALUE_HASH_2 GetHash("VALUE_HASH_2")
|
| -
|
| -#define VAR_HASH_1 "01234567890123456789012345678901"
|
| -#define VAR_HASH_2 "12345678901234567890123456789012"
|
| -
|
| -std::string GetHash(const std::string& input) {
|
| - return jtl_foundation::Hasher(seed).GetHash(input);
|
| -}
|
| -
|
| -std::string EncodeUint32(uint32 value) {
|
| - std::string bytecode;
|
| - for (int i = 0; i < 4; ++i) {
|
| - bytecode.push_back(static_cast<char>(value & 0xFFu));
|
| - value >>= 8;
|
| - }
|
| - return bytecode;
|
| -}
|
| -
|
| -// escaped_json_param may contain ' characters that are replaced with ". This
|
| -// makes the code more readable because we need less escaping.
|
| -#define INIT_INTERPRETER(program_param, escaped_json_param) \
|
| - const char* escaped_json = escaped_json_param; \
|
| - std::string json; \
|
| - base::ReplaceChars(escaped_json, "'", "\"", &json); \
|
| - scoped_ptr<base::Value> json_value(ParseJson(json)); \
|
| - JtlInterpreter interpreter( \
|
| - seed, \
|
| - program_param, \
|
| - static_cast<const base::DictionaryValue*>(json_value.get())); \
|
| - interpreter.Execute()
|
| -
|
| -using base::test::ParseJson;
|
| -
|
| -TEST(JtlInterpreter, Store) {
|
| - INIT_INTERPRETER(
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': 'VALUE_HASH_1' }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, NavigateAndStore) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': 'VALUE_HASH_1' }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, FailNavigate) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': 'VALUE_HASH_1' }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_1));
|
| -}
|
| -
|
| -TEST(JtlInterpreter, ConsecutiveNavigate) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, FailConsecutiveNavigate) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': 'foo' }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_1));
|
| -}
|
| -
|
| -TEST(JtlInterpreter, NavigateAnyInDictionary) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE_ANY +
|
| - OP_NAVIGATE(KEY_HASH_4) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1':"
|
| - " { 'KEY_HASH_2': {'KEY_HASH_3': 'VALUE_HASH_1' },"
|
| - " 'KEY_HASH_3': {'KEY_HASH_4': 'VALUE_HASH_1' }"
|
| - " } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, NavigateAnyInList) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE_ANY +
|
| - OP_NAVIGATE(KEY_HASH_4) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1':"
|
| - " [ {'KEY_HASH_3': 'VALUE_HASH_1' },"
|
| - " {'KEY_HASH_4': 'VALUE_HASH_1' }"
|
| - " ] }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, NavigateBack) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_NAVIGATE_BACK +
|
| - OP_NAVIGATE(KEY_HASH_3) +
|
| - OP_NAVIGATE(KEY_HASH_4) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1':"
|
| - " { 'KEY_HASH_2': {'KEY_HASH_3': 'VALUE_HASH_1' },"
|
| - " 'KEY_HASH_3': {'KEY_HASH_4': 'VALUE_HASH_1' }"
|
| - " } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, StoreTwoValues) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE) +
|
| - OP_STORE_HASH(VAR_HASH_2, VALUE_HASH_1),
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| - base::ExpectDictStringValue(VALUE_HASH_1, *interpreter.working_memory(),
|
| - VAR_HASH_2);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CompareStoredMatch) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_COMPARE_STORED_BOOL(VAR_HASH_1, VALUE_TRUE, VALUE_FALSE) +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_2);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CompareStoredMismatch) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_COMPARE_STORED_BOOL(VAR_HASH_1, VALUE_FALSE, VALUE_TRUE) +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_2));
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CompareStoredNoValueMatchingDefault) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_COMPARE_STORED_BOOL(VAR_HASH_1, VALUE_TRUE, VALUE_TRUE) +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_2);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CompareStoredNoValueMismatchingDefault) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_COMPARE_STORED_BOOL(VAR_HASH_1, VALUE_TRUE, VALUE_FALSE) +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_2));
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CompareBool) {
|
| - struct TestCase {
|
| - std::string expected_value;
|
| - const char* json;
|
| - bool expected_success;
|
| - } cases[] = {
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': true }", true },
|
| - { VALUE_FALSE, "{ 'KEY_HASH_1': false }", true },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': false }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': 'abc' }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': 1 }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': 1.2 }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': [1] }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| - };
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration " << i);
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_COMPARE_NODE_BOOL(cases[i].expected_value) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - cases[i].json);
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - if (cases[i].expected_success) {
|
| - base::ExpectDictBooleanValue(
|
| - true, *interpreter.working_memory(), VAR_HASH_1);
|
| - } else {
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_1));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CompareHashString) {
|
| - struct TestCase {
|
| - std::string expected_value;
|
| - const char* json;
|
| - bool expected_success;
|
| - } cases[] = {
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", true },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 'VALUE_HASH_2' }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': true }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 1 }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 1.1 }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': [1] }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| -
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 1.2 }", true },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': true }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 1 }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 1.3 }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': [1] }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| -
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 1 }", true },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': true }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 2 }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 1.1 }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': [1] }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| - };
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration " << i);
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_COMPARE_NODE_HASH(cases[i].expected_value) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - cases[i].json);
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - if (cases[i].expected_success) {
|
| - base::ExpectDictBooleanValue(
|
| - true, *interpreter.working_memory(), VAR_HASH_1);
|
| - } else {
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_1));
|
| - }
|
| - }
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Negated, Iteration " << i);
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_COMPARE_NODE_HASH_NOT(cases[i].expected_value) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - cases[i].json);
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - if (!cases[i].expected_success) {
|
| - base::ExpectDictBooleanValue(
|
| - true, *interpreter.working_memory(), VAR_HASH_1);
|
| - } else {
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_1));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(JtlInterpreter, StoreNodeBool) {
|
| - struct TestCase {
|
| - bool expected_value;
|
| - const char* json;
|
| - bool expected_success;
|
| - } cases[] = {
|
| - { true, "{ 'KEY_HASH_1': true }", true },
|
| - { false, "{ 'KEY_HASH_1': false }", true },
|
| - { false, "{ 'KEY_HASH_1': 'abc' }", false },
|
| - { false, "{ 'KEY_HASH_1': 1 }", false },
|
| - { false, "{ 'KEY_HASH_1': 1.2 }", false },
|
| - { false, "{ 'KEY_HASH_1': [1] }", false },
|
| - { false, "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| - };
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration " << i);
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_STORE_NODE_BOOL(VAR_HASH_1) +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - cases[i].json);
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - if (cases[i].expected_success) {
|
| - base::ExpectDictBooleanValue(
|
| - cases[i].expected_value, *interpreter.working_memory(), VAR_HASH_1);
|
| - base::ExpectDictBooleanValue(
|
| - true, *interpreter.working_memory(), VAR_HASH_2);
|
| - } else {
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_1));
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_2));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CompareNodeToStoredBool) {
|
| - struct TestCase {
|
| - std::string stored_value;
|
| - const char* json;
|
| - bool expected_success;
|
| - } cases[] = {
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': true }", true },
|
| - { VALUE_FALSE, "{ 'KEY_HASH_1': false }", true },
|
| - { VALUE_FALSE, "{ 'KEY_HASH_1': true }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': true }", false },
|
| -
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 1 }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 1.2 }", false },
|
| -
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': true }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': true }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': true }", false },
|
| -
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': 1 }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': 1.2 }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': [1] }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| - };
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration " << i);
|
| - std::string store_op;
|
| - if (cases[i].stored_value == VALUE_TRUE ||
|
| - cases[i].stored_value == VALUE_FALSE)
|
| - store_op = OP_STORE_BOOL(VAR_HASH_1, cases[i].stored_value);
|
| - else if (!cases[i].stored_value.empty())
|
| - store_op = OP_STORE_HASH(VAR_HASH_1, cases[i].stored_value);
|
| - INIT_INTERPRETER(
|
| - store_op +
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_COMPARE_NODE_TO_STORED_BOOL(VAR_HASH_1) +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - cases[i].json);
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - if (cases[i].expected_success) {
|
| - base::ExpectDictBooleanValue(
|
| - true, *interpreter.working_memory(), VAR_HASH_2);
|
| - } else {
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_2));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(JtlInterpreter, StoreNodeHash) {
|
| - struct TestCase {
|
| - std::string expected_value;
|
| - const char* json;
|
| - bool expected_success;
|
| - } cases[] = {
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", true },
|
| - { VALUE_HASH_2, "{ 'KEY_HASH_1': 'VALUE_HASH_2' }", true },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 1 }", true },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 1.2 }", true },
|
| - { std::string(), "{ 'KEY_HASH_1': true }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': [1] }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| - };
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration " << i);
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_STORE_NODE_HASH(VAR_HASH_1) +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - cases[i].json);
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - if (cases[i].expected_success) {
|
| - base::ExpectDictStringValue(
|
| - cases[i].expected_value, *interpreter.working_memory(), VAR_HASH_1);
|
| - base::ExpectDictBooleanValue(
|
| - true, *interpreter.working_memory(), VAR_HASH_2);
|
| - } else {
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_1));
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_2));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CompareNodeToStoredHash) {
|
| - struct TestCase {
|
| - std::string stored_value;
|
| - const char* json;
|
| - bool expected_success;
|
| - } cases[] = {
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", true },
|
| - { VALUE_HASH_2, "{ 'KEY_HASH_1': 'VALUE_HASH_2' }", true },
|
| - { std::string(), "{ 'KEY_HASH_1': 'VALUE_HASH_2' }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 'VALUE_HASH_2' }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': true }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 1 }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 1.1 }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': [1] }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| -
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 1.2 }", true },
|
| - { GetHash("1.3"), "{ 'KEY_HASH_1': 1.3 }", true },
|
| - { std::string(), "{ 'KEY_HASH_1': 1.2 }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': true }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 1 }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': 1.3 }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': [1] }", false },
|
| - { GetHash("1.2"), "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| -
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 1 }", true },
|
| - { GetHash("2"), "{ 'KEY_HASH_1': 2 }", true },
|
| - { std::string(), "{ 'KEY_HASH_1': 2 }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': true }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 2 }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': 1.1 }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': [1] }", false },
|
| - { GetHash("1"), "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| -
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': 'VALUE_HASH_1' }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': 1 }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': 1.3 }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': [1] }", false },
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| -
|
| - { VALUE_TRUE, "{ 'KEY_HASH_1': true }", false },
|
| - { VALUE_FALSE, "{ 'KEY_HASH_1': false }", false },
|
| - };
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration " << i);
|
| - std::string store_op;
|
| - if (cases[i].stored_value == VALUE_TRUE ||
|
| - cases[i].stored_value == VALUE_FALSE)
|
| - store_op = OP_STORE_BOOL(VAR_HASH_1, cases[i].stored_value);
|
| - else if (!cases[i].stored_value.empty())
|
| - store_op = OP_STORE_HASH(VAR_HASH_1, cases[i].stored_value);
|
| - INIT_INTERPRETER(
|
| - store_op +
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_COMPARE_NODE_TO_STORED_HASH(VAR_HASH_1) +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - cases[i].json);
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - if (cases[i].expected_success) {
|
| - base::ExpectDictBooleanValue(
|
| - true, *interpreter.working_memory(), VAR_HASH_2);
|
| - } else {
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_2));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CompareSubstring) {
|
| - struct TestCase {
|
| - std::string pattern;
|
| - const char* json;
|
| - bool expected_success;
|
| - } cases[] = {
|
| - { "abc", "{ 'KEY_HASH_1': 'abcdefghijklmnopqrstuvwxyz' }", true },
|
| - { "xyz", "{ 'KEY_HASH_1': 'abcdefghijklmnopqrstuvwxyz' }", true },
|
| - { "m", "{ 'KEY_HASH_1': 'abcdefghijklmnopqrstuvwxyz' }", true },
|
| - { "abc", "{ 'KEY_HASH_1': 'abc' }", true },
|
| - { "cba", "{ 'KEY_HASH_1': 'abcdefghijklmnopqrstuvwxyz' }", false },
|
| - { "acd", "{ 'KEY_HASH_1': 'abcdefghijklmnopqrstuvwxyz' }", false },
|
| - { "waaaaaaay_too_long", "{ 'KEY_HASH_1': 'abc' }", false },
|
| -
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': true }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 1 }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': 1.1 }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': [1] }", false },
|
| - { VALUE_HASH_1, "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| - };
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration " << i);
|
| - std::string pattern = cases[i].pattern;
|
| - uint32 pattern_sum = std::accumulate(
|
| - pattern.begin(), pattern.end(), static_cast<uint32>(0u));
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_COMPARE_NODE_SUBSTRING(GetHash(pattern),
|
| - EncodeUint32(pattern.size()),
|
| - EncodeUint32(pattern_sum)) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE),
|
| - cases[i].json);
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - if (cases[i].expected_success) {
|
| - base::ExpectDictBooleanValue(
|
| - true, *interpreter.working_memory(), VAR_HASH_1);
|
| - } else {
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_1));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(JtlInterpreter, StoreNodeRegisterableDomainHash) {
|
| - struct TestCase {
|
| - std::string expected_value;
|
| - const char* json;
|
| - bool expected_success;
|
| - } cases[] = {
|
| - { GetHash("google"), "{ 'KEY_HASH_1': 'http://google.com/path' }", true },
|
| - { GetHash("google"), "{ 'KEY_HASH_1': 'http://mail.google.com/' }", true },
|
| - { GetHash("google"), "{ 'KEY_HASH_1': 'http://google.co.uk/' }", true },
|
| - { GetHash("google"), "{ 'KEY_HASH_1': 'http://google.com./' }", true },
|
| - { GetHash("google"), "{ 'KEY_HASH_1': 'http://..google.com/' }", true },
|
| -
|
| - { GetHash("foo"), "{ 'KEY_HASH_1': 'http://foo.bar/path' }", true },
|
| - { GetHash("foo"), "{ 'KEY_HASH_1': 'http://sub.foo.bar' }", true },
|
| - { GetHash("foo"), "{ 'KEY_HASH_1': 'http://foo.appspot.com/' }", true },
|
| - { GetHash("foo"), "{ 'KEY_HASH_1': 'http://sub.foo.appspot.com' }", true },
|
| -
|
| - { std::string(), "{ 'KEY_HASH_1': 'http://google.com../' }", false },
|
| -
|
| - { std::string(), "{ 'KEY_HASH_1': 'http://bar/path' }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': 'http://co.uk/path' }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': 'http://appspot.com/path' }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': 'http://127.0.0.1/path' }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': 'file:///C:/bar.html' }", false },
|
| -
|
| - { std::string(), "{ 'KEY_HASH_1': 1 }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': 1.2 }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': true }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': [1] }", false },
|
| - { std::string(), "{ 'KEY_HASH_1': {'a': 'b'} }", false },
|
| - };
|
| -
|
| - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(cases); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration " << i);
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_STORE_NODE_REGISTERABLE_DOMAIN_HASH(VAR_HASH_1) +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - cases[i].json);
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - if (cases[i].expected_success) {
|
| - base::ExpectDictStringValue(
|
| - cases[i].expected_value, *interpreter.working_memory(), VAR_HASH_1);
|
| - base::ExpectDictBooleanValue(
|
| - true, *interpreter.working_memory(), VAR_HASH_2);
|
| - } else {
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_1));
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_2));
|
| - }
|
| - }
|
| -}
|
| -
|
| -TEST(JtlInterpreter, Stop) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE) +
|
| - OP_STOP_EXECUTING_SENTENCE +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| - EXPECT_FALSE(interpreter.working_memory()->HasKey(VAR_HASH_2));
|
| -}
|
| -
|
| -TEST(JtlInterpreter, EndOfSentence) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE(KEY_HASH_2) +
|
| - OP_STORE_BOOL(VAR_HASH_1, VALUE_TRUE) +
|
| - OP_END_OF_SENTENCE +
|
| - OP_STORE_BOOL(VAR_HASH_2, VALUE_TRUE),
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::OK, interpreter.result());
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_1);
|
| - base::ExpectDictBooleanValue(true, *interpreter.working_memory(), VAR_HASH_2);
|
| -}
|
| -
|
| -TEST(JtlInterpreter, InvalidBack) {
|
| - INIT_INTERPRETER(
|
| - OP_NAVIGATE(KEY_HASH_1) +
|
| - OP_NAVIGATE_BACK +
|
| - OP_NAVIGATE_BACK,
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::RUNTIME_ERROR, interpreter.result());
|
| -}
|
| -
|
| -TEST(JtlInterpreter, IncorrectPrograms) {
|
| - std::string missing_hash;
|
| - std::string missing_bool;
|
| - std::string invalid_hash("123");
|
| - std::string invalid_bool("\x02", 1);
|
| - std::string invalid_operation("\x99", 1);
|
| - std::string programs[] = {
|
| - OP_NAVIGATE(missing_hash),
|
| - OP_NAVIGATE(invalid_hash),
|
| - OP_STORE_BOOL(VAR_HASH_1, invalid_bool),
|
| - OP_STORE_BOOL(missing_hash, VALUE_TRUE),
|
| - OP_STORE_BOOL(invalid_hash, VALUE_TRUE),
|
| - OP_COMPARE_STORED_BOOL(invalid_hash, VALUE_TRUE, VALUE_TRUE),
|
| - OP_COMPARE_STORED_BOOL(VAR_HASH_1, invalid_bool, VALUE_TRUE),
|
| - OP_COMPARE_STORED_BOOL(VAR_HASH_1, VALUE_TRUE, invalid_bool),
|
| - OP_COMPARE_STORED_BOOL(VAR_HASH_1, VALUE_TRUE, missing_bool),
|
| - OP_STORE_NODE_BOOL(missing_hash),
|
| - OP_STORE_NODE_BOOL(invalid_hash),
|
| - OP_STORE_NODE_HASH(missing_hash),
|
| - OP_STORE_NODE_HASH(invalid_hash),
|
| - OP_COMPARE_NODE_BOOL(missing_bool),
|
| - OP_COMPARE_NODE_BOOL(invalid_bool),
|
| - OP_COMPARE_NODE_HASH(missing_hash),
|
| - OP_COMPARE_NODE_HASH(invalid_hash),
|
| - OP_COMPARE_NODE_TO_STORED_BOOL(missing_hash),
|
| - OP_COMPARE_NODE_TO_STORED_BOOL(invalid_hash),
|
| - OP_COMPARE_NODE_TO_STORED_HASH(missing_hash),
|
| - OP_COMPARE_NODE_TO_STORED_HASH(invalid_hash),
|
| - invalid_operation,
|
| - };
|
| - for (size_t i = 0; i < arraysize(programs); ++i) {
|
| - SCOPED_TRACE(testing::Message() << "Iteration " << i);
|
| - INIT_INTERPRETER(programs[i],
|
| - "{ 'KEY_HASH_1': { 'KEY_HASH_2': 'VALUE_HASH_1' } }");
|
| - EXPECT_EQ(JtlInterpreter::PARSE_ERROR, interpreter.result());
|
| - }
|
| -}
|
| -
|
| -TEST(JtlInterpreter, GetOutput) {
|
| - INIT_INTERPRETER(
|
| - OP_STORE_BOOL(GetHash("output1"), VALUE_TRUE) +
|
| - OP_STORE_HASH(GetHash("output2"), VALUE_HASH_1),
|
| - "{}");
|
| - bool output1 = false;
|
| - std::string output2;
|
| - EXPECT_TRUE(interpreter.GetOutputBoolean("output1", &output1));
|
| - EXPECT_EQ(true, output1);
|
| - EXPECT_TRUE(interpreter.GetOutputString("output2", &output2));
|
| - EXPECT_EQ(VALUE_HASH_1, output2);
|
| - EXPECT_FALSE(interpreter.GetOutputBoolean("outputxx", &output1));
|
| - EXPECT_FALSE(interpreter.GetOutputString("outputxx", &output2));
|
| -}
|
| -
|
| -TEST(JtlInterpreter, CalculateProgramChecksum) {
|
| - const char kTestSeed[] = "Irrelevant seed value.";
|
| - const char kTestProgram[] = "The quick brown fox jumps over the lazy dog.";
|
| - // This program is invalid, but we are not actually executing it.
|
| - base::DictionaryValue input;
|
| - JtlInterpreter interpreter(kTestSeed, kTestProgram, &input);
|
| - EXPECT_EQ(0xef537f, interpreter.CalculateProgramChecksum());
|
| -}
|
| -
|
| -} // namespace
|
|
|