120 lines
3.6 KiB
C++
120 lines
3.6 KiB
C++
// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
// Unit tests for SecureBlob.
|
|
|
|
#include "brillo/secure_blob.h"
|
|
|
|
#include <algorithm>
|
|
#include <iterator>
|
|
#include <numeric>
|
|
|
|
#include <base/logging.h>
|
|
#include <gtest/gtest.h>
|
|
|
|
namespace brillo {
|
|
using std::string;
|
|
|
|
class SecureBlobTest : public ::testing::Test {
|
|
public:
|
|
SecureBlobTest() {}
|
|
virtual ~SecureBlobTest() {}
|
|
|
|
static bool FindBlobInBlob(const brillo::Blob& haystack,
|
|
const brillo::Blob& needle) {
|
|
auto pos = std::search(
|
|
haystack.begin(), haystack.end(), needle.begin(), needle.end());
|
|
return (pos != haystack.end());
|
|
}
|
|
|
|
static int FindBlobIndexInBlob(const brillo::Blob& haystack,
|
|
const brillo::Blob& needle) {
|
|
auto pos = std::search(
|
|
haystack.begin(), haystack.end(), needle.begin(), needle.end());
|
|
if (pos == haystack.end()) {
|
|
return -1;
|
|
}
|
|
return std::distance(haystack.begin(), pos);
|
|
}
|
|
|
|
private:
|
|
DISALLOW_COPY_AND_ASSIGN(SecureBlobTest);
|
|
};
|
|
|
|
TEST_F(SecureBlobTest, AllocationSizeTest) {
|
|
// Check that allocating a SecureBlob of a specified size works
|
|
SecureBlob blob(32);
|
|
|
|
EXPECT_EQ(32, blob.size());
|
|
}
|
|
|
|
TEST_F(SecureBlobTest, AllocationCopyTest) {
|
|
// Check that allocating a SecureBlob with an iterator works
|
|
unsigned char from_data[32];
|
|
std::iota(std::begin(from_data), std::end(from_data), 0);
|
|
|
|
SecureBlob blob(std::begin(from_data), std::end(from_data));
|
|
|
|
EXPECT_EQ(sizeof(from_data), blob.size());
|
|
|
|
for (unsigned int i = 0; i < sizeof(from_data); i++) {
|
|
EXPECT_EQ(from_data[i], blob[i]);
|
|
}
|
|
}
|
|
|
|
TEST_F(SecureBlobTest, IteratorConstructorTest) {
|
|
// Check that allocating a SecureBlob with an iterator works
|
|
brillo::Blob from_blob(32);
|
|
for (unsigned int i = 0; i < from_blob.size(); i++) {
|
|
from_blob[i] = i;
|
|
}
|
|
|
|
SecureBlob blob(from_blob.begin(), from_blob.end());
|
|
|
|
EXPECT_EQ(from_blob.size(), blob.size());
|
|
EXPECT_TRUE(SecureBlobTest::FindBlobInBlob(from_blob, blob));
|
|
}
|
|
|
|
TEST_F(SecureBlobTest, ResizeTest) {
|
|
// Check that resizing a SecureBlob wipes the excess memory. The test assumes
|
|
// that resize() down by one will not re-allocate the memory, so the last byte
|
|
// will still be part of the SecureBlob's allocation
|
|
size_t length = 1024;
|
|
SecureBlob blob(length);
|
|
void* original_data = blob.data();
|
|
for (size_t i = 0; i < length; i++) {
|
|
blob[i] = i;
|
|
}
|
|
|
|
blob.resize(length - 1);
|
|
|
|
EXPECT_EQ(original_data, blob.data());
|
|
EXPECT_EQ(length - 1, blob.size());
|
|
EXPECT_EQ(0, blob.data()[length - 1]);
|
|
}
|
|
|
|
TEST_F(SecureBlobTest, CombineTest) {
|
|
SecureBlob blob1(32);
|
|
SecureBlob blob2(32);
|
|
std::iota(blob1.begin(), blob1.end(), 0);
|
|
std::iota(blob2.begin(), blob2.end(), 32);
|
|
SecureBlob combined_blob = SecureBlob::Combine(blob1, blob2);
|
|
EXPECT_EQ(combined_blob.size(), (blob1.size() + blob2.size()));
|
|
EXPECT_TRUE(SecureBlobTest::FindBlobInBlob(combined_blob, blob1));
|
|
EXPECT_TRUE(SecureBlobTest::FindBlobInBlob(combined_blob, blob2));
|
|
int blob1_index = SecureBlobTest::FindBlobIndexInBlob(combined_blob, blob1);
|
|
int blob2_index = SecureBlobTest::FindBlobIndexInBlob(combined_blob, blob2);
|
|
EXPECT_EQ(blob1_index, 0);
|
|
EXPECT_EQ(blob2_index, 32);
|
|
}
|
|
|
|
TEST_F(SecureBlobTest, BlobToStringTest) {
|
|
std::string test_string("Test String");
|
|
SecureBlob blob = SecureBlob(test_string.begin(), test_string.end());
|
|
EXPECT_EQ(blob.size(), test_string.length());
|
|
std::string result_string = blob.to_string();
|
|
EXPECT_EQ(test_string.compare(result_string), 0);
|
|
}
|
|
|
|
} // namespace brillo
|