1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 package com.android.statementservice.parser
18 
19 import android.os.PatternMatcher.PATTERN_ADVANCED_GLOB
20 import android.os.PatternMatcher.PATTERN_LITERAL
21 import android.os.PatternMatcher.PATTERN_PREFIX
22 import android.os.PatternMatcher.PATTERN_SIMPLE_GLOB
23 import androidx.test.ext.junit.runners.AndroidJUnit4
24 import com.google.common.truth.Truth.assertThat
25 import org.junit.Test
26 import org.junit.runner.RunWith
27 
28 @RunWith(AndroidJUnit4::class)
29 class DalComponentParserTest {
30 
31     @Test
parseExpressionsnull32     fun parseExpressions() {
33         validateParsedExpression("foobar", PATTERN_LITERAL, "foobar")
34         validateParsedExpression("foo.bar", PATTERN_LITERAL, "foo\\.bar")
35         validateParsedExpression("foo*", PATTERN_PREFIX, "foo")
36         validateParsedExpression("*bar", PATTERN_SIMPLE_GLOB, ".*bar")
37         validateParsedExpression("foo*bar", PATTERN_SIMPLE_GLOB, "foo.*bar")
38         validateParsedExpression("foo.*bar", PATTERN_SIMPLE_GLOB, "foo\\..*bar")
39         validateParsedExpression("*foo*bar", PATTERN_SIMPLE_GLOB, ".*foo.*bar")
40         validateParsedExpression("foo?bar", PATTERN_SIMPLE_GLOB, "foo.bar")
41         validateParsedExpression("foo.?bar", PATTERN_SIMPLE_GLOB, "foo\\..bar")
42         validateParsedExpression("?bar", PATTERN_SIMPLE_GLOB, ".bar")
43         validateParsedExpression("foo?", PATTERN_SIMPLE_GLOB, "foo.")
44         validateParsedExpression("fo?b*r", PATTERN_SIMPLE_GLOB, "fo.b.*r")
45         validateParsedExpression("?*bar", PATTERN_ADVANCED_GLOB, ".+bar")
46         validateParsedExpression("foo?*bar", PATTERN_ADVANCED_GLOB, "foo.+bar")
47         validateParsedExpression("foo?*bar*", PATTERN_ADVANCED_GLOB, "foo.+bar.*")
48         validateParsedExpression("foo*?bar", PATTERN_SIMPLE_GLOB, "foo.*.bar")
49 
50         // set matches are not supported in DAL
51         validateParsedExpression("foo[a-z]", PATTERN_LITERAL, "foo[a-z]")
52         validateParsedExpression("foo[a-z]+", PATTERN_LITERAL, "foo[a-z]+")
53         validateParsedExpression("foo[a-z]*", PATTERN_PREFIX, "foo[a-z]")
54         validateParsedExpression("[a-z]*bar", PATTERN_SIMPLE_GLOB, "[a-z].*bar")
55         validateParsedExpression("foo[a-z]?bar", PATTERN_SIMPLE_GLOB, "foo[a-z].bar")
56         validateParsedExpression("foo[a-z]?*bar", PATTERN_ADVANCED_GLOB, "foo\\[a-z\\].+bar")
57 
58         // range matches are not supported in DAL
59         validateParsedExpression("fo{2}", PATTERN_LITERAL, "fo{2}")
60         validateParsedExpression("fo{2}+", PATTERN_LITERAL, "fo{2}+")
61         validateParsedExpression("fo{2}*", PATTERN_PREFIX, "fo{2}")
62         validateParsedExpression("fo{2}*bar", PATTERN_SIMPLE_GLOB, "fo{2}.*bar")
63         validateParsedExpression("fo{2}?*", PATTERN_ADVANCED_GLOB, "fo\\{2\\}.+")
64         validateParsedExpression("foo{2}?*bar", PATTERN_ADVANCED_GLOB, "foo\\{2\\}.+bar")
65     }
66 
67     @Test(expected = IllegalArgumentException::class)
parseEmptyExpressionnull68     fun parseEmptyExpression() {
69         parseMatchingExpression("")
70     }
71 
validateParsedExpressionnull72     private fun validateParsedExpression(given: String, expectedType: Int, expectedFilter: String) {
73         val (type, filter) = parseMatchingExpression(given)
74         assertThat(filter).isEqualTo(expectedFilter)
75         assertThat(type).isEqualTo(expectedType)
76         assertThat(filter).isEqualTo(expectedFilter)
77     }
78 }