/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specic language governing permissions and * limitations under the License. */ #define LOG_TAG "RedactionInfoTest" #include #include #include #include "libfuse_jni/RedactionInfo.h" using namespace mediaprovider::fuse; using std::unique_ptr; using std::vector; unique_ptr> createRedactionRangeVector(int num_rr, off64_t* rr) { auto res = std::make_unique>(); for (int i = 0; i < num_rr; ++i) { res->push_back(RedactionRange(rr[2 * i], rr[2 * i + 1])); } return res; } /** * Test the case where there are no redaction ranges. */ TEST(RedactionInfoTest, testNoRedactionRanges) { RedactionInfo info(0, nullptr); EXPECT_EQ(0, info.size()); EXPECT_EQ(false, info.isRedactionNeeded()); auto overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 1000, /*off*/ 1000); EXPECT_EQ(0, overlapping_rr->size()); } /** * Test the case where there is 1 redaction range. */ TEST(RedactionInfoTest, testSingleRedactionRange) { off64_t ranges[2] = { 1, 10, }; RedactionInfo info(1, ranges); EXPECT_EQ(1, info.size()); EXPECT_EQ(true, info.isRedactionNeeded()); // Overlapping ranges auto overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 1000, /*off*/ 0); EXPECT_EQ(*(createRedactionRangeVector(1, ranges)), *overlapping_rr); overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 5, /*off*/ 0); EXPECT_EQ(*(createRedactionRangeVector(1, ranges)), *overlapping_rr); overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 5, /*off*/ 5); EXPECT_EQ(*(createRedactionRangeVector(1, ranges)), *overlapping_rr); overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 10, /*off*/ 1); EXPECT_EQ(*(createRedactionRangeVector(1, ranges)), *overlapping_rr); overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 1, /*off*/ 1); EXPECT_EQ(*(createRedactionRangeVector(1, ranges)), *overlapping_rr); // Non-overlapping range overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 100, /*off*/ 11); EXPECT_EQ(*(createRedactionRangeVector(0, nullptr)), *overlapping_rr); overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 1, /*off*/ 11); EXPECT_EQ(*(createRedactionRangeVector(0, nullptr)), *overlapping_rr); } /** * Test the case where the redaction ranges don't require sorting or merging */ TEST(RedactionInfoTest, testSortedAndNonOverlappingRedactionRanges) { off64_t ranges[6] = { 1, 10, 15, 21, 32, 40, }; RedactionInfo info = RedactionInfo(3, ranges); EXPECT_EQ(3, info.size()); EXPECT_EQ(true, info.isRedactionNeeded()); // Read request strictly contains all ranges: [0, 49] auto overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 50, /*off*/ 0); off64_t expected1[] = { 1, 10, 15, 21, 32, 40, }; EXPECT_EQ(*(createRedactionRangeVector(3, expected1)), *overlapping_rr); // Read request strictly contains a subset of the ranges: [15, 40] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 26, /*off*/ 15); off64_t expected2[] = { 15, 21, 32, 40, }; EXPECT_EQ(*(createRedactionRangeVector(2, expected2)), *overlapping_rr); // Read request intersects with a subset of the ranges" [16, 32] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 17, /*off*/ 16); EXPECT_EQ(*(createRedactionRangeVector(2, expected2)), *overlapping_rr); } /** * Test the case where the redaction ranges require sorting */ TEST(RedactionInfoTest, testSortRedactionRanges) { off64_t ranges[6] = { 1, 10, 32, 40, 15, 21, }; RedactionInfo info = RedactionInfo(3, ranges); EXPECT_EQ(3, info.size()); EXPECT_EQ(true, info.isRedactionNeeded()); // Read request strictly contains all ranges: [0, 49] auto overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 50, /*off*/ 0); off64_t expected1[] = { 1, 10, 15, 21, 32, 40, }; EXPECT_EQ(*(createRedactionRangeVector(3, expected1)), *overlapping_rr); // Read request strictly contains a subset of the ranges: [15, 40] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 26, /*off*/ 15); off64_t expected2[] = { 15, 21, 32, 40, }; EXPECT_EQ(*(createRedactionRangeVector(2, expected2)), *overlapping_rr); // Read request intersects with a subset of the ranges" [16, 32] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 17, /*off*/ 16); EXPECT_EQ(*(createRedactionRangeVector(2, expected2)), *overlapping_rr); } /** * Test the case where the redaction ranges require sorting or merging */ TEST(RedactionInfoTest, testSortAndMergeRedactionRanges) { off64_t ranges[8] = { 35, 40, 1, 10, 32, 35, 15, 21, }; RedactionInfo info = RedactionInfo(4, ranges); EXPECT_EQ(3, info.size()); EXPECT_EQ(true, info.isRedactionNeeded()); // Read request strictly contains all ranges: [0, 49] auto overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 50, /*off*/ 0); off64_t expected1[] = { 1, 10, 15, 21, 32, 40, }; EXPECT_EQ(*(createRedactionRangeVector(3, expected1)), *overlapping_rr); // Read request strictly contains a subset of the ranges: [15, 40] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 26, /*off*/ 15); off64_t expected2[] = { 15, 21, 32, 40, }; EXPECT_EQ(*(createRedactionRangeVector(2, expected2)), *overlapping_rr); // Read request intersects with a subset of the ranges" [16, 32] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 17, /*off*/ 16); EXPECT_EQ(*(createRedactionRangeVector(2, expected2)), *overlapping_rr); } /** * Test the case where the redaction ranges all merge into the first range */ TEST(RedactionInfoTest, testMergeAllRangesIntoTheFirstRange) { off64_t ranges[10] = { 1, 100, 2, 99, 3, 98, 4, 97, 3, 15, }; RedactionInfo info = RedactionInfo(5, ranges); EXPECT_EQ(1, info.size()); EXPECT_EQ(true, info.isRedactionNeeded()); // Read request equals the range: [1, 100] auto overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 100, /*off*/ 1); off64_t expected[] = {1, 100}; EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); // Read request is contained in the range: [15, 40] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 26, /*off*/ 15); EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); // Read request that strictly contains all of the redaction ranges overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 1000, /*off*/ 0); EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); } /** * Test the case where the redaction ranges all merge into the last range */ TEST(RedactionInfoTest, testMergeAllRangesIntoTheLastRange) { off64_t ranges[10] = { 4, 96, 3, 97, 2, 98, 1, 99, 0, 100, }; RedactionInfo info = RedactionInfo(5, ranges); EXPECT_EQ(1, info.size()); EXPECT_EQ(true, info.isRedactionNeeded()); // Read request equals the range: [0, 100] auto overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 100, /*off*/ 0); off64_t expected[] = {0, 100}; EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); // Read request is contained in the range: [15, 40] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 26, /*off*/ 15); EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); // Read request that strictly contains all of the redaction ranges overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 1000, /*off*/ 0); EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); } /** * Test the case where the redaction ranges progressively merge */ TEST(RedactionInfoTest, testMergeAllRangesProgressively) { off64_t ranges[10] = { 1, 11, 2, 12, 3, 13, 4, 14, 5, 15, }; RedactionInfo info = RedactionInfo(5, ranges); EXPECT_EQ(1, info.size()); EXPECT_EQ(true, info.isRedactionNeeded()); // Read request equals the range: [1, 15] auto overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 15, /*off*/ 1); off64_t expected[] = {1, 15}; EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); // Read request is contained in the range: [2, 12] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 10, /*off*/ 2); EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); // Read request that strictly contains all of the redaction ranges overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 100, /*off*/ 0); EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); off64_t reverse_rr[10] = { 5, 15, 4, 14, 3, 13, 2, 12, 1, 11, }; RedactionInfo reverse_info = RedactionInfo(5, reverse_rr); EXPECT_EQ(1, info.size()); EXPECT_EQ(true, info.isRedactionNeeded()); // Read request equals the range: [1, 15] overlapping_rr = info.getOverlappingRedactionRanges(/*size*/ 15, /*off*/ 1); EXPECT_EQ(*(createRedactionRangeVector(1, expected)), *overlapping_rr); }