From 7d7554b6b3c79e707e25521e61e066ce2b996e4c Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sat, 4 Feb 2017 11:48:59 -0500 Subject: [PATCH] Add a helper for comparing byte strings. We compare pointer/length pairs constantly. To avoid needing to type it everywhere and get GTest's output, add a StringPiece-alike for byte slices which supports ==, !=, and std::ostream. BUG=129 Change-Id: I108342cbd2c6a58fec0b9cb87ebdf50364bda099 Reviewed-on: https://boringssl-review.googlesource.com/13625 Reviewed-by: David Benjamin Commit-Queue: David Benjamin CQ-Verified: CQ bot account: commit-bot@chromium.org --- crypto/test/test_util.cc | 17 ++++++++++++++--- crypto/test/test_util.h | 32 +++++++++++++++++++++++++------- crypto/x509/pkcs7_test.c | 1 - ssl/ssl_test.cc | 9 +++------ 4 files changed, 42 insertions(+), 17 deletions(-) diff --git a/crypto/test/test_util.cc b/crypto/test/test_util.cc index 928972a3..493b1247 100644 --- a/crypto/test/test_util.cc +++ b/crypto/test/test_util.cc @@ -12,11 +12,12 @@ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include -#include - #include "test_util.h" +#include + +#include "../internal.h" + void hexdump(FILE *fp, const char *msg, const void *in, size_t len) { const uint8_t *data = reinterpret_cast(in); @@ -27,3 +28,13 @@ void hexdump(FILE *fp, const char *msg, const void *in, size_t len) { } fputs("\n", fp); } + +std::ostream &operator<<(std::ostream &os, const Bytes &in) { + // Print a byte slice as hex. + static const char hex[] = "0123456789abcdef"; + for (size_t i = 0; i < in.len; i++) { + os << hex[in.data[i] >> 4]; + os << hex[in.data[i] & 0xf]; + } + return os; +} diff --git a/crypto/test/test_util.h b/crypto/test/test_util.h index 972e2065..d834973e 100644 --- a/crypto/test/test_util.h +++ b/crypto/test/test_util.h @@ -16,20 +16,38 @@ #define OPENSSL_HEADER_CRYPTO_TEST_TEST_UTIL_H #include +#include #include -#if defined(__cplusplus) -extern "C" { -#endif +#include + +#include "../internal.h" -/* hexdump writes |msg| to |fp| followed by the hex encoding of |len| bytes - * from |in|. */ +// hexdump writes |msg| to |fp| followed by the hex encoding of |len| bytes +// from |in|. void hexdump(FILE *fp, const char *msg, const void *in, size_t len); +// Bytes is a wrapper over a byte slice which may be compared for equality. This +// allows it to be used in EXPECT_EQ macros. +struct Bytes { + Bytes(const uint8_t *data_arg, size_t len_arg) + : data(data_arg), len(len_arg) {} -#if defined(__cplusplus) + template + Bytes(const uint8_t (&array)[N]) : data(array), len(N) {} + + const uint8_t *data; + size_t len; +}; + +inline bool operator==(const Bytes &a, const Bytes &b) { + return a.len == b.len && OPENSSL_memcmp(a.data, b.data, a.len) == 0; } -#endif + +inline bool operator!=(const Bytes &a, const Bytes &b) { return !(a == b); } + +std::ostream &operator<<(std::ostream &os, const Bytes &in); + #endif /* OPENSSL_HEADER_CRYPTO_TEST_TEST_UTIL_H */ diff --git a/crypto/x509/pkcs7_test.c b/crypto/x509/pkcs7_test.c index 7bf4b81d..f620b9bc 100644 --- a/crypto/x509/pkcs7_test.c +++ b/crypto/x509/pkcs7_test.c @@ -23,7 +23,6 @@ #include #include "../internal.h" -#include "../test/test_util.h" /* kPKCS7NSS contains the certificate chain of mail.google.com, as saved by NSS diff --git a/ssl/ssl_test.cc b/ssl/ssl_test.cc index e12c613f..dfab9769 100644 --- a/ssl/ssl_test.cc +++ b/ssl/ssl_test.cc @@ -1503,8 +1503,7 @@ TEST(SSLTest, SessionDuplication) { ASSERT_TRUE(SSL_SESSION_to_bytes(session1.get(), &s1_bytes, &s1_len)); bssl::UniquePtr free_s1(s1_bytes); - ASSERT_EQ(s0_len, s1_len); - EXPECT_EQ(0, OPENSSL_memcmp(s0_bytes, s1_bytes, s0_len)); + EXPECT_EQ(Bytes(s0_bytes, s0_len), Bytes(s1_bytes, s1_len)); } static void ExpectFDs(const SSL *ssl, int rfd, int wfd) { @@ -3076,10 +3075,8 @@ TEST(SSLTest, GetCertificate) { bssl::UniquePtr free_der3(der3); // They must also encode identically. - ASSERT_EQ(der2_len, der_len); - EXPECT_EQ(0, OPENSSL_memcmp(der, der2, static_cast(der_len))); - ASSERT_EQ(der3_len, der_len); - EXPECT_EQ(0, OPENSSL_memcmp(der, der3, static_cast(der_len))); + EXPECT_EQ(Bytes(der, der_len), Bytes(der2, der2_len)); + EXPECT_EQ(Bytes(der, der_len), Bytes(der3, der3_len)); } // TODO(davidben): Convert this file to GTest properly.