1<?php
2
3require_once "Auth/Yadis/Yadis.php";
4require_once "Tests/Auth/Yadis/TestUtil.php";
5
6global $testlist;
7$testlist = [
8// success, input_name,          id_name,            result_name
9    [true,  "equiv",             "equiv",            "xrds"],
10    [true,  "header",            "header",           "xrds"],
11    [true,  "lowercase_header",  "lowercase_header", "xrds"],
12    [true,  "xrds",              "xrds",             "xrds"],
13    [true,  "xrds_ctparam",      "xrds_ctparam",     "xrds_ctparam"],
14    [true,  "xrds_ctcase",       "xrds_ctcase",      "xrds_ctcase"],
15    [false, "xrds_html",         "xrds_html",        "xrds_html"],
16    [true,  "redir_equiv",       "equiv",            "xrds"],
17    [true,  "redir_header",      "header",           "xrds"],
18    [true,  "redir_xrds",        "xrds",             "xrds"],
19    [false, "redir_xrds_html",   "xrds_html",        "xrds_html"],
20    [true,  "redir_redir_equiv", "equiv",            "xrds"],
21    [false, "404_server_response", null,             null],
22    [false, "404_with_header",     null,             null],
23    [false, "404_with_meta",       null,             null],
24    [false, "201_server_response", null,             null],
25    [false, "500_server_response", null,             null],
26];
27
28function getExampleXRDS()
29{
30    return Tests_Auth_Yadis_readdata('example-xrds.xml');
31}
32
33global $example_xrds;
34$example_xrds = getExampleXRDS();
35
36global $default_test_file;
37$default_test_file = 'test1-discover.txt';
38
39global $discover_tests;
40$discover_tests = [];
41
42function readTests($filename)
43{
44    $data = Tests_Auth_Yadis_readdata($filename);
45
46    if ($data === null) {
47        return null;
48    }
49
50    $tests = [];
51    foreach (preg_split("/\f\n/", $data) as $case) {
52        list($name, $content) = explode("\n", $case, 2);
53        $tests[$name] = $content;
54    }
55    return $tests;
56}
57
58function getData($filename, $name)
59{
60    global $discover_tests;
61    if (!array_key_exists($filename, $discover_tests)) {
62        $data = readTests($filename);
63        if ($data === null) {
64            return null;
65        }
66        $discover_tests[$filename] = $data;
67    }
68
69    $file_tests = $discover_tests[$filename];
70
71    if (array_key_exists($name, $file_tests)) {
72        return $file_tests[$name];
73    } else {
74        return null;
75    }
76}
77
78function fillTemplate($test_name, $template, $base_url, $example_xrds)
79{
80    $mapping = [
81        ['URL_BASE/', $base_url],
82        ['<XRDS Content>', $example_xrds],
83        ['YADIS_HEADER', 'X-XRDS-Location'],
84        ['NAME', $test_name],
85    ];
86
87    foreach ($mapping as $pair) {
88        list($k, $v) = $pair;
89        $template = str_replace($k, $v, $template);
90    }
91
92    return $template;
93}
94
95function generateSample($test_name, $base_url,
96                        $_example_xrds = null, $filename = null)
97{
98    global $example_xrds, $default_test_file;
99
100    if ($_example_xrds === null) {
101        $_example_xrds = $example_xrds;
102    }
103
104    if ($filename === null) {
105        $filename = $default_test_file;
106    }
107
108    $template = getData($filename, $test_name);
109
110    if ($template === null) {
111        return null;
112    }
113
114    return fillTemplate($test_name, $template, $base_url, $_example_xrds);
115}
116
117function generateResult($base_url, $input_name, $id_name, $result_name, $success)
118{
119    $input_url = $base_url . $input_name; // urlparse.urljoin(base_url, input_name)
120
121    // If the name is null then we expect the protocol to fail, which
122    // we represent by null
123    if ($id_name === null) {
124        // assert result_name is null
125        return [$input_url, null]; // DiscoveryFailure
126    }
127
128    $result = generateSample($result_name, $base_url);
129    list($headers, $content) = explode("\n\n", $result, 2);
130    $header_lines = explode("\n", $headers);
131    $ctype = null;
132    foreach ($header_lines as $header_line) {
133        if (strpos($header_line, 'Content-Type:') === 0) {
134            list($temp, $ctype) = explode(":", $header_line, 2);
135            $ctype = trim($ctype);
136            break;
137        }
138    }
139
140    $id_url = $base_url . $id_name;
141
142    $result = new Auth_Yadis_Yadis();
143    $result->uri = $id_url;
144    if ($success) {
145        $result->xrds_uri = $base_url . $result_name;
146    } else {
147        $result->xrds_uri = null;
148    }
149    $result->content_type = $ctype;
150    $result->body = $content;
151    return [$input_url, $result];
152}
153
154