/* * 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.addthis.hydra.data.filter.value; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import com.addthis.bundle.value.ValueFactory; import com.addthis.bundle.value.ValueObject; import org.apache.commons.lang.RandomStringUtils; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; public class TestValueFilterContains { @Test public void scalarInput() { String[] values = new String[3]; values[0] = "foo"; values[1] = "bar"; values[2] = "baz"; ValueFilterContains filter = new ValueFilterContains(values, null, false, false); assertNotNull(filter.filter(ValueFactory.create("foo"))); assertNotNull(filter.filter(ValueFactory.create("bar"))); assertNotNull(filter.filter(ValueFactory.create("baz"))); assertNotNull(filter.filter(ValueFactory.create("hellofooworld"))); assertNull(filter.filter(ValueFactory.create(""))); assertNull(filter.filter(null)); } @Test public void integerInput() { String[] values = new String[3]; values[0] = "200"; values[1] = "300"; values[2] = "400"; ValueFilterContains filter = new ValueFilterContains(values, null, false, false); assertNotNull(filter.filter(ValueFactory.create(200))); assertNotNull(filter.filter(ValueFactory.create(300))); assertNotNull(filter.filter(ValueFactory.create(400))); assertNotNull(filter.filter(ValueFactory.create(2000))); assertNull(filter.filter(ValueFactory.create(5))); assertNull(filter.filter(null)); } @Test public void escapedInput() { String[] values = new String[3]; values[0] = "foo"; values[1] = "bar\\Ebar"; values[2] = "baz"; ValueFilterContains filter = new ValueFilterContains(values, null, false, false); assertNotNull(filter.filter(ValueFactory.create("foo"))); assertNotNull(filter.filter(ValueFactory.create("bar\\Ebar"))); assertNotNull(filter.filter(ValueFactory.create("baz"))); assertNotNull(filter.filter(ValueFactory.create("hellofooworld"))); assertNull(filter.filter(ValueFactory.create(""))); assertNull(filter.filter(null)); } @Test public void returnMatch() { String[] values = new String[3]; values[0] = "foo"; values[1] = "bar"; values[2] = "baz"; ValueFilterContains filter = new ValueFilterContains(values, null, false, true); assertEquals("foo", filter.filter(ValueFactory.create("foo")).asString().toString()); assertEquals("bar", filter.filter(ValueFactory.create("bar")).asString().toString()); assertEquals("baz", filter.filter(ValueFactory.create("baz")).asString().toString()); assertEquals("foo", filter.filter(ValueFactory.create("hellofooworld")).asString().toString()); assertNull(filter.filter(ValueFactory.create(""))); assertNull(filter.filter(null)); } private static class SearchThread extends Thread { final Set<String> needles; final List<String> haystack; final ValueFilterContains filter; SearchThread(Set<String> needles, int numHaystack, ValueFilterContains filter) { this.needles = needles; this.filter = filter; this.haystack = new ArrayList<>(needles); for (int i = needles.size(); i < numHaystack; i++) { String candidate = RandomStringUtils.randomAscii(20); if (!needles.contains(candidate)) { haystack.add(candidate); } } Collections.shuffle(haystack); } @Override public void start() { int count = 0; for (String next : haystack) { ValueObject result = filter.filterValue(ValueFactory.create(next)); if (needles.contains(next)) { assertEquals(next, result.asString().toString()); count++; } else { assertNull(result); } } assertEquals(needles.size(), count); } } @Test public void multithreadedTest() throws InterruptedException { int numThreads = 8; int numNeedles = 100; int numHaystack = 1000; SearchThread[] threads = new SearchThread[numThreads]; Set<String> needles = new HashSet<>(); for (int i = 0; i < numNeedles; i++) { needles.add(RandomStringUtils.randomAscii(20)); } ValueFilterContains filter = new ValueFilterContains(needles.toArray(new String[numNeedles]), null, false, false); for (int i = 0; i < numThreads; i++) { threads[i] = new SearchThread(needles, numHaystack, filter); } for (int i = 0; i < numThreads; i++) { threads[i].start(); } for (int i = 0; i < numThreads; i++) { threads[i].join(); } } }