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 <davidben@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
This commit is contained in:
David Benjamin 2017-02-04 11:48:59 -05:00 committed by CQ bot account: commit-bot@chromium.org
parent 949628a2ab
commit 7d7554b6b3
4 changed files with 42 additions and 17 deletions

View File

@ -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 <stdint.h>
#include <stdio.h>
#include "test_util.h"
#include <ostream>
#include "../internal.h"
void hexdump(FILE *fp, const char *msg, const void *in, size_t len) {
const uint8_t *data = reinterpret_cast<const uint8_t*>(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;
}

View File

@ -16,20 +16,38 @@
#define OPENSSL_HEADER_CRYPTO_TEST_TEST_UTIL_H
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#if defined(__cplusplus)
extern "C" {
#endif
#include <iosfwd>
#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 <size_t N>
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 */

View File

@ -23,7 +23,6 @@
#include <openssl/x509.h>
#include "../internal.h"
#include "../test/test_util.h"
/* kPKCS7NSS contains the certificate chain of mail.google.com, as saved by NSS

View File

@ -1503,8 +1503,7 @@ TEST(SSLTest, SessionDuplication) {
ASSERT_TRUE(SSL_SESSION_to_bytes(session1.get(), &s1_bytes, &s1_len));
bssl::UniquePtr<uint8_t> 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<uint8_t> free_der3(der3);
// They must also encode identically.
ASSERT_EQ(der2_len, der_len);
EXPECT_EQ(0, OPENSSL_memcmp(der, der2, static_cast<size_t>(der_len)));
ASSERT_EQ(der3_len, der_len);
EXPECT_EQ(0, OPENSSL_memcmp(der, der3, static_cast<size_t>(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.