/** * 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 #include #include #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 struct TypeOp { typedef T BareT; typedef T ArgT; }; // partial specialization for reference types template struct TypeOp{ typedef T& ArgT; typedef typename TypeOp::BareT BareT; }; // partial specialization for pointers template struct TypeOp{ typedef T* ArgT; typedef typename TypeOp::BareT BareT; }; // ***************************************************************************** // Container utilities template void putValue(std::map& map,const K& k, const V& v){ typedef std::map 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 bool getValue(const std::map& map,const K& k,V& v){ typedef std::map 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 int ensureCondition(const Predicate& p,int timeout){ int elapsed=0; while(!p() && elapsed 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