190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file.
490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/shared_impl/unittest_utils.h"
690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <cmath>
890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h"
1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/logging.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ipc/ipc_message.h"
1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/shared_impl/array_var.h"
1390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/shared_impl/dictionary_var.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ppapi/shared_impl/resource_var.h"
1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/shared_impl/var.h"
1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ppapi/shared_impl/var_tracker.h"
1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace ppapi {
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace {
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// When two vars x and y are found to be equal, an entry is inserted into
2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// |visited_map| with (x.value.as_id, y.value.as_id). This allows reference
2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// cycles to be avoided. It also allows us to associate nodes in |expected| with
2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// nodes in |actual| and check whether the graphs have equivalent topology.
2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)bool Equals(const PP_Var& expected,
2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            const PP_Var& actual,
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            bool test_string_references,
2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            base::hash_map<int64_t, int64_t>* visited_map) {
3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (expected.type != actual.type) {
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    LOG(ERROR) << "expected type: " << expected.type
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               << " actual type: " << actual.type;
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    return false;
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (VarTracker::IsVarTypeRefcounted(expected.type)) {
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::hash_map<int64_t, int64_t>::iterator it =
3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        visited_map->find(expected.value.as_id);
3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if (it != visited_map->end()) {
3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (it->second != actual.value.as_id) {
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        LOG(ERROR) << "expected id: " << it->second
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual id: " << actual.value.as_id;
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      } else {
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return true;
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    } else {
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (expected.type != PP_VARTYPE_STRING || test_string_references)
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        (*visited_map)[expected.value.as_id] = actual.value.as_id;
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  switch (expected.type) {
5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_UNDEFINED:
5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_NULL:
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_BOOL:
5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (expected.value.as_bool != actual.value.as_bool) {
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        LOG(ERROR) << "expected: " << expected.value.as_bool
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual: " << actual.value.as_bool;
6090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
6190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_INT32:
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (expected.value.as_int != actual.value.as_int) {
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        LOG(ERROR) << "expected: " << expected.value.as_int
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual: " << actual.value.as_int;
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_DOUBLE:
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (fabs(expected.value.as_double - actual.value.as_double) > 1.0e-4) {
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        LOG(ERROR) << "expected: " << expected.value.as_double
73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual: " << actual.value.as_double;
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_OBJECT:
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (expected.value.as_id != actual.value.as_id) {
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        LOG(ERROR) << "expected: " << expected.value.as_id
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual: " << actual.value.as_id;
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_STRING: {
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      StringVar* expected_var = StringVar::FromPPVar(expected);
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      StringVar* actual_var = StringVar::FromPPVar(actual);
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DCHECK(expected_var && actual_var);
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (expected_var->value() != actual_var->value()) {
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        LOG(ERROR) << "expected: " << expected_var->value()
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual: " << actual_var->value();
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_ARRAY_BUFFER: {
9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ArrayBufferVar* expected_var = ArrayBufferVar::FromPPVar(expected);
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ArrayBufferVar* actual_var = ArrayBufferVar::FromPPVar(actual);
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DCHECK(expected_var && actual_var);
9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (expected_var->ByteLength() != actual_var->ByteLength()) {
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        LOG(ERROR) << "expected: " << expected_var->ByteLength()
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual: " << actual_var->ByteLength();
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (memcmp(expected_var->Map(),
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 actual_var->Map(),
10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 expected_var->ByteLength()) != 0) {
10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        LOG(ERROR) << "expected array buffer does not match actual.";
10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
11090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
11190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_ARRAY: {
11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ArrayVar* expected_var = ArrayVar::FromPPVar(expected);
11490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      ArrayVar* actual_var = ArrayVar::FromPPVar(actual);
11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DCHECK(expected_var && actual_var);
11690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (expected_var->elements().size() != actual_var->elements().size()) {
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        LOG(ERROR) << "expected: " << expected_var->elements().size()
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual: " << actual_var->elements().size();
11990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      for (size_t i = 0; i < expected_var->elements().size(); ++i) {
12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (!Equals(expected_var->elements()[i].get(),
12390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    actual_var->elements()[i].get(),
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    test_string_references,
12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    visited_map)) {
12690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return false;
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        }
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
13090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    case PP_VARTYPE_DICTIONARY: {
13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DictionaryVar* expected_var = DictionaryVar::FromPPVar(expected);
13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DictionaryVar* actual_var = DictionaryVar::FromPPVar(actual);
13490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DCHECK(expected_var && actual_var);
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      if (expected_var->key_value_map().size() !=
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          actual_var->key_value_map().size()) {
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        LOG(ERROR) << "expected: " << expected_var->key_value_map().size()
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual: " << actual_var->key_value_map().size();
13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        return false;
14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
14190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DictionaryVar::KeyValueMap::const_iterator expected_iter =
14290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          expected_var->key_value_map().begin();
14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      DictionaryVar::KeyValueMap::const_iterator actual_iter =
14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          actual_var->key_value_map().begin();
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      for (; expected_iter != expected_var->key_value_map().end();
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           ++expected_iter, ++actual_iter) {
14790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (expected_iter->first != actual_iter->first) {
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          LOG(ERROR) << "expected: " << expected_iter->first
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     << " actual: " << actual_iter->first;
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return false;
15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        }
15290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        if (!Equals(expected_iter->second.get(),
15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    actual_iter->second.get(),
154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    test_string_references,
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                    visited_map)) {
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          return false;
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        }
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      }
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      return true;
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    }
161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    case PP_VARTYPE_RESOURCE: {
162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ResourceVar* expected_var = ResourceVar::FromPPVar(expected);
163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ResourceVar* actual_var = ResourceVar::FromPPVar(actual);
164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      DCHECK(expected_var && actual_var);
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (expected_var->GetPPResource() != actual_var->GetPPResource()) {
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        LOG(ERROR) << "expected: " << expected_var->GetPPResource()
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                   << " actual: " << actual_var->GetPPResource();
168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return false;
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      }
17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const IPC::Message* actual_message = actual_var->GetCreationMessage();
172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const IPC::Message* expected_message = expected_var->GetCreationMessage();
17368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (expected_message->size() != actual_message->size()) {
174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        LOG(ERROR) << "expected creation message size: "
175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << expected_message->size()
176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                   << " actual: " << actual_message->size();
177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return false;
178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      }
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // Set the upper 24 bits of actual creation_message flags to the same as
181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // expected. This is an unpredictable reference number that changes
182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // between serialization/deserialization, and we do not want it to cause
183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      // the comparison to fail.
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      IPC::Message local_actual_message(*actual_message);
18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      local_actual_message.SetHeaderValues(
186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          actual_message->routing_id(),
187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          actual_message->type(),
18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          (expected_message->flags() & 0xffffff00) |
189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              (actual_message->flags() & 0xff));
190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      if (memcmp(expected_message->data(),
191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 local_actual_message.data(),
19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                 expected_message->size()) != 0) {
193d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        LOG(ERROR) << "expected creation message does not match actual.";
194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        return false;
195d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      }
196d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return true;
197d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    }
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  NOTREACHED();
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  return false;
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool TestEqual(const PP_Var& expected,
206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               const PP_Var& actual,
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               bool test_string_references) {
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::hash_map<int64_t, int64_t> visited_map;
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return Equals(expected, actual, test_string_references, &visited_map);
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}  // namespace ppapi
213