#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# Copyright 2018 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.

"""Tests for request string parsing."""

from __future__ import print_function

import unittest

import nebraska


class XMLStrings(object):
  """Collection of XML request strings for testing."""

  INSTALL_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
<request protocol="3.0">
  <os version="Indy" platform="Chrome OS" sp="10323.52.0_x86_64"></os>
  <app appid="platform" version="1.0.0" hardware_class="c" delta_okay="false">
    <ping active="1" a="1" r="1"></ping>
  </app>
  <app appid="foo" version="1.0.0" delta_okay="false">
    <ping active="1" a="1" r="1"></ping>
    <updatecheck targetversionprefix=""></updatecheck>
  </app>
  <app appid="bar" version="1.0.0" delta_okay="false">
    <ping active="1" a="1" r="1"></ping>
    <updatecheck targetversionprefix=""></updatecheck>
  </app>
</request>
"""

  UPDATE_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
<request protocol="3.0">
  <os version="Indy" platform="Chrome OS" sp="10323.52.0_x86_64"></os>
  <app appid="platform" version="1.0.0" hardware_class="c" delta_okay="true">
    <ping active="1" a="1" r="1"></ping>
    <updatecheck targetversionprefix=""></updatecheck>
  </app>
  <app appid="foo" version="1.0.0" delta_okay="true">
    <ping active="1" a="1" r="1"></ping>
    <updatecheck targetversionprefix=""></updatecheck>
  </app>
  <app appid="bar" version="1.0.0" delta_okay="false">
    <ping active="1" a="1" r="1"></ping>
    <updatecheck targetversionprefix=""></updatecheck>
  </app>
</request>
"""

  INVALID_NOOP_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
<request protocol="3.0">
  <os version="Indy" platform="Chrome OS" sp="10323.52.0_x86_64"></os>
  <app appid="platform" version="1.0.0" hardware_class="c" delta_okay="true">
    <ping active="1" a="1" r="1"></ping>
  </app>
  <app appid="foo" version="1.0.0" delta_okay="true">
    <ping active="1" a="1" r="1"></ping>
  </app>
  <app appid="bar" version="1.0.0" delta_okay="false">
    <ping active="1" a="1" r="1"></ping>
    <updatecheck targetversionprefix=""></updatecheck>
  </app>
</request>
"""

  EVENT_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
<request protocol="3.0">
  <os version="Indy" platform="Chrome OS" sp="10323.52.0_x86_64"></os>
  <app appid="platform" version="1.0.0" hardware_class="c">
    <event eventtype="3" eventresult="1"></event>
  </app>
</request>
"""

  INVALID_XML_REQUEST = """invalid xml!
<?xml version="1.0" encoding="UTF-8"?>
<request protocol="3.0">
  <os version="Indy" platform="Chrome OS" sp="10323.52.0_x86_64"></os>
  <app appid="foo" version="1.0.0" delta_okay="false">
    <ping active="1" a="1" r="1"></ping>
  </app>
</request>
"""

  # No appid
  INVALID_APP_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
<request protocol="3.0">
  <os version="Indy" platform="Chrome OS" sp="10323.52.0_x86_64"></os>
  <app version="1.0.0" hardware_class="caroline" delta_okay="true">
    <ping active="1" a="1" r="1"></ping>
  </app>
</request>
"""

  # No version number
  INVALID_INSTALL_REQUEST = """<?xml version="1.0" encoding="UTF-8"?>
<request protocol="3.0">
  <os version="Indy" platform="Chrome OS" sp="10323.52.0_x86_64"></os>
  <app appid="platform" version="1.0.0" hardware_class="c" delta_okay="false">
    <ping active="1" a="1" r="1"></ping>
  </app>
  <app appid="foo" delta_okay="false">
    <ping active="1" a="1" r="1"></ping>
    <updatecheck targetversionprefix=""></updatecheck>
  </app>
</request>
"""

class RequestTest(unittest.TestCase):
  """Tests for Request class."""

  def testParseRequestInvalidXML(self):
    """Tests ParseRequest handling of invalid XML."""
    with self.assertRaises(ValueError):
      request = nebraska.Request(XMLStrings.INVALID_XML_REQUEST)
      request.ParseRequest()

  def testParseRequestInvalidApp(self):
    """Tests ParseRequest handling of invalid app requests."""
    with self.assertRaises(ValueError):
      request = nebraska.Request(XMLStrings.INVALID_APP_REQUEST)
      request.ParseRequest()

  def testParseRequestInvalidInstall(self):
    """Tests ParseRequest handling of invalid app requests."""
    with self.assertRaises(ValueError):
      request = nebraska.Request(XMLStrings.INVALID_INSTALL_REQUEST)
      request.ParseRequest()

  def testParseRequestInvalidNoop(self):
    """Tests ParseRequest handling of invalid mixed no-op request."""
    with self.assertRaises(ValueError):
      request = nebraska.Request(XMLStrings.INVALID_NOOP_REQUEST)
      request.ParseRequest()

  def testParseRequestInstall(self):
    """Tests ParseRequest handling of install requests."""
    request = nebraska.Request(XMLStrings.INSTALL_REQUEST)
    app_requests = request.ParseRequest()

    self.assertTrue(app_requests[0].request_type ==
                    nebraska.Request.AppRequest.RequestType.NO_OP)
    self.assertTrue(app_requests[1].request_type ==
                    nebraska.Request.AppRequest.RequestType.INSTALL)
    self.assertTrue(app_requests[2].request_type ==
                    nebraska.Request.AppRequest.RequestType.INSTALL)

    self.assertTrue(app_requests[0].appid == "platform")
    self.assertTrue(app_requests[1].appid == "foo")
    self.assertTrue(app_requests[2].appid == "bar")

    self.assertTrue(app_requests[1].version == "1.0.0")
    self.assertTrue(app_requests[2].version == "1.0.0")

  def testParseRequestUpdate(self):
    """Tests ParseRequest handling of update requests."""
    request = nebraska.Request(XMLStrings.UPDATE_REQUEST)
    app_requests = request.ParseRequest()

    self.assertTrue(app_requests[0].request_type ==
                    nebraska.Request.AppRequest.RequestType.UPDATE)
    self.assertTrue(app_requests[1].request_type ==
                    nebraska.Request.AppRequest.RequestType.UPDATE)
    self.assertTrue(app_requests[2].request_type ==
                    nebraska.Request.AppRequest.RequestType.UPDATE)

    self.assertTrue(app_requests[0].appid == "platform")
    self.assertTrue(app_requests[1].appid == "foo")
    self.assertTrue(app_requests[2].appid == "bar")

    self.assertTrue(app_requests[0].version == "1.0.0")
    self.assertTrue(app_requests[1].version == "1.0.0")
    self.assertTrue(app_requests[2].version == "1.0.0")

    self.assertTrue(app_requests[0].delta_okay)
    self.assertTrue(app_requests[1].delta_okay)
    self.assertFalse(app_requests[2].delta_okay)

  def testParseRequestEventPing(self):
    """Tests ParseRequest handling of event ping requests."""
    request = nebraska.Request(XMLStrings.EVENT_REQUEST)
    app_requests = request.ParseRequest()

    self.assertTrue(app_requests[0].request_type ==
                    nebraska.Request.AppRequest.RequestType.NO_OP)
    self.assertTrue(app_requests[0].appid == "platform")
    self.assertTrue(app_requests[0].event_type == "3")
    self.assertTrue(app_requests[0].event_result == "1")


if __name__ == '__main__':
  unittest.main()
