1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector>
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h>
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/substitute.h>
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/testing/googletest.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <gtest/gtest.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include "config.h"
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// TODO(kenton):  More tests.
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#ifdef PACKAGE_VERSION  // only defined when using automake, not MSVC
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(VersionTest, VersionMatchesConfig) {
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Verify that the version string specified in config.h matches the one
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // in common.h.  The config.h version is a string which may have a suffix
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // like "beta" or "rc1", so we remove that.
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string version = PACKAGE_VERSION;
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int pos = 0;
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  while (pos < version.size() &&
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville         (ascii_isdigit(version[pos]) || version[pos] == '.')) {
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    ++pos;
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  version.erase(pos);
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(version, internal::VersionString(GOOGLE_PROTOBUF_VERSION));
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif  // PACKAGE_VERSION
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(CommonTest, IntMinMaxConstants) {
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // kint32min was declared incorrectly in the first release of protobufs.
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Ugh.
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_LT(kint32min, kint32max);
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(static_cast<uint32>(kint32min), static_cast<uint32>(kint32max) + 1);
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_LT(kint64min, kint64max);
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(static_cast<uint64>(kint64min), static_cast<uint64>(kint64max) + 1);
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(0, kuint32max + 1);
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(0, kuint64max + 1);
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevector<string> captured_messages_;
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid CaptureLog(LogLevel level, const char* filename, int line,
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                const string& message) {
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  captured_messages_.push_back(
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    strings::Substitute("$0 $1:$2: $3",
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      implicit_cast<int>(level), filename, line, message));
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(LoggingTest, DefaultLogging) {
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CaptureTestStderr();
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int line = __LINE__;
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(INFO   ) << "A message.";
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(WARNING) << "A warning.";
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(ERROR  ) << "An error.";
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string text = GetCapturedTestStderr();
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(
97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "[libprotobuf INFO "__FILE__":" + SimpleItoa(line + 1) + "] A message.\n"
98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "[libprotobuf WARNING "__FILE__":" + SimpleItoa(line + 2) + "] A warning.\n"
99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "[libprotobuf ERROR "__FILE__":" + SimpleItoa(line + 3) + "] An error.\n",
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    text);
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(LoggingTest, NullLogging) {
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogHandler* old_handler = SetLogHandler(NULL);
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  CaptureTestStderr();
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(INFO   ) << "A message.";
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(WARNING) << "A warning.";
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(ERROR  ) << "An error.";
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(SetLogHandler(old_handler) == NULL);
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string text = GetCapturedTestStderr();
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("", text);
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(LoggingTest, CaptureLogging) {
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  captured_messages_.clear();
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogHandler* old_handler = SetLogHandler(&CaptureLog);
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int start_line = __LINE__;
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(ERROR) << "An error.";
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(WARNING) << "A warning.";
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog);
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(2, captured_messages_.size());
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "2 "__FILE__":" + SimpleItoa(start_line + 1) + ": An error.",
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    captured_messages_[0]);
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "1 "__FILE__":" + SimpleItoa(start_line + 2) + ": A warning.",
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    captured_messages_[1]);
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST(LoggingTest, SilenceLogging) {
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  captured_messages_.clear();
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogHandler* old_handler = SetLogHandler(&CaptureLog);
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int line1 = __LINE__; GOOGLE_LOG(INFO) << "Visible1";
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogSilencer* silencer1 = new LogSilencer;
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(INFO) << "Not visible.";
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  LogSilencer* silencer2 = new LogSilencer;
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(INFO) << "Not visible.";
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  delete silencer1;
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(INFO) << "Not visible.";
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  delete silencer2;
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int line2 = __LINE__; GOOGLE_LOG(INFO) << "Visible2";
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_TRUE(SetLogHandler(old_handler) == &CaptureLog);
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  ASSERT_EQ(2, captured_messages_.size());
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0 "__FILE__":" + SimpleItoa(line1) + ": Visible1",
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    captured_messages_[0]);
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "0 "__FILE__":" + SimpleItoa(line2) + ": Visible2",
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    captured_messages_[1]);
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleclass ClosureTest : public testing::Test {
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville public:
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetA123Method()   { a_ = 123; }
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void SetA123Function() { current_instance_->a_ = 123; }
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetAMethod(int a)         { a_ = a; }
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetCMethod(string c)      { c_ = c; }
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void SetAFunction(int a)         { current_instance_->a_ = a; }
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void SetCFunction(string c)      { current_instance_->c_ = c; }
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  void SetABMethod(int a, const char* b)  { a_ = a; b_ = b; }
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static void SetABFunction(int a, const char* b) {
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    current_instance_->a_ = a;
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    current_instance_->b_ = b;
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  virtual void SetUp() {
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    current_instance_ = this;
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    a_ = 0;
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    b_ = NULL;
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    c_.clear();
185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    permanent_closure_ = NULL;
186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  void DeleteClosureInCallback() {
189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    delete permanent_closure_;
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  int a_;
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const char* b_;
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string c_;
195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  Closure* permanent_closure_;
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  static ClosureTest* current_instance_;
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville};
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleClosureTest* ClosureTest::current_instance_ = NULL;
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestClosureFunction0) {
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewCallback(&SetA123Function);
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(123, a_);
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(123, a_);
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestClosureMethod0) {
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewCallback(current_instance_,
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 &ClosureTest::SetA123Method);
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(123, a_);
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(123, a_);
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestClosureFunction1) {
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewCallback(&SetAFunction, 456);
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(456, a_);
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(456, a_);
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestClosureMethod1) {
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewCallback(current_instance_,
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 &ClosureTest::SetAMethod, 456);
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(456, a_);
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(456, a_);
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestClosureFunction1String) {
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewCallback(&SetCFunction, string("test"));
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE("test", c_);
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("test", c_);
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestClosureMethod1String) {
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewCallback(current_instance_,
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 &ClosureTest::SetCMethod, string("test"));
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE("test", c_);
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ("test", c_);
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestClosureFunction2) {
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const char* cstr = "hello";
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewCallback(&SetABFunction, 789, cstr);
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(789, a_);
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(cstr, b_);
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(789, a_);
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(cstr, b_);
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestClosureMethod2) {
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const char* cstr = "hello";
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewCallback(current_instance_,
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                 &ClosureTest::SetABMethod, 789, cstr);
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(789, a_);
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(cstr, b_);
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(789, a_);
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(cstr, b_);
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Repeat all of the above with NewPermanentCallback()
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestPermanentClosureFunction0) {
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewPermanentCallback(&SetA123Function);
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(123, a_);
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(123, a_);
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  a_ = 0;
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(123, a_);
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  delete closure;
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestPermanentClosureMethod0) {
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewPermanentCallback(current_instance_,
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                          &ClosureTest::SetA123Method);
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(123, a_);
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(123, a_);
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  a_ = 0;
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(123, a_);
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  delete closure;
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestPermanentClosureFunction1) {
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewPermanentCallback(&SetAFunction, 456);
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(456, a_);
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(456, a_);
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  a_ = 0;
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(456, a_);
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  delete closure;
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestPermanentClosureMethod1) {
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewPermanentCallback(current_instance_,
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                          &ClosureTest::SetAMethod, 456);
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(456, a_);
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(456, a_);
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  a_ = 0;
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(456, a_);
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  delete closure;
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestPermanentClosureFunction2) {
317fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const char* cstr = "hello";
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewPermanentCallback(&SetABFunction, 789, cstr);
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(789, a_);
320fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(cstr, b_);
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
322fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(789, a_);
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(cstr, b_);
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  a_ = 0;
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  b_ = NULL;
326fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
327fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(789, a_);
328fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(cstr, b_);
329fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  delete closure;
330fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
331fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
332fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleTEST_F(ClosureTest, TestPermanentClosureMethod2) {
333fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  const char* cstr = "hello";
334fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  Closure* closure = NewPermanentCallback(current_instance_,
335fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                                          &ClosureTest::SetABMethod, 789, cstr);
336fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(789, a_);
337fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_NE(cstr, b_);
338fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
339fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(789, a_);
340fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(cstr, b_);
341fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  a_ = 0;
342fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  b_ = NULL;
343fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  closure->Run();
344fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(789, a_);
345fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  EXPECT_EQ(cstr, b_);
346fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  delete closure;
347fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
348fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonTEST_F(ClosureTest, TestPermanentClosureDeleteInCallback) {
350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  permanent_closure_ = NewPermanentCallback((ClosureTest*) this,
351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      &ClosureTest::DeleteClosureInCallback);
352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  permanent_closure_->Run();
353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
355fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // anonymous namespace
356fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
357fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
358