| // 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 |