The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use WWW::Splunk::XMLParser;
use XML::LibXML;
use Test::More tests => 5;

my $case1 = XML::LibXML->load_xml (string => <<EOF);
<response>
	<dict>
		<key name="remoteSearch">search index=default readlevel=2 foo</key>
		<key name="remoteTimeOrdered">true</key>
	</dict>
	<list>
		<item>
			<dict>
				<key name="overridesTimeOrder">false</key>
				jjjjjjjjjjjjjjjjjjjj<key name="isStreamingOpRequired">false</key>

			</dict>
		</item>
		<item>
			<dict>
			</dict>
			<dict>
			</dict>
		</item>
	</list>
</response>
EOF
is_deeply ([ WWW::Splunk::XMLParser::parse ($case1) ], [
	{
		'remoteSearch' => 'search index=default readlevel=2 foo',
		'remoteTimeOrdered' => 'true'
	},
	[
		{
		'isStreamingOpRequired' => 'false',
		'overridesTimeOrder' => 'false'
		},
		{},
		{}
	],
	], "Structured document parsed correctly");

my $case2 = XML::LibXML->load_xml (string => <<EOF);
<?xml version="1.0" encoding="UTF-8"?>
<!--This is to override browser formatting; see server.conf[httpServer] to disable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .-->
<?xml-stylesheet type="text/xml" href="/static/atom.xsl"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:s="http://dev.splunk.com/ns/rest" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">
  <title>search index=* source=/mnt/log/httpd/access_log |stats count by http_status_code</title>
  <id>https://splunk.example.net:8089/services/search/jobs/1336417395.8763.example-user</id>
  <updated>2012-05-07T21:03:16.000+02:00</updated>
  <link href="/services/search/jobs/1336417395.8763.example-user" rel="alternate"/>
  <published>2012-05-07T21:03:16.000+02:00</published>
  <link href="/services/search/jobs/1336417395.8763.example-user/search.log" rel="search.log"/>
  <link href="/services/search/jobs/1336417395.8763.example-user/events" rel="events"/>
  <author>
    <name>nobody</name>
  </author>
  <content type="text/xml">
    <s:dict>
      <s:key name="bundleVersion">6012424754159105074</s:key>
      <s:key name="cursorTime">2038-01-19T04:14:07.000+01:00</s:key>
      <s:key name="messages">
        <s:dict/>
      </s:key>
      <s:key name="request">
        <s:dict>
          <s:key name="earliest_time">2012-05-07T21:02:13</s:key>
        </s:dict>
      </s:key>
      <s:key name="eai:acl">
        <s:dict>
          <s:key name="perms">
            <s:dict>
              <s:key name="read">
                <s:list>
                  <s:item>nobody</s:item>
                </s:list>
              </s:key>
              <s:key name="write">
                <s:list>
                  <s:item>nobody</s:item>
                </s:list>
              </s:key>
            </s:dict>
          </s:key>
          <s:key name="owner">nobody</s:key>
          <s:key name="delegate"/>
          <s:key name="modifiable">true</s:key>
          <s:key name="sharing">global</s:key>
          <s:key name="app">search</s:key>
          <s:key name="can_write">true</s:key>
        </s:dict>
      </s:key>
      <s:key name="searchProviders">
        <s:list/>
      </s:key>
    </s:dict>
  </content>
</entry>
EOF
is_deeply (WWW::Splunk::XMLParser::parse ($case2), {
	request => { earliest_time => '2012-05-07T21:02:13' },
	messages => {},
	searchProviders => [],
	'eai:acl' => {
		sharing => 'global',
		modifiable => 'true',
		delegate => undef,
		owner => 'nobody',
		app => 'search',
		can_write => 'true',
		perms => {
			read => [ 'nobody' ],
			write => [ 'nobody' ]
		}
	},
	cursorTime => '2038-01-19T04:14:07.000+01:00',
	bundleVersion => '6012424754159105074',
	}, 'Atom wrapped document parsed correctly');

my $case3 = XML::LibXML->load_xml (string => <<EOF);
<?xml version=\'1.0\' encoding=\'UTF-8\'?>
<response><sid>666</sid></response>
EOF
isa_ok (WWW::Splunk::XMLParser::parse ($case3),
	'XML::LibXML::Document', "Raw document 1");

my $case4 = XML::LibXML->load_xml (string => <<EOF);
<response>
	<messages>
		<msg type='FATAL'>Unknown sid.</msg>
	</messages>
</response>
EOF
isa_ok (WWW::Splunk::XMLParser::parse ($case4),
	'XML::LibXML::Document', "Raw document 2");

my $case5 = XML::LibXML->load_xml (string => <<EOF);
<?xml version="1.0" encoding="UTF-8"?>
<results preview="0">
        <meta>
                <fieldOrder>
                        <field>http_status_code</field>
                        <field>count</field>
                </fieldOrder>
        </meta>
        <result offset="0">
                <field k="http_status_code">
                        <value><text>200</text></value>
                </field>
                <field k="count">
                        <value><text>666</text></value>
                </field>
        </result>
        <result offset="1">
                <field k="http_status_code">
                        <value><text>204</text></value>
                </field>
                <field k="count">
                        <value><text>8086</text></value>
                </field>
		<field k="_raw">
			<v xml:space="preserve" trunc="0">fnfnfn</v>
		</field>
        </result>
</results>
EOF
is_deeply ([ WWW::Splunk::XMLParser::parse ($case5) ], [
	{ count => '666', http_status_code => '200' },
	{ count => '8086', http_status_code => '204', _raw => 'fnfnfn' }
	], 'Results structure parsed fine');