97 lines
2.6 KiB
Python
97 lines
2.6 KiB
Python
#
|
|
# 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"
|