librazor/test-uri.c
author J. Ali Harlow <ali@juiblex.co.uk>
Tue Apr 24 19:27:53 2018 +0100 (2018-04-24)
changeset 497 6fbb686d919f
permissions -rw-r--r--
Added tag Release 0.6.3.112 for changeset 203fa998c6df
ali@475
     1
/*
ali@475
     2
 * Copyright (C) 2016  J. Ali Harlow <ali@juiblex.co.uk>
ali@475
     3
 *
ali@475
     4
 * This program is free software; you can redistribute it and/or modify
ali@475
     5
 * it under the terms of the GNU General Public License as published by
ali@475
     6
 * the Free Software Foundation; either version 2 of the License, or
ali@475
     7
 * (at your option) any later version.
ali@475
     8
 *
ali@475
     9
 * This program is distributed in the hope that it will be useful,
ali@475
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ali@475
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
ali@475
    12
 * GNU General Public License for more details.
ali@475
    13
 *
ali@475
    14
 * You should have received a copy of the GNU General Public License along
ali@475
    15
 * with this program; if not, write to the Free Software Foundation, Inc.,
ali@475
    16
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
ali@475
    17
 */
ali@475
    18
ali@475
    19
#include "config.h"
ali@475
    20
ali@475
    21
#include <stdlib.h>
ali@475
    22
#include <stdio.h>
ali@475
    23
#include <string.h>
ali@475
    24
#include "razor.h"
ali@475
    25
#include "razor-internal.h"
ali@475
    26
ali@475
    27
static int test_parse(const char *uri)
ali@475
    28
{
ali@475
    29
	struct razor_uri ru;
ali@475
    30
	struct razor_error *error = NULL;
ali@475
    31
	int r;
ali@475
    32
ali@475
    33
	r = razor_uri_parse(&ru, uri, &error);
ali@475
    34
	razor_uri_destroy(&ru);
ali@475
    35
ali@475
    36
	if (r < 0) {
ali@475
    37
		fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n",
ali@475
    38
			uri, razor_error_get_msg(error));
ali@475
    39
		return -1;
ali@475
    40
	}
ali@475
    41
ali@475
    42
	return r;
ali@475
    43
}
ali@475
    44
ali@475
    45
static int test_normalize(const char *uri, const char *expected_normalized_uri)
ali@475
    46
{
ali@475
    47
	struct razor_uri ru;
ali@475
    48
	struct razor_error *error = NULL;
ali@475
    49
	int r;
ali@475
    50
	char *normalized_uri;
ali@475
    51
ali@475
    52
	r = razor_uri_parse(&ru, uri, &error);
ali@475
    53
ali@475
    54
	if (r < 0) {
ali@475
    55
		razor_uri_destroy(&ru);
ali@475
    56
		fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n",
ali@475
    57
			uri, razor_error_get_msg(error));
ali@475
    58
		return -1;
ali@475
    59
	}
ali@475
    60
ali@475
    61
	razor_uri_normalize(&ru);
ali@475
    62
	normalized_uri = razor_uri_recompose(&ru);
ali@475
    63
	razor_uri_destroy(&ru);
ali@475
    64
ali@475
    65
	if (strcmp(normalized_uri, expected_normalized_uri)) {
ali@475
    66
		fprintf(stderr, "Fail: normalization of \"%s\" produces "
ali@475
    67
			"\"%s\", expected \"%s\"\n", uri, normalized_uri,
ali@475
    68
			expected_normalized_uri);
ali@475
    69
		r = -1;
ali@475
    70
	}
ali@475
    71
ali@475
    72
	free(normalized_uri);
ali@475
    73
	return r;
ali@475
    74
}
ali@475
    75
ali@475
    76
static int test_resolve(const char *base_uri, const char *relative_reference,
ali@475
    77
  const char *expected_target_uri)
ali@475
    78
{
ali@475
    79
	struct razor_uri base_ru, rr_ru, target_ru;
ali@475
    80
	struct razor_error *error = NULL;
ali@475
    81
	char *target_uri;
ali@475
    82
	int r;
ali@475
    83
ali@475
    84
	r = razor_uri_parse(&base_ru, base_uri, &error);
ali@475
    85
ali@475
    86
	if (r < 0) {
ali@475
    87
		fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n",
ali@475
    88
			base_uri, razor_error_get_msg(error));
ali@475
    89
		return -1;
ali@475
    90
	}
ali@475
    91
ali@475
    92
	r = razor_uri_parse(&rr_ru, relative_reference, &error);
ali@475
    93
ali@475
    94
	if (r < 0) {
ali@475
    95
		fprintf(stderr, "Fail: razor_uri_parse(\"%s\") reports %s\n",
ali@475
    96
			relative_reference, razor_error_get_msg(error));
ali@475
    97
		razor_uri_destroy(&base_ru);
ali@475
    98
		return -1;
ali@475
    99
	}
ali@475
   100
ali@475
   101
	razor_uri_resolve(&target_ru, &base_ru, &rr_ru);
ali@475
   102
	razor_uri_destroy(&base_ru);
ali@475
   103
	razor_uri_destroy(&rr_ru);
ali@475
   104
ali@475
   105
	target_uri = razor_uri_recompose(&target_ru);
ali@475
   106
	razor_uri_destroy(&target_ru);
ali@475
   107
ali@475
   108
	if (strcmp(target_uri, expected_target_uri)) {
ali@475
   109
		fprintf(stderr,
ali@475
   110
			"Fail: razor_uri_resolve(\"%s\", \"%s\") returns %s\n",
ali@475
   111
			base_uri, relative_reference, target_uri);
ali@475
   112
		free(target_uri);
ali@475
   113
		return -1;
ali@475
   114
	}
ali@475
   115
ali@475
   116
	free(target_uri);
ali@475
   117
ali@475
   118
	return 0;
ali@475
   119
}
ali@475
   120
ali@475
   121
int main(int argc, char *argv[])
ali@475
   122
{
ali@475
   123
	int r = 0;
ali@475
   124
ali@475
   125
	r |= test_parse("file:");
ali@475
   126
	r |= test_parse("file:/");
ali@475
   127
	r |= test_parse("file:///");
ali@475
   128
ali@475
   129
	/* From RFC 3986 § 6.2.2 */
ali@475
   130
	r |= test_normalize("eXAMPLE://a/./b/../b/%63/%7bfoo%7d",
ali@475
   131
			    "example://a/b/c/%7Bfoo%7D");
ali@475
   132
ali@475
   133
	/* From RFC 3986 § 5.4.1 */
ali@475
   134
	r |= test_resolve("http://a/b/c/d;p?q", "g:h", "g:h");
ali@475
   135
	r |= test_resolve("http://a/b/c/d;p?q", "g", "http://a/b/c/g");
ali@475
   136
	r |= test_resolve("http://a/b/c/d;p?q", "./g", "http://a/b/c/g");
ali@475
   137
	r |= test_resolve("http://a/b/c/d;p?q", "g/", "http://a/b/c/g/");
ali@475
   138
	r |= test_resolve("http://a/b/c/d;p?q", "/g", "http://a/g");
ali@475
   139
	r |= test_resolve("http://a/b/c/d;p?q", "//g", "http://g");
ali@475
   140
	r |= test_resolve("http://a/b/c/d;p?q", "?y", "http://a/b/c/d;p?y");
ali@475
   141
	r |= test_resolve("http://a/b/c/d;p?q", "g?y", "http://a/b/c/g?y");
ali@475
   142
	r |= test_resolve("http://a/b/c/d;p?q", "#s", "http://a/b/c/d;p?q#s");
ali@475
   143
	r |= test_resolve("http://a/b/c/d;p?q", "g#s", "http://a/b/c/g#s");
ali@475
   144
	r |= test_resolve("http://a/b/c/d;p?q", "g?y#s", "http://a/b/c/g?y#s");
ali@475
   145
	r |= test_resolve("http://a/b/c/d;p?q", ";x", "http://a/b/c/;x");
ali@475
   146
	r |= test_resolve("http://a/b/c/d;p?q", "g;x", "http://a/b/c/g;x");
ali@475
   147
	r |= test_resolve("http://a/b/c/d;p?q", "g;x?y#s",
ali@475
   148
			  "http://a/b/c/g;x?y#s");
ali@475
   149
	r |= test_resolve("http://a/b/c/d;p?q", "", "http://a/b/c/d;p?q");
ali@475
   150
	r |= test_resolve("http://a/b/c/d;p?q", ".", "http://a/b/c/");
ali@475
   151
	r |= test_resolve("http://a/b/c/d;p?q", "./", "http://a/b/c/");
ali@475
   152
	r |= test_resolve("http://a/b/c/d;p?q", "..", "http://a/b/");
ali@475
   153
	r |= test_resolve("http://a/b/c/d;p?q", "../", "http://a/b/");
ali@475
   154
	r |= test_resolve("http://a/b/c/d;p?q", "../g", "http://a/b/g");
ali@475
   155
	r |= test_resolve("http://a/b/c/d;p?q", "../..", "http://a/");
ali@475
   156
	r |= test_resolve("http://a/b/c/d;p?q", "../../", "http://a/");
ali@475
   157
	r |= test_resolve("http://a/b/c/d;p?q", "../../g", "http://a/g");
ali@475
   158
ali@475
   159
	r |= test_resolve("http://a/b/c/d;p?q", "../../../g", "http://a/g");
ali@475
   160
	r |= test_resolve("http://a/b/c/d;p?q", "../../../../g", "http://a/g");
ali@475
   161
ali@475
   162
	r |= test_resolve("http://a/b/c/d;p?q", "/./g", "http://a/g");
ali@475
   163
	r |= test_resolve("http://a/b/c/d;p?q", "/../g", "http://a/g");
ali@475
   164
	r |= test_resolve("http://a/b/c/d;p?q", "g.", "http://a/b/c/g.");
ali@475
   165
	r |= test_resolve("http://a/b/c/d;p?q", ".g", "http://a/b/c/.g");
ali@475
   166
	r |= test_resolve("http://a/b/c/d;p?q", "g..", "http://a/b/c/g..");
ali@475
   167
	r |= test_resolve("http://a/b/c/d;p?q", "..g", "http://a/b/c/..g");
ali@475
   168
ali@475
   169
	r |= test_resolve("http://a/b/c/d;p?q", "./../g", "http://a/b/g");
ali@475
   170
	r |= test_resolve("http://a/b/c/d;p?q", "./g/.", "http://a/b/c/g/");
ali@475
   171
	r |= test_resolve("http://a/b/c/d;p?q", "g/./h", "http://a/b/c/g/h");
ali@475
   172
	r |= test_resolve("http://a/b/c/d;p?q", "g/../h", "http://a/b/c/h");
ali@475
   173
	r |= test_resolve("http://a/b/c/d;p?q", "g;x=1/./y",
ali@475
   174
			  "http://a/b/c/g;x=1/y");
ali@475
   175
	r |= test_resolve("http://a/b/c/d;p?q", "g;x=1/../y", "http://a/b/c/y");
ali@475
   176
ali@475
   177
	r |= test_resolve("http://a/b/c/d;p?q", "g?y/./x",
ali@475
   178
			  "http://a/b/c/g?y/./x");
ali@475
   179
	r |= test_resolve("http://a/b/c/d;p?q", "g?y/../x",
ali@475
   180
			  "http://a/b/c/g?y/../x");
ali@475
   181
	r |= test_resolve("http://a/b/c/d;p?q", "g#s/./x",
ali@475
   182
			  "http://a/b/c/g#s/./x");
ali@475
   183
	r |= test_resolve("http://a/b/c/d;p?q", "g#s/../x",
ali@475
   184
			  "http://a/b/c/g#s/../x");
ali@475
   185
ali@475
   186
	r |= test_resolve("http://a/b/c/d;p?q", "http:g", "http:g");
ali@475
   187
ali@475
   188
	/* From http://www.w3.org/2000/10/swap/uripath.py */
ali@475
   189
	r |= test_resolve("foo:xyz", "bar:abc", "bar:abc");
ali@475
   190
ali@475
   191
	r |= test_resolve("http://example/x/y/z", "../abc",
ali@475
   192
			  "http://example/x/abc");
ali@475
   193
	r |= test_resolve("http://example2/x/y/z", "http://example/x/abc",
ali@475
   194
			  "http://example/x/abc");
ali@475
   195
	r |= test_resolve("http://ex/x/y/z", "../r", "http://ex/x/r");
ali@475
   196
	// "http://ex/x/y/z", "../../r", "http://ex/r");    // DanC had this.
ali@475
   197
	r |= test_resolve("http://ex/x/y", "q/r", "http://ex/x/q/r");
ali@475
   198
	r |= test_resolve("http://ex/x/y", "q/r#s", "http://ex/x/q/r#s");
ali@475
   199
	r |= test_resolve("http://ex/x/y", "q/r#s/t", "http://ex/x/q/r#s/t");
ali@475
   200
	r |= test_resolve("http://ex/x/y", "ftp://ex/x/q/r", "ftp://ex/x/q/r");
ali@475
   201
	r |= test_resolve("http://ex/x/y", "", "http://ex/x/y");
ali@475
   202
	r |= test_resolve("http://ex/x/y/", "", "http://ex/x/y/");
ali@475
   203
	r |= test_resolve("http://ex/x/y/pdq", "", "http://ex/x/y/pdq");
ali@475
   204
	r |= test_resolve("http://ex/x/y/", "z/", "http://ex/x/y/z/");
ali@475
   205
	r |= test_resolve("file:/swap/test/animal.rdf", "#Animal",
ali@475
   206
			  "file:/swap/test/animal.rdf#Animal");
ali@475
   207
	r |= test_resolve("file:/e/x/y/z", "../abc", "file:/e/x/abc");
ali@475
   208
	r |= test_resolve("file:/example2/x/y/z", "/example/x/abc",
ali@475
   209
			  "file:/example/x/abc");
ali@475
   210
	r |= test_resolve("file:/ex/x/y/z", "../r", "file:/ex/x/r");
ali@475
   211
	r |= test_resolve("file:/ex/x/y/z", "/r", "file:/r");
ali@475
   212
	r |= test_resolve("file:/ex/x/y", "q/r", "file:/ex/x/q/r");
ali@475
   213
	r |= test_resolve("file:/ex/x/y", "q/r#s", "file:/ex/x/q/r#s");
ali@475
   214
	r |= test_resolve("file:/ex/x/y", "q/r#", "file:/ex/x/q/r#");
ali@475
   215
	r |= test_resolve("file:/ex/x/y", "q/r#s/t", "file:/ex/x/q/r#s/t");
ali@475
   216
	r |= test_resolve("file:/ex/x/y", "ftp://ex/x/q/r", "ftp://ex/x/q/r");
ali@475
   217
	r |= test_resolve("file:/ex/x/y", "", "file:/ex/x/y");
ali@475
   218
	r |= test_resolve("file:/ex/x/y/", "", "file:/ex/x/y/");
ali@475
   219
	r |= test_resolve("file:/ex/x/y/pdq", "", "file:/ex/x/y/pdq");
ali@475
   220
	r |= test_resolve("file:/ex/x/y/", "z/", "file:/ex/x/y/z/");
ali@475
   221
	r |= test_resolve("file:/devel/WWW/2000/10/swap/test/reluri-1.n3",
ali@475
   222
			  "file://meetings.example.com/cal#m1",
ali@475
   223
			  "file://meetings.example.com/cal#m1");
ali@475
   224
	r |= test_resolve("file:/home/connolly/w3ccvs/WWW/2000/10/swap/test/reluri-1.n3",
ali@475
   225
			  "file://meetings.example.com/cal#m1",
ali@475
   226
			  "file://meetings.example.com/cal#m1");
ali@475
   227
	r |= test_resolve("file:/some/dir/foo", "./#blort",
ali@475
   228
			  "file:/some/dir/#blort");
ali@475
   229
	r |= test_resolve("file:/some/dir/foo", "./#", "file:/some/dir/#");
ali@475
   230
	/* From Graham Klyne Thu, 20 Feb 2003 18:08:17 +0000 */
ali@475
   231
	r |= test_resolve("http://example/x/y%2Fz", "abc",
ali@475
   232
			  "http://example/x/abc");
ali@475
   233
	r |= test_resolve("http://example/x/y/z", "/x%2Fabc",
ali@475
   234
			  "http://example/x%2Fabc");
ali@475
   235
	r |= test_resolve("http://example/x/y%2Fz", "/x%2Fabc",
ali@475
   236
			  "http://example/x%2Fabc");
ali@475
   237
	r |= test_resolve("http://example/x%2Fy/z", "abc",
ali@475
   238
			  "http://example/x%2Fy/abc");
ali@475
   239
	/* Ryan Lee */
ali@475
   240
	r |= test_resolve("http://example/x/abc.efg", "./",
ali@475
   241
			  "http://example/x/");
ali@475
   242
ali@475
   243
	exit(r ? 1 : 0);
ali@475
   244
}