blob: af52e9a8664c92c91f55073e38e6352b14367f1a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014-2015 IBM Corp.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Allan Stockdill-Mander
* Seth Hoenig
*******************************************************************************/
package gateway
// Remember benchmarks can be run with the command
// go test -bench=".*" ./...
import (
"testing"
)
func Test_ContainsWildcard(t *testing.T) {
topics := map[string]bool{
"a": false,
"a/b": false,
"/a/b": false,
"+": true,
"/+": true,
"a/+": true,
"a/b/c/+": true,
"a/+/+/d": true,
"a/++/+d": false,
"#": true,
"/#": true,
"a/b/c/#": true,
"a/##/b": false,
}
for topic, exp := range topics {
res := ContainsWildcard(topic)
if res != exp {
t.Errorf("ContainsWildcard expected \"%s\", got \"%s\"", exp, res)
}
}
}
func Benchmark_ContainsWildcard(b *testing.B) {
topics := map[string]bool{
"a": false,
"a/b": false,
"/a/b": false,
"+": true,
"/+": true,
"a/+": true,
"a/b/c/+": true,
"a/+/+/d": true,
"a/++/+d": false,
"#": true,
"/#": true,
"a/b/c/#": true,
"a/##/b": false,
"a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z": false,
"a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/+/z": true,
"a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/#": true,
"+/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z": true,
"a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/+/s/+/u/v/w/x/+/z": true,
"a/b/c/d/e/f/g/+/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/+/z": true,
"a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/+/y/+": true,
"a/b/+/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/+/z": true,
"a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/+/w/x/+/z": true,
"+/+/+/d/+/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/+/z": true,
"a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/+/t/u/v/w/x/+/#": true,
"a/b/c/d/e/f/g/h/i/j/k/+/+/n/+/p/+/r/+/t/u/v/w/x/+/z": true,
"a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/++/##/z": false,
}
res := false
for i := 0; i < b.N; i++ {
for topic, _ := range topics {
res = res && ContainsWildcard(topic)
}
}
}
func Test_ValidateTopicFilter(t *testing.T) {
topics := map[string]bool{
"": false,
"a": true,
"#": true,
"+": true,
"/": true,
"/a": true,
"/#": true,
"a/": true,
"+/": true,
"#/": false,
"a/b": true,
"a/#": true,
"a/+": true,
"b/a": true,
"#/b": false,
"+/b": true,
"a/b/c/": true,
"/a/b/c": true,
"/a/++": true,
"a/++/b": true,
"/a/##": true,
"a/##/b": true,
"a/#/b": false,
"a/+/b": true,
"a/+/b/+": true,
"/a/+/b/#": true,
"/a/+#/b": true,
"/a/#+/b": true,
"a//b": true,
"//a": true,
"a//": true,
}
for topic, expectError := range topics {
_, e := ValidateTopicFilter(topic)
if expectError == (e != nil) {
t.Errorf("error validating topic \"%s\"", topic)
}
}
}
func Benchmark_ValidateTopicFilter(b *testing.B) {
topics := map[string]bool{
"": false,
"a": true,
"#": true,
"+": true,
"/": true,
"/a": true,
"/#": true,
"a/": true,
"+/": true,
"#/": false,
"a/b": true,
"a/#": true,
"a/+": true,
"b/a": true,
"#/b": false,
"+/b": true,
"a/b/c/": false,
"/a/b/c": true,
"/a/++": true,
"a/++/b": true,
"/a/##": true,
"a/##/b": true,
"a/#/b": false,
"a/+/b": true,
"a/+/b/+": true,
"/a/+/b/#": true,
"/a/+#/b": true,
"/a/#+/b": true,
"a//b": true,
"//a": true,
"a//": true,
}
for i := 0; i < b.N; i++ {
sum := 0
for topic, _ := range topics {
toks, _ := ValidateTopicFilter(topic)
sum += len(toks)
}
}
}
func Test_ValidateTopicName(t *testing.T) {
topics := map[string]bool{
"": false,
"a": true,
"#": false,
"+": false,
"/": true,
"/a": true,
"/#": false,
"a/": true,
"+/": false,
"#/": false,
"a/b": true,
"a/#": false,
"a/+": false,
"b/a": true,
"#/b": false,
"+/b": false,
"a/b/c/": true,
"/a/b/c": true,
"/a/++": true,
"a/++/b": true,
"/a/##": true,
"a/##/b": true,
"a/#/b": false,
"a/+/b": false,
"a/+/b/+": false,
"/a/+/b/#": false,
"/a/+#/b": true,
"/a/#+/b": true,
"//": true,
"a//": true,
"//a": true,
"///a///": true,
}
for topic, expectError := range topics {
_, e := ValidateTopicName(topic)
if expectError == (e != nil) {
t.Errorf("error validating topic \"%s\"", topic)
}
}
}
func Benchmark_ValidateTopicName(b *testing.B) {
topics := map[string]bool{
"": false,
"a": true,
"#": false,
"+": false,
"/": true,
"/a": true,
"/#": false,
"a/": true,
"+/": false,
"#/": false,
"a/b": true,
"a/#": false,
"a/+": false,
"b/a": true,
"#/b": false,
"+/b": false,
"a/b/c/": true,
"/a/b/c": true,
"/a/++": true,
"a/++/b": true,
"/a/##": true,
"a/##/b": true,
"a/#/b": false,
"a/+/b": false,
"a/+/b/+": false,
"/a/+/b/#": false,
"/a/+#/b": true,
"/a/#+/b": true,
"//": true,
"a//": true,
"//a": true,
"///a///": true,
}
for i := 0; i < b.N; i++ {
sum := 0
for topic, _ := range topics {
toks, _ := ValidateTopicName(topic)
sum += len(toks)
}
}
}