#!/usr/bin/env python

# Copyright 2016 99cloud Inc.
# Licensed 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 io import StringIO
from oslotest import base

from kayobe.plugins.action import merge_configs


TESTA = '''[DEFAULT]
key1 = b
       c
key2 = v1
       v2
key3 = v3
key3 = v4
key4 = v5

[b]
b_key1 = 1
b_key2 = 1
         2

[c]
c_key1 =
c_key2 = 1 2 3
         4 5 6

'''

TESTB = '''[DEFAULT]
key2 = v3
       v4
       v5
key4 = v4
key4 =

[b]
b_key2 = 2

'''

# TESTC is TESTA + TESTB
TESTC = '''[DEFAULT]
key1 = b
       c
key2 = v3
       v4
       v5
key3 = v3
key3 = v4
key4 = v4
key4 =

[b]
b_key1 = 1
b_key2 = 2

[c]
c_key1 =
c_key2 = 1 2 3
         4 5 6

'''

TESTA_NO_SECTIONS = '''key1 = a
key2 = b

'''

TESTB_NO_SECTIONS = '''key3 = c

'''

# TESTA_NO_SECTIONS and TESTB_NO_SECTIONS combined
TESTC_NO_SECTIONS = '''key1 = a
key2 = b
key3 = c

'''

TESTA_NO_DEFAULT_SECTION = '''key1 = a
key2 = b

[a]
key1 = not_a

[b]
key3 = not_c

'''

TESTB_NO_DEFAULT_SECTION = '''key3 = c

[b]
key2 = not_b
key3 = override

'''

# TESTA_NO_DEFAULT_SECTION and TESTB_NO_DEFAULT_SECTION combined
TESTC_NO_DEFAULT_SECTION = '''key1 = a
key2 = b
key3 = c

[a]
key1 = not_a

[b]
key3 = override
key2 = not_b

'''

# TESTC_NO_WHITESPACE is TESTA + TESTB without whitespace around equal signs
TESTC_NO_WHITESPACE = '''[DEFAULT]
key1=b
     c
key2=v3
     v4
     v5
key3=v3
key3=v4
key4=v4
key4=

[b]
b_key1=1
b_key2=2

[c]
c_key1=
c_key2=1 2 3
       4 5 6

'''


class OverrideConfigParserTest(base.BaseTestCase):

    def test_read_write(self):
        for ini in [TESTA,
                    TESTB,
                    TESTC,
                    TESTA_NO_SECTIONS,
                    TESTB_NO_SECTIONS,
                    TESTC_NO_SECTIONS,
                    TESTA_NO_DEFAULT_SECTION,
                    TESTB_NO_DEFAULT_SECTION,
                    TESTC_NO_DEFAULT_SECTION]:
            parser = merge_configs.OverrideConfigParser()
            parser.parse(StringIO(ini))
            output = StringIO()
            parser.write(output)
            self.assertEqual(ini, output.getvalue())
            output.close()

    def test_merge(self):
        parser = merge_configs.OverrideConfigParser()
        parser.parse(StringIO(TESTA))
        parser.parse(StringIO(TESTB))
        output = StringIO()
        parser.write(output)
        self.assertEqual(TESTC, output.getvalue())
        output.close()

    def test_merge_no_sections(self):
        parser = merge_configs.OverrideConfigParser()
        parser.parse(StringIO(TESTA_NO_SECTIONS))
        parser.parse(StringIO(TESTB_NO_SECTIONS))
        output = StringIO()
        parser.write(output)
        self.assertEqual(TESTC_NO_SECTIONS, output.getvalue())
        output.close()

    def test_merge_no_default_section(self):
        parser = merge_configs.OverrideConfigParser()
        parser.parse(StringIO(TESTA_NO_DEFAULT_SECTION))
        parser.parse(StringIO(TESTB_NO_DEFAULT_SECTION))
        output = StringIO()
        parser.write(output)
        self.assertEqual(TESTC_NO_DEFAULT_SECTION, output.getvalue())
        output.close()

    def test_merge_no_whitespace(self):
        parser = merge_configs.OverrideConfigParser(whitespace=False)
        parser.parse(StringIO(TESTA))
        parser.parse(StringIO(TESTB))
        output = StringIO()
        parser.write(output)
        self.assertEqual(TESTC_NO_WHITESPACE, output.getvalue())
        output.close()
