15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/ 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met: 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions of source code must retain the above copyright 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions in binary form must reproduce the above 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/common.h> 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/strutil.h> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/substitute.h> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/testing/googletest.h> 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtest/gtest.h> 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "config.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kenton): More tests. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef PACKAGE_VERSION // only defined when using automake, not MSVC 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(VersionTest, VersionMatchesConfig) { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the version string specified in config.h matches the one 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in common.h. The config.h version is a string which may have a suffix 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // like "beta" or "rc1", so we remove that. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string version = PACKAGE_VERSION; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int pos = 0; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (pos < version.size() && 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ascii_isdigit(version[pos]) || version[pos] == '.')) { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++pos; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) version.erase(pos); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(version, internal::VersionString(GOOGLE_PROTOBUF_VERSION)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // PACKAGE_VERSION 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(CommonTest, IntMinMaxConstants) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // kint32min was declared incorrectly in the first release of protobufs. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ugh. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(kint32min, kint32max); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<uint32>(kint32min), static_cast<uint32>(kint32max) + 1); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(kint64min, kint64max); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(static_cast<uint64>(kint64min), static_cast<uint64>(kint64max) + 1); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, kuint32max + 1); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, kuint64max + 1); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)vector<string> captured_messages_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CaptureLog(LogLevel level, const char* filename, int line, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string& message) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captured_messages_.push_back( 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings::Substitute("$0 $1:$2: $3", 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) implicit_cast<int>(level), filename, line, message)); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LoggingTest, DefaultLogging) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CaptureTestStderr(); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int line = __LINE__; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(INFO ) << "A message."; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(WARNING) << "A warning."; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(ERROR ) << "An error."; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string text = GetCapturedTestStderr(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "[libprotobuf INFO "__FILE__":" + SimpleItoa(line + 1) + "] A message.\n" 983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "[libprotobuf WARNING "__FILE__":" + SimpleItoa(line + 2) + "] A warning.\n" 993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) "[libprotobuf ERROR "__FILE__":" + SimpleItoa(line + 3) + "] An error.\n", 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LoggingTest, NullLogging) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogHandler* old_handler = SetLogHandler(NULL); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CaptureTestStderr(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(INFO ) << "A message."; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(WARNING) << "A warning."; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(ERROR ) << "An error."; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(SetLogHandler(old_handler) == NULL); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string text = GetCapturedTestStderr(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("", text); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LoggingTest, CaptureLogging) { 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captured_messages_.clear(); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogHandler* old_handler = SetLogHandler(&CaptureLog); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int start_line = __LINE__; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(ERROR) << "An error."; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(WARNING) << "A warning."; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, captured_messages_.size()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "2 "__FILE__":" + SimpleItoa(start_line + 1) + ": An error.", 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captured_messages_[0]); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "1 "__FILE__":" + SimpleItoa(start_line + 2) + ": A warning.", 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captured_messages_[1]); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(LoggingTest, SilenceLogging) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captured_messages_.clear(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogHandler* old_handler = SetLogHandler(&CaptureLog); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int line1 = __LINE__; GOOGLE_LOG(INFO) << "Visible1"; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogSilencer* silencer1 = new LogSilencer; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(INFO) << "Not visible."; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogSilencer* silencer2 = new LogSilencer; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(INFO) << "Not visible."; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete silencer1; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GOOGLE_LOG(INFO) << "Not visible."; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete silencer2; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int line2 = __LINE__; GOOGLE_LOG(INFO) << "Visible2"; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2, captured_messages_.size()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 "__FILE__":" + SimpleItoa(line1) + ": Visible1", 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captured_messages_[0]); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0 "__FILE__":" + SimpleItoa(line2) + ": Visible2", 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) captured_messages_[1]); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClosureTest : public testing::Test { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetA123Method() { a_ = 123; } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetA123Function() { current_instance_->a_ = 123; } 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetAMethod(int a) { a_ = a; } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetCMethod(string c) { c_ = c; } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetAFunction(int a) { current_instance_->a_ = a; } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetCFunction(string c) { current_instance_->c_ = c; } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetABMethod(int a, const char* b) { a_ = a; b_ = b; } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetABFunction(int a, const char* b) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_instance_->a_ = a; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_instance_->b_ = b; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_instance_ = this; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a_ = 0; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b_ = NULL; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c_.clear(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permanent_closure_ = NULL; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DeleteClosureInCallback() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete permanent_closure_; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int a_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* b_; 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string c_; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* permanent_closure_; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ClosureTest* current_instance_; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ClosureTest* ClosureTest::current_instance_ = NULL; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestClosureFunction0) { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewCallback(&SetA123Function); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(123, a_); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(123, a_); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestClosureMethod0) { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewCallback(current_instance_, 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ClosureTest::SetA123Method); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(123, a_); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(123, a_); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestClosureFunction1) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewCallback(&SetAFunction, 456); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(456, a_); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(456, a_); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestClosureMethod1) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewCallback(current_instance_, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ClosureTest::SetAMethod, 456); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(456, a_); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(456, a_); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestClosureFunction1String) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewCallback(&SetCFunction, string("test")); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE("test", c_); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("test", c_); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestClosureMethod1String) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewCallback(current_instance_, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ClosureTest::SetCMethod, string("test")); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE("test", c_); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("test", c_); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestClosureFunction2) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* cstr = "hello"; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewCallback(&SetABFunction, 789, cstr); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(789, a_); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(cstr, b_); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(789, a_); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cstr, b_); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestClosureMethod2) { 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* cstr = "hello"; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewCallback(current_instance_, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ClosureTest::SetABMethod, 789, cstr); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(789, a_); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(cstr, b_); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(789, a_); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cstr, b_); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Repeat all of the above with NewPermanentCallback() 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestPermanentClosureFunction0) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewPermanentCallback(&SetA123Function); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(123, a_); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(123, a_); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a_ = 0; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(123, a_); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete closure; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestPermanentClosureMethod0) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewPermanentCallback(current_instance_, 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ClosureTest::SetA123Method); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(123, a_); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(123, a_); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a_ = 0; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(123, a_); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete closure; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestPermanentClosureFunction1) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewPermanentCallback(&SetAFunction, 456); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(456, a_); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(456, a_); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a_ = 0; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(456, a_); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete closure; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestPermanentClosureMethod1) { 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewPermanentCallback(current_instance_, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ClosureTest::SetAMethod, 456); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(456, a_); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(456, a_); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a_ = 0; 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(456, a_); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete closure; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestPermanentClosureFunction2) { 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* cstr = "hello"; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewPermanentCallback(&SetABFunction, 789, cstr); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(789, a_); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(cstr, b_); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(789, a_); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cstr, b_); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a_ = 0; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b_ = NULL; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(789, a_); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cstr, b_); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete closure; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestPermanentClosureMethod2) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* cstr = "hello"; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Closure* closure = NewPermanentCallback(current_instance_, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ClosureTest::SetABMethod, 789, cstr); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(789, a_); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(cstr, b_); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(789, a_); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cstr, b_); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) a_ = 0; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b_ = NULL; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closure->Run(); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(789, a_); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cstr, b_); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete closure; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ClosureTest, TestPermanentClosureDeleteInCallback) { 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permanent_closure_ = NewPermanentCallback((ClosureTest*) this, 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &ClosureTest::DeleteClosureInCallback); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) permanent_closure_->Run(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // anonymous namespace 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protobuf 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace google 358