#
# 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 logging
from parse import with_pattern
from vts.testcases.kernel.api.proc import KernelProcFileTestBase
@with_pattern(r'[^ ^\t^\n^:^\0]+')
def token_name(text):
return text
@with_pattern(r'[ ]*[0-9]+')
def token_lu(text):
return int(text)
@with_pattern(r'(kB)?')
def token_kb(text):
return text
class ProcMemInfoTest(KernelProcFileTestBase.KernelProcFileTestBase):
'''/proc/meminfo reports statistics about memory usage on the system.
No new fields should be added to the upstream implementation.
'''
REQUIRED_FIELDS = {
"MemTotal",
"MemFree",
"MemAvailable",
"Buffers",
"Cached",
"SwapCached",
"Active",
"Inactive",
"Active(anon)",
"Inactive(anon)",
"Active(file)",
"Inactive(file)",
"Unevictable",
"Mlocked",
"SwapTotal",
"SwapFree",
"Dirty",
"Writeback",
"AnonPages",
"Mapped",
"Shmem",
"Slab",
"SReclaimable",
"SUnreclaim",
"KernelStack",
"PageTables",
"NFS_Unstable",
"Bounce",
"WritebackTmp",
"CommitLimit",
"Committed_AS",
"VmallocTotal",
"VmallocUsed",
"VmallocChunk",
}
def parse_contents(self, contents):
lines = contents.split('\n')
if lines[-1] != '':
raise SyntaxError("missing final newline")
return [self.parse_line("{:name}: {:lu}{:^kb}", line,
dict(name=token_name, lu=token_lu, kb=token_kb)) for line in lines[:-1]]
def result_correct(self, parse_result):
required_fields = self.REQUIRED_FIELDS.copy()
for line in parse_result:
if line[0] in required_fields:
required_fields.remove(line[0])
if len(required_fields) > 0:
logging.error("Required fields not present: %s", str(required_fields))
return False
return True
def get_path(self):
return "/proc/meminfo"