Merge "Dump the uncompressed data's SHA1 to debug flaky tests"

This commit is contained in:
Tianjie Xu
2018-04-26 17:23:00 +00:00
committed by Gerrit Code Review
2 changed files with 75 additions and 3 deletions
+52 -2
View File
@@ -37,6 +37,7 @@
#include <bsdiff/bsdiff.h>
#include <gtest/gtest.h>
#include <openssl/sha.h>
#include <zlib.h>
#include "applypatch/applypatch.h"
#include "applypatch/applypatch_modes.h"
@@ -46,6 +47,47 @@
using namespace std::string_literals;
// TODO(b/67849209) Remove after debug the flakiness.
static void DecompressAndDumpRecoveryImage(const std::string& image_path) {
// Expected recovery_image structure
// chunk normal: 45066 bytes
// chunk deflate: 479442 bytes
// chunk normal: 5199 bytes
std::string recovery_content;
ASSERT_TRUE(android::base::ReadFileToString(image_path, &recovery_content));
ASSERT_GT(recovery_content.size(), 45066 + 5199);
z_stream strm = {};
strm.avail_in = recovery_content.size() - 45066 - 5199;
strm.next_in =
const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(recovery_content.data())) + 45066;
ASSERT_EQ(Z_OK, inflateInit2(&strm, -15));
constexpr unsigned int BUFFER_SIZE = 32768;
std::vector<uint8_t> uncompressed_data(BUFFER_SIZE);
size_t uncompressed_length = 0;
SHA_CTX ctx;
SHA1_Init(&ctx);
int ret;
do {
strm.avail_out = BUFFER_SIZE;
strm.next_out = uncompressed_data.data();
ret = inflate(&strm, Z_NO_FLUSH);
ASSERT_GE(ret, 0);
SHA1_Update(&ctx, uncompressed_data.data(), BUFFER_SIZE - strm.avail_out);
uncompressed_length += BUFFER_SIZE - strm.avail_out;
} while (ret != Z_STREAM_END);
inflateEnd(&strm);
uint8_t digest[SHA_DIGEST_LENGTH];
SHA1_Final(digest, &ctx);
GTEST_LOG_(INFO) << "uncompressed length " << uncompressed_length
<< " sha1: " << short_sha1(digest);
}
static void sha1sum(const std::string& fname, std::string* sha1, size_t* fsize = nullptr) {
ASSERT_TRUE(sha1 != nullptr);
@@ -317,7 +359,11 @@ TEST_F(ApplyPatchModesTest, PatchModeEmmcTargetWithoutBonusFile) {
recovery_img_sha1.c_str(),
recovery_img_size_arg.c_str(),
patch_arg.c_str() };
ASSERT_EQ(0, applypatch_modes(args.size(), args.data()));
if (applypatch_modes(args.size(), args.data()) != 0) {
DecompressAndDumpRecoveryImage(tgt_file.path);
FAIL();
}
}
TEST_F(ApplyPatchModesTest, PatchModeEmmcTargetWithMultiplePatches) {
@@ -360,7 +406,11 @@ TEST_F(ApplyPatchModesTest, PatchModeEmmcTargetWithMultiplePatches) {
for (const auto& arg : args) {
printf(" %s\n", arg);
}
ASSERT_EQ(0, applypatch_modes(args.size(), args.data()));
if (applypatch_modes(args.size(), args.data()) != 0) {
DecompressAndDumpRecoveryImage(tgt_file.path);
FAIL();
}
}
// Ensures that applypatch works with a bsdiff based recovery-from-boot.p.