1 // Tencent is pleased to support the open source community by making RapidJSON available.
2 //
3 // Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
4 //
5 // Licensed under the MIT License (the "License"); you may not use this file except
6 // in compliance with the License. You may obtain a copy of the License at
7 //
8 // http://opensource.org/licenses/MIT
9 //
10 // Unless required by applicable law or agreed to in writing, software distributed
11 // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
12 // CONDITIONS OF ANY KIND, either express or implied. See the License for the
13 // specific language governing permissions and limitations under the License.
14 
15 #ifndef PERFTEST_H_
16 #define PERFTEST_H_
17 
18 #define TEST_RAPIDJSON  1
19 #define TEST_PLATFORM   0
20 #define TEST_MISC       0
21 
22 #define TEST_VERSION_CODE(x,y,z) \
23   (((x)*100000) + ((y)*100) + (z))
24 
25 // __SSE2__ and __SSE4_2__ are recognized by gcc, clang, and the Intel compiler.
26 // We use -march=native with gmake to enable -msse2 and -msse4.2, if supported.
27 #if defined(__SSE4_2__)
28 #  define RAPIDJSON_SSE42
29 #elif defined(__SSE2__)
30 #  define RAPIDJSON_SSE2
31 #endif
32 
33 ////////////////////////////////////////////////////////////////////////////////
34 // Google Test
35 
36 #ifdef __cplusplus
37 
38 // gtest indirectly included inttypes.h, without __STDC_CONSTANT_MACROS.
39 #ifndef __STDC_CONSTANT_MACROS
40 #  define __STDC_CONSTANT_MACROS 1 // required by C++ standard
41 #endif
42 
43 #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
44 #if defined(__clang__) || (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
45 #pragma GCC diagnostic push
46 #endif
47 #pragma GCC diagnostic ignored "-Weffc++"
48 #endif
49 
50 #include "gtest/gtest.h"
51 
52 #if defined(__clang__) || defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
53 #pragma GCC diagnostic pop
54 #endif
55 
56 #ifdef _MSC_VER
57 #define _CRTDBG_MAP_ALLOC
58 #include <crtdbg.h>
59 #pragma warning(disable : 4996) // 'function': was declared deprecated
60 #endif
61 
62 //! Base class for all performance tests
63 class PerfTest : public ::testing::Test {
64 public:
PerfTest()65     PerfTest() : filename_(), json_(), length_(), whitespace_(), whitespace_length_() {}
66 
SetUp()67     virtual void SetUp() {
68 
69         const char *paths[] = {
70             "data/sample.json",
71             "bin/data/sample.json",
72             "../bin/data/sample.json",
73             "../../bin/data/sample.json",
74             "../../../bin/data/sample.json"
75         };
76         FILE *fp = 0;
77         for (size_t i = 0; i < sizeof(paths) / sizeof(paths[0]); i++) {
78             fp = fopen(filename_ = paths[i], "rb");
79             if (fp)
80                 break;
81         }
82         ASSERT_TRUE(fp != 0);
83 
84         fseek(fp, 0, SEEK_END);
85         length_ = (size_t)ftell(fp);
86         fseek(fp, 0, SEEK_SET);
87         json_ = (char*)malloc(length_ + 1);
88         ASSERT_EQ(length_, fread(json_, 1, length_, fp));
89         json_[length_] = '\0';
90         fclose(fp);
91 
92         // whitespace test
93         whitespace_length_ = 1024 * 1024;
94         whitespace_ = (char *)malloc(whitespace_length_  + 4);
95         char *p = whitespace_;
96         for (size_t i = 0; i < whitespace_length_; i += 4) {
97             *p++ = ' ';
98             *p++ = '\n';
99             *p++ = '\r';
100             *p++ = '\t';
101         }
102         *p++ = '[';
103         *p++ = '0';
104         *p++ = ']';
105         *p++ = '\0';
106     }
107 
TearDown()108     virtual void TearDown() {
109         free(json_);
110         free(whitespace_);
111         json_ = 0;
112         whitespace_ = 0;
113     }
114 
115 private:
116     PerfTest(const PerfTest&);
117     PerfTest& operator=(const PerfTest&);
118 
119 protected:
120     const char* filename_;
121     char *json_;
122     size_t length_;
123     char *whitespace_;
124     size_t whitespace_length_;
125 
126     static const size_t kTrialCount = 1000;
127 };
128 
129 #endif // __cplusplus
130 
131 #endif // PERFTEST_H_
132