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