// // ======================================================================== // Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package test.utils.lang; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; import com.firefly.utils.lang.QuotedStringTokenizer; /** * * */ public class TestQuotedStringTokenizer { /* * Test for String nextToken() */ @Test public void testTokenizer0() { QuotedStringTokenizer tok = new QuotedStringTokenizer("abc\n\"d\\\"'\"\n'p\\',y'\nz"); checkTok(tok, false, false); } /* * Test for String nextToken() */ @Test public void testTokenizer1() { QuotedStringTokenizer tok = new QuotedStringTokenizer("abc, \"d\\\"'\",'p\\',y' z", " ,"); checkTok(tok, false, false); } /* * Test for String nextToken() */ @Test public void testTokenizer2() { QuotedStringTokenizer tok = new QuotedStringTokenizer("abc, \"d\\\"'\",'p\\',y' z", " ,", false); checkTok(tok, false, false); tok = new QuotedStringTokenizer("abc, \"d\\\"'\",'p\\',y' z", " ,", true); checkTok(tok, true, false); } /* * Test for String nextToken() */ @Test public void testTokenizer3() { QuotedStringTokenizer tok; tok = new QuotedStringTokenizer("abc, \"d\\\"'\",'p\\',y' z", " ,", false, false); checkTok(tok, false, false); tok = new QuotedStringTokenizer("abc, \"d\\\"'\",'p\\',y' z", " ,", false, true); checkTok(tok, false, true); tok = new QuotedStringTokenizer("abc, \"d\\\"'\",'p\\',y' z", " ,", true, false); checkTok(tok, true, false); tok = new QuotedStringTokenizer("abc, \"d\\\"'\",'p\\',y' z", " ,", true, true); checkTok(tok, true, true); } @Test public void testQuote() { StringBuffer buf = new StringBuffer(); buf.setLength(0); QuotedStringTokenizer.quote(buf, "abc \n efg"); assertEquals("\"abc \\n efg\"", buf.toString()); buf.setLength(0); QuotedStringTokenizer.quote(buf, "abcefg"); assertEquals("\"abcefg\"", buf.toString()); buf.setLength(0); QuotedStringTokenizer.quote(buf, "abcefg\""); assertEquals("\"abcefg\\\"\"", buf.toString()); } /* * Test for String nextToken() */ @Test public void testTokenizer4() { QuotedStringTokenizer tok = new QuotedStringTokenizer("abc'def,ghi'jkl", ","); tok.setSingle(false); assertEquals("abc'def", tok.nextToken()); assertEquals("ghi'jkl", tok.nextToken()); tok = new QuotedStringTokenizer("abc'def,ghi'jkl", ","); tok.setSingle(true); assertEquals("abcdef,ghijkl", tok.nextToken()); } private void checkTok(QuotedStringTokenizer tok, boolean delim, boolean quotes) { assertTrue(tok.hasMoreElements()); assertTrue(tok.hasMoreTokens()); assertEquals("abc", tok.nextToken()); if (delim) assertEquals(",", tok.nextToken()); if (delim) assertEquals(" ", tok.nextToken()); assertEquals(quotes ? "\"d\\\"'\"" : "d\"'", tok.nextElement()); if (delim) assertEquals(",", tok.nextToken()); assertEquals(quotes ? "'p\\',y'" : "p',y", tok.nextToken()); if (delim) assertEquals(" ", tok.nextToken()); assertEquals("z", tok.nextToken()); assertFalse(tok.hasMoreTokens()); } /* * Test for String quote(String, String) */ @Test public void testQuoteIfNeeded() { assertEquals("abc", QuotedStringTokenizer.quoteIfNeeded("abc", " ,")); assertEquals("\"a c\"", QuotedStringTokenizer.quoteIfNeeded("a c", " ,")); assertEquals("\"a'c\"", QuotedStringTokenizer.quoteIfNeeded("a'c", " ,")); assertEquals("\"a\\n\\r\\t\"", QuotedStringTokenizer.quote("a\n\r\t")); assertEquals("\"\\u0000\\u001f\"", QuotedStringTokenizer.quote("\u0000\u001f")); } @Test public void testUnquote() { assertEquals("abc", QuotedStringTokenizer.unquote("abc")); assertEquals("a\"c", QuotedStringTokenizer.unquote("\"a\\\"c\"")); assertEquals("a'c", QuotedStringTokenizer.unquote("\"a'c\"")); assertEquals("a\n\r\t", QuotedStringTokenizer.unquote("\"a\\n\\r\\t\"")); assertEquals("\u0000\u001f ", QuotedStringTokenizer.unquote("\"\u0000\u001f\u0020\"")); assertEquals("\u0000\u001f ", QuotedStringTokenizer.unquote("\"\u0000\u001f\u0020\"")); assertEquals("ab\u001ec", QuotedStringTokenizer.unquote("ab\u001ec")); assertEquals("ab\u001ec", QuotedStringTokenizer.unquote("\"ab\u001ec\"")); } @Test public void testUnquoteOnly() { assertEquals("abc", QuotedStringTokenizer.unquoteOnly("abc")); assertEquals("a\"c", QuotedStringTokenizer.unquoteOnly("\"a\\\"c\"")); assertEquals("a'c", QuotedStringTokenizer.unquoteOnly("\"a'c\"")); assertEquals("a\\n\\r\\t", QuotedStringTokenizer.unquoteOnly("\"a\\\\n\\\\r\\\\t\"")); assertEquals("ba\\uXXXXaaa", QuotedStringTokenizer.unquoteOnly("\"ba\\\\uXXXXaaa\"")); } /** * When encountering a Content-Disposition line during a multi-part mime * file upload, the filename="..." field can contain '\' characters that do * not belong to a proper escaping sequence, this tests * QuotedStringTokenizer to ensure that it preserves those slashes for where * they cannot be escaped. */ @Test public void testNextTokenOnContentDisposition() { String content_disposition = "form-data; name=\"fileup\"; filename=\"Taken on Aug 22 \\ 2012.jpg\""; QuotedStringTokenizer tok = new QuotedStringTokenizer(content_disposition, ";", false, true); assertEquals("form-data", tok.nextToken().trim()); assertEquals("name=\"fileup\"", tok.nextToken().trim()); assertEquals("filename=\"Taken on Aug 22 \\ 2012.jpg\"", tok.nextToken().trim()); } }