# # 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"