You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2012/06/20 23:23:01 UTC
[7/14] Delete all the old files,
they are moved to plugins/experimental in our normal repo
http://git-wip-us.apache.org/repos/asf/trafficserver-plugins/blob/ff849998/esi/test/parser_test.cc
----------------------------------------------------------------------
diff --git a/esi/test/parser_test.cc b/esi/test/parser_test.cc
deleted file mode 100644
index 0278435..0000000
--- a/esi/test/parser_test.cc
+++ /dev/null
@@ -1,1588 +0,0 @@
-/** @file
-
- A brief file description
-
- @section license License
-
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you 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 <iostream>
-#include <assert.h>
-#include <string>
-
-#include "EsiParser.h"
-#include "print_funcs.h"
-#include "Utils.h"
-
-using std::cout;
-using std::cerr;
-using std::endl;
-using std::string;
-using namespace EsiLib;
-
-void check_node_attr(const Attribute &attr, const char *name, const char *value) {
- int name_len = strlen(name);
- int value_len = strlen(value);
- assert(attr.name_len == name_len);
- assert(attr.value_len == value_len);
- assert(strncmp(attr.name, name, name_len) == 0);
- assert(strncmp(attr.value, value, value_len) == 0);
-}
-
-int main()
-{
- Utils::init(&Debug, &Error);
-
- {
- cout << endl << "==================== Test 1: No src attr test " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:include />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 2: Empty src test " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:include src=/>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 3: Valid src test " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:include src=abc />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNode &node = node_list.back();
- assert(node.type == DocNode::TYPE_INCLUDE);
- assert(node.data_len == 0);
- assert(node.attr_list.size() == 1);
- assert(node.child_nodes.size() == 0);
- check_node_attr(node.attr_list.front(), "src", "abc");
- }
-
- {
- cout << endl << "==================== Test 4: Invalid Quoted URL test " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:include src=\"abc def />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 5: Invalid Quoted URL test " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:include src=abcdef\" />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 6: Invalid Quoted URL test " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:include src=abc\"\"de\"f />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 7: Quoted URL test " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:include src=\"abc def\" />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNode &node = node_list.back();
- assert(node.type == DocNode::TYPE_INCLUDE);
- assert(node.data_len == 0);
- assert(node.attr_list.size() == 1);
- check_node_attr(node.attr_list.front(), "src", "abc def");
- assert(node.child_nodes.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 8: Invalid tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "bleh <esi:blah /> flah";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 9: Invalid Comment tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:comment></esi:comment>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 10: Valid Comment tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:comment text=\"blah\"/>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- assert(node_list.begin()->child_nodes.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 11: Invalid remove tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:remove />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 12: Valid remove tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:remove> </esi:remove>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- }
-
- {
- cout << endl << "==================== Test 13: Interleaving raw text " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "foo <esi:remove> </esi:remove> bar";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 3);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "foo ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_REMOVE);
- assert(list_iter->data_len == 0);
- assert(list_iter->data == 0);
- assert((list_iter->child_nodes).size() == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, " bar", list_iter->data_len) == 0);
- }
-
- {
- cout << endl << "==================== Test 14: Interleaving different nodes" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "foo <esi:remove> </esi:remove> bar <esi:include src=blah /><esi:vars>bleh</esi:vars>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 5);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "foo ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_REMOVE);
- assert(list_iter->data_len == 0);
- assert(list_iter->data == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 5);
- assert(strncmp(list_iter->data, " bar ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "blah");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_VARS);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "bleh", list_iter->data_len) == 0);
- }
-
- {
- cout << endl << "==================== Test 15: empty parse" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- assert(parser.completeParse(node_list) == true);
- }
-
- {
- cout << endl << "==================== Test 16: clear() test" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- string input_data = "foo <esi:remove> </esi:remove> bar <esi:include src=blah />";
-
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 4);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "foo ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_REMOVE);
- assert(list_iter->data_len == 0);
- assert(list_iter->data == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 5);
- assert(strncmp(list_iter->data, " bar ", list_iter->data_len) == 0);
- assert((list_iter->child_nodes).size() == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "blah");
-
- parser.clear();
- node_list.clear();
-
- input_data = "foo <esi:remove> </esi:remove> bar";
-
- assert(parser.parseChunk(input_data.c_str(), node_list, -1) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 3);
- list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "foo ", list_iter->data_len) == 0);
- assert((list_iter->child_nodes).size() == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_REMOVE);
- assert(list_iter->data_len == 0);
- assert(list_iter->data == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, " bar", list_iter->data_len) == 0);
- }
-
- {
- cout << endl << "==================== Test 17: multi-chunk" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- char line1[] = "foo1 <esi:include src=url1/> bar1\n";
- char line2[] = "foo2 <esi:include src=url2/> bar2\n";
- char line3[] = "<esi:include src=\"blah bleh\"/>";
- char line4[] = "<esi:comment text=\"bleh\"/>";
- char line5[] = "<esi:remove> <a href=> </esi:remove>";
- assert(parser.parseChunk(line1, node_list) == true);
- assert(node_list.size() == 2);
- assert(parser.parseChunk(line2, node_list) == true);
- assert(node_list.size() == 4);
- assert(parser.parseChunk(line3, node_list) == true);
- assert(node_list.size() == 6);
- assert(parser.parseChunk(line4, node_list) == true);
- assert(node_list.size() == 7);
- assert(parser.parseChunk(line5, node_list) == true);
- assert(node_list.size() == 8);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 8);
- }
-
- {
- cout << endl << "==================== Test 18: multi-chunk" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- char line1[] = "foo1 <esi:include";
- char line2[] = "src=url2/>";
- char line3[] = "bar3";
- assert(parser.parseChunk(line1, node_list) == true);
- assert(node_list.size() == 1);
- assert(parser.parseChunk(line2, node_list) == false);
- assert(node_list.size() == 1);
- assert(parser.parseChunk(line3, node_list) == false);
- assert(node_list.size() == 1);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 19: multi-chunk" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- char line1[] = "foo1 <esi:include ";
- char line2[] = "src=url2/>";
- char line3[] = "bar3";
- assert(parser.parseChunk(line1, node_list) == true);
- assert(node_list.size() == 1);
- assert(parser.parseChunk(line2, node_list) == true);
- assert(node_list.size() == 2);
- assert(parser.parseChunk(line3, node_list) == true);
- assert(node_list.size() == 2);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 3);
- }
-
- {
- cout << endl << "==================== Test 20: multi-chunk" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- char line1[] = "foo1 <e";
- char line2[] = "si:include src=url2/>";
- char line3[] = "bar3";
- assert(parser.parseChunk(line1, node_list) == true);
- assert(node_list.size() == 0);
- assert(parser.parseChunk(line2, node_list) == true);
- assert(node_list.size() == 2);
- assert(parser.parseChunk(line3, node_list) == true);
- assert(node_list.size() == 2);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 3);
- }
-
- {
- cout << endl << "==================== Test 21: multi-chunk" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- char line1[] = "foo1 <e";
- char line2[] = "xsi:include src=url2/>";
- char line3[] = "bar3";
- assert(parser.parseChunk(line1, node_list) == true);
- assert(node_list.size() == 0);
- assert(parser.parseChunk(line2, node_list) == true);
- assert(node_list.size() == 0);
- assert(parser.parseChunk(line3, node_list) == true);
- assert(node_list.size() == 0);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- }
-
- {
- cout << endl << "==================== Test 22: multi-chunk" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- char line1[] = "foo1 <e";
- char line2[] = "si:include src=ur";
- char line3[] = "l2/>bar3";
- assert(parser.parseChunk(line1, node_list) == true);
- assert(node_list.size() == 0);
- assert(parser.parseChunk(line2, node_list) == true);
- assert(node_list.size() == 1);
- assert(parser.parseChunk(line3, node_list) == true);
- assert(node_list.size() == 2);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 3);
-
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 5);
- assert(strncmp(list_iter->data, "foo1 ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "url2");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "bar3", list_iter->data_len) == 0);
- }
-
- {
- cout << endl << "==================== Test 23: multi-chunk" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- char line1[] = "foo1 <e";
- char line2[] = "si:include src=ur";
- char line3[] = "l2/>bar3";
- char line4[] = "<esi:remove>blah</esi:remove> <esi:comment";
- char line5[] = " text=\"foo\"/>";
- assert(parser.parseChunk(line1, node_list) == true);
- assert(node_list.size() == 0);
- assert(parser.parseChunk(line2, node_list) == true);
- assert(node_list.size() == 1);
- assert(parser.parseChunk(line3, node_list) == true);
- assert(node_list.size() == 2);
- assert(parser.parseChunk(line4, node_list) == true);
- assert(node_list.size() == 5);
- assert(parser.parseChunk(line5, node_list) == true);
- assert(node_list.size() == 6);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 6);
-
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 5);
- assert(strncmp(list_iter->data, "foo1 ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "url2");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "bar3", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_REMOVE);
- assert(list_iter->data_len == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 1);
- assert(strncmp(list_iter->data, " ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_COMMENT);
- assert(list_iter->data_len == 0);
- }
-
- {
- cout << endl << "==================== Test 24: one-shot parse" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "foo <esi:include src=blah /> bar";
-
- DocNodeList node_list;
- assert(parser.completeParse(node_list, input_data) == true);
- assert(node_list.size() == 3);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "foo ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "blah");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, " bar", list_iter->data_len) == 0);
- assert((list_iter->child_nodes).size() == 0);
- }
-
- {
- cout << endl << "==================== Test 25: final chunk" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- char line1[] = "foo1 <e";
- char line2[] = "si:include src=ur";
- char line3[] = "l2/>bar3";
- char line4[] = "<esi:remove>blah</esi:remove> <esi:comment";
- char line5[] = " bar/>";
- assert(parser.parseChunk(line1, node_list) == true);
- assert(node_list.size() == 0);
- assert(parser.parseChunk(line2, node_list) == true);
- assert(node_list.size() == 1);
- assert(parser.parseChunk(line3, node_list) == true);
- assert(node_list.size() == 2);
- assert(parser.parseChunk(line4, node_list) == true);
- assert(node_list.size() == 5);
- assert(parser.completeParse(node_list, line5, sizeof(line5) - 1) == true);
- assert(node_list.size() == 6);
-
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 5);
- assert(strncmp(list_iter->data, "foo1 ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "url2");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "bar3", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_REMOVE);
- assert(list_iter->data_len == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 1);
- assert(strncmp(list_iter->data, " ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_COMMENT);
- assert(list_iter->data_len == 0);
- }
-
- {
- cout << endl << "==================== Test 26: partial trailing tag" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "foo <esi:include src=blah /> <esi";
-
- DocNodeList node_list;
- assert(parser.completeParse(node_list, input_data) == true);
- assert(node_list.size() == 3);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "foo ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "blah");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 5);
- assert(strncmp(list_iter->data, " <esi", list_iter->data_len) == 0);
- }
-
- {
- cout << endl << "==================== Test 27: partial trailing tag" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "foo <esi:include src=blah /> <esi:remov";
-
- DocNodeList node_list;
- assert(parser.completeParse(node_list, input_data) == true);
- assert(node_list.size() == 4);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 4);
- assert(strncmp(list_iter->data, "foo ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "blah");
- ++list_iter;
- // parsing code adds the space and partial tag as two separate nodes
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 1);
- assert(strncmp(list_iter->data, " ", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 10);
- assert(strncmp(list_iter->data, "<esi:remov", list_iter->data_len) == 0);
- }
-
- {
- cout << endl << "==================== Test 28: empty vars tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:vars></esi:vars>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_VARS);
- assert(list_iter->data_len == 0);
- }
-
- {
- cout << endl << "==================== Test 29: non-empty vars tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:vars>$(HTTP_COOKIE)</esi:vars>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_VARS);
- assert(list_iter->data_len == 14);
- assert(strncmp(list_iter->data, "$(HTTP_COOKIE)", list_iter->data_len) == 0);
- }
-
- {
- cout << endl << "==================== Test 30: choose tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data =
- "<esi:choose>"
- "<esi:when test=blah><esi:include src=url /></esi:when>"
- "</esi:choose>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_CHOOSE);
- assert(list_iter->data_len == 0);
- assert(list_iter->child_nodes.size() == 1);
- assert(list_iter->attr_list.size() == 0);
- DocNodeList::iterator list_iter2 = list_iter->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_WHEN);
- assert(list_iter2->data_len == 0);
- assert(list_iter2->child_nodes.size() == 1);
- assert(list_iter2->attr_list.size() == 1);
- check_node_attr(list_iter2->attr_list.front(), "test", "blah");
- DocNodeList::iterator list_iter3 = list_iter2->child_nodes.begin();
- assert(list_iter3->type == DocNode::TYPE_INCLUDE);
- assert(list_iter3->data_len == 0);
- assert(list_iter3->child_nodes.size() == 0);
- assert(list_iter3->attr_list.size() == 1);
- check_node_attr(list_iter3->attr_list.front(), "src", "url");
- }
-
- {
- cout << endl << "==================== Test 31: when tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:when test=blah><esi:include src=url /></esi:when>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_WHEN);
- assert(list_iter->data_len == 0);
- assert(list_iter->child_nodes.size() == 1);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "test", "blah");
- }
-
- {
- cout << endl << "==================== Test 32: otherwise tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:otherwise><esi:include src=url /></esi:otherwise>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_OTHERWISE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 0);
- assert(list_iter->child_nodes.size() == 1);
- }
-
- {
- cout << endl << "==================== Test 33: try tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data =
- "<esi:try>"
- "<esi:attempt><esi:include src=url1 /></esi:attempt>"
- "<esi:except><esi:include src=url2 /></esi:except>"
- "</esi:try>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_TRY);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 0);
- assert(list_iter->child_nodes.size() == 2);
- DocNodeList &child_nodes = list_iter->child_nodes;
- assert(child_nodes.size() == 2);
- list_iter = child_nodes.begin();
- assert(list_iter->type == DocNode::TYPE_ATTEMPT);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 0);
- assert(list_iter->child_nodes.size() == 1);
- DocNodeList::iterator list_iter2 = list_iter->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_INCLUDE);
- assert(list_iter2->data_len == 0);
- assert(list_iter2->child_nodes.size() == 0);
- assert(list_iter2->attr_list.size() == 1);
- check_node_attr(list_iter2->attr_list.front(), "src", "url1");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_EXCEPT);
- assert(list_iter->data_len == 0);
- assert(list_iter->child_nodes.size() == 1);
- assert(list_iter->attr_list.size() == 0);
- list_iter2 = list_iter->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_INCLUDE);
- assert(list_iter2->data_len == 0);
- assert(list_iter2->child_nodes.size() == 0);
- assert(list_iter2->attr_list.size() == 1);
- check_node_attr(list_iter2->attr_list.front(), "src", "url2");
- }
-
- {
- cout << endl << "==================== Test 34: attempt/except tags " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data =
- "<esi:attempt><esi:include src=url1 /></esi:attempt>"
- "<esi:except><esi:include src=url2 /></esi:except>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 2);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_ATTEMPT);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 0);
- assert(list_iter->child_nodes.size() == 1);
- DocNodeList::iterator list_iter2 = list_iter->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_INCLUDE);
- assert(list_iter2->data_len == 0);
- assert(list_iter2->child_nodes.size() == 0);
- assert(list_iter2->attr_list.size() == 1);
- check_node_attr(list_iter2->attr_list.front(), "src", "url1");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_EXCEPT);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 0);
- assert(list_iter->child_nodes.size() == 1);
- list_iter2 = list_iter->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_INCLUDE);
- assert(list_iter2->data_len == 0);
- assert(list_iter2->child_nodes.size() == 0);
- assert(list_iter2->attr_list.size() == 1);
- check_node_attr(list_iter2->attr_list.front(), "src", "url2");
- }
-
- {
- cout << endl << "==================== Test 35: internal data pointer " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:include src=abc />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNode &node = node_list.back();
- assert(node.type == DocNode::TYPE_INCLUDE);
- assert(node.data_len == 0);
- assert(node.attr_list.size() == 1);
- check_node_attr(node.attr_list.front(), "src", "abc");
- input_data = "blah";
- assert(node.type == DocNode::TYPE_INCLUDE);
- assert(node.data_len == 0);
- assert(node.attr_list.size() == 1);
- check_node_attr(node.attr_list.front(), "src", "abc");
- }
-
- {
- cout << endl << "==================== Test 36: external data pointer " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:include src=abc />";
-
- DocNodeList orig_node_list;
- assert(parser.parseChunk(input_data, orig_node_list) == true);
- assert(parser.completeParse(orig_node_list) == true);
- assert(orig_node_list.size() == 1);
- DocNode &orig_node = orig_node_list.back();
- assert(orig_node.type == DocNode::TYPE_INCLUDE);
- assert(orig_node.data_len == 0);
- assert(orig_node.attr_list.size() == 1);
- check_node_attr(orig_node.attr_list.front(), "src", "abc");
-
- DocNodeList new_node_list;
- input_data = "foo<esi:try><esi:attempt></esi:attempt><esi:except></esi:except></esi:try>";
- assert(parser.parse(new_node_list, input_data) == true);
-
- // make sure orig pointers are still valid
- assert(orig_node.type == DocNode::TYPE_INCLUDE);
- assert(orig_node.data_len == 0);
- assert(orig_node.attr_list.size() == 1);
- check_node_attr(orig_node.attr_list.front(), "src", "abc");
-
- // check new pointers
- assert(new_node_list.size() == 2);
- DocNodeList::iterator list_iter = new_node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == strlen("foo"));
- assert(strncmp(list_iter->data, "foo", list_iter->data_len) == 0);
-
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_TRY);
- DocNodeList &child_nodes = list_iter->child_nodes;
- assert(child_nodes.size() == 2);
- assert(list_iter->attr_list.size() == 0);
- DocNodeList::iterator list_iter2 = list_iter->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_ATTEMPT);
- assert(list_iter2->data_len == 0);
- assert(list_iter2->child_nodes.size() == 0);
- assert(list_iter2->attr_list.size() == 0);
- ++list_iter2;
- assert(list_iter2->type == DocNode::TYPE_EXCEPT);
- assert(list_iter2->data_len == 0);
- assert(list_iter2->child_nodes.size() == 0);
- assert(list_iter2->attr_list.size() == 0);
- input_data[0] = 'b';
- input_data[1] = 'a';
- input_data[2] = 'r';
- list_iter = new_node_list.begin();
- assert(strncmp(list_iter->data, "bar", 3) == 0);
- }
-
- {
- cout << endl << "==================== Test 37: html comment tag " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data =
- "foo <esi:comment text=\"blah\"/><!--esi <p><esi:vars>Hello, $(HTTP_COOKIE{name})!</esi:vars></p>-->"
- "<esi:include src=url /> bar";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 5);
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == strlen("foo "));
- assert(strncmp(list_iter->data, "foo ", list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_COMMENT);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_HTML_COMMENT);
- assert(list_iter->data_len == strlen("<p><esi:vars>Hello, $(HTTP_COOKIE{name})!</esi:vars></p>"));
- assert(strncmp(list_iter->data, "<p><esi:vars>Hello, $(HTTP_COOKIE{name})!</esi:vars></p>",
- list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "url");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == strlen(" bar"));
- assert(strncmp(list_iter->data, " bar", list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 38: html comment tag - partial chunks " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- const char *lines[] = {
- "foo ",
- "<es",
- "i:comment text=\"blah\"/><esi:include src=url1/>",
- "<!--",
- "esi <p><esi:vars>Hello, $(HTTP_COOKIE{name})!</esi:vars></p>-->",
- "<esi:include src=url2 /><!--e",
- "si foo--><!--esi bar-->",
- "<!--esi blah--><esi:com",
- "ment text=\"bleh\" /> <esi:remove> </esi:remove><!--esi bleh -->",
- "<!--esi blooh--><esi:include src=url3/>",
- 0
- };
-
- DocNodeList node_list;
- for (int i = 0; lines[i]; ++i) {
- assert(parser.parseChunk(lines[i], node_list) == true);
- }
- assert(parser.completeParse(node_list) == true);
-
- assert(node_list.size() == 14);
-
- DocNodeList::iterator list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == strlen("foo "));
- assert(strncmp(list_iter->data, "foo ", list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_COMMENT);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "url1");
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_HTML_COMMENT);
- assert(list_iter->data_len == strlen("<p><esi:vars>Hello, $(HTTP_COOKIE{name})!</esi:vars></p>"));
- assert(strncmp(list_iter->data, "<p><esi:vars>Hello, $(HTTP_COOKIE{name})!</esi:vars></p>",
- list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "url2");
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_HTML_COMMENT);
- assert(list_iter->data_len == strlen("foo"));
- assert(strncmp(list_iter->data, "foo", list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_HTML_COMMENT);
- assert(list_iter->data_len == strlen("bar"));
- assert(strncmp(list_iter->data, "bar", list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_HTML_COMMENT);
- assert(list_iter->data_len == strlen("blah"));
- assert(strncmp(list_iter->data, "blah", list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_COMMENT);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == strlen(" "));
- assert(strncmp(list_iter->data, " ", list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_REMOVE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_HTML_COMMENT);
- assert(list_iter->data_len == strlen("bleh "));
- assert(strncmp(list_iter->data, "bleh ", list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_HTML_COMMENT);
- assert(list_iter->data_len == strlen("blooh"));
- assert(strncmp(list_iter->data, "blooh", list_iter->data_len) == 0);
- assert(list_iter->attr_list.size() == 0);
- ++list_iter;
-
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "url3");
- ++list_iter;
- }
-
- {
- cout << endl << "==================== Test 39: opening tag corner cases" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- DocNodeList node_list;
- DocNodeList::iterator list_iter;
-
- assert(parser.parse(node_list, "<<esi:include src=url/>") == true);
- assert(node_list.size() == 2);
- list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 1);
- assert(list_iter->data[0] == '<');
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->data_len == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "url");
-
- assert(parser.parse(node_list, "<<!--esi <esi:comment text=blah/>-->") == true);
- assert(node_list.size() == 4);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 1);
- assert(list_iter->data[0] == '<');
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_HTML_COMMENT);
- assert(list_iter->data_len == strlen("<esi:comment text=blah/>"));
- assert(strncmp(list_iter->data, "<esi:comment text=blah/>", list_iter->data_len) == 0);
-
- assert(parser.parse(node_list, "<!<esi:comment text=blah/>") == true);
- assert(node_list.size() == 6);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->data_len == 2);
- assert(strncmp(list_iter->data, "<!", list_iter->data_len) == 0);
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_COMMENT);
-
- assert(parser.parse(node_list, "<esi<!--esi <esi:comment text=blah/>") == false);
- assert(node_list.size() == 6);
-
- assert(parser.parse(node_list, "<esi:<!--esi <esi:comment text=blah/>-->/>") == false);
- assert(node_list.size() == 6);
- }
-
- {
- cout << endl << "==================== Test 40: No handler attr " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:special-include />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 41: Empty handle " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:special-include handler=/>";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "==================== Test 42: Valid special include " << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data = "<esi:special-include handler=ads pos=SKY />";
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNode &node = node_list.back();
- assert(node.type == DocNode::TYPE_SPECIAL_INCLUDE);
- assert(node.data_len == strlen(" handler=ads pos=SKY "));
- assert(strncmp(node.data, " handler=ads pos=SKY ", node.data_len) == 0);
- assert(node.attr_list.size() == 1);
- check_node_attr(node.attr_list.front(), "handler", "ads");
- }
-
- {
- cout << endl << "===================== Test 43) choose-when" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string
- input_data1("<esi:choose>"
- "<esi:when test=cond1>"
- "<esi:include src=foo />"
- "</esi:when>"
- "<esi:when test=cond2>"
- "<esi:include src=bar />"),
- input_data2("</esi:when>"
- "<esi:otherwise>"
- "<esi:include src=otherwise />"
- "</esi:otherwise>"
- "</esi:choose>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data1, node_list) == true);
- assert(parser.parseChunk(input_data2, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNode *node = &(*(node_list.begin()));
- assert(node->type == DocNode::TYPE_CHOOSE);
- assert((node->child_nodes).size() == 3);
- DocNodeList::iterator list_iter = (node->child_nodes).begin();
- assert(list_iter->type == DocNode::TYPE_WHEN);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "test", "cond1");
- assert(list_iter->child_nodes.size() == 1);
- node = &(*(list_iter->child_nodes.begin()));
- assert(node->type == DocNode::TYPE_INCLUDE);
- assert(node->attr_list.size() == 1);
- check_node_attr(node->attr_list.front(), "src", "foo");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_WHEN);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "test", "cond2");
- assert(list_iter->child_nodes.size() == 1);
- node = &(*(list_iter->child_nodes.begin()));
- assert(node->type == DocNode::TYPE_INCLUDE);
- assert(node->attr_list.size() == 1);
- check_node_attr(node->attr_list.front(), "src", "bar");
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_OTHERWISE);
- assert(list_iter->attr_list.size() == 0);
- assert(list_iter->child_nodes.size() == 1);
- node = &(*(list_iter->child_nodes.begin()));
- assert(node->type == DocNode::TYPE_INCLUDE);
- assert(node->attr_list.size() == 1);
- check_node_attr(node->attr_list.front(), "src", "otherwise");
- }
-
- {
- cout << endl << "===================== Test 44) invalid choose; non when/otherwise node" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:choose>"
- "<esi:comment text=\"blah\" />"
- "<esi:when test=foo>"
- "<esi:include src=foo />"
- "</esi:when>"
- "<esi:when test=bar>"
- "<esi:include src=bar />"
- "</esi:when>"
- "<esi:otherwise>"
- "<esi:include src=otherwise />"
- "</esi:otherwise>"
- "</esi:choose>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 45) invalid choose; multiple otherwise" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:choose>"
- "<esi:when test=foo>"
- "<esi:include src=foo />"
- "</esi:when>"
- "<esi:when test=bar>"
- "<esi:include src=bar />"
- "</esi:when>"
- "<esi:otherwise>"
- "<esi:include src=otherwise />"
- "</esi:otherwise>"
- "<esi:otherwise>"
- "<esi:include src=otherwise />"
- "</esi:otherwise>"
- "</esi:choose>");
-
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 46) choose-when" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:choose>"
- "<esi:otherwise>"
- "<esi:include src=otherwise />"
- "</esi:otherwise>"
- "</esi:choose>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 1);
- DocNode *node = &(*(node_list.begin()));
- assert(node->type == DocNode::TYPE_CHOOSE);
- assert((node->child_nodes).size() == 1);
- DocNodeList::iterator list_iter = (node->child_nodes).begin();
- assert(list_iter->type == DocNode::TYPE_OTHERWISE);
- assert(list_iter->child_nodes.size() == 1);
- node = &(*(list_iter->child_nodes.begin()));
- assert(node->type == DocNode::TYPE_INCLUDE);
- assert(node->attr_list.size() == 1);
- check_node_attr(node->attr_list.front(), "src", "otherwise");
- }
-
- {
- cout << endl << "===================== Test 47) invalid try block" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:try>"
- "<esi:attempt>"
- "<esi:include src=attempt />"
- "</esi:attempt>"
- "</esi:try>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 48) invalid try block" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:try>"
- "<esi:except>"
- "<esi:include src=except />"
- "</esi:except>"
- "</esi:try>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 49) invalid try block" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:try>"
- "<esi:attempt>"
- "<esi:include src=attempt />"
- "</esi:attempt>"
- "<esi:comment text=blah/>"
- "<esi:except>"
- "<esi:include src=except />"
- "</esi:except>"
- "</esi:try>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 50) invalid try block" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:try>"
- "<esi:attempt>"
- "<esi:include src=attempt />"
- "</esi:attempt>"
- "<esi:attempt>"
- "<esi:include src=attempt />"
- "</esi:attempt>"
- "<esi:except>"
- "<esi:include src=except />"
- "</esi:except>"
- "</esi:try>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 51) invalid try block" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:try>"
- "<esi:attempt>"
- "<esi:include src=attempt />"
- "</esi:attempt>"
- "<esi:except>"
- "<esi:include src=except />"
- "</esi:except>"
- "<esi:except>"
- "<esi:include src=except />"
- "</esi:except>"
- "</esi:try>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 52) invalid try block" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:include src=pre />"
- "foo"
- "<esi:try>"
- "foo"
- "<esi:attempt>"
- "bar"
- "<esi:include src=attempt />"
- "</esi:attempt>"
- "<esi:except>"
- "<esi:include src=except />"
- "</esi:except>"
- "</esi:try>"
- "bar");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 53) try block" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string
- input_data1("<esi:include src=pre />"
- "foo"
- "<esi:try>\n\t "
- "<esi:attempt>"
- "bar"
- "<esi:include src=attempt />"
- "</esi:attempt>"
- "\n\n\t "),
- input_data2("<esi:except>"
- "<esi:include src=except />"
- "</esi:except>"
- "\n\t "
- "</esi:try>"
- "bar");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data1, node_list) == true);
- assert(parser.parseChunk(input_data2, node_list) == true);
- assert(parser.completeParse(node_list) == true);
- assert(node_list.size() == 4);
- DocNodeList::iterator list_iter, list_iter2, list_iter3;
- list_iter = node_list.begin();
- assert(list_iter->type == DocNode::TYPE_INCLUDE);
- assert(list_iter->child_nodes.size() == 0);
- assert(list_iter->attr_list.size() == 1);
- check_node_attr(list_iter->attr_list.front(), "src", "pre");
-
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->child_nodes.size() == 0);
- assert(list_iter->attr_list.size() == 0);
- assert(list_iter->data_len == strlen("foo"));
- assert(strncmp(list_iter->data, "foo", list_iter->data_len) == 0);
-
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_TRY);
- assert(list_iter->child_nodes.size() == 2);
- assert(list_iter->attr_list.size() == 0);
- assert(list_iter->data_len == 0);
-
- list_iter2 = list_iter->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_ATTEMPT);
- assert(list_iter2->child_nodes.size() == 2);
- assert(list_iter2->attr_list.size() == 0);
- assert(list_iter2->data_len == 0);
-
- list_iter3 = list_iter2->child_nodes.begin();
- assert(list_iter3->type == DocNode::TYPE_PRE);
- assert(list_iter3->child_nodes.size() == 0);
- assert(list_iter3->attr_list.size() == 0);
- assert(list_iter3->data_len == strlen("bar"));
- assert(strncmp(list_iter3->data, "bar", list_iter3->data_len) == 0);
-
- ++list_iter3;
- assert(list_iter3->type == DocNode::TYPE_INCLUDE);
- assert(list_iter3->child_nodes.size() == 0);
- assert(list_iter3->attr_list.size() == 1);
- assert(list_iter3->data_len == 0);
- check_node_attr(list_iter3->attr_list.front(), "src", "attempt");
-
- ++list_iter2;
- assert(list_iter2->type == DocNode::TYPE_EXCEPT);
- assert(list_iter2->child_nodes.size() == 1);
- assert(list_iter2->attr_list.size() == 0);
- assert(list_iter2->data_len == 0);
-
- list_iter3 = list_iter2->child_nodes.begin();
- assert(list_iter3->type == DocNode::TYPE_INCLUDE);
- assert(list_iter3->child_nodes.size() == 0);
- assert(list_iter3->attr_list.size() == 1);
- assert(list_iter3->data_len == 0);
- check_node_attr(list_iter3->attr_list.front(), "src", "except");
-
- ++list_iter;
- assert(list_iter->type == DocNode::TYPE_PRE);
- assert(list_iter->child_nodes.size() == 0);
- assert(list_iter->attr_list.size() == 0);
- assert(list_iter->data_len == strlen("bar"));
- assert(strncmp(list_iter->data, "bar", list_iter->data_len) == 0);
- }
-
- {
- cout << endl << "===================== Test 54) invalid choose-when" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:choose>"
- "<esi:when test=foo>"
- "<esi:include src=foo />"
- "</esi:when>"
- "<esi:when test=bar>"
- "<esi:include src=bar />"
- "</esi:when>"
- "<esi:otherwise>"
- "<esi:include src=otherwise />"
- "</esi:otherwise>foo"
- "</esi:choose>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 55) invalid choose; multiple otherwise" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:choose>\n"
- "\t<esi:when test=foo>"
- "<esi:include src=foo />"
- "</esi:when>\n"
- "\t<esi:when test=bar>"
- "<esi:include src=bar />"
- "</esi:when>\n"
- "<esi:otherwise>"
- "<esi:include src=otherwise />"
- "</esi:otherwise>"
- "<esi:otherwise>"
- "<esi:include src=otherwise />"
- "</esi:otherwise>"
- "</esi:choose>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 56) invalid try block" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:try>"
- "</esi:try>");
- DocNodeList node_list;
- assert(parser.parseChunk(input_data, node_list) == false);
- assert(parser.completeParse(node_list) == false);
- assert(node_list.size() == 0);
- }
-
- {
- cout << endl << "===================== Test 57) choose/try combo" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:choose>"
- "<esi:when test=c1>"
- "<esi:try>"
- "<esi:attempt>"
- "<esi:include src=foo1 />"
- "</esi:attempt>"
- "<esi:except>"
- "<esi:include src=bar1 />"
- "</esi:except>"
- "</esi:try>"
- "</esi:when>"
- "<esi:when test=c2>"
- "<esi:try>"
- "<esi:attempt>"
- "<esi:include src=foo2 />"
- "</esi:attempt>"
- "<esi:except>"
- "<esi:include src=bar2 />"
- "</esi:except>"
- "</esi:try>"
- "</esi:when>"
- "<esi:otherwise>"
- "<esi:try>"
- "<esi:attempt>"
- "<esi:include src=foo3 />"
- "</esi:attempt>"
- "<esi:except>"
- "<esi:include src=bar3 />"
- "</esi:except>"
- "</esi:try>"
- "</esi:otherwise>"
- "</esi:choose>");
-
- DocNodeList node_list;
- assert(parser.completeParse(node_list, input_data) == true);
- assert(node_list.size() == 1);
- DocNodeList::iterator list_iter = node_list.begin(), list_iter2, list_iter3;
- assert(list_iter->type == DocNode::TYPE_CHOOSE);
-
- list_iter2 = list_iter->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_WHEN);
- assert(list_iter2->attr_list.size() == 1);
- check_node_attr(list_iter2->attr_list.front(), "test", "c1");
- list_iter2 = list_iter2->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_TRY);
- list_iter2 = list_iter2->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_ATTEMPT);
- list_iter3 = list_iter2->child_nodes.begin();
- assert(list_iter3->type == DocNode::TYPE_INCLUDE);
- assert(list_iter3->data_len == 0);
- assert(list_iter3->attr_list.size() == 1);
- check_node_attr(list_iter3->attr_list.front(), "src", "foo1");
- ++list_iter2;
- assert(list_iter2->type == DocNode::TYPE_EXCEPT);
- list_iter3 = list_iter2->child_nodes.begin();
- assert(list_iter3->type == DocNode::TYPE_INCLUDE);
- assert(list_iter3->data_len == 0);
- assert(list_iter3->attr_list.size() == 1);
- check_node_attr(list_iter3->attr_list.front(), "src", "bar1");
-
- list_iter2 = list_iter->child_nodes.begin();
- ++list_iter2;
- assert(list_iter2->type == DocNode::TYPE_WHEN);
- assert(list_iter2->attr_list.size() == 1);
- check_node_attr(list_iter2->attr_list.front(), "test", "c2");
- list_iter2 = list_iter2->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_TRY);
- list_iter2 = list_iter2->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_ATTEMPT);
- list_iter3 = list_iter2->child_nodes.begin();
- assert(list_iter3->type == DocNode::TYPE_INCLUDE);
- assert(list_iter3->data_len == 0);
- assert(list_iter3->attr_list.size() == 1);
- check_node_attr(list_iter3->attr_list.front(), "src", "foo2");
- ++list_iter2;
- assert(list_iter2->type == DocNode::TYPE_EXCEPT);
- list_iter3 = list_iter2->child_nodes.begin();
- assert(list_iter3->type == DocNode::TYPE_INCLUDE);
- assert(list_iter3->data_len == 0);
- assert(list_iter3->attr_list.size() == 1);
- check_node_attr(list_iter3->attr_list.front(), "src", "bar2");
-
- list_iter2 = list_iter->child_nodes.begin();
- ++list_iter2;
- ++list_iter2;
- assert(list_iter2->type == DocNode::TYPE_OTHERWISE);
- assert(list_iter2->attr_list.size() == 0);
- list_iter2 = list_iter2->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_TRY);
- list_iter2 = list_iter2->child_nodes.begin();
- assert(list_iter2->type == DocNode::TYPE_ATTEMPT);
- list_iter3 = list_iter2->child_nodes.begin();
- assert(list_iter3->type == DocNode::TYPE_INCLUDE);
- assert(list_iter3->data_len == 0);
- assert(list_iter3->attr_list.size() == 1);
- check_node_attr(list_iter3->attr_list.front(), "src", "foo3");
- ++list_iter2;
- assert(list_iter2->type == DocNode::TYPE_EXCEPT);
- list_iter3 = list_iter2->child_nodes.begin();
- assert(list_iter3->type == DocNode::TYPE_INCLUDE);
- assert(list_iter3->data_len == 0);
- assert(list_iter3->attr_list.size() == 1);
- check_node_attr(list_iter3->attr_list.front(), "src", "bar3");
- }
-
- {
- cout << endl << "===================== Test 58) '>' and '>=' operators" << endl;
- EsiParser parser("parser_test", &Debug, &Error);
- string input_data("<esi:choose>"
- "<esi:when test=\"a>b\">foo</esi:when>"
- "<esi:when test=\"c >= d\">bar</esi:when>"
- "</esi:choose>");
- DocNodeList node_list;
- assert(parser.completeParse(node_list, input_data) == true);
- DocNodeList::iterator list_iter = node_list.begin()->child_nodes.begin();
- AttributeList::iterator attr_iter = list_iter->attr_list.begin();
- assert(attr_iter->value_len == 3);
- assert(strncmp(attr_iter->value, "a>b", attr_iter->value_len) == 0);
- ++list_iter;
- attr_iter = list_iter->attr_list.begin();
- assert(attr_iter->value_len == 6);
- assert(strncmp(attr_iter->value, "c >= d", attr_iter->value_len) == 0);
-
- node_list.clear();
- parser.clear();
- input_data.assign("<esi:choose>"
- "<esi:when test=a>b>foo</esi:when>"
- "<esi:when test=\"c >= d\">bar</esi:when>"
- "</esi:choose>");
- assert(parser.completeParse(node_list, input_data) == true);
- list_iter = node_list.begin()->child_nodes.begin();
- attr_iter = list_iter->attr_list.begin();
- assert(attr_iter->value_len == 1);
- assert(strncmp(attr_iter->value, "a", attr_iter->value_len) == 0);
- ++list_iter;
- attr_iter = list_iter->attr_list.begin();
- assert(attr_iter->value_len == 6);
- assert(strncmp(attr_iter->value, "c >= d", attr_iter->value_len) == 0);
- }
-
- cout << endl << "All tests passed!" << endl;
- return 0;
-}