#!/usr/bin/env python

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

from unittest import TestCase
from Grep import Grep
import socket
import os, sys
import logging
import platform
IS_WINDOWS = platform.system() == "Windows"

class TestGrep(TestCase):

  logger = logging.getLogger()
  string_good = None
  string_bad = None
  grep = Grep()

  def setUp(self):
    if IS_WINDOWS:
      self.string_good = open('agent' + os.sep + 'dummy_output_good.txt', 'r').read().replace("\r\n", os.linesep)
      self.string_bad = open('agent' + os.sep + 'dummy_output_error.txt', 'r').read().replace("\r\n", os.linesep)
    else:
      self.string_good = open('agent' + os.sep + 'dummy_output_good.txt', 'r').read().replace("\n", os.linesep)
      self.string_bad = open('agent' + os.sep + 'dummy_output_error.txt', 'r').read().replace("\n", os.linesep)
    pass

  def test_grep_many_lines(self):
    fragment = self.grep.grep(self.string_bad, "err", 1000, 1000)
    desired = self.string_bad.strip()
    self.assertEquals(fragment, desired, "Grep grep function should return all lines if there are less lines than n")


  def test_grep_few_lines(self):
    self.assertEqual.__self__.maxDiff = None
    fragment = self.grep.grep(self.string_bad, "Err", 3, 3)
    desired = """
debug: /Schedule[never]: Skipping device resources because running on a host
debug: Exec[command_good](provider=posix): Executing 'wget e432423423xample.com/badurl444111'
debug: Executing 'wget e432423423xample.com/badurl444111'
err: /Stage[main]//Exec[command_good]/returns: change from notrun to 0 failed: wget e432423423xample.com/badurl444111 returned 4 instead of one of [0] at /root/puppet-learn/2-bad.pp:5
debug: /Schedule[weekly]: Skipping device resources because running on a host
debug: /Schedule[puppet]: Skipping device resources because running on a host
debug: Finishing transaction 70171639726240
""".strip()
    self.assertEquals(fragment, desired, "Grep grep function should return only last 3 lines of file")

  def test_grep_no_result(self):
    fragment = self.grep.grep(self.string_good, "Err", 3, 3)
    desired = None
    self.assertEquals(fragment, desired, 'Grep grep function should return None if result is not found')

  def test_grep_empty_string(self):
    fragment = self.grep.grep("", "Err", 1000, 1000)
    desired = None
    self.assertEquals(fragment, desired, 'Grep grep function should return None for empty string')

  def test_grep_all(self):
    fragment = self.grep.grep(self.string_bad, "Err", 35, 9)
    desired = self.string_bad.strip()
    self.assertEquals(fragment, desired, 'Grep grep function contains bug in index arithmetics')


  def test_tail_many_lines(self):
    fragment = self.grep.tail(self.string_good, 1000)
    desired = self.string_good.strip()
    self.assertEquals(fragment, desired, "Grep tail function should return all lines if there are less lines than n")

  def test_tail_few_lines(self):
    self.assertEqual.__self__.maxDiff = None
    fragment = self.grep.tail(self.string_good, 3)
    desired = """
debug: Finishing transaction 70060456663980
debug: Received report to process from ambari-dmi
debug: Processing report from ambari-dmi with processor Puppet::Reports::Store
""".strip()
    self.assertEquals(fragment, desired, "Grep tail function should return only last 3 lines of file")

  def test_tail_no_lines(self):
    fragment = self.grep.tail("", 3)
    desired = ''
    self.assertEquals(fragment, desired, 'Grep tail function should return "" for empty string')

  def test_tail_all(self):
    fragment = self.grep.tail("", 47)
    desired = ''
    self.assertEquals(fragment, desired, 'Grep tail function contains bug in index arithmetics')

  def test_filterMarkup(self):
    string = """[0;36mnotice: /Stage[main]/Hdp-hadoop/Hdp-hadoop::Package[hadoop]/Hdp::Package[hadoop 64]/Hdp::Package::Process_pkg[hadoop 64]/Package[hadoop-libhdfs]/ensure: created[0m"""
    desired="""notice: /Stage[main]/Hdp-hadoop/Hdp-hadoop::Package[hadoop]/Hdp::Package[hadoop 64]/Hdp::Package::Process_pkg[hadoop 64]/Package[hadoop-libhdfs]/ensure: created"""
    filtered = self.grep.filterMarkup(string)
    #sys.stderr.write(filtered)
    self.assertEquals(filtered, desired)

  def tearDown(self):
    pass

  def test_cleanByTemplate(self):
    self.assertEqual.__self__.maxDiff = None
    fragment = self.grep.cleanByTemplate(self.string_bad, "debug")
    desired = """
info: Applying configuration version '1352127563'
err: /Stage[main]//Exec[command_good]/returns: change from notrun to 0 failed: wget e432423423xample.com/badurl444111 returned 4 instead of one of [0] at /root/puppet-learn/2-bad.pp:5
notice: Finished catalog run in 0.23 seconds
""".strip()
    self.assertEquals(fragment, desired, 'Grep cleanByTemplate function should return string without debug lines.')


