#!/usr/bin/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.

import imp
import os
import sys

import mock
from oslotest import base
from six import StringIO


PROJECT_DIR = os.path.abspath(os.path.join(os. path.dirname(__file__), '../'))
MERGE_CONFIG_FILE = os.path.join(PROJECT_DIR,
                                 'ansible/action_plugins/merge_configs.py')

sys.modules['ansible.plugins'] = mock.MagicMock()

merge_configs = imp.load_source('merge_configs', MERGE_CONFIG_FILE)

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

'''


class OverrideConfigParserTest(base.BaseTestCase):

    def test_read_write(self):
        for ini in [TESTA, TESTB, TESTC]:
            parser = merge_configs.OverrideConfigParser()
            parser.parse(StringIO(ini))
            output = StringIO()
            parser.write(output)
            self.assertEqual(ini, output.getvalue())

    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())