| // Copyright 2016 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "net/cert/merkle_audit_proof.h" | 
 |  | 
 | #include "base/check.h" | 
 | #include "testing/gmock/include/gmock/gmock.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | namespace net::ct { | 
 | namespace { | 
 |  | 
 | TEST(MerkleAuditProofTest, CalculatesAuditPathLengthCorrectly) { | 
 |   // Test all leaves up to a tree size of 4: | 
 |   EXPECT_EQ(0u, CalculateAuditPathLength(0, 1)); | 
 |   EXPECT_EQ(1u, CalculateAuditPathLength(0, 2)); | 
 |   EXPECT_EQ(1u, CalculateAuditPathLength(1, 2)); | 
 |   EXPECT_EQ(2u, CalculateAuditPathLength(0, 3)); | 
 |   EXPECT_EQ(2u, CalculateAuditPathLength(1, 3)); | 
 |   EXPECT_EQ(1u, CalculateAuditPathLength(2, 3)); | 
 |   EXPECT_EQ(2u, CalculateAuditPathLength(0, 4)); | 
 |   EXPECT_EQ(2u, CalculateAuditPathLength(1, 4)); | 
 |   EXPECT_EQ(2u, CalculateAuditPathLength(2, 4)); | 
 |   EXPECT_EQ(2u, CalculateAuditPathLength(3, 4)); | 
 |   // Boundary cases for a larger tree size: | 
 |   EXPECT_EQ(9u, CalculateAuditPathLength(0, 257)); | 
 |   EXPECT_EQ(9u, CalculateAuditPathLength(255, 257)); | 
 |   EXPECT_EQ(1u, CalculateAuditPathLength(256, 257)); | 
 |   // Example from CT over DNS draft RFC: | 
 |   EXPECT_EQ(20u, CalculateAuditPathLength(123456, 999999)); | 
 |   // Test data from | 
 |   // https://github.com/google/certificate-transparency/blob/af98904302724c29aa6659ca372d41c9687de2b7/python/ct/crypto/merkle_test.py: | 
 |   EXPECT_EQ(22u, CalculateAuditPathLength(848049, 3630887)); | 
 | } | 
 |  | 
 | TEST(MerkleAuditProofDeathTest, DiesIfLeafIndexIsGreaterThanOrEqualToTreeSize) { | 
 | #ifdef OFFICIAL_BUILD | 
 |   // The official build does not print the reason a CHECK failed. | 
 |   const char kErrorRegex[] = ""; | 
 | #else | 
 |   const char kErrorRegex[] = "leaf_index < tree_size"; | 
 | #endif | 
 |  | 
 |   EXPECT_DEATH_IF_SUPPORTED(CalculateAuditPathLength(0, 0), kErrorRegex); | 
 |   EXPECT_DEATH_IF_SUPPORTED(CalculateAuditPathLength(10, 10), kErrorRegex); | 
 |   EXPECT_DEATH_IF_SUPPORTED(CalculateAuditPathLength(11, 10), kErrorRegex); | 
 | } | 
 |  | 
 | }  // namespace | 
 | }  // namespace net::ct |