+/*
+ * Copyright 2013 Facebook, Inc.
+ *
+ * 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.
+ */
+
+#include "folly/Uri.h"
+
+#include <glog/logging.h>
+#include <gtest/gtest.h>
+
+using namespace folly;
+
+namespace {
+
+} // namespace
+
+TEST(Uri, Simple) {
+ {
+ fbstring s("http://www.facebook.com/hello/world?query#fragment");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("www.facebook.com", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/hello/world", u.path());
+ EXPECT_EQ("query", u.query());
+ EXPECT_EQ("fragment", u.fragment());
+ EXPECT_EQ(s, u.fbstr()); // canonical
+ }
+
+ {
+ fbstring s("http://www.facebook.com:8080/hello/world?query#fragment");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("www.facebook.com", u.host());
+ EXPECT_EQ(8080, u.port());
+ EXPECT_EQ("/hello/world", u.path());
+ EXPECT_EQ("query", u.query());
+ EXPECT_EQ("fragment", u.fragment());
+ EXPECT_EQ(s, u.fbstr()); // canonical
+ }
+
+ {
+ fbstring s("http://127.0.0.1:8080/hello/world?query#fragment");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("127.0.0.1", u.host());
+ EXPECT_EQ(8080, u.port());
+ EXPECT_EQ("/hello/world", u.path());
+ EXPECT_EQ("query", u.query());
+ EXPECT_EQ("fragment", u.fragment());
+ EXPECT_EQ(s, u.fbstr()); // canonical
+ }
+
+ {
+ fbstring s("http://[::1]:8080/hello/world?query#fragment");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("[::1]", u.host());
+ EXPECT_EQ(8080, u.port());
+ EXPECT_EQ("/hello/world", u.path());
+ EXPECT_EQ("query", u.query());
+ EXPECT_EQ("fragment", u.fragment());
+ EXPECT_EQ(s, u.fbstr()); // canonical
+ }
+
+ {
+ fbstring s("http://user:pass@host.com/");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("user", u.username());
+ EXPECT_EQ("pass", u.password());
+ EXPECT_EQ("host.com", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/", u.path());
+ EXPECT_EQ("", u.query());
+ EXPECT_EQ("", u.fragment());
+ EXPECT_EQ(s, u.fbstr());
+ }
+
+ {
+ fbstring s("http://user@host.com/");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("user", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("host.com", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/", u.path());
+ EXPECT_EQ("", u.query());
+ EXPECT_EQ("", u.fragment());
+ EXPECT_EQ(s, u.fbstr());
+ }
+
+ {
+ fbstring s("http://user:@host.com/");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("user", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("host.com", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/", u.path());
+ EXPECT_EQ("", u.query());
+ EXPECT_EQ("", u.fragment());
+ EXPECT_EQ("http://user@host.com/", u.fbstr());
+ }
+
+ {
+ fbstring s("http://:pass@host.com/");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("pass", u.password());
+ EXPECT_EQ("host.com", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/", u.path());
+ EXPECT_EQ("", u.query());
+ EXPECT_EQ("", u.fragment());
+ EXPECT_EQ(s, u.fbstr());
+ }
+
+ {
+ fbstring s("http://@host.com/");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("host.com", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/", u.path());
+ EXPECT_EQ("", u.query());
+ EXPECT_EQ("", u.fragment());
+ EXPECT_EQ("http://host.com/", u.fbstr());
+ }
+
+ {
+ fbstring s("http://:@host.com/");
+ Uri u(s);
+ EXPECT_EQ("http", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("host.com", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/", u.path());
+ EXPECT_EQ("", u.query());
+ EXPECT_EQ("", u.fragment());
+ EXPECT_EQ("http://host.com/", u.fbstr());
+ }
+
+ {
+ fbstring s("file:///etc/motd");
+ Uri u(s);
+ EXPECT_EQ("file", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/etc/motd", u.path());
+ EXPECT_EQ("", u.query());
+ EXPECT_EQ("", u.fragment());
+ EXPECT_EQ(s, u.fbstr());
+ }
+
+ {
+ fbstring s("file:/etc/motd");
+ Uri u(s);
+ EXPECT_EQ("file", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/etc/motd", u.path());
+ EXPECT_EQ("", u.query());
+ EXPECT_EQ("", u.fragment());
+ EXPECT_EQ("file:///etc/motd", u.fbstr());
+ }
+
+ {
+ fbstring s("file://etc/motd");
+ Uri u(s);
+ EXPECT_EQ("file", u.scheme());
+ EXPECT_EQ("", u.username());
+ EXPECT_EQ("", u.password());
+ EXPECT_EQ("etc", u.host());
+ EXPECT_EQ(0, u.port());
+ EXPECT_EQ("/motd", u.path());
+ EXPECT_EQ("", u.query());
+ EXPECT_EQ("", u.fragment());
+ EXPECT_EQ(s, u.fbstr());
+ }
+
+ EXPECT_THROW({Uri("2http://www.facebook.com/");},
+ std::invalid_argument);
+}