You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by jb...@apache.org on 2018/12/18 17:20:23 UTC

[geode-native] branch develop updated: GEODE-5188 - Adds benchmarking framework. (#293)

This is an automated email from the ASF dual-hosted git repository.

jbarrett pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode-native.git


The following commit(s) were added to refs/heads/develop by this push:
     new e4b2577  GEODE-5188 - Adds benchmarking framework. (#293)
e4b2577 is described below

commit e4b2577305e015f38249db70c23b49b2a0523df6
Author: Jacob Barrett <jb...@pivotal.io>
AuthorDate: Tue Dec 18 09:20:18 2018 -0800

    GEODE-5188 - Adds benchmarking framework. (#293)
    
    * Prevent optimization of bench.
    * Adds benchmark framework.
    * Refactor for shared integration framework.
    * Adds some get benchmarks.
    * Fixes Rat checking
---
 .ratCheck.sh                                       |  12 --
 .ratignore                                         |  67 ++++++-----
 .travis.yml                                        |   4 +-
 CMakeLists.txt                                     |  15 ++-
 .../uninstall-doxygen.ps1 => cmake/RatCheck.cmake  |  23 ++--
 cppcache/CMakeLists.txt                            |   6 +-
 cppcache/README.md                                 |  37 ++++++
 .../benchmark/CMakeLists.txt                       |  26 +++--
 cppcache/benchmark/GeodeHashBM.cpp                 |  45 +++++++
 .../framework/Gfsh.cpp => benchmark/main.cpp}      |   4 +-
 .../integration/CMakeLists.txt                     |  16 +--
 .../integration/benchmark/CMakeLists.txt           |  24 ++--
 cppcache/integration/benchmark/RegionBM.cpp        | 130 +++++++++++++++++++++
 .../Gfsh.cpp => integration/benchmark/main.cpp}    |   4 +-
 .../framework/.clang-tidy                          |   0
 .../integration/framework/CMakeLists.txt           |  50 +++++++-
 .../framework/Cluster.cpp                          |   0
 .../framework/Cluster.h                            |   2 +-
 .../framework/Framework.cpp                        |   0
 .../framework/Framework.h                          |   0
 .../framework/Gfsh.cpp                             |   0
 .../framework/Gfsh.h                               |   0
 .../framework/GfshExecute.cpp                      |   4 +-
 .../framework/GfshExecute.h                        |   0
 .../framework/config.h.in                          |   0
 .../test}/CMakeLists.txt                           |  35 +++---
 .../test}/DataSerializableTest.cpp                 |   0
 .../test}/EnableChunkHandlerThreadTest.cpp         |   0
 .../test}/ExampleTest.cpp                          |   8 +-
 .../test}/FunctionExecutionTest.cpp                |   0
 .../test}/PdxInstanceTest.cpp                      |   5 +-
 cppcache/integration/test/RegionGetAllTest.cpp     |  94 +++++++++++++++
 cppcache/integration/test/RegionPutAllTest.cpp     | 102 ++++++++++++++++
 .../test}/RegionPutGetAllTest.cpp                  |   8 +-
 .../test}/RegisterKeysTest.cpp                     |   0
 .../test}/StructTest.cpp                           |   7 +-
 dependencies/CMakeLists.txt                        |  11 +-
 dependencies/benchmark/CMakeLists.txt              |  78 +++++++++++++
 dependencies/benchmark/patches                     |  12 ++
 dependencies/boost/CMakeLists.txt                  |   4 +-
 dependencies/gtest/CMakeLists.txt                  |  42 +++----
 .../rat/CMakeLists.txt                             |  22 ++--
 docs/docker/Dockerfile                             |  16 +++
 packer/solaris/changepasswd                        |  14 +++
 packer/windows/Packer.psm1                         |   1 +
 packer/windows/add-user-build.ps1                  |   1 +
 packer/windows/cleanup.ps1                         |   1 +
 packer/windows/install-chocolatey.ps1              |   1 +
 packer/windows/install-gemfire.ps1                 |   1 +
 .../windows/install-windows-8.1-2012-r2-wmf-5.ps1  |   1 +
 packer/windows/setup-ec2config.ps1                 |   1 +
 packer/windows/uninstall-doxygen.ps1               |   2 +-
 52 files changed, 764 insertions(+), 172 deletions(-)

diff --git a/.ratCheck.sh b/.ratCheck.sh
deleted file mode 100755
index 0fb3474..0000000
--- a/.ratCheck.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-
-SOURCE_DIR=.
-COUNT=`java -jar /apache-rat-0.12/apache-rat-0.12.jar -E ${SOURCE_DIR}/.ratignore -d ${SOURCE_DIR} | grep '== File:' | sed 's/== File://' | wc -l`
-
-if [ $COUNT -gt 0 ]
-    then
-        echo "Rat check failed, $COUNT files are missing Apache license headers"
-fi
-
-exit $COUNT
-
diff --git a/.ratignore b/.ratignore
index fefd090..dbf556f 100644
--- a/.ratignore
+++ b/.ratignore
@@ -1,40 +1,39 @@
-# text files
-.*\.clang-format$
-.*\.clang-tidy$
-.*\.cpackignore$
-.*\.gitignore$
-.*\.lcovrc$
-.*\.ratignore$
-.*\.lgtm.yml$
-.*\.ratCheck.sh$
+# rat -E only matches filename components
+# All matches are anchored automatically to who string
 
-.*md$
-.*json$
-.*deprecated_xml_instructions.txt$
+# /
+\.clang-format
+\.clang-tidy
+\.gitignore
+\.ratignore
+\.lgtm.yml
+\.lcovrc
+\.cpackignore
 
-# generated files
-.*Resources.Designer.cs$
-.*Settings.Designer.cs$
+# dependencies/*/
+patches
 
-# public domain
-.*CPPDictionary.hpp$
-.*CPPSymbol.hpp$
-.*CPP_parser.g$
-.*DictEntry.hpp$
-.*Dictionary.cpp$
-.*Dictionary.hpp$
-.*STDCTokenTypes.txt$
-.*Support.cpp$
+# packer/*/
+.*\.cloud-init
+.*\.json
 
-# expect script
-.*changepasswd$
-.*winrm.cloud-init$
+# docs/
+Gemfile.lock
+package-list
+.*\.md
+.*\.md.erb
 
-# doxygen
-.*package-list$
-.*testframeworkdox.txt$
-docs
+# contrib/pdxautoserializer
+# public domain sources
+CPPDictionary.hpp
+CPPSymbol.hpp
+CPP_parser.g
+DictEntry.hpp
+Dictionary.cpp
+Dictionary.hpp
+STDCTokenTypes.txt
+Support.cpp
 
-# patches
-.*patches$
-.*ACE.config.h.in$
+# well known build directories
+build
+cmake-build-.*
diff --git a/.travis.yml b/.travis.yml
index 826c049..304d967 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -29,8 +29,8 @@ env:
     - SOURCE_DIR="/geode-native"
 
   matrix:
-    - DOCKER_COMMAND="cd ${SOURCE_DIR} && ./.ratCheck.sh"
-    - DOCKER_COMMAND="mkdir build && cd build && cmake ${SOURCE_DIR} -DCMAKE_CXX_FLAGS=-stdlib=libc++ -DCMAKE_CXX_CLANG_TIDY=clang-tidy && cmake --build . -- -j2 && ./cppcache/test/apache-geode_unittests && git -C ${SOURCE_DIR} diff --exit-code"
+    - DOCKER_COMMAND="echo rat && mkdir build && cd build && cmake ${SOURCE_DIR} -DUSE_RAT=ON && cmake --build . --target rat-check"
+    - DOCKER_COMMAND="echo test && mkdir build && cd build && cmake ${SOURCE_DIR} -DCMAKE_CXX_FLAGS=-stdlib=libc++ -DCMAKE_CXX_CLANG_TIDY=clang-tidy && cmake --build . -- -j2 && ./cppcache/test/apache-geode_unittests && git -C ${SOURCE_DIR} diff --exit-code"
 
 install:
   - docker pull "${DOCKER_IMAGE}"
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1ae923b..2802259 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,7 +17,8 @@ cmake_minimum_required(VERSION 3.12)
 project(nativeclient LANGUAGES C CXX)
 
 option(USE_PCH "Use precompiled headers (PCH)." OFF)
-option(USE_CPP_COVERAGE "Enable profiling and coverage report analysis for apache-geode cpp library" OFF)
+option(USE_CPP_COVERAGE "Enable profiling and coverage report analysis for apache-geode cpp library." OFF)
+option(USE_RAT "Enable Apache Rat checking." OFF)
 
 list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
 
@@ -40,6 +41,7 @@ endif()
 set(CMAKE_DOTNET_TARGET_FRAMEWORK_VERSION "4.5.2")
 set(DOTNET_TARGET_FRAMEWORK_VERSION "4.5.2")
 set(BUILD_BITS 64 CACHE STRING "Build for 64 (Geode default) or 32 bit.")
+option(BUILD_BENCHMARKS "Build benchmarks" ON)
 
 set(PRODUCT_VENDOR "Apache" CACHE STRING "Product vendor")
 set(PRODUCT_VENDOR_NAME "The Apache Software Foundation" CACHE STRING "Product vendor full legal name")
@@ -363,3 +365,14 @@ install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/templates/ DESTINATION templates
   PATTERN "templates/security/CMakeLists.txt" EXCLUDE
   PATTERN "templates/security/CMakeLists.txt.forInstall" EXCLUDE)
 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/templates/security/CMakeLists.txt.forInstall RENAME CMakeLists.txt DESTINATION templates/security)
+
+if (USE_RAT)
+  add_custom_target( rat-check
+    COMMAND ${CMAKE_COMMAND}
+        -DJava_JAVA_EXECUTABLE=${Java_JAVA_EXECUTABLE}
+        -DRat_JAR=${Rat_JAR}
+        -P cmake/RatCheck.cmake
+    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+    COMMENT "Checking source with Apache Rat."
+  )
+endif()
\ No newline at end of file
diff --git a/packer/windows/uninstall-doxygen.ps1 b/cmake/RatCheck.cmake
similarity index 62%
copy from packer/windows/uninstall-doxygen.ps1
copy to cmake/RatCheck.cmake
index 467d5f1..0590409 100644
--- a/packer/windows/uninstall-doxygen.ps1
+++ b/cmake/RatCheck.cmake
@@ -12,12 +12,21 @@
 # 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.
-# Enable the system password to be retrieved from the AWS Console after this AMI is built and used to launch code
-
-$package = 'doxygen.install'
-$uninstallRegKey = 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\doxygen_is1'
+#
 
-Import-Module C:\ProgramData\chocolatey\helpers\chocolateyInstaller.psm1
-$uninstallPath = (Get-ItemProperty $uninstallRegKey UninstallString).UninstallString
-Uninstall-ChocolateyPackage $package 'exe' '/VERYSILENT' $uninstallPath
+execute_process(
+  COMMAND ${Java_JAVA_EXECUTABLE} -jar ${Rat_JAR} -d . -E .ratignore >
+  OUTPUT_VARIABLE ratOutput
+)
 
+set(pass FALSE)
+if (ratOutput MATCHES "([0-9]+) Unknown Licenses")
+  set(unknownLicenses ${CMAKE_MATCH_1})
+  if (unknownLicenses GREATER 0)
+    message(SEND_ERROR "${ratOutput}")
+    message(FATAL_ERROR "${unknownLicenses} Unknown licenses detected.")
+  endif()
+else()
+  message(SEND_ERROR "${ratOutput}")
+  message(FATAL_ERROR "Unknown failure")
+endif()
diff --git a/cppcache/CMakeLists.txt b/cppcache/CMakeLists.txt
index 1f97c41..e4afd54 100644
--- a/cppcache/CMakeLists.txt
+++ b/cppcache/CMakeLists.txt
@@ -129,5 +129,9 @@ add_subdirectory(shared)
 add_subdirectory(static)
 add_subdirectory(test)
 add_subdirectory(internal)
+add_subdirectory(integration)
 add_subdirectory(integration-test)
-add_subdirectory(integration-test-2)
+
+if (BUILD_BENCHMARKS)
+  add_subdirectory(benchmark)
+endif()
\ No newline at end of file
diff --git a/cppcache/README.md b/cppcache/README.md
new file mode 100644
index 0000000..e947804
--- /dev/null
+++ b/cppcache/README.md
@@ -0,0 +1,37 @@
+Contents
+========
+
+
+## Main sources
+
+# include/
+Public include header files for C++ library.
+
+# src/
+Sources for both static and shared C++ library.
+
+# shared/
+Shared library definition only. Should not contain any sources.
+
+# static/
+Static library definition only. Should not contain any sources.
+
+
+## Test and Benchmark sources
+
+# integration/
+Integration syle tests, benchmarks, and common sources. These are all "modern"
+single process style and shoult not use any of the "legacy" multiple process
+framework.
+
+## integrtion-test/
+Legacy integration tests written in the multiple process framework. No new tests
+should be added to this collections. Fixes and rewrites should be migrated to
+the new framework in the _integration/test_ directory metioned above.
+
+## test/
+Unit style tests.
+
+## benchmark/
+Unit style or micro benchmark tests.
+
diff --git a/packer/windows/install-chocolatey.ps1 b/cppcache/benchmark/CMakeLists.txt
similarity index 69%
copy from packer/windows/install-chocolatey.ps1
copy to cppcache/benchmark/CMakeLists.txt
index 9fa384d..5461abe 100644
--- a/packer/windows/install-chocolatey.ps1
+++ b/cppcache/benchmark/CMakeLists.txt
@@ -4,21 +4,31 @@
 # 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.
-$ErrorActionPreference = "Stop"
 
-write-host "Installing Chocolatey"
+add_executable(cpp-benchmark
+  main.cpp
+  GeodeHashBM.cpp
+  )
 
-# Avoid bug in 7zip when running via WinRM
-$Env:chocolateyUseWindowsCompression = $true
+target_link_libraries(cpp-benchmark
+  PUBLIC
+    apache-geode-static
+    benchmark::benchmark
+  PRIVATE
+    _WarningsAsError
+  )
 
-iwr https://chocolatey.org/install.ps1 | iex
+target_include_directories(cpp-benchmark
+  PRIVATE
+  $<TARGET_PROPERTY:apache-geode-static,SOURCE_DIR>/../src
+  )
 
-write-host "Chocolatey Installed"
+add_clangformat(cpp-benchmark)
diff --git a/cppcache/benchmark/GeodeHashBM.cpp b/cppcache/benchmark/GeodeHashBM.cpp
new file mode 100644
index 0000000..9bb5cb0
--- /dev/null
+++ b/cppcache/benchmark/GeodeHashBM.cpp
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+
+#include <benchmark/benchmark.h>
+
+#include <geode/CacheableString.hpp>
+
+#include "util/string.hpp"
+
+using apache::geode::client::to_utf16;
+using apache::geode::client::internal::geode_hash;
+
+class GeodeHashBM : public benchmark::Fixture {};
+
+BENCHMARK_DEFINE_F(GeodeHashBM, std_string)(benchmark::State& state) {
+  std::string x(state.range(0), 'x');
+  for (auto _ : state) {
+    int hashcode;
+    benchmark::DoNotOptimize(hashcode = geode_hash<std::string>{}(x));
+  }
+}
+BENCHMARK_REGISTER_F(GeodeHashBM, std_string)->Range(8, 8 << 10);
+
+BENCHMARK_DEFINE_F(GeodeHashBM, std_u16string)(benchmark::State& state) {
+  std::u16string x(state.range(0), u'x');
+  for (auto _ : state) {
+    int hashcode;
+    benchmark::DoNotOptimize(hashcode = geode_hash<std::u16string>{}(x));
+  }
+}
+BENCHMARK_REGISTER_F(GeodeHashBM, std_u16string)->Range(8, 8 << 10);
diff --git a/cppcache/integration-test-2/framework/Gfsh.cpp b/cppcache/benchmark/main.cpp
similarity index 93%
copy from cppcache/integration-test-2/framework/Gfsh.cpp
copy to cppcache/benchmark/main.cpp
index d10798d..782f521 100644
--- a/cppcache/integration-test-2/framework/Gfsh.cpp
+++ b/cppcache/benchmark/main.cpp
@@ -15,4 +15,6 @@
  * limitations under the License.
  */
 
-#include "Gfsh.h"
+#include <benchmark/benchmark.h>
+
+BENCHMARK_MAIN();
diff --git a/packer/windows/install-gemfire.ps1 b/cppcache/integration/CMakeLists.txt
similarity index 83%
copy from packer/windows/install-gemfire.ps1
copy to cppcache/integration/CMakeLists.txt
index 1a4ed54..c7e76eb 100644
--- a/packer/windows/install-gemfire.ps1
+++ b/cppcache/integration/CMakeLists.txt
@@ -4,18 +4,18 @@
 # 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.
-$ErrorActionPreference = "Stop"
-Import-Module Packer -Force
 
-mkdir C:\gemfire
-cd C:\gemfire
-cmake -E tar zxf $Home\gemfire.tar.gz
-rm $Home\gemfire.tar.gz
+add_subdirectory(framework)
+add_subdirectory(test)
+
+if (BUILD_BENCHMARKS)
+  add_subdirectory(benchmark)
+endif()
diff --git a/packer/windows/install-chocolatey.ps1 b/cppcache/integration/benchmark/CMakeLists.txt
similarity index 73%
copy from packer/windows/install-chocolatey.ps1
copy to cppcache/integration/benchmark/CMakeLists.txt
index 9fa384d..c15ffeb 100644
--- a/packer/windows/install-chocolatey.ps1
+++ b/cppcache/integration/benchmark/CMakeLists.txt
@@ -4,21 +4,27 @@
 # 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.
-$ErrorActionPreference = "Stop"
 
-write-host "Installing Chocolatey"
+add_executable(cpp-integration-benchmark
+  main.cpp
+  RegionBM.cpp
+  )
 
-# Avoid bug in 7zip when running via WinRM
-$Env:chocolateyUseWindowsCompression = $true
+target_link_libraries(cpp-integration-benchmark
+  PUBLIC
+    apache-geode
+    benchmark::benchmark
+    integration-framework
+  PRIVATE
+    _WarningsAsError
+  )
 
-iwr https://chocolatey.org/install.ps1 | iex
-
-write-host "Chocolatey Installed"
+add_clangformat(cpp-integration-benchmark)
diff --git a/cppcache/integration/benchmark/RegionBM.cpp b/cppcache/integration/benchmark/RegionBM.cpp
new file mode 100644
index 0000000..8ca972f
--- /dev/null
+++ b/cppcache/integration/benchmark/RegionBM.cpp
@@ -0,0 +1,130 @@
+/*
+ * 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.
+ */
+
+#include <benchmark/benchmark.h>
+#include <framework/Cluster.h>
+#include <framework/Gfsh.h>
+
+#include <boost/log/core.hpp>
+#include <boost/log/expressions.hpp>
+#include <boost/log/trivial.hpp>
+
+#include <geode/Cache.hpp>
+#include <geode/CacheableString.hpp>
+#include <geode/PoolManager.hpp>
+#include <geode/RegionFactory.hpp>
+#include <geode/RegionShortcut.hpp>
+
+using apache::geode::client::Cache;
+using apache::geode::client::CacheableInt32;
+using apache::geode::client::CacheableString;
+using apache::geode::client::Region;
+using apache::geode::client::RegionShortcut;
+
+namespace {
+
+class RegionBM : public benchmark::Fixture {
+ public:
+  RegionBM() {
+    boost::log::core::get()->set_filter(boost::log::trivial::severity >=
+                                        boost::log::trivial::warning);
+  }
+
+  using benchmark::Fixture::SetUp;
+  void SetUp(benchmark::State&) override {
+    if (!cluster) {
+      cluster = std::unique_ptr<Cluster>(
+          new Cluster(Name{name_}, LocatorCount{1}, ServerCount{1}));
+      cluster->getGfsh()
+          .create()
+          .region()
+          .withName("region")
+          .withType("REPLICATE")
+          .execute();
+
+      cache = std::unique_ptr<Cache>(new Cache(cluster->createCache()));
+      region = cache->createRegionFactory(RegionShortcut::PROXY)
+                   .setPoolName("default")
+                   .create("region");
+    }
+  }
+
+  using benchmark::Fixture::TearDown;
+  void TearDown(benchmark::State&) override {
+    if (cluster) {
+      region = nullptr;
+      cache = nullptr;
+      cluster = nullptr;
+    }
+  }
+
+ protected:
+  void SetName(const char* name) {
+    name_ = name;
+
+    Benchmark::SetName(name);
+  }
+
+  std::unique_ptr<Cluster> cluster;
+  std::unique_ptr<Cache> cache;
+  std::shared_ptr<Region> region;
+
+ private:
+  std::string name_;
+};
+
+BENCHMARK_F(RegionBM, put_string)(benchmark::State& state) {
+  auto key = CacheableString::create("key");
+  auto value = CacheableString::create("value");
+
+  for (auto _ : state) {
+    region->put(key, value);
+  }
+}
+
+BENCHMARK_F(RegionBM, put_int)(benchmark::State& state) {
+  auto key = CacheableInt32::create(1);
+  auto value = CacheableInt32::create(1);
+
+  for (auto _ : state) {
+    region->put(key, value);
+  }
+}
+
+BENCHMARK_F(RegionBM, get_string)(benchmark::State& state) {
+  auto key = CacheableString::create("key");
+  auto value = CacheableString::create("value");
+
+  region->put(key, value);
+
+  for (auto _ : state) {
+    region->get(key);
+  }
+}
+
+BENCHMARK_F(RegionBM, get_int)(benchmark::State& state) {
+  auto key = CacheableInt32::create(1);
+  auto value = CacheableInt32::create(1);
+
+  region->put(key, value);
+
+  for (auto _ : state) {
+    region->get(key);
+  }
+}
+
+}  // namespace
diff --git a/cppcache/integration-test-2/framework/Gfsh.cpp b/cppcache/integration/benchmark/main.cpp
similarity index 93%
copy from cppcache/integration-test-2/framework/Gfsh.cpp
copy to cppcache/integration/benchmark/main.cpp
index d10798d..782f521 100644
--- a/cppcache/integration-test-2/framework/Gfsh.cpp
+++ b/cppcache/integration/benchmark/main.cpp
@@ -15,4 +15,6 @@
  * limitations under the License.
  */
 
-#include "Gfsh.h"
+#include <benchmark/benchmark.h>
+
+BENCHMARK_MAIN();
diff --git a/cppcache/integration-test-2/framework/.clang-tidy b/cppcache/integration/framework/.clang-tidy
similarity index 100%
rename from cppcache/integration-test-2/framework/.clang-tidy
rename to cppcache/integration/framework/.clang-tidy
diff --git a/packer/windows/uninstall-doxygen.ps1 b/cppcache/integration/framework/CMakeLists.txt
similarity index 50%
copy from packer/windows/uninstall-doxygen.ps1
copy to cppcache/integration/framework/CMakeLists.txt
index 467d5f1..50b7d29 100644
--- a/packer/windows/uninstall-doxygen.ps1
+++ b/cppcache/integration/framework/CMakeLists.txt
@@ -12,12 +12,50 @@
 # 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.
-# Enable the system password to be retrieved from the AWS Console after this AMI is built and used to launch code
 
-$package = 'doxygen.install'
-$uninstallRegKey = 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\doxygen_is1'
+configure_file(config.h.in config.h)
 
-Import-Module C:\ProgramData\chocolatey\helpers\chocolateyInstaller.psm1
-$uninstallPath = (Get-ItemProperty $uninstallRegKey UninstallString).UninstallString
-Uninstall-ChocolateyPackage $package 'exe' '/VERYSILENT' $uninstallPath
+add_library(integration-framework STATIC
+  Gfsh.cpp
+  Gfsh.h
+  Framework.cpp
+  Framework.h
+  Cluster.cpp
+  Cluster.h
+  GfshExecute.cpp
+  GfshExecute.h
+  )
 
+target_compile_definitions(integration-framework
+  PUBLIC
+    BOOST_ASIO_HAS_MOVE
+)
+
+target_include_directories(integration-framework
+  PUBLIC
+    ${CMAKE_CURRENT_SOURCE_DIR}/..
+  PRIVATE
+    ${CMAKE_CURRENT_BINARY_DIR}
+
+)
+
+target_link_libraries(integration-framework
+  PUBLIC
+    apache-geode
+    GTest::GTest
+    Boost::boost
+    Boost::system
+    Boost::log
+    Boost::filesystem
+  PRIVATE
+    _WarningsAsError
+    internal
+)
+
+if(WIN32)
+  target_compile_definitions(integration-framework
+    PUBLIC
+      # Required for Boost.WinAPI
+      _WIN32_WINNT=0x06020000
+  )
+endif()
diff --git a/cppcache/integration-test-2/framework/Cluster.cpp b/cppcache/integration/framework/Cluster.cpp
similarity index 100%
rename from cppcache/integration-test-2/framework/Cluster.cpp
rename to cppcache/integration/framework/Cluster.cpp
diff --git a/cppcache/integration-test-2/framework/Cluster.h b/cppcache/integration/framework/Cluster.h
similarity index 99%
rename from cppcache/integration-test-2/framework/Cluster.h
rename to cppcache/integration/framework/Cluster.h
index a8aefad..06a8a84 100644
--- a/cppcache/integration-test-2/framework/Cluster.h
+++ b/cppcache/integration/framework/Cluster.h
@@ -23,7 +23,7 @@
 #include <cstdint>
 #include <string>
 
-#include <gtest/gtest.h>
+#include "gtest/gtest.h"
 
 #include <geode/Cache.hpp>
 #include <geode/PoolManager.hpp>
diff --git a/cppcache/integration-test-2/framework/Framework.cpp b/cppcache/integration/framework/Framework.cpp
similarity index 100%
rename from cppcache/integration-test-2/framework/Framework.cpp
rename to cppcache/integration/framework/Framework.cpp
diff --git a/cppcache/integration-test-2/framework/Framework.h b/cppcache/integration/framework/Framework.h
similarity index 100%
rename from cppcache/integration-test-2/framework/Framework.h
rename to cppcache/integration/framework/Framework.h
diff --git a/cppcache/integration-test-2/framework/Gfsh.cpp b/cppcache/integration/framework/Gfsh.cpp
similarity index 100%
rename from cppcache/integration-test-2/framework/Gfsh.cpp
rename to cppcache/integration/framework/Gfsh.cpp
diff --git a/cppcache/integration-test-2/framework/Gfsh.h b/cppcache/integration/framework/Gfsh.h
similarity index 100%
rename from cppcache/integration-test-2/framework/Gfsh.h
rename to cppcache/integration/framework/Gfsh.h
diff --git a/cppcache/integration-test-2/framework/GfshExecute.cpp b/cppcache/integration/framework/GfshExecute.cpp
similarity index 97%
rename from cppcache/integration-test-2/framework/GfshExecute.cpp
rename to cppcache/integration/framework/GfshExecute.cpp
index b9d8f69..5ae9023 100644
--- a/cppcache/integration-test-2/framework/GfshExecute.cpp
+++ b/cppcache/integration/framework/GfshExecute.cpp
@@ -55,11 +55,11 @@ void GfshExecute::execute(const std::string &command) {
   std::string line;
 
   while (outStream && std::getline(outStream, line)) {
-    BOOST_LOG_TRIVIAL(debug) << "Gfsh::execute: " << line;
+    BOOST_LOG_TRIVIAL(trace) << "Gfsh::execute: " << line;
   }
 
   while (errStream && std::getline(errStream, line)) {
-    BOOST_LOG_TRIVIAL(error) << "Gfsh::execute: " << line;
+    BOOST_LOG_TRIVIAL(debug) << "Gfsh::execute: " << line;
   }
 
   gfsh.wait();
diff --git a/cppcache/integration-test-2/framework/GfshExecute.h b/cppcache/integration/framework/GfshExecute.h
similarity index 100%
rename from cppcache/integration-test-2/framework/GfshExecute.h
rename to cppcache/integration/framework/GfshExecute.h
diff --git a/cppcache/integration-test-2/framework/config.h.in b/cppcache/integration/framework/config.h.in
similarity index 100%
rename from cppcache/integration-test-2/framework/config.h.in
rename to cppcache/integration/framework/config.h.in
diff --git a/cppcache/integration-test-2/CMakeLists.txt b/cppcache/integration/test/CMakeLists.txt
similarity index 68%
rename from cppcache/integration-test-2/CMakeLists.txt
rename to cppcache/integration/test/CMakeLists.txt
index ddd14ed..f2552ed 100644
--- a/cppcache/integration-test-2/CMakeLists.txt
+++ b/cppcache/integration/test/CMakeLists.txt
@@ -13,40 +13,33 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-configure_file(framework/config.h.in config.h)
-
-add_executable(integration-test-2
+add_executable(cpp-integration-test
   ExampleTest.cpp
-  framework/Gfsh.cpp
-  framework/Gfsh.h
-  framework/Framework.cpp
-  framework/Framework.h
-  framework/Cluster.cpp
-  framework/Cluster.h
-  framework/GfshExecute.cpp
-  framework/GfshExecute.h
   RegionPutGetAllTest.cpp
   PdxInstanceTest.cpp
   RegisterKeysTest.cpp
   StructTest.cpp
   EnableChunkHandlerThreadTest.cpp
   DataSerializableTest.cpp
-  FunctionExecutionTest.cpp)
+  FunctionExecutionTest.cpp
+  StructTest.cpp
+)
 
-target_compile_definitions(integration-test-2
+target_compile_definitions(cpp-integration-test
   PUBLIC
     BOOST_ASIO_HAS_MOVE
     GTEST_ELLIPSIS_NEEDS_POD_
 )
 
-target_include_directories(integration-test-2
+target_include_directories(cpp-integration-test
   PUBLIC
    ${CMAKE_CURRENT_BINARY_DIR}
 )
 
-target_link_libraries(integration-test-2
+target_link_libraries(cpp-integration-test
   PUBLIC
     apache-geode
+    integration-framework
     testobject
     ACE
     GTest::GTest
@@ -61,28 +54,28 @@ target_link_libraries(integration-test-2
 )
 
 if(WIN32)
-  target_compile_definitions(integration-test-2
+  target_compile_definitions(cpp-integration-test
     PUBLIC
       # Required for Boost.WinAPI
       _WIN32_WINNT=0x06020000
   )
 
   foreach (_target apache-geode testobject)
-    add_custom_command(TARGET integration-test-2 POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different
+    add_custom_command(TARGET cpp-integration-test POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different
         "$<TARGET_FILE:${_target}>"
         "$<$<CONFIG:Debug>:$<TARGET_PDB_FILE:${_target}>>"
-        "$<TARGET_FILE_DIR:integration-test-2>")
+        "$<TARGET_FILE_DIR:cpp-integration-test>")
   endforeach()
 endif()
 
-set_target_properties(integration-test-2 PROPERTIES
+set_target_properties(cpp-integration-test PROPERTIES
   CXX_VISIBILITY_PRESET hidden
   VISIBILITY_INLINES_HIDDEN ON
   FOLDER cpp/test/integration
 )
 
-add_clangformat(integration-test-2)
+add_clangformat(cpp-integration-test)
 
 enable_testing()
 include(GoogleTest)
-gtest_discover_tests(integration-test-2)
\ No newline at end of file
+gtest_discover_tests(cpp-integration-test)
diff --git a/cppcache/integration-test-2/DataSerializableTest.cpp b/cppcache/integration/test/DataSerializableTest.cpp
similarity index 100%
rename from cppcache/integration-test-2/DataSerializableTest.cpp
rename to cppcache/integration/test/DataSerializableTest.cpp
diff --git a/cppcache/integration-test-2/EnableChunkHandlerThreadTest.cpp b/cppcache/integration/test/EnableChunkHandlerThreadTest.cpp
similarity index 100%
rename from cppcache/integration-test-2/EnableChunkHandlerThreadTest.cpp
rename to cppcache/integration/test/EnableChunkHandlerThreadTest.cpp
diff --git a/cppcache/integration-test-2/ExampleTest.cpp b/cppcache/integration/test/ExampleTest.cpp
similarity index 97%
rename from cppcache/integration-test-2/ExampleTest.cpp
rename to cppcache/integration/test/ExampleTest.cpp
index 6458ac1..bd96453 100644
--- a/cppcache/integration-test-2/ExampleTest.cpp
+++ b/cppcache/integration/test/ExampleTest.cpp
@@ -15,6 +15,10 @@
  * limitations under the License.
  */
 
+#include <framework/Cluster.h>
+#include <framework/Framework.h>
+#include <framework/Gfsh.h>
+
 #include <future>
 #include <iostream>
 #include <random>
@@ -27,10 +31,6 @@
 #include <geode/RegionFactory.hpp>
 #include <geode/RegionShortcut.hpp>
 
-#include "framework/Cluster.h"
-#include "framework/Framework.h"
-#include "framework/Gfsh.h"
-
 namespace {
 
 using apache::geode::client::Cache;
diff --git a/cppcache/integration-test-2/FunctionExecutionTest.cpp b/cppcache/integration/test/FunctionExecutionTest.cpp
similarity index 100%
rename from cppcache/integration-test-2/FunctionExecutionTest.cpp
rename to cppcache/integration/test/FunctionExecutionTest.cpp
diff --git a/cppcache/integration-test-2/PdxInstanceTest.cpp b/cppcache/integration/test/PdxInstanceTest.cpp
similarity index 99%
rename from cppcache/integration-test-2/PdxInstanceTest.cpp
rename to cppcache/integration/test/PdxInstanceTest.cpp
index dadbe32..b68a1a5 100644
--- a/cppcache/integration-test-2/PdxInstanceTest.cpp
+++ b/cppcache/integration/test/PdxInstanceTest.cpp
@@ -15,6 +15,9 @@
  * limitations under the License.
  */
 
+#include <framework/Cluster.h>
+#include <framework/Gfsh.h>
+
 #include <future>
 #include <initializer_list>
 #include <iostream>
@@ -33,8 +36,6 @@
 #include "LocalRegion.hpp"
 #include "NestedPdxObject.hpp"
 #include "PdxType.hpp"
-#include "framework/Cluster.h"
-#include "framework/Gfsh.h"
 
 namespace {
 
diff --git a/cppcache/integration/test/RegionGetAllTest.cpp b/cppcache/integration/test/RegionGetAllTest.cpp
new file mode 100644
index 0000000..b032f96
--- /dev/null
+++ b/cppcache/integration/test/RegionGetAllTest.cpp
@@ -0,0 +1,94 @@
+/*
+ * 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.
+ */
+
+#include <future>
+#include <iostream>
+#include <random>
+#include <thread>
+
+#include <gtest/gtest.h>
+
+#include <geode/Cache.hpp>
+#include <geode/PoolManager.hpp>
+#include <geode/RegionFactory.hpp>
+#include <geode/RegionShortcut.hpp>
+
+#include "framework/Cluster.h"
+#include "framework/Framework.h"
+#include "framework/Gfsh.h"
+
+namespace {
+
+using apache::geode::client::Cache;
+using apache::geode::client::CacheableString;
+using apache::geode::client::Pool;
+using apache::geode::client::Region;
+using apache::geode::client::RegionShortcut;
+
+using std::chrono::minutes;
+
+Cache createCache() {
+  using apache::geode::client::CacheFactory;
+
+  auto cache = CacheFactory()
+                   .set("log-level", "none")
+                   .set("statistic-sampling-enabled", "false")
+                   .create();
+
+  return cache;
+}
+
+std::shared_ptr<Pool> createPool(Cluster& cluster, Cache& cache) {
+  auto poolFactory = cache.getPoolManager().createFactory();
+  cluster.applyLocators(poolFactory);
+  poolFactory.setPRSingleHopEnabled(true);
+  return poolFactory.create("default");
+}
+
+std::shared_ptr<Region> setupRegion(Cache& cache,
+                                    const std::shared_ptr<Pool>& pool) {
+  auto region = cache.createRegionFactory(RegionShortcut::PROXY)
+                    .setPoolName(pool->getName())
+                    .create("region");
+
+  return region;
+}
+
+TEST(RegionGetAllTest, getAllFromPartitionedRegion) {
+  Cluster cluster{LocatorCount{1}, ServerCount{2}};
+  cluster.getGfsh()
+      .create()
+      .region()
+      .withName("region")
+      .withType("PARTITION")
+      .execute();
+
+  auto cache = createCache();
+  auto pool = createPool(cluster, cache);
+  auto region = setupRegion(cache, pool);
+
+  region->put(1, "one");
+  region->put(2, "two");
+
+  auto keys = region->serverKeys();
+
+  for (int i = 0; i < 100; i++) {
+    auto all = region->getAll(keys);
+  }
+}
+
+}  // namespace
diff --git a/cppcache/integration/test/RegionPutAllTest.cpp b/cppcache/integration/test/RegionPutAllTest.cpp
new file mode 100644
index 0000000..03bd31f
--- /dev/null
+++ b/cppcache/integration/test/RegionPutAllTest.cpp
@@ -0,0 +1,102 @@
+/*
+ * 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.
+ */
+
+#include <chrono>
+#include <future>
+#include <iostream>
+#include <random>
+#include <thread>
+
+#include <gtest/gtest.h>
+
+#include <geode/Cache.hpp>
+#include <geode/PoolManager.hpp>
+#include <geode/RegionFactory.hpp>
+#include <geode/RegionShortcut.hpp>
+
+#include "CacheRegionHelper.hpp"
+#include "framework/Cluster.h"
+#include "framework/Framework.h"
+#include "framework/Gfsh.h"
+
+namespace {
+
+using apache::geode::client::Cache;
+using apache::geode::client::Cacheable;
+using apache::geode::client::CacheableKey;
+using apache::geode::client::CacheableString;
+using apache::geode::client::HashMapOfCacheable;
+using apache::geode::client::Pool;
+using apache::geode::client::Region;
+using apache::geode::client::RegionShortcut;
+
+using std::chrono::minutes;
+
+Cache createCache() {
+  using apache::geode::client::CacheFactory;
+
+  auto cache = CacheFactory()
+                   .set("log-level", "debug")
+                   .set("statistic-sampling-enabled", "false")
+                   .create();
+
+  return cache;
+}
+
+std::shared_ptr<Pool> createPool(Cluster& cluster, Cache& cache) {
+  auto poolFactory = cache.getPoolManager().createFactory();
+  cluster.applyLocators(poolFactory);
+  poolFactory.setPRSingleHopEnabled(true);
+  return poolFactory.create("default");
+}
+
+std::shared_ptr<Region> setupRegion(Cache& cache,
+                                    const std::shared_ptr<Pool>& pool) {
+  auto region = cache.createRegionFactory(RegionShortcut::PROXY)
+                    .setPoolName(pool->getName())
+                    .create("region");
+
+  return region;
+}
+
+TEST(RegionPutAllTest, putAllToPartitionedRegion) {
+  Cluster cluster{LocatorCount{1}, ServerCount{2}};
+  cluster.getGfsh()
+      .create()
+      .region()
+      .withName("region")
+      .withType("PARTITION")
+      .execute();
+
+  auto cache = createCache();
+  auto pool = createPool(cluster, cache);
+  auto region = setupRegion(cache, pool);
+
+  HashMapOfCacheable all;
+  for (int i = 0; i < 100; i++) {
+    region->put(CacheableKey::create(i), Cacheable::create(std::to_string(i)));
+    all.emplace(CacheableKey::create(i), Cacheable::create(std::to_string(i)));
+  }
+
+  for (int i = 0; i < 100; i++) {
+    // TODO some way force synchronous client metadata update first.
+    region->putAll(all);
+    std::this_thread::sleep_for(std::chrono::seconds(1));
+  }
+}
+
+}  // namespace
diff --git a/cppcache/integration-test-2/RegionPutGetAllTest.cpp b/cppcache/integration/test/RegionPutGetAllTest.cpp
similarity index 98%
rename from cppcache/integration-test-2/RegionPutGetAllTest.cpp
rename to cppcache/integration/test/RegionPutGetAllTest.cpp
index 4b5633f..16ca0e7 100644
--- a/cppcache/integration-test-2/RegionPutGetAllTest.cpp
+++ b/cppcache/integration/test/RegionPutGetAllTest.cpp
@@ -15,6 +15,10 @@
  * limitations under the License.
  */
 
+#include <framework/Cluster.h>
+#include <framework/Gfsh.h>
+
+#include <VariousPdxTypes.hpp>
 #include <future>
 #include <initializer_list>
 #include <iostream>
@@ -29,10 +33,6 @@
 #include <geode/RegionShortcut.hpp>
 #include <geode/TypeRegistry.hpp>
 
-#include "VariousPdxTypes.hpp"
-#include "framework/Cluster.h"
-#include "framework/Gfsh.h"
-
 namespace {
 
 using apache::geode::client::Cache;
diff --git a/cppcache/integration-test-2/RegisterKeysTest.cpp b/cppcache/integration/test/RegisterKeysTest.cpp
similarity index 100%
rename from cppcache/integration-test-2/RegisterKeysTest.cpp
rename to cppcache/integration/test/RegisterKeysTest.cpp
diff --git a/cppcache/integration-test-2/StructTest.cpp b/cppcache/integration/test/StructTest.cpp
similarity index 97%
rename from cppcache/integration-test-2/StructTest.cpp
rename to cppcache/integration/test/StructTest.cpp
index 6f5d0d0..b65c6d7 100644
--- a/cppcache/integration-test-2/StructTest.cpp
+++ b/cppcache/integration/test/StructTest.cpp
@@ -15,6 +15,9 @@
  * limitations under the License.
  */
 
+#include <framework/Cluster.h>
+#include <framework/Framework.h>
+#include <framework/Gfsh.h>
 #include <hacks/range.h>
 
 #include <iostream>
@@ -29,10 +32,6 @@
 #include <geode/RegionShortcut.hpp>
 #include <geode/Struct.hpp>
 
-#include "framework/Cluster.h"
-#include "framework/Framework.h"
-#include "framework/Gfsh.h"
-
 namespace {
 
 using apache::geode::client::Cache;
diff --git a/dependencies/CMakeLists.txt b/dependencies/CMakeLists.txt
index f86a418..9830e6b 100644
--- a/dependencies/CMakeLists.txt
+++ b/dependencies/CMakeLists.txt
@@ -12,6 +12,7 @@
 # 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.
+
 cmake_minimum_required( VERSION 3.10 )
 project( dependencies LANGUAGES NONE )
 
@@ -26,10 +27,11 @@ set ( DEPENDENCIES
 	sqlite
 	doxygen
 	gtest
+  benchmark
 )
 
-if ( "" STREQUAL "${USE_C++}" )
-  set (DEPENDENCIES STLport ${DEPENDENCIES})
+if (USE_RAT)
+  list(APPEND DEPENDENCIES rat)
 endif()
 
 include(CheckCCompilerFlag)
@@ -61,8 +63,8 @@ if (WIN32)
   elseif(MSVC14)
     set(MSVC_VERSION 14)
   endIF()
-  
-  set(DEPENDENCIES ${DEPENDENCIES} sqlite-netFx)
+
+  list(APPEND DEPENDENCIES sqlite-netFx)
 endif()
 
 # TODO autoconfig?
@@ -101,4 +103,3 @@ foreach(_D ${DEPENDENCIES})
 endforeach(_D)
 
 set(sqlite-netFx_SHARED_LIB ${sqlite-netFx_SHARED_LIB} PARENT_SCOPE)
-
diff --git a/dependencies/benchmark/CMakeLists.txt b/dependencies/benchmark/CMakeLists.txt
new file mode 100644
index 0000000..4bd80bb
--- /dev/null
+++ b/dependencies/benchmark/CMakeLists.txt
@@ -0,0 +1,78 @@
+# 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.
+
+project( benchmark LANGUAGES NONE )
+
+set( ${PROJECT_NAME}_VERSION 1.4.1 )
+set( ${PROJECT_NAME}_SHA265 61ae07eb5d4a0b02753419eb17a82b7d322786bb36ab62bd3df331a4d47c00a7 )
+set( ${PROJECT_NAME}_URL "https://github.com/google/benchmark/archive/v${${PROJECT_NAME}_VERSION}.zip" )
+set( ${PROJECT_NAME}_EXTERN ${PROJECT_NAME}-extern )
+set( ${PROJECT_NAME}_DEPENDS gtest_gtest )
+
+include(ExternalProject)
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")
+endif()
+
+ExternalProject_Add( ${${PROJECT_NAME}_EXTERN}
+   URL ${${PROJECT_NAME}_URL}
+   URL_HASH SHA256=${${PROJECT_NAME}_SHA265}
+   UPDATE_COMMAND ""
+   CMAKE_ARGS
+    -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
+    -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
+    -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
+	  -DCMAKE_BUILD_TYPE=$<CONFIG>
+    -DGTEST_ROOT=$<TARGET_PROPERTY:GTest::GTest,INTERFACE_INCLUDE_DIRECTORIES>/..
+    -DBENCHMARK_ENABLE_TESTING=OFF
+   DEPENDS ${${PROJECT_NAME}_DEPENDS}
+)
+
+ExternalProject_Get_Property( ${${PROJECT_NAME}_EXTERN} SOURCE_DIR )
+ExternalProject_Get_Property( ${${PROJECT_NAME}_EXTERN} INSTALL_DIR )
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
+  set(PATCH_FILE ${CMAKE_CURRENT_SOURCE_DIR}/patches)
+  ExternalProject_Add_Step(${${PROJECT_NAME}_EXTERN} patches
+    ALWAYS 0
+    DEPENDEES download
+    DEPENDERS patch
+    DEPENDS ${PATCH_FILE}
+    BYPRODUCTS ${SOURCE_DIR}/CMakeLists.txt
+    WORKING_DIRECTORY ${SOURCE_DIR}
+    COMMAND ${PATCH} -u -N -p1 < ${PATCH_FILE}
+  )
+endif()
+
+add_library(${PROJECT_NAME} INTERFACE)
+target_include_directories(${PROJECT_NAME} SYSTEM INTERFACE
+  $<BUILD_INTERFACE:${INSTALL_DIR}/include>
+)
+target_link_libraries(${PROJECT_NAME} INTERFACE
+  ${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}benchmark${CMAKE_STATIC_LIBRARY_SUFFIX}
+)
+if (WIN32)
+target_link_libraries(${PROJECT_NAME} INTERFACE
+  Shlwapi
+)
+elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
+  target_link_libraries(${PROJECT_NAME} INTERFACE
+    kstat
+  )
+endif()
+add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXTERN})
+
+add_library(benchmark::benchmark ALIAS ${PROJECT_NAME})
diff --git a/dependencies/benchmark/patches b/dependencies/benchmark/patches
new file mode 100644
index 0000000..57907d4
--- /dev/null
+++ b/dependencies/benchmark/patches
@@ -0,0 +1,12 @@
+diff -ru a/CMakeLists.txt b/CMakeLists.txt
+--- a/CMakeLists.txt	Tue Apr  3 22:12:47 2018
++++ b/CMakeLists.txt	Sun May  6 00:15:34 2018
+@@ -120,6 +120,8 @@
+     set(CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL "${CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL} /LTCG")
+     set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} /LTCG")
+   endif()
++elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "SunPro")
++  add_cxx_compiler_flag(-std=c++11)
+ else()
+   # Try and enable C++11. Don't use C++14 because it doesn't work in some
+   # configurations.
diff --git a/dependencies/boost/CMakeLists.txt b/dependencies/boost/CMakeLists.txt
index 11db424..392998a 100644
--- a/dependencies/boost/CMakeLists.txt
+++ b/dependencies/boost/CMakeLists.txt
@@ -133,9 +133,11 @@ target_link_libraries(${PROJECT_NAME} INTERFACE
 add_library(Boost::boost ALIAS boost)
 add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXTERN})
 
+find_package(Threads REQUIRED)
+
 add_boost_library(system DEPENDENCIES Boost::boost)
 add_boost_library(atomic DEPENDENCIES Boost::boost)
-add_boost_library(thread DEPENDENCIES Boost::atomic Boost::boost)
+add_boost_library(thread DEPENDENCIES Threads::Threads Boost::atomic Boost::boost)
 add_boost_library(filesystem DEPENDENCIES Boost::system Boost::boost)
 add_boost_library(log DEPENDENCIES Boost::thread Boost::filesystem Boost::boost)
 add_boost_library(log_setup DEPENDENCIES Boost::log)
diff --git a/dependencies/gtest/CMakeLists.txt b/dependencies/gtest/CMakeLists.txt
index b93c7ff..298995e 100644
--- a/dependencies/gtest/CMakeLists.txt
+++ b/dependencies/gtest/CMakeLists.txt
@@ -4,9 +4,9 @@
 # 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.
@@ -27,47 +27,33 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
 endif()
 
 ExternalProject_Add( ${${PROJECT_NAME}_EXTERN}
-   URL ${${PROJECT_NAME}_URL}
-   URL_HASH SHA256=${${PROJECT_NAME}_SHA265}
-   UPDATE_COMMAND ""
-   INSTALL_COMMAND ""
-   CMAKE_ARGS -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS} -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} -Dgtest_force_shared_crt:BOOL=ON
+  URL ${${PROJECT_NAME}_URL}
+  URL_HASH SHA256=${${PROJECT_NAME}_SHA265}
+  CMAKE_ARGS
+    -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
+    -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
+    -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
+    -DCMAKE_BUILD_TYPE=$<CONFIG>
+    -Dgtest_force_shared_crt:BOOL=ON
 )
 
-ExternalProject_Get_Property( ${${PROJECT_NAME}_EXTERN} SOURCE_DIR )
-set( ${PROJECT_NAME}_gtest_SOURCE_DIR ${SOURCE_DIR}/googletest )
-set( ${PROJECT_NAME}_gmock_SOURCE_DIR ${SOURCE_DIR}/googlemock )
 ExternalProject_Get_Property( ${${PROJECT_NAME}_EXTERN} INSTALL_DIR )
-set( ${PROJECT_NAME}_INSTALL_DIR ${INSTALL_DIR} )
-ExternalProject_Get_Property( ${${PROJECT_NAME}_EXTERN} BINARY_DIR )
-set( ${PROJECT_NAME}_gtest_BINARY_DIR ${BINARY_DIR}/googlemock/gtest/${_DEBUG_OR_RELEASE} )
-set( ${PROJECT_NAME}_gmock_BINARY_DIR ${BINARY_DIR}/googlemock/${_DEBUG_OR_RELEASE} )
-set( DEPENDENCIES_${PROJECT_NAME}_DIR ${${PROJECT_NAME}_BINARY_DIR} PARENT_SCOPE)
-
-set( ${PROJECT_NAME}_STATIC_LIB
-${${PROJECT_NAME}_gtest_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
-${${PROJECT_NAME}_gtest_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX}
-${${PROJECT_NAME}_gmock_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock${CMAKE_STATIC_LIBRARY_SUFFIX}
-${${PROJECT_NAME}_gmock_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gmock_main${CMAKE_STATIC_LIBRARY_SUFFIX}
-PARENT_SCOPE)
 
 add_library(${PROJECT_NAME}_gtest INTERFACE)
 target_include_directories(${PROJECT_NAME}_gtest SYSTEM INTERFACE
-  $<BUILD_INTERFACE:${${PROJECT_NAME}_gtest_SOURCE_DIR}/include>
-  $<BUILD_INTERFACE:${${PROJECT_NAME}_gmock_SOURCE_DIR}/include>
+  $<BUILD_INTERFACE:${INSTALL_DIR}/include>
 )
 target_link_libraries(${PROJECT_NAME}_gtest INTERFACE
-  ${${PROJECT_NAME}_gtest_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
+  ${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
 )
 add_dependencies(${PROJECT_NAME}_gtest ${${PROJECT_NAME}_EXTERN})
 
 add_library(${PROJECT_NAME}_gtest_main INTERFACE)
 target_include_directories(${PROJECT_NAME}_gtest_main SYSTEM INTERFACE
-  $<BUILD_INTERFACE:${${PROJECT_NAME}_gtest_SOURCE_DIR}/include>
-  $<BUILD_INTERFACE:${${PROJECT_NAME}_gmock_SOURCE_DIR}/include>
+  $<BUILD_INTERFACE:${INSTALL_DIR}/include>
 )
 target_link_libraries(${PROJECT_NAME}_gtest_main INTERFACE
-  ${${PROJECT_NAME}_gtest_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX}
+  ${INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX}gtest_main${CMAKE_STATIC_LIBRARY_SUFFIX}
 )
 add_dependencies(${PROJECT_NAME}_gtest_main ${${PROJECT_NAME}_EXTERN})
 
diff --git a/packer/windows/add-user-build.ps1 b/dependencies/rat/CMakeLists.txt
similarity index 51%
copy from packer/windows/add-user-build.ps1
copy to dependencies/rat/CMakeLists.txt
index 042d0e6..bfb8771 100644
--- a/packer/windows/add-user-build.ps1
+++ b/dependencies/rat/CMakeLists.txt
@@ -12,17 +12,21 @@
 # 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.
-$user = "build"
-$pass = "p1votal!"
 
-net.exe user $user $pass /add
-net.exe localgroup Administrators $user /add
-wmic.exe UserAccount where "Name='$user'" set PasswordExpires=False
+project( rat LANGUAGES NONE )
+# used to check licenses in source
 
-$spw = ConvertTo-SecureString $pass -AsPlainText -Force
-$cred = New-Object System.Management.Automation.PSCredential -ArgumentList $user,$spw
-Start-Process cmd /c -WindowStyle Hidden -Credential $cred -ErrorAction SilentlyContinue
+set( ARTIFACT_VERSION 0.12 )
+set( ARTIFACT_SHA265 cedf78f6d213226464784ecb999b54515c97eab8a2f9b82514292f837cf88b93 )
+set( ARTIFACT_NAME apache-rat-${ARTIFACT_VERSION} )
+set( ARTIFACT_FILE apache-rat-${ARTIFACT_VERSION}-bin.tar.gz )
+set( ARTIFACT_URL "https://www.apache.org/dyn/closer.cgi?action=download&filename=creadur/${ARTIFACT_NAME}/${ARTIFACT_FILE}" )
 
 
-schtasks.exe /Create /TN init-user-build /RU SYSTEM /SC ONSTART /TR "powershell.exe -File 'C:\Users\build\init-user-build.ps1'" 
+file( DOWNLOAD ${ARTIFACT_URL} ${CMAKE_CURRENT_BINARY_DIR}/${ARTIFACT_FILE} )
+execute_process(
+  COMMAND ${CMAKE_COMMAND} -E tar xzf ${ARTIFACT_FILE}
+  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+)
 
+set( Rat_JAR ${CMAKE_CURRENT_BINARY_DIR}/${ARTIFACT_NAME}/${ARTIFACT_NAME}.jar CACHE STRING "Full path to Apaceh Rat jar." )
diff --git a/docs/docker/Dockerfile b/docs/docker/Dockerfile
index 82b3aed..ad5d674 100644
--- a/docs/docker/Dockerfile
+++ b/docs/docker/Dockerfile
@@ -1,3 +1,19 @@
+# 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.
+
 FROM ubuntu:latest
 
 RUN apt-get update
diff --git a/packer/solaris/changepasswd b/packer/solaris/changepasswd
index 2cfe960..caae9c0 100755
--- a/packer/solaris/changepasswd
+++ b/packer/solaris/changepasswd
@@ -1,4 +1,18 @@
 #!/usr/bin/env expect -f
+# 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.
 
 set force_conservative 0  ;# set to 1 to force conservative mode even if
                           ;# script wasn't run conservatively originally
diff --git a/packer/windows/Packer.psm1 b/packer/windows/Packer.psm1
index 062e23f..6ca5962 100644
--- a/packer/windows/Packer.psm1
+++ b/packer/windows/Packer.psm1
@@ -12,6 +12,7 @@
 # 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.
+
 Set-PSDebug -Trace 0
 
 function Install-Package {
diff --git a/packer/windows/add-user-build.ps1 b/packer/windows/add-user-build.ps1
index 042d0e6..31606d6 100644
--- a/packer/windows/add-user-build.ps1
+++ b/packer/windows/add-user-build.ps1
@@ -12,6 +12,7 @@
 # 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.
+
 $user = "build"
 $pass = "p1votal!"
 
diff --git a/packer/windows/cleanup.ps1 b/packer/windows/cleanup.ps1
index 979a36e..0b66f97 100644
--- a/packer/windows/cleanup.ps1
+++ b/packer/windows/cleanup.ps1
@@ -12,6 +12,7 @@
 # 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.
+
 # Remove admin ssh keys
 Remove-Item C:\Users\Administrator\.ssh -Recurse -Force -ErrorAction SilentlyContinue
 
diff --git a/packer/windows/install-chocolatey.ps1 b/packer/windows/install-chocolatey.ps1
index 9fa384d..60bdd85 100644
--- a/packer/windows/install-chocolatey.ps1
+++ b/packer/windows/install-chocolatey.ps1
@@ -12,6 +12,7 @@
 # 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.
+
 $ErrorActionPreference = "Stop"
 
 write-host "Installing Chocolatey"
diff --git a/packer/windows/install-gemfire.ps1 b/packer/windows/install-gemfire.ps1
index 1a4ed54..d228157 100644
--- a/packer/windows/install-gemfire.ps1
+++ b/packer/windows/install-gemfire.ps1
@@ -12,6 +12,7 @@
 # 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.
+
 $ErrorActionPreference = "Stop"
 Import-Module Packer -Force
 
diff --git a/packer/windows/install-windows-8.1-2012-r2-wmf-5.ps1 b/packer/windows/install-windows-8.1-2012-r2-wmf-5.ps1
index 8cce796..4953afb 100644
--- a/packer/windows/install-windows-8.1-2012-r2-wmf-5.ps1
+++ b/packer/windows/install-windows-8.1-2012-r2-wmf-5.ps1
@@ -12,6 +12,7 @@
 # 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.
+
 $ErrorActionPreference = "Stop"
 
 Import-Module Packer
diff --git a/packer/windows/setup-ec2config.ps1 b/packer/windows/setup-ec2config.ps1
index 028b31c..04124b1 100644
--- a/packer/windows/setup-ec2config.ps1
+++ b/packer/windows/setup-ec2config.ps1
@@ -12,6 +12,7 @@
 # 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.
+
 # Enable the system password to be retrieved from the AWS Console after this AMI is built and used to launch code
 $ec2config = [xml] (get-content 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml')
 ($ec2config.ec2configurationsettings.plugins.plugin | where {$_.name -eq "Ec2SetPassword"}).state = "Enabled"
diff --git a/packer/windows/uninstall-doxygen.ps1 b/packer/windows/uninstall-doxygen.ps1
index 467d5f1..5175f1d 100644
--- a/packer/windows/uninstall-doxygen.ps1
+++ b/packer/windows/uninstall-doxygen.ps1
@@ -12,6 +12,7 @@
 # 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.
+
 # Enable the system password to be retrieved from the AWS Console after this AMI is built and used to launch code
 
 $package = 'doxygen.install'
@@ -20,4 +21,3 @@ $uninstallRegKey = 'HKLM:SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\dox
 Import-Module C:\ProgramData\chocolatey\helpers\chocolateyInstaller.psm1
 $uninstallPath = (Get-ItemProperty $uninstallRegKey UninstallString).UninstallString
 Uninstall-ChocolateyPackage $package 'exe' '/VERYSILENT' $uninstallPath
-