| /* |
| * Copyright (C) 2021 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 specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.modules.utils; |
| |
| import androidx.test.filters.SmallTest; |
| |
| import libcore.util.HexEncoding; |
| |
| import junit.framework.TestCase; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.junit.runners.JUnit4; |
| |
| @RunWith(JUnit4.class) |
| @SmallTest |
| public class BytesMatcherTest extends TestCase { |
| @Test |
| public void testEmpty() throws Exception { |
| BytesMatcher matcher = BytesMatcher.decode(""); |
| assertFalse(matcher.test(HexEncoding.decode("cafe"))); |
| assertFalse(matcher.test(HexEncoding.decode(""))); |
| } |
| |
| @Test |
| public void testExact() throws Exception { |
| BytesMatcher matcher = BytesMatcher.decode("+cafe"); |
| assertTrue(matcher.test(HexEncoding.decode("cafe"))); |
| assertFalse(matcher.test(HexEncoding.decode("beef"))); |
| assertFalse(matcher.test(HexEncoding.decode("ca"))); |
| assertFalse(matcher.test(HexEncoding.decode("cafe00"))); |
| } |
| |
| @Test |
| public void testMask() throws Exception { |
| BytesMatcher matcher = BytesMatcher.decode("+cafe/ff00"); |
| assertTrue(matcher.test(HexEncoding.decode("cafe"))); |
| assertTrue(matcher.test(HexEncoding.decode("ca88"))); |
| assertFalse(matcher.test(HexEncoding.decode("beef"))); |
| assertFalse(matcher.test(HexEncoding.decode("ca"))); |
| assertFalse(matcher.test(HexEncoding.decode("cafe00"))); |
| } |
| |
| @Test |
| public void testPrefix() throws Exception { |
| BytesMatcher matcher = BytesMatcher.decode("⊆cafe,⊆beef/ff00"); |
| assertTrue(matcher.test(HexEncoding.decode("cafe"))); |
| assertFalse(matcher.test(HexEncoding.decode("caff"))); |
| assertTrue(matcher.test(HexEncoding.decode("cafecafe"))); |
| assertFalse(matcher.test(HexEncoding.decode("ca"))); |
| assertTrue(matcher.test(HexEncoding.decode("beef"))); |
| assertTrue(matcher.test(HexEncoding.decode("beff"))); |
| assertTrue(matcher.test(HexEncoding.decode("beffbeff"))); |
| assertFalse(matcher.test(HexEncoding.decode("be"))); |
| } |
| |
| @Test |
| public void testSerialize_Empty() throws Exception { |
| BytesMatcher matcher = new BytesMatcher(); |
| matcher = BytesMatcher.decode(BytesMatcher.encode(matcher)); |
| |
| // Also very empty and null values |
| BytesMatcher.decode(""); |
| BytesMatcher.decode(null); |
| } |
| |
| @Test |
| public void testSerialize_Exact() throws Exception { |
| BytesMatcher matcher = new BytesMatcher(); |
| matcher.addExactRejectRule(HexEncoding.decode("cafe00112233"), |
| HexEncoding.decode("ffffff000000")); |
| matcher.addExactRejectRule(HexEncoding.decode("beef00112233"), |
| null); |
| matcher.addExactAcceptRule(HexEncoding.decode("000000000000"), |
| HexEncoding.decode("000000000000")); |
| |
| assertFalse(matcher.test(HexEncoding.decode("cafe00ffffff"))); |
| assertFalse(matcher.test(HexEncoding.decode("beef00112233"))); |
| assertTrue(matcher.test(HexEncoding.decode("beef00ffffff"))); |
| |
| // Bounce through serialization pass and confirm it still works |
| matcher = BytesMatcher.decode(BytesMatcher.encode(matcher)); |
| |
| assertFalse(matcher.test(HexEncoding.decode("cafe00ffffff"))); |
| assertFalse(matcher.test(HexEncoding.decode("beef00112233"))); |
| assertTrue(matcher.test(HexEncoding.decode("beef00ffffff"))); |
| } |
| |
| @Test |
| public void testSerialize_Prefix() throws Exception { |
| BytesMatcher matcher = new BytesMatcher(); |
| matcher.addExactRejectRule(HexEncoding.decode("aa"), null); |
| matcher.addExactAcceptRule(HexEncoding.decode("bb"), null); |
| matcher.addPrefixAcceptRule(HexEncoding.decode("aa"), null); |
| matcher.addPrefixRejectRule(HexEncoding.decode("bb"), null); |
| |
| assertFalse(matcher.test(HexEncoding.decode("aa"))); |
| assertTrue(matcher.test(HexEncoding.decode("bb"))); |
| assertTrue(matcher.test(HexEncoding.decode("aaaa"))); |
| assertFalse(matcher.test(HexEncoding.decode("bbbb"))); |
| |
| // Bounce through serialization pass and confirm it still works |
| matcher = BytesMatcher.decode(BytesMatcher.encode(matcher)); |
| |
| assertFalse(matcher.test(HexEncoding.decode("aa"))); |
| assertTrue(matcher.test(HexEncoding.decode("bb"))); |
| assertTrue(matcher.test(HexEncoding.decode("aaaa"))); |
| assertFalse(matcher.test(HexEncoding.decode("bbbb"))); |
| } |
| |
| @Test |
| public void testOrdering_RejectFirst() throws Exception { |
| BytesMatcher matcher = BytesMatcher.decode("-ff/0f,+ff/f0"); |
| assertFalse(matcher.test(HexEncoding.decode("ff"))); |
| assertTrue(matcher.test(HexEncoding.decode("f0"))); |
| assertFalse(matcher.test(HexEncoding.decode("0f"))); |
| } |
| |
| @Test |
| public void testOrdering_AcceptFirst() throws Exception { |
| BytesMatcher matcher = BytesMatcher.decode("+ff/f0,-ff/0f"); |
| assertTrue(matcher.test(HexEncoding.decode("ff"))); |
| assertTrue(matcher.test(HexEncoding.decode("f0"))); |
| assertFalse(matcher.test(HexEncoding.decode("0f"))); |
| } |
| } |