summaryrefslogtreecommitdiff
path: root/jni/RedactionInfoTest.cpp
diff options
context:
space:
mode:
authorZim <zezeozue@google.com>2020-01-13 14:11:19 +0000
committerZim <zezeozue@google.com>2020-01-13 14:13:15 +0000
commit2e5ad887558a64647992d7d606b40a1678a8d967 (patch)
tree2003575ab912be26015db07d82f494cc66a5c9b8 /jni/RedactionInfoTest.cpp
parent2dda61d5441ca0c22d5715366bad21034a9ddfce (diff)
downloadMediaProvider-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.cpp276
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);
+}