#
# Copyright (C) 2017 The Android Open Source Project
#
# 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 KernelProcFileTestBase
from KernelProcFileTestBase import repeat_rule, literal_token


class ProcCpuInfoTest(KernelProcFileTestBase.KernelProcFileTestBase):
    '''/proc/cpuinfo displays a collection of cpu and architecture specific items.

    The file consists of multiple lines of 'identifier : values' where
    'identifier' is a space separated name that can end in some tabs, and
    'values' are space separated items that can also in in a space.
    Extra newlines are allowed between normal lines.
    '''

    EXPECTED_FIELDS = [
        ['Features', ['\t']],
        ['processor', ['\t']],
        ['CPU', 'architecture', []],
    ]

    start = 'lines'

    # Any character except for ':' and whitespace is allowed
    t_STRING = r'[^:^ ^\t^\n]+'

    # Numbers and literals are tokenized as strings instead
    t_NUMBER = r'[0-9]+'
    t_HEX_LITERAL = r'[0-9a-f]+'

    p_lines = repeat_rule('line')
    p_string_spaces = repeat_rule('string_space', zero_ok=True)
    p_space_items = repeat_rule('space_item', zero_ok=True)
    p_TABs = repeat_rule('TAB', zero_ok=True)

    def p_line(self, p):
        '''line : string_spaces STRING TABs COLON space_items SPACE NEWLINE
                | string_spaces STRING TABs COLON space_items NEWLINE
                | NEWLINE'''
        if len(p) == 2:
            p[0] = []
            return
        p[0] = [p[1] + [p[2], p[3]], p[5], p[6]]

    def p_space_item(self, p):
        'space_item : SPACE STRING'
        p[0] = p[2]

    def p_string_space(self, p):
        'string_space : STRING SPACE'
        p[0] = p[1]

    def result_correct(self, parse_result):
        expected_fields = self.EXPECTED_FIELDS[:]
        for line in parse_result:
            if len(line) > 0:
                if line[0] in expected_fields:
                    expected_fields.remove(line[0])
        return len(expected_fields) == 0

    def get_path(self):
        return "/proc/cpuinfo"
