TFCweb  1.0.4 $Rev: 483 $
TFC Primavera 2012: Nucli d'un servidor web
TestUri.cc
Veure la documentació d'aquest fitxer.
1 
11 /*
12  * Copyright (c) 2012 Toni Corvera
13  *
14  * This file is part of TFCWeb.
15  *
16  * TFCWeb is free software: you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation, either version 3 of the License, or
19  * (at your option) any later version.
20  *
21  * TFCWeb is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with TFCWeb. If not, see <http://www.gnu.org/licenses/>.
28  */
29 
30 #include <iostream>
31 #include <limits>
32 #include <sstream>
33 #include <string>
34 
35 #include <Uri.h>
36 
37 #include "comu.h"
38 
39 using namespace std;
40 using namespace tfc;
41 
42 namespace tfc {
43 
44 namespace Fixtures {
45 
46 struct FxtUri {
47 
49  : str_www_google_com("www.google.com"), // ambigu!
50  www_google_com("www.google.com"), // ambigu!
51  str_http_www_google_com("http://www.google.com"),
52  http_www_google_com("http://www.google.com"),
53  str_https_www_google_com_query("https://www.google.com/search?q=c%2B%2B"),
54  https_www_google_com_query("https://www.google.com/search?q=c%2B%2B"),
55  index_html("index.html"),
56  str_barra_barra_str("//str"), // s'entendrà com a http://str/ !
57  barra_barra_str("//str")
58  {
59  // buit
60  }
61 
62  const string str_www_google_com,
63  str_http_www_google_com,
64  str_https_www_google_com_query,
65  str_barra_barra_str;
66 
68  http_www_google_com,
69  https_www_google_com_query,
70  index_html,
71  barra_barra_str;
72 };
73 
74 } // ns Fixtures
75 
76 } // ns tfc
77 
78 BOOST_FIXTURE_TEST_SUITE( Uri_TestSuite, tfc::Fixtures::FxtUri )
79 
80 
83 inline string norm(const string & p) {
84  const Uri u(p);
85  return string(u.normalitzada());
86 }
87 
88 BOOST_AUTO_TEST_CASE( construccio )
89 {
90  BOOST_CHECK_NO_THROW( Uri("../index.html") );
91  BOOST_CHECK_NO_THROW( Uri("././../index.html?q=home#frg") );
92 
93  // TODO: Realment és incorrecta sobre l'RFC?, sembla que no
94  //BOOST_CHECK_THROW( Uri("http://http://www.google.com"), tfc::ErrorAnalisiUrl );
95 }
96 
98 {
99  BOOST_CHECK_EQUAL( Uri(str_www_google_com), Uri(str_www_google_com) );
100  BOOST_CHECK_EQUAL( Uri(str_https_www_google_com_query), Uri(str_https_www_google_com_query) );
101  BOOST_CHECK_EQUAL( Uri(barra_barra_str), Uri(barra_barra_str) );
102 }
103 
104 BOOST_AUTO_TEST_CASE( assignacio )
105 {
106  Uri c(https_www_google_com_query);
107  BOOST_CHECK_EQUAL( c, https_www_google_com_query );
108  c = www_google_com;
109  BOOST_CHECK_EQUAL( c, www_google_com );
110  c = Uri(".");
111  BOOST_CHECK_EQUAL( c, Uri(".") );
112 }
113 
115 {
116  Uri c_google(www_google_com), c_barres(barra_barra_str);
117  BOOST_CHECK_EQUAL( www_google_com, c_google );
118  BOOST_CHECK_EQUAL( barra_barra_str, c_barres );
119 }
120 
121 BOOST_AUTO_TEST_CASE( absolutes_i_relatives )
122 {
123  Uri abs("http://www.example.com"),
124  rel("../index.html"),
125  ruta_abs("/index.html");
126  // TODO: Escriure tests
127 }
128 
129 BOOST_AUTO_TEST_CASE( postcondicio_normalitzacio )
130 {
131  const Uri & u = https_www_google_com_query;
132  const Uri nu1(Uri::normalitza(u));
133  const Uri nu2(Uri::normalitza(u));
134  const Uri nunu(Uri::normalitza(nu1));
135  // POST1 ( normalitza(u) == normalitza(u) == normalitza(normalitza(u)) )
136  BOOST_CHECK_EQUAL( nu1, nu2 );
137  BOOST_CHECK_EQUAL( nu1, nunu );
138  // POST2
139  BOOST_CHECK_EQUAL( nu1.esquema(), u.esquema() );
140  BOOST_CHECK_EQUAL( nu1.autoritat(), u.autoritat() );
141  BOOST_CHECK_EQUAL( nu1.query(), u.query() );
142  BOOST_CHECK_EQUAL( nu1.fragment(), u.fragment() );
143 }
144 
145 BOOST_AUTO_TEST_CASE( normalitzacio_completes )
146 {
147  BOOST_CHECK_EQUAL( norm("http://www.google.com/.."),
148  "http://www.google.com/");
149 }
150 
151 BOOST_AUTO_TEST_CASE( normalitzacio_parcials_absolutes )
152 {
153  BOOST_CHECK_EQUAL( norm("/"), "/" );
154  // TODO: Escriure nous tests
155 #if 0 // TODO: Les dobles barres tenen un significat especial!
156  BOOST_CHECK_EQUAL( norm("//"), "/" );
157  BOOST_CHECK_EQUAL( norm("//.//"), "/" );
158  BOOST_CHECK_EQUAL( norm("///"), "/" );
159  BOOST_CHECK_EQUAL( norm("/index.html"), "/index.html");
160  BOOST_CHECK_EQUAL( norm("//index.html"), "/index.html");
161 #endif
162 }
163 
164 BOOST_AUTO_TEST_CASE( normalitzacio_parcials_relatives )
165 {
166  BOOST_CHECK_EQUAL( norm("."), "" );
167  BOOST_CHECK_EQUAL( norm("./.."), "" );
168  BOOST_CHECK_EQUAL( norm("../index.html"), "/index.html");
169  BOOST_CHECK_EQUAL( norm("dir/../index.html"), "/index.html");
170  // FIXME: és implícit '/' ó './' ?
171  BOOST_CHECK_EQUAL( norm("index.html"), "/index.html");
172 }
173 
174 inline void compara_string(const string & s) {
175  BOOST_CHECK_EQUAL( string(Uri(s)), s );
176 }
177 
179 {
180  //BOOST_CHECK_THROW(frase_estat(indefinit), ErrorTipusPeticioHTTPDesconeguda);
181 
182  compara_string( str_www_google_com );
183  compara_string( str_https_www_google_com_query );
184  compara_string( str_barra_barra_str );
185 }
186 
187 
188 BOOST_AUTO_TEST_CASE( descodificacio )
189 {
190  bool error;
191  const string r = Uri::descodifica("%2F", error);
192  BOOST_CHECK_EQUAL( r, "/" );
193  // Exemple usat en la documentació de la capçalera Url.h
194  BOOST_CHECK_EQUAL( "http://example.com",
195  Uri::descodifica("http%3A%2F%2Fexample%2Ecom",error) );
196 }
197 
198 BOOST_AUTO_TEST_CASE( codificacio )
199 {
200  const string r = Uri::codifica("/");
201  BOOST_CHECK_EQUAL( r, "%2F" );
202  // Exemple usat en la documentació de la capçalera Url.h
203  BOOST_CHECK_EQUAL( "http%3A%2F%2Fexample%2Ecom",
204  Uri::codifica("http://example.com") );
205 }
206 
207 BOOST_AUTO_TEST_SUITE_END()
208 
209 // vim:set ts=4 et ai: //