verity: break libbase dependency

This removes the need for libbase for logging or special
types like scoped_ptr.

Now only gtest and gmock are required in order to run the unittests.

TEST=FEATURES=test emerge-(x86-alex|amd64-generic) verity
BUG=chromium-os:26649

Change-Id: I75643c5bdfe33b57afd0e3cfca7c49b7df6c5408
Reviewed-on: https://gerrit.chromium.org/gerrit/16411
Reviewed-by: Sonny Rao <sonnyrao@chromium.org>
Commit-Ready: Will Drewry <wad@chromium.org>
Tested-by: Will Drewry <wad@chromium.org>
diff --git a/Makefile b/Makefile
index 6afddd0..d926da8 100644
--- a/Makefile
+++ b/Makefile
@@ -11,12 +11,6 @@
 CFLAGS += -I$(SRC)/include -I$(SRC)/..
 CXXFLAGS += -I$(SRC)/include -I$(SRC)/..
 
-ifneq ($(WITH_CHROME),0)
-  CXXFLAGS += -DWITH_CHROME=1
-  LDFLAGS += -lbase -lpthread -lrt
-  WITH_CHROME = 1
-endif
-
 # Current toolchain doesn't support -pie statically linked binaries
 CXX_STATIC_BINARY(verity-static): \
   $(filter-out %_testrunner.o %_unittest.o,$(CXX_OBJECTS)) \
@@ -43,16 +37,13 @@
 all: CXX_LIBRARY(libdm-bht.so)
 clean: CLEAN(libdm-bht.so)
 
-# Tests require libchrome
-ifneq ($(WITH_CHROME),0)
-  # For this project, only the unittests are CXX
-  CXX_BINARY(verity_testrunner): $(filter-out %_main.o,$(CXX_OBJECTS)) \
-                           $(filter %dm-bht-userspace.o,$(C_OBJECTS)) \
+# For this project, only the unittests are CXX
+CXX_BINARY(verity_testrunner): $(filter-out %_main.o,$(CXX_OBJECTS)) \
+                          $(filter %dm-bht-userspace.o,$(C_OBJECTS)) \
                            CXX_STATIC_LIBRARY(kernel/libkernel.pie.a) \
                            CXX_STATIC_LIBRARY(simple_file/libsimple_file.pie.a)
-	$(call cxx_binary,-lgtest -lgmock)
+	$(call cxx_binary,-lgtest -lgmock -lpthread)
 
-  all: CXX_BINARY(verity_testrunner)
-  clean: CLEAN(verity_testrunner)
-  tests: TEST(CXX_BINARY(verity_testrunner))
-endif
+all: CXX_BINARY(verity_testrunner)
+clean: CLEAN(verity_testrunner)
+tests: TEST(CXX_BINARY(verity_testrunner))
diff --git a/dm-bht_unittest.cc b/dm-bht_unittest.cc
index be68988..2eadf84 100644
--- a/dm-bht_unittest.cc
+++ b/dm-bht_unittest.cc
@@ -4,12 +4,14 @@
 //
 // Basic unittesting of dm-bht using google-gtest.
 
-#include <base/basictypes.h>
-#include <base/logging.h>
-#include <base/memory/scoped_ptr.h>
 #include <gtest/gtest.h>
 #include <stdlib.h>
 
+#include <string>
+#include <vector>
+
+#include "verity/logging.h"
+
 // Pull in dm-bht.c so that we can access static functions.
 // But disable verbose logging.
 extern "C" {
@@ -43,7 +45,7 @@
   // This should fail.
   unsigned int blocks, total_blocks = 16384;
   u8 *data = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE);
-  void * hash_data;
+  u8 *hash_data;
 
   blocks = total_blocks;
 
@@ -66,13 +68,21 @@
 	      0);
   EXPECT_EQ(0, dm_bht_compute(&bht));
   EXPECT_EQ(0, dm_bht_destroy(&bht));
-  free(hash_data);
+  delete hash_data;
   free(data);
 }
 
 class MemoryBhtTest : public ::testing::Test {
  public:
   void SetUp() {
+    bht_ = NULL;
+  }
+
+  void TearDown() {
+    hash_data_.clear();
+    if (bht_)
+      delete bht_;
+    bht_ = NULL;
   }
 
   int Read(sector_t start, u8 *dst, sector_t count) {
@@ -126,31 +136,31 @@
   void SetupBht(const unsigned int total_blocks,
                 const char *digest_algorithm,
                 const char *salt) {
-    bht_.reset(new dm_bht());
+    if (bht_)
+      delete bht_;
+    bht_ = new dm_bht;
 
-    EXPECT_EQ(0, dm_bht_create(bht_.get(), total_blocks, digest_algorithm));
-       if (hash_data_.get() == NULL) {
-      sectors_ = dm_bht_sectors(bht_.get());
-      hash_data_.reset(new u8[to_bytes(sectors_)]);
-    }
+    EXPECT_EQ(0, dm_bht_create(bht_, total_blocks, digest_algorithm));
+    sectors_ = dm_bht_sectors(bht_);
+    hash_data_.resize(to_bytes(sectors_));
 
     if (salt)
-      dm_bht_set_salt(bht_.get(), salt);
+      dm_bht_set_salt(bht_, salt);
 
     SetupHash(total_blocks, digest_algorithm, salt, &hash_data_[0]);
-    dm_bht_set_read_cb(bht_.get(), MemoryBhtTest::ReadCallback);
+    dm_bht_set_read_cb(bht_, MemoryBhtTest::ReadCallback);
 
     // Load the tree from the pre-populated hash data
     unsigned int blocks;
     for (blocks = 0; blocks < total_blocks; blocks += bht_->node_count)
-      EXPECT_GE(dm_bht_populate(bht_.get(),
+      EXPECT_GE(dm_bht_populate(bht_,
                                 reinterpret_cast<void *>(this),
                                 blocks),
                 0);
   }
 
-  scoped_ptr<struct dm_bht> bht_;
-  scoped_array<u8> hash_data_;
+  struct dm_bht *bht_;
+  std::vector<u8> hash_data_;
   sector_t sectors_;
 };
 
@@ -165,16 +175,16 @@
   memset(zero_page, 0, PAGE_SIZE);
 
   SetupBht(total_blocks, "sha256", NULL);
-  dm_bht_set_root_hexdigest(bht_.get(),
+  dm_bht_set_root_hexdigest(bht_,
                             reinterpret_cast<const u8 *>(kRootDigest));
 
   for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) {
     DLOG(INFO) << "verifying block: " << blocks;
-    EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks,
+    EXPECT_EQ(0, dm_bht_verify_block(bht_, blocks,
                                      virt_to_page(zero_page), 0));
   }
 
-  EXPECT_EQ(0, dm_bht_destroy(bht_.get()));
+  EXPECT_EQ(0, dm_bht_destroy(bht_));
   free(zero_page);
 }
 
@@ -189,16 +199,16 @@
   memset(zero_page, 0, PAGE_SIZE);
 
   SetupBht(total_blocks, "sha256", NULL);
-  dm_bht_set_root_hexdigest(bht_.get(),
+  dm_bht_set_root_hexdigest(bht_,
                             reinterpret_cast<const u8 *>(kRootDigest));
 
   for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) {
     DLOG(INFO) << "verifying block: " << blocks;
-    EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks,
+    EXPECT_EQ(0, dm_bht_verify_block(bht_, blocks,
                                      virt_to_page(zero_page), 0));
   }
 
-  EXPECT_EQ(0, dm_bht_destroy(bht_.get()));
+  EXPECT_EQ(0, dm_bht_destroy(bht_));
   free(zero_page);
 }
 
@@ -213,16 +223,16 @@
   memset(zero_page, 0, PAGE_SIZE);
 
   SetupBht(total_blocks, "sha256", NULL);
-  dm_bht_set_root_hexdigest(bht_.get(),
+  dm_bht_set_root_hexdigest(bht_,
                             reinterpret_cast<const u8 *>(kRootDigest));
 
   for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) {
     DLOG(INFO) << "verifying block: " << blocks;
-    EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks,
+    EXPECT_EQ(0, dm_bht_verify_block(bht_, blocks,
                                      virt_to_page(zero_page), 0));
   }
 
-  EXPECT_EQ(0, dm_bht_destroy(bht_.get()));
+  EXPECT_EQ(0, dm_bht_destroy(bht_));
   free(zero_page);
 }
 
@@ -237,16 +247,16 @@
   memset(zero_page, 0, PAGE_SIZE);
 
   SetupBht(total_blocks, "sha256", NULL);
-  dm_bht_set_root_hexdigest(bht_.get(),
+  dm_bht_set_root_hexdigest(bht_,
                             reinterpret_cast<const u8 *>(kRootDigest));
 
   for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) {
     DLOG(INFO) << "verifying block: " << blocks;
-    EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks,
+    EXPECT_EQ(0, dm_bht_verify_block(bht_, blocks,
                                      virt_to_page(zero_page), 0));
   }
 
-  EXPECT_EQ(0, dm_bht_destroy(bht_.get()));
+  EXPECT_EQ(0, dm_bht_destroy(bht_));
   free(zero_page);
 }
 
@@ -261,16 +271,16 @@
   memset(zero_page, 0, PAGE_SIZE);
 
   SetupBht(total_blocks, "sha256", NULL);
-  dm_bht_set_root_hexdigest(bht_.get(),
+  dm_bht_set_root_hexdigest(bht_,
                             reinterpret_cast<const u8 *>(kRootDigest));
 
   for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) {
     DLOG(INFO) << "verifying block: " << blocks;
-    EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks,
+    EXPECT_EQ(0, dm_bht_verify_block(bht_, blocks,
                                      virt_to_page(zero_page), 0));
   }
 
-  EXPECT_EQ(0, dm_bht_destroy(bht_.get()));
+  EXPECT_EQ(0, dm_bht_destroy(bht_));
   free(zero_page);
 }
 
@@ -286,7 +296,7 @@
 
   SetupBht(total_blocks, "sha256", NULL);
 
-  dm_bht_set_root_hexdigest(bht_.get(),
+  dm_bht_set_root_hexdigest(bht_,
                             reinterpret_cast<const u8 *>(kRootDigest));
 
   // TODO(wad) add tests for partial tree validity/verification
@@ -295,30 +305,30 @@
   static const unsigned int kBadBlock = 256;
   u8 *bad_hash_block= (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE);
   memset(bad_hash_block, 'A', PAGE_SIZE);
-  EXPECT_EQ(dm_bht_store_block(bht_.get(), kBadBlock, bad_hash_block), 0);
+  EXPECT_EQ(dm_bht_store_block(bht_, kBadBlock, bad_hash_block), 0);
 
   // Attempt to verify both the bad block and all the neighbors.
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock + 1,
+  EXPECT_LT(dm_bht_verify_block(bht_, kBadBlock + 1,
                                 virt_to_page(zero_page), 0), 0);
 
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock + 2,
+  EXPECT_LT(dm_bht_verify_block(bht_, kBadBlock + 2,
                                 virt_to_page(zero_page), 0), 0);
 
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock + (bht_->node_count / 2),
+  EXPECT_LT(dm_bht_verify_block(bht_, kBadBlock + (bht_->node_count / 2),
                                 virt_to_page(zero_page), 0), 0);
 
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), kBadBlock,
+  EXPECT_LT(dm_bht_verify_block(bht_, kBadBlock,
                                 virt_to_page(zero_page), 0), 0);
 
   // Verify that the prior entry is untouched and still safe
-  EXPECT_EQ(dm_bht_verify_block(bht_.get(), kBadBlock - 1,
+  EXPECT_EQ(dm_bht_verify_block(bht_, kBadBlock - 1,
                                 virt_to_page(zero_page), 0), 0);
 
   // Same for the next entry
-  EXPECT_EQ(dm_bht_verify_block(bht_.get(), kBadBlock + bht_->node_count,
+  EXPECT_EQ(dm_bht_verify_block(bht_, kBadBlock + bht_->node_count,
                                 virt_to_page(zero_page), 0), 0);
 
-  EXPECT_EQ(0, dm_bht_destroy(bht_.get()));
+  EXPECT_EQ(0, dm_bht_destroy(bht_));
   free(bad_hash_block);
   free(zero_page);
 }
@@ -329,7 +339,7 @@
   // Set the root hash for a 0-filled image
   static const char kRootDigest[] =
     "45d65d6f9e5a962f4d80b5f1bd7a918152251c27bdad8c5f52b590c129833372";
-  dm_bht_set_root_hexdigest(bht_.get(),
+  dm_bht_set_root_hexdigest(bht_,
                             reinterpret_cast<const u8 *>(kRootDigest));
   // A corrupt page
   u8 *bad_page = (u8 *)my_memalign(PAGE_SIZE, PAGE_SIZE);
@@ -337,14 +347,14 @@
   memset(bad_page, 'A', PAGE_SIZE);
 
 
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), 0, virt_to_page(bad_page), 0), 0);
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), 127, virt_to_page(bad_page), 0), 0);
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), 128, virt_to_page(bad_page), 0), 0);
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), 255, virt_to_page(bad_page), 0), 0);
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), 256, virt_to_page(bad_page), 0), 0);
-  EXPECT_LT(dm_bht_verify_block(bht_.get(), 383, virt_to_page(bad_page), 0), 0);
+  EXPECT_LT(dm_bht_verify_block(bht_, 0, virt_to_page(bad_page), 0), 0);
+  EXPECT_LT(dm_bht_verify_block(bht_, 127, virt_to_page(bad_page), 0), 0);
+  EXPECT_LT(dm_bht_verify_block(bht_, 128, virt_to_page(bad_page), 0), 0);
+  EXPECT_LT(dm_bht_verify_block(bht_, 255, virt_to_page(bad_page), 0), 0);
+  EXPECT_LT(dm_bht_verify_block(bht_, 256, virt_to_page(bad_page), 0), 0);
+  EXPECT_LT(dm_bht_verify_block(bht_, 383, virt_to_page(bad_page), 0), 0);
 
-  EXPECT_EQ(0, dm_bht_destroy(bht_.get()));
+  EXPECT_EQ(0, dm_bht_destroy(bht_));
   free(bad_page);
 }
 
@@ -361,16 +371,16 @@
   memset(zero_page, 0, PAGE_SIZE);
 
   SetupBht(total_blocks, "sha256", salt);
-  dm_bht_set_root_hexdigest(bht_.get(),
+  dm_bht_set_root_hexdigest(bht_,
                             reinterpret_cast<const u8 *>(kRootDigest));
 
   for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) {
     DLOG(INFO) << "verifying block: " << blocks;
-    EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks,
+    EXPECT_EQ(0, dm_bht_verify_block(bht_, blocks,
                                      virt_to_page(zero_page), 0));
   }
 
-  EXPECT_EQ(0, dm_bht_destroy(bht_.get()));
+  EXPECT_EQ(0, dm_bht_destroy(bht_));
   free(zero_page);
 }
 
@@ -387,15 +397,15 @@
   memset(zero_page, 0, PAGE_SIZE);
 
   SetupBht(total_blocks, "sha256", salt);
-  dm_bht_set_root_hexdigest(bht_.get(),
+  dm_bht_set_root_hexdigest(bht_,
                             reinterpret_cast<const u8 *>(kRootDigest));
 
   for (unsigned int blocks = 0; blocks < total_blocks; ++blocks) {
     DLOG(INFO) << "verifying block: " << blocks;
-    EXPECT_EQ(0, dm_bht_verify_block(bht_.get(), blocks,
+    EXPECT_EQ(0, dm_bht_verify_block(bht_, blocks,
                                      virt_to_page(zero_page), 0));
   }
 
-  EXPECT_EQ(0, dm_bht_destroy(bht_.get()));
+  EXPECT_EQ(0, dm_bht_destroy(bht_));
   free(zero_page);
 }
diff --git a/file_hasher_unittest.cc b/file_hasher_unittest.cc
index 3dff901..83c7af4 100644
--- a/file_hasher_unittest.cc
+++ b/file_hasher_unittest.cc
@@ -5,11 +5,10 @@
 // Tests for verity::FileHasher
 #include "verity/file_hasher.h"
 
-#include <base/basictypes.h>
-#include <base/memory/scoped_ptr.h>
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
+#include "verity/logging.h"
 #include "verity/simple_file/mock_file.h"
 #include "verity/utils.h"
 
@@ -25,14 +24,21 @@
   FileHasherTest() :
     src_(new simple_file::MockFile()),
     dst_(new simple_file::MockFile()) { }
-  ~FileHasherTest() { }
+  ~FileHasherTest() {
+    delete src_;
+    delete dst_;
+    if (hasher_)
+      delete hasher_;
+  }
   void SetUp() {
-    hasher_.reset(new verity::FileHasher());
+    if (hasher_)
+      delete hasher_;
+    hasher_ = new verity::FileHasher();
   }
  protected:
-  scoped_ptr<simple_file::MockFile> src_;
-  scoped_ptr<simple_file::MockFile> dst_;
-  scoped_ptr<verity::FileHasher> hasher_;
+  simple_file::MockFile *src_;
+  simple_file::MockFile *dst_;
+  verity::FileHasher *hasher_;
 };
 
 static char last_digest_match[256] = { 0 };
diff --git a/logging.h b/logging.h
index b86f9eb..89035d3 100644
--- a/logging.h
+++ b/logging.h
@@ -2,21 +2,11 @@
 // Use of this source code is governed by the GPL v2 license that can
 // be found in the LICENSE file.
 //
-// Includes the correct logging library, either google-log or chrome logging.
+// Provides a crude google-log compatible logging facility.
 #ifndef VERITY_LOGGING_H_
 #define VERITY_LOGGING_H_
 
-#if defined(WITH_CHROME)
-#  include <base/logging.h>
-#  define INIT_LOGGING(name, flags...) { \
-   logging::InitLogging(NULL, \
-                       logging::LOG_ONLY_TO_SYSTEM_DEBUG_LOG, \
-                       logging::DONT_LOCK_LOG_FILE, \
-                       logging::APPEND_TO_OLD_LOG_FILE); \
-   }
-#else
-#  include "verity/logging/logging.h"
-#  define INIT_LOGGING(name, flags...) { }
-#endif
+#include "verity/logging/logging.h"
+#define INIT_LOGGING(name, flags...) { }
 
 #endif   // VERITY_LOGGING_H_