/*- * -\-\- * Helios Client * -- * Copyright (C) 2016 Spotify AB * -- * 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.spotify.helios.common.descriptors; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import com.spotify.helios.common.Json; import org.junit.Test; public class HostSelectorTest { @Test public void testParseEquals() { assertEquals(new HostSelector("A", HostSelector.Operator.EQUALS, "B"), HostSelector.parse("A=B")); assertEquals(new HostSelector("A", HostSelector.Operator.EQUALS, "B"), HostSelector.parse("A = B")); assertEquals(new HostSelector("A", HostSelector.Operator.EQUALS, "B"), HostSelector.parse("A =B")); assertEquals(new HostSelector("A", HostSelector.Operator.EQUALS, "B"), HostSelector.parse("A= B")); assertEquals(new HostSelector("A", HostSelector.Operator.EQUALS, "B"), HostSelector.parse("A\t\t= B")); } @Test public void testParseNotEquals() { assertEquals(new HostSelector("A", HostSelector.Operator.NOT_EQUALS, "B"), HostSelector.parse("A!=B")); assertEquals(new HostSelector("A", HostSelector.Operator.NOT_EQUALS, "B"), HostSelector.parse("A != B")); assertEquals(new HostSelector("A", HostSelector.Operator.NOT_EQUALS, "B"), HostSelector.parse("A !=B")); assertEquals(new HostSelector("A", HostSelector.Operator.NOT_EQUALS, "B"), HostSelector.parse("A!= B")); assertEquals(new HostSelector("A", HostSelector.Operator.NOT_EQUALS, "B"), HostSelector.parse("A\t\t!= B")); } @Test public void testParseAllowedCharacters() { assertEquals(new HostSelector("foo", HostSelector.Operator.EQUALS, "123"), HostSelector.parse("foo=123")); assertEquals(new HostSelector("_abc", HostSelector.Operator.NOT_EQUALS, "d-e"), HostSelector.parse("_abc!=d-e")); } @Test public void testParseDisallowedCharacters() { assertNull(HostSelector.parse("foo = @123")); assertNull(HostSelector.parse("f/oo = 123")); // Verify equal not allowed in label and operand assertNull(HostSelector.parse("f=oo = 123")); assertNull(HostSelector.parse("foo = 12=3")); // Verify spaces not allowed in label and operand assertNull(HostSelector.parse("fo o = 123")); assertNull(HostSelector.parse("foo = 1 23")); // Verify ! not allowed in label and operand assertNull(HostSelector.parse("foo=!123")); assertNull(HostSelector.parse("!foo=bar")); // Verify fails on unknown operators assertNull(HostSelector.parse("foo or 123")); assertNull(HostSelector.parse("foo==123")); assertNull(HostSelector.parse("foo&&123")); // Verify fails on empty label or operand assertNull(HostSelector.parse("=123")); assertNull(HostSelector.parse(" =123")); assertNull(HostSelector.parse(" = 123")); assertNull(HostSelector.parse("foo=")); assertNull(HostSelector.parse("foo= ")); assertNull(HostSelector.parse("foo = ")); } @Test public void testEqualsMatch() { final HostSelector hostSelector = HostSelector.parse("A=B"); assertTrue(hostSelector.matches("B")); assertFalse(hostSelector.matches("Bb")); assertFalse(hostSelector.matches("b")); assertFalse(hostSelector.matches("A")); } @Test public void testNotEqualsMatch() { final HostSelector hostSelector = HostSelector.parse("A!=B"); assertFalse(hostSelector.matches("B")); assertTrue(hostSelector.matches("Bb")); assertTrue(hostSelector.matches("b")); assertTrue(hostSelector.matches("A")); } @Test public void testInOperator() { final HostSelector hostSelector = HostSelector.parse("a in (foo, bar)"); assertTrue(hostSelector.matches("foo")); assertTrue(hostSelector.matches("bar")); assertFalse(hostSelector.matches("baz")); final HostSelector hostSelector2 = HostSelector.parse("a in(foo,bar)"); assertTrue(hostSelector2.matches("foo")); assertTrue(hostSelector2.matches("bar")); assertFalse(hostSelector2.matches("baz")); final HostSelector hostSelector3 = HostSelector.parse("a in(foo)"); assertTrue(hostSelector3.matches("foo")); assertFalse(hostSelector3.matches("baz")); } @Test public void testInOperatorEquality() { assertEquals( HostSelector.parse("a in (foo,bar)"), HostSelector.parse("a in (foo, bar)") ); assertEquals( HostSelector.parse("a in (foo,bar)"), HostSelector.parse("a in (bar,foo)") ); assertEquals( HostSelector.parse("a in (foo)"), HostSelector.parse("a in (foo,foo)") ); } @Test public void testInOperatorSerialization() throws Exception { final HostSelector orig = HostSelector.parse("a in (foo,bar)"); final HostSelector parsed = Json.read(Json.asString(orig), HostSelector.class); assertEquals(orig, parsed); } @Test public void testInOperatorEmptySet() { final HostSelector hostSelector = HostSelector.parse("a in ()"); assertFalse(hostSelector.matches("foo")); assertFalse(hostSelector.matches("bar")); assertFalse(hostSelector.matches("baz")); final HostSelector hostSelector2 = HostSelector.parse("a in()"); assertFalse(hostSelector2.matches("foo")); assertFalse(hostSelector2.matches("bar")); assertFalse(hostSelector2.matches("baz")); } @Test public void testNotInOperator() { final HostSelector hostSelector = HostSelector.parse("a notin (foo, bar)"); assertFalse(hostSelector.matches("foo")); assertFalse(hostSelector.matches("bar")); assertTrue(hostSelector.matches("baz")); final HostSelector hostSelector2 = HostSelector.parse("a notin(foo,bar)"); assertFalse(hostSelector2.matches("foo")); assertFalse(hostSelector2.matches("bar")); assertTrue(hostSelector2.matches("baz")); final HostSelector hostSelector3 = HostSelector.parse("a notin(foo)"); assertFalse(hostSelector3.matches("foo")); assertTrue(hostSelector3.matches("baz")); } @Test public void testNotInOperatorEquality() { assertEquals( HostSelector.parse("a notin (foo,bar)"), HostSelector.parse("a notin (foo, bar)") ); assertEquals( HostSelector.parse("a notin (foo,bar)"), HostSelector.parse("a notin (bar,foo)") ); assertEquals( HostSelector.parse("a notin (foo)"), HostSelector.parse("a notin (foo,foo)") ); } @Test public void testNotInOperatorSerialization() throws Exception { final HostSelector orig = HostSelector.parse("a notin (foo,bar)"); final HostSelector parsed = Json.read(Json.asString(orig), HostSelector.class); assertEquals(orig, parsed); } @Test public void testNotInOperatorEmptySet() { final HostSelector hostSelector = HostSelector.parse("a notin ()"); assertTrue(hostSelector.matches("foo")); assertTrue(hostSelector.matches("bar")); assertTrue(hostSelector.matches("baz")); final HostSelector hostSelector2 = HostSelector.parse("a notin()"); assertTrue(hostSelector2.matches("foo")); assertTrue(hostSelector2.matches("bar")); assertTrue(hostSelector2.matches("baz")); } @Test public void testToPrettyString() { assertEquals("A != B", HostSelector.parse("A!=B").toPrettyString()); assertEquals("A = B", HostSelector.parse("A=B").toPrettyString()); } }