1*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format 2*1b3f573fSAndroid Build Coastguard Worker // Copyright 2008 Google Inc. All rights reserved. 3*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/ 4*1b3f573fSAndroid Build Coastguard Worker // 5*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without 6*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are 7*1b3f573fSAndroid Build Coastguard Worker // met: 8*1b3f573fSAndroid Build Coastguard Worker // 9*1b3f573fSAndroid Build Coastguard Worker // * Redistributions of source code must retain the above copyright 10*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer. 11*1b3f573fSAndroid Build Coastguard Worker // * Redistributions in binary form must reproduce the above 12*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer 13*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the 14*1b3f573fSAndroid Build Coastguard Worker // distribution. 15*1b3f573fSAndroid Build Coastguard Worker // * Neither the name of Google Inc. nor the names of its 16*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from 17*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission. 18*1b3f573fSAndroid Build Coastguard Worker // 19*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30*1b3f573fSAndroid Build Coastguard Worker 31*1b3f573fSAndroid Build Coastguard Worker 32*1b3f573fSAndroid Build Coastguard Worker // This file defines a protocol for running the conformance test suite 33*1b3f573fSAndroid Build Coastguard Worker // in-process. In other words, the suite itself will run in the same process as 34*1b3f573fSAndroid Build Coastguard Worker // the code under test. 35*1b3f573fSAndroid Build Coastguard Worker // 36*1b3f573fSAndroid Build Coastguard Worker // For pros and cons of this approach, please see conformance.proto. 37*1b3f573fSAndroid Build Coastguard Worker 38*1b3f573fSAndroid Build Coastguard Worker #ifndef CONFORMANCE_CONFORMANCE_TEST_H 39*1b3f573fSAndroid Build Coastguard Worker #define CONFORMANCE_CONFORMANCE_TEST_H 40*1b3f573fSAndroid Build Coastguard Worker 41*1b3f573fSAndroid Build Coastguard Worker #include <functional> 42*1b3f573fSAndroid Build Coastguard Worker #include <string> 43*1b3f573fSAndroid Build Coastguard Worker #include <vector> 44*1b3f573fSAndroid Build Coastguard Worker 45*1b3f573fSAndroid Build Coastguard Worker #include <google/protobuf/descriptor.h> 46*1b3f573fSAndroid Build Coastguard Worker #include <google/protobuf/wire_format_lite.h> 47*1b3f573fSAndroid Build Coastguard Worker #include <google/protobuf/util/type_resolver.h> 48*1b3f573fSAndroid Build Coastguard Worker #include "conformance.pb.h" 49*1b3f573fSAndroid Build Coastguard Worker 50*1b3f573fSAndroid Build Coastguard Worker namespace conformance { 51*1b3f573fSAndroid Build Coastguard Worker class ConformanceRequest; 52*1b3f573fSAndroid Build Coastguard Worker class ConformanceResponse; 53*1b3f573fSAndroid Build Coastguard Worker } // namespace conformance 54*1b3f573fSAndroid Build Coastguard Worker 55*1b3f573fSAndroid Build Coastguard Worker namespace protobuf_test_messages { 56*1b3f573fSAndroid Build Coastguard Worker namespace proto3 { 57*1b3f573fSAndroid Build Coastguard Worker class TestAllTypesProto3; 58*1b3f573fSAndroid Build Coastguard Worker } // namespace proto3 59*1b3f573fSAndroid Build Coastguard Worker } // namespace protobuf_test_messages 60*1b3f573fSAndroid Build Coastguard Worker 61*1b3f573fSAndroid Build Coastguard Worker namespace google { 62*1b3f573fSAndroid Build Coastguard Worker namespace protobuf { 63*1b3f573fSAndroid Build Coastguard Worker 64*1b3f573fSAndroid Build Coastguard Worker class ConformanceTestSuite; 65*1b3f573fSAndroid Build Coastguard Worker 66*1b3f573fSAndroid Build Coastguard Worker class ConformanceTestRunner { 67*1b3f573fSAndroid Build Coastguard Worker public: ~ConformanceTestRunner()68*1b3f573fSAndroid Build Coastguard Worker virtual ~ConformanceTestRunner() {} 69*1b3f573fSAndroid Build Coastguard Worker 70*1b3f573fSAndroid Build Coastguard Worker // Call to run a single conformance test. 71*1b3f573fSAndroid Build Coastguard Worker // 72*1b3f573fSAndroid Build Coastguard Worker // "input" is a serialized conformance.ConformanceRequest. 73*1b3f573fSAndroid Build Coastguard Worker // "output" should be set to a serialized conformance.ConformanceResponse. 74*1b3f573fSAndroid Build Coastguard Worker // 75*1b3f573fSAndroid Build Coastguard Worker // If there is any error in running the test itself, set "runtime_error" in 76*1b3f573fSAndroid Build Coastguard Worker // the response. 77*1b3f573fSAndroid Build Coastguard Worker virtual void RunTest(const std::string& test_name, 78*1b3f573fSAndroid Build Coastguard Worker const std::string& input, 79*1b3f573fSAndroid Build Coastguard Worker std::string* output) = 0; 80*1b3f573fSAndroid Build Coastguard Worker }; 81*1b3f573fSAndroid Build Coastguard Worker 82*1b3f573fSAndroid Build Coastguard Worker // Test runner that spawns the process being tested and communicates with it 83*1b3f573fSAndroid Build Coastguard Worker // over a pipe. 84*1b3f573fSAndroid Build Coastguard Worker class ForkPipeRunner : public ConformanceTestRunner { 85*1b3f573fSAndroid Build Coastguard Worker public: 86*1b3f573fSAndroid Build Coastguard Worker // Note: Run() doesn't take ownership of the pointers inside suites. 87*1b3f573fSAndroid Build Coastguard Worker static int Run(int argc, char *argv[], 88*1b3f573fSAndroid Build Coastguard Worker const std::vector<ConformanceTestSuite*>& suites); 89*1b3f573fSAndroid Build Coastguard Worker ForkPipeRunner(const std::string & executable,const std::vector<std::string> & executable_args)90*1b3f573fSAndroid Build Coastguard Worker ForkPipeRunner(const std::string& executable, 91*1b3f573fSAndroid Build Coastguard Worker const std::vector<std::string>& executable_args) 92*1b3f573fSAndroid Build Coastguard Worker : child_pid_(-1), 93*1b3f573fSAndroid Build Coastguard Worker executable_(executable), 94*1b3f573fSAndroid Build Coastguard Worker executable_args_(executable_args) {} 95*1b3f573fSAndroid Build Coastguard Worker ForkPipeRunner(const std::string & executable)96*1b3f573fSAndroid Build Coastguard Worker explicit ForkPipeRunner(const std::string& executable) 97*1b3f573fSAndroid Build Coastguard Worker : child_pid_(-1), executable_(executable) {} 98*1b3f573fSAndroid Build Coastguard Worker ~ForkPipeRunner()99*1b3f573fSAndroid Build Coastguard Worker virtual ~ForkPipeRunner() {} 100*1b3f573fSAndroid Build Coastguard Worker 101*1b3f573fSAndroid Build Coastguard Worker void RunTest(const std::string& test_name, 102*1b3f573fSAndroid Build Coastguard Worker const std::string& request, 103*1b3f573fSAndroid Build Coastguard Worker std::string* response); 104*1b3f573fSAndroid Build Coastguard Worker 105*1b3f573fSAndroid Build Coastguard Worker private: 106*1b3f573fSAndroid Build Coastguard Worker void SpawnTestProgram(); 107*1b3f573fSAndroid Build Coastguard Worker 108*1b3f573fSAndroid Build Coastguard Worker void CheckedWrite(int fd, const void *buf, size_t len); 109*1b3f573fSAndroid Build Coastguard Worker bool TryRead(int fd, void *buf, size_t len); 110*1b3f573fSAndroid Build Coastguard Worker void CheckedRead(int fd, void *buf, size_t len); 111*1b3f573fSAndroid Build Coastguard Worker 112*1b3f573fSAndroid Build Coastguard Worker int write_fd_; 113*1b3f573fSAndroid Build Coastguard Worker int read_fd_; 114*1b3f573fSAndroid Build Coastguard Worker pid_t child_pid_; 115*1b3f573fSAndroid Build Coastguard Worker std::string executable_; 116*1b3f573fSAndroid Build Coastguard Worker const std::vector<std::string> executable_args_; 117*1b3f573fSAndroid Build Coastguard Worker std::string current_test_name_; 118*1b3f573fSAndroid Build Coastguard Worker }; 119*1b3f573fSAndroid Build Coastguard Worker 120*1b3f573fSAndroid Build Coastguard Worker // Class representing the test suite itself. To run it, implement your own 121*1b3f573fSAndroid Build Coastguard Worker // class derived from ConformanceTestRunner, class derived from 122*1b3f573fSAndroid Build Coastguard Worker // ConformanceTestSuite and then write code like: 123*1b3f573fSAndroid Build Coastguard Worker // 124*1b3f573fSAndroid Build Coastguard Worker // class MyConformanceTestSuite : public ConformanceTestSuite { 125*1b3f573fSAndroid Build Coastguard Worker // public: 126*1b3f573fSAndroid Build Coastguard Worker // void RunSuiteImpl() { 127*1b3f573fSAndroid Build Coastguard Worker // // INSERT ACTUAL TESTS. 128*1b3f573fSAndroid Build Coastguard Worker // } 129*1b3f573fSAndroid Build Coastguard Worker // }; 130*1b3f573fSAndroid Build Coastguard Worker // 131*1b3f573fSAndroid Build Coastguard Worker // class MyConformanceTestRunner : public ConformanceTestRunner { 132*1b3f573fSAndroid Build Coastguard Worker // public: 133*1b3f573fSAndroid Build Coastguard Worker // static int Run(int argc, char *argv[], 134*1b3f573fSAndroid Build Coastguard Worker // ConformanceTestSuite* suite); 135*1b3f573fSAndroid Build Coastguard Worker // 136*1b3f573fSAndroid Build Coastguard Worker // private: 137*1b3f573fSAndroid Build Coastguard Worker // virtual void RunTest(...) { 138*1b3f573fSAndroid Build Coastguard Worker // // INSERT YOUR FRAMEWORK-SPECIFIC CODE HERE. 139*1b3f573fSAndroid Build Coastguard Worker // } 140*1b3f573fSAndroid Build Coastguard Worker // }; 141*1b3f573fSAndroid Build Coastguard Worker // 142*1b3f573fSAndroid Build Coastguard Worker // int main() { 143*1b3f573fSAndroid Build Coastguard Worker // MyConformanceTestSuite suite; 144*1b3f573fSAndroid Build Coastguard Worker // MyConformanceTestRunner::Run(argc, argv, &suite); 145*1b3f573fSAndroid Build Coastguard Worker // } 146*1b3f573fSAndroid Build Coastguard Worker // 147*1b3f573fSAndroid Build Coastguard Worker class ConformanceTestSuite { 148*1b3f573fSAndroid Build Coastguard Worker public: ConformanceTestSuite()149*1b3f573fSAndroid Build Coastguard Worker ConformanceTestSuite() 150*1b3f573fSAndroid Build Coastguard Worker : verbose_(false), 151*1b3f573fSAndroid Build Coastguard Worker enforce_recommended_(false), 152*1b3f573fSAndroid Build Coastguard Worker failure_list_flag_name_("--failure_list") {} ~ConformanceTestSuite()153*1b3f573fSAndroid Build Coastguard Worker virtual ~ConformanceTestSuite() {} 154*1b3f573fSAndroid Build Coastguard Worker SetVerbose(bool verbose)155*1b3f573fSAndroid Build Coastguard Worker void SetVerbose(bool verbose) { verbose_ = verbose; } 156*1b3f573fSAndroid Build Coastguard Worker 157*1b3f573fSAndroid Build Coastguard Worker // Whether to require the testee to pass RECOMMENDED tests. By default failing 158*1b3f573fSAndroid Build Coastguard Worker // a RECOMMENDED test case will not fail the entire suite but will only 159*1b3f573fSAndroid Build Coastguard Worker // generated a warning. If this flag is set to true, RECOMMENDED tests will 160*1b3f573fSAndroid Build Coastguard Worker // be treated the same way as REQUIRED tests and failing a RECOMMENDED test 161*1b3f573fSAndroid Build Coastguard Worker // case will cause the entire test suite to fail as well. An implementation 162*1b3f573fSAndroid Build Coastguard Worker // can enable this if it wants to be strictly conforming to protobuf spec. 163*1b3f573fSAndroid Build Coastguard Worker // See the comments about ConformanceLevel below to learn more about the 164*1b3f573fSAndroid Build Coastguard Worker // difference between REQUIRED and RECOMMENDED test cases. SetEnforceRecommended(bool value)165*1b3f573fSAndroid Build Coastguard Worker void SetEnforceRecommended(bool value) { 166*1b3f573fSAndroid Build Coastguard Worker enforce_recommended_ = value; 167*1b3f573fSAndroid Build Coastguard Worker } 168*1b3f573fSAndroid Build Coastguard Worker 169*1b3f573fSAndroid Build Coastguard Worker // Gets the flag name to the failure list file. 170*1b3f573fSAndroid Build Coastguard Worker // By default, this would return --failure_list GetFailureListFlagName()171*1b3f573fSAndroid Build Coastguard Worker std::string GetFailureListFlagName() { return failure_list_flag_name_; } 172*1b3f573fSAndroid Build Coastguard Worker SetFailureListFlagName(const std::string & failure_list_flag_name)173*1b3f573fSAndroid Build Coastguard Worker void SetFailureListFlagName(const std::string& failure_list_flag_name) { 174*1b3f573fSAndroid Build Coastguard Worker failure_list_flag_name_ = failure_list_flag_name; 175*1b3f573fSAndroid Build Coastguard Worker } 176*1b3f573fSAndroid Build Coastguard Worker 177*1b3f573fSAndroid Build Coastguard Worker // Sets the path of the output directory. SetOutputDir(const char * output_dir)178*1b3f573fSAndroid Build Coastguard Worker void SetOutputDir(const char* output_dir) { 179*1b3f573fSAndroid Build Coastguard Worker output_dir_ = output_dir; 180*1b3f573fSAndroid Build Coastguard Worker } 181*1b3f573fSAndroid Build Coastguard Worker 182*1b3f573fSAndroid Build Coastguard Worker // Run all the conformance tests against the given test runner. 183*1b3f573fSAndroid Build Coastguard Worker // Test output will be stored in "output". 184*1b3f573fSAndroid Build Coastguard Worker // 185*1b3f573fSAndroid Build Coastguard Worker // Returns true if the set of failing tests was exactly the same as the 186*1b3f573fSAndroid Build Coastguard Worker // failure list. 187*1b3f573fSAndroid Build Coastguard Worker // The filename here is *only* used to create/format useful error messages for 188*1b3f573fSAndroid Build Coastguard Worker // how to update the failure list. We do NOT read this file at all. 189*1b3f573fSAndroid Build Coastguard Worker bool RunSuite(ConformanceTestRunner* runner, std::string* output, 190*1b3f573fSAndroid Build Coastguard Worker const std::string& filename, 191*1b3f573fSAndroid Build Coastguard Worker conformance::FailureSet* failure_list); 192*1b3f573fSAndroid Build Coastguard Worker 193*1b3f573fSAndroid Build Coastguard Worker protected: 194*1b3f573fSAndroid Build Coastguard Worker // Test cases are classified into a few categories: 195*1b3f573fSAndroid Build Coastguard Worker // REQUIRED: the test case must be passed for an implementation to be 196*1b3f573fSAndroid Build Coastguard Worker // interoperable with other implementations. For example, a 197*1b3f573fSAndroid Build Coastguard Worker // parser implementation must accept both packed and unpacked 198*1b3f573fSAndroid Build Coastguard Worker // form of repeated primitive fields. 199*1b3f573fSAndroid Build Coastguard Worker // RECOMMENDED: the test case is not required for the implementation to 200*1b3f573fSAndroid Build Coastguard Worker // be interoperable with other implementations, but is 201*1b3f573fSAndroid Build Coastguard Worker // recommended for best performance and compatibility. For 202*1b3f573fSAndroid Build Coastguard Worker // example, a proto3 serializer should serialize repeated 203*1b3f573fSAndroid Build Coastguard Worker // primitive fields in packed form, but an implementation 204*1b3f573fSAndroid Build Coastguard Worker // failing to do so will still be able to communicate with 205*1b3f573fSAndroid Build Coastguard Worker // other implementations. 206*1b3f573fSAndroid Build Coastguard Worker enum ConformanceLevel { 207*1b3f573fSAndroid Build Coastguard Worker REQUIRED = 0, 208*1b3f573fSAndroid Build Coastguard Worker RECOMMENDED = 1, 209*1b3f573fSAndroid Build Coastguard Worker }; 210*1b3f573fSAndroid Build Coastguard Worker 211*1b3f573fSAndroid Build Coastguard Worker class ConformanceRequestSetting { 212*1b3f573fSAndroid Build Coastguard Worker public: 213*1b3f573fSAndroid Build Coastguard Worker ConformanceRequestSetting(ConformanceLevel level, 214*1b3f573fSAndroid Build Coastguard Worker conformance::WireFormat input_format, 215*1b3f573fSAndroid Build Coastguard Worker conformance::WireFormat output_format, 216*1b3f573fSAndroid Build Coastguard Worker conformance::TestCategory test_category, 217*1b3f573fSAndroid Build Coastguard Worker const Message& prototype_message, 218*1b3f573fSAndroid Build Coastguard Worker const std::string& test_name, 219*1b3f573fSAndroid Build Coastguard Worker const std::string& input); ~ConformanceRequestSetting()220*1b3f573fSAndroid Build Coastguard Worker virtual ~ConformanceRequestSetting() {} 221*1b3f573fSAndroid Build Coastguard Worker 222*1b3f573fSAndroid Build Coastguard Worker std::unique_ptr<Message> NewTestMessage() const; 223*1b3f573fSAndroid Build Coastguard Worker 224*1b3f573fSAndroid Build Coastguard Worker std::string GetTestName() const; 225*1b3f573fSAndroid Build Coastguard Worker GetRequest()226*1b3f573fSAndroid Build Coastguard Worker const conformance::ConformanceRequest& GetRequest() const { 227*1b3f573fSAndroid Build Coastguard Worker return request_; 228*1b3f573fSAndroid Build Coastguard Worker } 229*1b3f573fSAndroid Build Coastguard Worker GetLevel()230*1b3f573fSAndroid Build Coastguard Worker const ConformanceLevel GetLevel() const { 231*1b3f573fSAndroid Build Coastguard Worker return level_; 232*1b3f573fSAndroid Build Coastguard Worker } 233*1b3f573fSAndroid Build Coastguard Worker 234*1b3f573fSAndroid Build Coastguard Worker std::string ConformanceLevelToString(ConformanceLevel level) const; 235*1b3f573fSAndroid Build Coastguard Worker SetPrintUnknownFields(bool print_unknown_fields)236*1b3f573fSAndroid Build Coastguard Worker void SetPrintUnknownFields(bool print_unknown_fields) { 237*1b3f573fSAndroid Build Coastguard Worker request_.set_print_unknown_fields(true); 238*1b3f573fSAndroid Build Coastguard Worker } 239*1b3f573fSAndroid Build Coastguard Worker SetPrototypeMessageForCompare(const Message & message)240*1b3f573fSAndroid Build Coastguard Worker void SetPrototypeMessageForCompare(const Message& message) { 241*1b3f573fSAndroid Build Coastguard Worker prototype_message_for_compare_.reset(message.New()); 242*1b3f573fSAndroid Build Coastguard Worker } 243*1b3f573fSAndroid Build Coastguard Worker 244*1b3f573fSAndroid Build Coastguard Worker protected: 245*1b3f573fSAndroid Build Coastguard Worker virtual std::string InputFormatString(conformance::WireFormat format) const; 246*1b3f573fSAndroid Build Coastguard Worker virtual std::string OutputFormatString( 247*1b3f573fSAndroid Build Coastguard Worker conformance::WireFormat format) const; 248*1b3f573fSAndroid Build Coastguard Worker conformance::ConformanceRequest request_; 249*1b3f573fSAndroid Build Coastguard Worker 250*1b3f573fSAndroid Build Coastguard Worker private: 251*1b3f573fSAndroid Build Coastguard Worker ConformanceLevel level_; 252*1b3f573fSAndroid Build Coastguard Worker ::conformance::WireFormat input_format_; 253*1b3f573fSAndroid Build Coastguard Worker ::conformance::WireFormat output_format_; 254*1b3f573fSAndroid Build Coastguard Worker const Message& prototype_message_; 255*1b3f573fSAndroid Build Coastguard Worker std::unique_ptr<Message> prototype_message_for_compare_; 256*1b3f573fSAndroid Build Coastguard Worker std::string test_name_; 257*1b3f573fSAndroid Build Coastguard Worker }; 258*1b3f573fSAndroid Build Coastguard Worker 259*1b3f573fSAndroid Build Coastguard Worker bool CheckSetEmpty(const std::set<std::string>& set_to_check, 260*1b3f573fSAndroid Build Coastguard Worker const std::string& write_to_file, const std::string& msg); 261*1b3f573fSAndroid Build Coastguard Worker std::string WireFormatToString(conformance::WireFormat wire_format); 262*1b3f573fSAndroid Build Coastguard Worker 263*1b3f573fSAndroid Build Coastguard Worker // Parse payload in the response to the given message. Returns true on 264*1b3f573fSAndroid Build Coastguard Worker // success. 265*1b3f573fSAndroid Build Coastguard Worker virtual bool ParseResponse( 266*1b3f573fSAndroid Build Coastguard Worker const conformance::ConformanceResponse& response, 267*1b3f573fSAndroid Build Coastguard Worker const ConformanceRequestSetting& setting, 268*1b3f573fSAndroid Build Coastguard Worker Message* test_message) = 0; 269*1b3f573fSAndroid Build Coastguard Worker 270*1b3f573fSAndroid Build Coastguard Worker void VerifyResponse(const ConformanceRequestSetting& setting, 271*1b3f573fSAndroid Build Coastguard Worker const std::string& equivalent_wire_format, 272*1b3f573fSAndroid Build Coastguard Worker const conformance::ConformanceResponse& response, 273*1b3f573fSAndroid Build Coastguard Worker bool need_report_success, bool require_same_wire_format); 274*1b3f573fSAndroid Build Coastguard Worker 275*1b3f573fSAndroid Build Coastguard Worker void ReportSuccess(const std::string& test_name); 276*1b3f573fSAndroid Build Coastguard Worker void ReportFailure(const std::string& test_name, ConformanceLevel level, 277*1b3f573fSAndroid Build Coastguard Worker const conformance::ConformanceRequest& request, 278*1b3f573fSAndroid Build Coastguard Worker const conformance::ConformanceResponse& response, 279*1b3f573fSAndroid Build Coastguard Worker const char* fmt, ...); 280*1b3f573fSAndroid Build Coastguard Worker void ReportSkip(const std::string& test_name, 281*1b3f573fSAndroid Build Coastguard Worker const conformance::ConformanceRequest& request, 282*1b3f573fSAndroid Build Coastguard Worker const conformance::ConformanceResponse& response); 283*1b3f573fSAndroid Build Coastguard Worker 284*1b3f573fSAndroid Build Coastguard Worker void RunValidInputTest(const ConformanceRequestSetting& setting, 285*1b3f573fSAndroid Build Coastguard Worker const std::string& equivalent_text_format); 286*1b3f573fSAndroid Build Coastguard Worker void RunValidBinaryInputTest(const ConformanceRequestSetting& setting, 287*1b3f573fSAndroid Build Coastguard Worker const std::string& equivalent_wire_format, 288*1b3f573fSAndroid Build Coastguard Worker bool require_same_wire_format = false); 289*1b3f573fSAndroid Build Coastguard Worker 290*1b3f573fSAndroid Build Coastguard Worker void RunTest(const std::string& test_name, 291*1b3f573fSAndroid Build Coastguard Worker const conformance::ConformanceRequest& request, 292*1b3f573fSAndroid Build Coastguard Worker conformance::ConformanceResponse* response); 293*1b3f573fSAndroid Build Coastguard Worker 294*1b3f573fSAndroid Build Coastguard Worker void AddExpectedFailedTest(const std::string& test_name); 295*1b3f573fSAndroid Build Coastguard Worker 296*1b3f573fSAndroid Build Coastguard Worker virtual void RunSuiteImpl() = 0; 297*1b3f573fSAndroid Build Coastguard Worker 298*1b3f573fSAndroid Build Coastguard Worker ConformanceTestRunner* runner_; 299*1b3f573fSAndroid Build Coastguard Worker int successes_; 300*1b3f573fSAndroid Build Coastguard Worker int expected_failures_; 301*1b3f573fSAndroid Build Coastguard Worker bool verbose_; 302*1b3f573fSAndroid Build Coastguard Worker bool enforce_recommended_; 303*1b3f573fSAndroid Build Coastguard Worker std::string output_; 304*1b3f573fSAndroid Build Coastguard Worker std::string output_dir_; 305*1b3f573fSAndroid Build Coastguard Worker std::string failure_list_flag_name_; 306*1b3f573fSAndroid Build Coastguard Worker std::string failure_list_filename_; 307*1b3f573fSAndroid Build Coastguard Worker 308*1b3f573fSAndroid Build Coastguard Worker // The set of test names that are expected to fail in this run, but haven't 309*1b3f573fSAndroid Build Coastguard Worker // failed yet. 310*1b3f573fSAndroid Build Coastguard Worker std::set<std::string> expected_to_fail_; 311*1b3f573fSAndroid Build Coastguard Worker 312*1b3f573fSAndroid Build Coastguard Worker // The set of test names that have been run. Used to ensure that there are no 313*1b3f573fSAndroid Build Coastguard Worker // duplicate names in the suite. 314*1b3f573fSAndroid Build Coastguard Worker std::set<std::string> test_names_; 315*1b3f573fSAndroid Build Coastguard Worker 316*1b3f573fSAndroid Build Coastguard Worker // The set of tests that failed, but weren't expected to. 317*1b3f573fSAndroid Build Coastguard Worker std::set<std::string> unexpected_failing_tests_; 318*1b3f573fSAndroid Build Coastguard Worker 319*1b3f573fSAndroid Build Coastguard Worker // The set of tests that succeeded, but weren't expected to. 320*1b3f573fSAndroid Build Coastguard Worker std::set<std::string> unexpected_succeeding_tests_; 321*1b3f573fSAndroid Build Coastguard Worker 322*1b3f573fSAndroid Build Coastguard Worker // The set of tests that the testee opted out of; 323*1b3f573fSAndroid Build Coastguard Worker std::set<std::string> skipped_; 324*1b3f573fSAndroid Build Coastguard Worker }; 325*1b3f573fSAndroid Build Coastguard Worker 326*1b3f573fSAndroid Build Coastguard Worker } // namespace protobuf 327*1b3f573fSAndroid Build Coastguard Worker } // namespace google 328*1b3f573fSAndroid Build Coastguard Worker 329*1b3f573fSAndroid Build Coastguard Worker #endif // CONFORMANCE_CONFORMANCE_TEST_H 330