diff options
author | Zim <zezeozue@google.com> | 2020-01-13 14:11:19 +0000 |
---|---|---|
committer | Zim <zezeozue@google.com> | 2020-01-13 14:13:15 +0000 |
commit | 2e5ad887558a64647992d7d606b40a1678a8d967 (patch) | |
tree | 2003575ab912be26015db07d82f494cc66a5c9b8 /jni/RedactionInfoTest.cpp | |
parent | 2dda61d5441ca0c22d5715366bad21034a9ddfce (diff) | |
download | MediaProvider-2e5ad887558a64647992d7d606b40a1678a8d967.tar.gz |
Fixed RedactionInfoTest
With MediaProvider apexing, the RedactionInfoTest binary was unable to
link to libfuse_jni.
Now, we just build the test against the required source directly
Test: atest RedactionInfoTest
Bug: 141540368
Change-Id: I1e4aee297083ea33594fd0ffa4bab632ab2b5f93
Diffstat (limited to 'jni/RedactionInfoTest.cpp')
-rw-r--r-- | jni/RedactionInfoTest.cpp | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/jni/RedactionInfoTest.cpp b/jni/RedactionInfoTest.cpp new file mode 100644 index 000000000..9d98058e1 --- /dev/null +++ b/jni/RedactionInfoTest.cpp @@ -0,0 +1,276 @@ +/* + * 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 <gtest/gtest.h> + +#include <memory> +#include <vector> + +#include "libfuse_jni/RedactionInfo.h" + +using namespace mediaprovider::fuse; + +using std::unique_ptr; +using std::vector; + +unique_ptr<vector<RedactionRange>> createRedactionRangeVector(int num_rr, off64_t* rr) { + auto res = std::make_unique<vector<RedactionRange>>(); + 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); +} |