// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview Jasmine test file for pdml_document.js.
 */
describe('PdmlDocument', function() {
  it('should gracefully handle empty input', function() {
    var pdmlDocument = new pcap.PdmlDocument();
    expect(pdmlDocument.read()).toBe(false);
  });

  it('should extend from pcap.XmlDocument', function() {
    var pdmlDocument = new pcap.PdmlDocument();
    expect(pdmlDocument instanceof pcap.PdmlDocument).toBe(true);
    expect(pdmlDocument instanceof pcap.XmlDocument).toBe(true);
  });


  it('should return false for invalid XML', function() {
    var xmlString = '>this<is><invalid><';

    var parser = new DOMParser();
    var xml = parser.parseFromString(xmlString, 'application/xml');

    var pdmlDocument = new pcap.PdmlDocument();
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(0);
    expect(pdmlDocument.read(xml)).toBe(false);
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(0);
  });

  it('should return false for missing packets', function() {
    var xmlString = '<?xml version="1.0"?>';
    xmlString += '<pdml>';
    xmlString += '</pdml>';

    var parser = new DOMParser();
    var xml = parser.parseFromString(xmlString, 'application/xml');

    var pdmlDocument = new pcap.PdmlDocument();
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(0);
    expect(pdmlDocument.read(xml)).toBe(false);
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(0);
  });

  it('should return false for missing protos', function() {
    var xmlString = '<?xml version="1.0"?>';
    xmlString += '<pdml>';
    xmlString += '<packet>';
    xmlString += '</packet>';
    xmlString += '</pdml>';

    var parser = new DOMParser();
    var xml = parser.parseFromString(xmlString, 'application/xml');

    var pdmlDocument = new pcap.PdmlDocument();
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(0);
    expect(pdmlDocument.read(xml)).toBe(false);
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(0);
  });

  it('should return false for missing fields', function() {
    var xmlString = '<?xml version="1.0"?>';
    xmlString += '<pdml>';
    xmlString += '<packet>';
    xmlString += '<proto name="geninfo" showname="General information">';
    xmlString += '</proto>';
    xmlString += '</packet>';
    xmlString += '</pdml>';

    var parser = new DOMParser();
    var xml = parser.parseFromString(xmlString, 'application/xml');

    var pdmlDocument = new pcap.PdmlDocument();
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(0);
    expect(pdmlDocument.read(xml)).toBe(false);
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(0);
  });

  it('should successfully read and return true for valid PDML', function() {
    var xmlString = '<?xml version="1.0"?>';
    xmlString += '<pdml>';
    xmlString += '<packet>';
    xmlString += '<proto name="a">';
    xmlString += '<field name="a" show="b" showname="c"/>';
    xmlString += '</proto>';
    xmlString += '</packet>';
    xmlString += '</pdml>';

    var parser = new DOMParser();
    var xml = parser.parseFromString(xmlString, 'application/xml');

    var pdmlDocument = new pcap.PdmlDocument();
    expect(pdmlDocument.read(xml)).toBe(true);
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(1);
    expect(pdmlDocument.packets_[0]).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_.length).toBe(1);
    expect(pdmlDocument.packets_[0].protos_[0].attributes_).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_[0].fields_).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_[0].attributes_['name']).toBe('a');
    expect(pdmlDocument.packets_[0].protos_[0].fields_.length).toBe(1);
  });

  it('should sucessfully handle multiple protos', function() {
    var xmlString = '<?xml version="1.0"?>';
    xmlString += '<pdml>';
    xmlString += '<packet>';
    xmlString += '<proto name="a" showname="b">';
    xmlString += '<field name="c" show="d" showname="e"/>';
    xmlString += '</proto>';
    xmlString += '<proto name="f" showname="g">';
    xmlString += '<field name="h" showname="i" show="j"/>';
    xmlString += '</proto>';
    xmlString += '</packet>';
    xmlString += '</pdml>';

    var parser = new DOMParser();
    var xml = parser.parseFromString(xmlString, 'application/xml');

    var pdmlDocument = new pcap.PdmlDocument();
    expect(pdmlDocument.read(xml)).toBe(true);
    expect(pdmlDocument.packets_).toBeDefined();
    expect(pdmlDocument.packets_.length).toBe(1);
    expect(pdmlDocument.packets_[0]).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_.length).toBe(2);
  });

  it('should sucessfully handle nested fields', function() {
    var xmlString = '<?xml version="1.0"?>';
    xmlString += '<pdml>';
    xmlString += '<packet>';
    xmlString += '<proto name="a" showname="b">';
    xmlString += '<field name="c" showname="d" show="e">';
    xmlString += '<field name="f" showname="g" show="h"/>';
    xmlString += '</field>';
    xmlString += '</proto>';
    xmlString += '</packet>';
    xmlString += '</pdml>';

    var parser = new DOMParser();
    var xml = parser.parseFromString(xmlString, 'application/xml');

    var pdmlDocument = new pcap.PdmlDocument();
    expect(pdmlDocument.read(xml)).toBe(true);
    expect(pdmlDocument.packets_.length).toBe(1);
    expect(pdmlDocument.packets_.length).toBe(1);
    expect(pdmlDocument.packets_[0]).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_[0]).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_[0].fields_).toBeDefined();
    expect(pdmlDocument.packets_[0].protos_[0].fields_.length).toBe(1);
    expect(pdmlDocument.packets_[0].protos_[0].fields_[0]).toBeDefined();

    var field = pdmlDocument.packets_[0].protos_[0].fields_[0];
    expect(field.attributes_).toBeDefined();
    expect(field.attributes_['name']).toBe('c');
    expect(field.fields_).toBeDefined();
    expect(field.fields_.length).toBe(1);
    expect(field.fields_[0]).toBeDefined();
    expect(field.fields_[0].attributes_['name']).toBe('f');
  });
});
