1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef UTIL_H_
#define UTIL_H_
#include <map>
#include <vector>
#include <string>
#include "zookeeper_log.h"
// number of elements in array
#define COUNTOF(array) sizeof(array)/sizeof(array[0])
#define DECLARE_WRAPPER(ret,sym,sig) \
extern "C" ret __real_##sym sig; \
extern "C" ret __wrap_##sym sig
#define CALL_REAL(sym,params) \
__real_##sym params
// must include "src/zookeeper_log.h" to be able to use this macro
#define TEST_TRACE(x...) \
log_message(LOGSTREAM, ZOO_LOG_LEVEL_DEBUG,__LINE__,__func__,x)
extern const std::string EMPTY_STRING;
// *****************************************************************************
// A bit of wizardry to get to the bare type from a reference or a pointer
// to the type
template <class T>
struct TypeOp {
typedef T BareT;
typedef T ArgT;
};
// partial specialization for reference types
template <class T>
struct TypeOp<T&>{
typedef T& ArgT;
typedef typename TypeOp<T>::BareT BareT;
};
// partial specialization for pointers
template <class T>
struct TypeOp<T*>{
typedef T* ArgT;
typedef typename TypeOp<T>::BareT BareT;
};
// *****************************************************************************
// Container utilities
template <class K, class V>
void putValue(std::map<K,V>& map,const K& k, const V& v){
typedef std::map<K,V> Map;
typename Map::const_iterator it=map.find(k);
if(it==map.end())
map.insert(typename Map::value_type(k,v));
else
map[k]=v;
}
template <class K, class V>
bool getValue(const std::map<K,V>& map,const K& k,V& v){
typedef std::map<K,V> Map;
typename Map::const_iterator it=map.find(k);
if(it==map.end())
return false;
v=it->second;
return true;
}
// *****************************************************************************
// misc utils
// millisecond sleep
void millisleep(int ms);
FILE *openlogfile(const char* name);
// evaluate given predicate until it returns true or the timeout
// (in millis) has expired
template<class Predicate>
int ensureCondition(const Predicate& p,int timeout){
int elapsed=0;
while(!p() && elapsed<timeout){
millisleep(2);
elapsed+=2;
}
return elapsed;
};
// *****************************************************************************
// test global configuration data
class TestConfig{
typedef std::vector<std::string> CmdLineOptList;
public:
typedef CmdLineOptList::const_iterator const_iterator;
TestConfig(){}
~TestConfig(){}
void addConfigFromCmdLine(int argc, char* argv[]){
if(argc>=2)
testName_=argv[1];
for(int i=2; i<argc;++i)
cmdOpts_.push_back(argv[i]);
}
const_iterator getExtraOptBegin() const {return cmdOpts_.begin();}
const_iterator getExtraOptEnd() const {return cmdOpts_.end();}
size_t getExtraOptCount() const {
return cmdOpts_.size();
}
const std::string& getTestName() const {
return testName_=="all"?EMPTY_STRING:testName_;
}
private:
CmdLineOptList cmdOpts_;
std::string testName_;
};
extern TestConfig globalTestConfig;
#endif /*UTIL_H_*/
|