#
# 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.
#

import os, common
from proton import *

class Test(common.Test):
  pass

class TransportTest(Test):

  def setup(self):
    self.transport = Transport()

  def teardown(self):
    self.transport = None

  def testEOS(self):
    try:
      n = self.transport.input("")
      assert False, n
    except TransportException:
      pass

  def testPartial(self):
    n = self.transport.input("AMQ")
    assert n == 3, n
    try:
      n = self.transport.input("")
      assert False, n
    except TransportException:
      pass

  def testGarbage(self):
    try:
      n = self.transport.input("GARBAGE_")
      assert False, n
    except TransportException, e:
      assert "AMQP header mismatch" in str(e)
    try:
      n = self.transport.input("")
      assert False, n
    except TransportException, e:
      assert "AMQP header mismatch" in str(e)

  def testSmallGarbage(self):
    try:
      n = self.transport.input("XXX")
      assert False, n
    except TransportException, e:
      assert "AMQP header mismatch" in str(e)
    try:
      n = self.transport.input("")
      assert False, n
    except TransportException, e:
      assert "AMQP header mismatch" in str(e)

  def testBigGarbage(self):
    try:
      n = self.transport.input("GARBAGE_XXX")
      assert False, n
    except TransportException, e:
      assert "AMQP header mismatch" in str(e)
    try:
      n = self.transport.input("")
      assert False, n
    except TransportException, e:
      assert "AMQP header mismatch" in str(e)

  def testHeader(self):
    n = self.transport.input("AMQP\x00\x01\x00\x00")
    assert n == 8, n
    try:
      n = self.transport.input("")
      assert False, n
    except TransportException, e:
      assert "connection aborted" in str(e)

  def testOutput(self):
    out = self.transport.output(1024)
    assert out is not None

  def testBindAfterOpen(self):
    conn = Connection()
    ssn = conn.session()
    conn.open()
    ssn.open()
    conn.container = "test-container"
    conn.hostname = "test-hostname"
    trn = Transport()
    trn.bind(conn)
    out = trn.output(1024)
    assert "test-container" in out, repr(out)
    assert "test-hostname" in out, repr(out)
    n = self.transport.input(out)
    assert n > 0, n
    out = out[n:]

    if out:
      n = self.transport.input(out)
      assert n == 0

    c = Connection()
    assert c.remote_container == None
    assert c.remote_hostname == None
    assert c.session_head(0) == None
    self.transport.bind(c)
    assert c.remote_container == "test-container"
    assert c.remote_hostname == "test-hostname"
    if out:
      assert c.session_head(0) == None
      n = self.transport.input(out)
      assert n == len(out), (n, out)
    assert c.session_head(0) != None
