// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by the GPL v2 license that can
// be found in the LICENSE file.
//
// Tests for verity::FileHasher
#include "verity/file_hasher.h"

#include <gmock/gmock.h>
#include <gtest/gtest.h>

#include "verity/logging.h"
#include "verity/simple_file/mock_file.h"
#include "verity/utils.h"

using ::testing::_;             // wildcard mock matcher
using ::testing::AtLeast;       // Times modifier
using ::testing::DefaultValue;  // allow for easy default return value change
using ::testing::InSequence;
using ::testing::Invoke;  // mock Invoke action
using ::testing::Return;  // mock Return action

class FileHasherTest : public ::testing::Test {
 public:
  FileHasherTest()
      : src_(new simple_file::MockFile()), dst_(new simple_file::MockFile()) {}
  ~FileHasherTest() {
    delete src_;
    delete dst_;
    if (hasher_)
      delete hasher_;
  }
  void SetUp() {
    if (hasher_)
      delete hasher_;
    hasher_ = new verity::FileHasher();
  }

 protected:
  simple_file::MockFile* src_;
  simple_file::MockFile* dst_;
  verity::FileHasher* hasher_;
};

MATCHER_P(DigestMatch, a, "given hexdigest matches binary digest arg") {
  static char last_digest_match[256] = {0};
  char* hexdigest = new char[strlen(a) + 1];
  verity_utils::to_hex(hexdigest, arg, strlen(a) / 2);
  bool ok = !strcmp(a, hexdigest);
  LOG(INFO) << "DigestMatcher: " << hexdigest << (ok ? " == " : " != ") << a;
  delete[] hexdigest;
  // Store this away globally so we can easily re use it.
  // Later this needs to be supported by a MockFile.
  if (sizeof(last_digest_match) > strlen(a) / 2) {
    memcpy(last_digest_match, arg, strlen(a) / 2);
  }
  return ok;
}

#if 0
TEST_F(FileHasherTest, EndToEnd) {
  EXPECT_TRUE(false);
}
#endif
