/*
* 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.facebook.presto.operator.scalar;
import org.testng.annotations.Test;
import static com.facebook.presto.spi.type.BigintType.BIGINT;
import static com.facebook.presto.spi.type.VarcharType.createVarcharType;
public class TestUrlFunctions
extends AbstractTestFunctions
{
@Test
public void testUrlExtract()
{
validateUrlExtract("http://example.com/path1/p.php?k1=v1&k2=v2#Ref1", "http", "example.com", null, "/path1/p.php", "k1=v1&k2=v2", "Ref1");
validateUrlExtract("http://example.com/path1/p.php?", "http", "example.com", null, "/path1/p.php", "", "");
validateUrlExtract("http://example.com/path1/p.php", "http", "example.com", null, "/path1/p.php", "", "");
validateUrlExtract("http://example.com:8080/path1/p.php?k1=v1&k2=v2#Ref1", "http", "example.com", 8080L, "/path1/p.php", "k1=v1&k2=v2", "Ref1");
validateUrlExtract("https://username@example.com", "https", "example.com", null, "", "", "");
validateUrlExtract("https://username:password@example.com", "https", "example.com", null, "", "", "");
validateUrlExtract("mailto:test@example.com", "mailto", "", null, "", "", "");
validateUrlExtract("foo", "", "", null, "foo", "", "");
validateUrlExtract("http://example.com/^", null, null, null, null, null, null);
}
@Test
public void testUrlExtractParameter()
{
assertFunction("url_extract_parameter('http://example.com/path1/p.php?k1=v1&k2=v2&k3&k4#Ref1', 'k1')", createVarcharType(53), "v1");
assertFunction("url_extract_parameter('http://example.com/path1/p.php?k1=v1&k2=v2&k3&k4#Ref1', 'k2')", createVarcharType(53), "v2");
assertFunction("url_extract_parameter('http://example.com/path1/p.php?k1=v1&k2=v2&k3&k4#Ref1', 'k3')", createVarcharType(53), "");
assertFunction("url_extract_parameter('http://example.com/path1/p.php?k1=v1&k2=v2&k3&k4#Ref1', 'k4')", createVarcharType(53), "");
assertFunction("url_extract_parameter('http://example.com/path1/p.php?k1=v1&k2=v2&k3&k4#Ref1', 'k5')", createVarcharType(53), null);
assertFunction("url_extract_parameter('http://example.com/path1/p.php?k1=v1&k1=v2&k1&k1#Ref1', 'k1')", createVarcharType(53), "v1");
assertFunction("url_extract_parameter('http://example.com/path1/p.php?k1&k1=v1&k1&k1#Ref1', 'k1')", createVarcharType(50), "");
assertFunction("url_extract_parameter('http://example.com/path1/p.php?k=a=b=c&x=y#Ref1', 'k')", createVarcharType(47), "a=b=c");
assertFunction("url_extract_parameter('foo', 'k1')", createVarcharType(3), null);
}
@Test
public void testUrlEncode()
{
final String[][] outputInputPairs = {
{"http%3A%2F%2Ftest", "http://test"},
{"http%3A%2F%2Ftest%3Fa%3Db%26c%3Dd", "http://test?a=b&c=d"},
{"http%3A%2F%2F%E3%83%86%E3%82%B9%E3%83%88", "http://\u30c6\u30b9\u30c8"},
{"%7E%40%3A.-*_%2B+%E2%98%83", "~@:.-*_+ \u2603"},
{"test", "test"}
};
for (String[] outputInputPair : outputInputPairs) {
String input = outputInputPair[1];
String output = outputInputPair[0];
assertFunction("url_encode('" + input + "')", createVarcharType(input.length() * 12), output);
}
assertFunction("url_encode('\uD867\uDE3D')", createVarcharType(12), "%F0%A9%B8%BD");
}
@Test
public void testUrlDecode()
{
String[][] inputOutputPairs = {
{"http%3A%2F%2Ftest", "http://test"},
{"http%3A%2F%2Ftest%3Fa%3Db%26c%3Dd", "http://test?a=b&c=d"},
{"http%3A%2F%2F%E3%83%86%E3%82%B9%E3%83%88", "http://\u30c6\u30b9\u30c8"},
{"%7E%40%3A.-*_%2B+%E2%98%83", "~@:.-*_+ \u2603"},
{"test", "test"}
};
for (String[] inputOutputPair : inputOutputPairs) {
String input = inputOutputPair[0];
String output = inputOutputPair[1];
assertFunction("url_decode('" + input + "')", createVarcharType(input.length()), output);
}
}
private void validateUrlExtract(String url, String protocol, String host, Long port, String path, String query, String fragment)
{
assertFunction("url_extract_protocol('" + url + "')", createVarcharType(url.length()), protocol);
assertFunction("url_extract_host('" + url + "')", createVarcharType(url.length()), host);
if (port == null) {
assertFunction("url_extract_port('" + url + "')", BIGINT, null);
}
else {
assertFunction("url_extract_port('" + url + "')", BIGINT, port);
}
assertFunction("url_extract_path('" + url + "')", createVarcharType(url.length()), path);
assertFunction("url_extract_query('" + url + "')", createVarcharType(url.length()), query);
assertFunction("url_extract_fragment('" + url + "')", createVarcharType(url.length()), fragment);
}
}