diff --git a/crit/mempages_test.go b/crit/mempages_test.go index 2c087b8a6..feaf2f574 100644 --- a/crit/mempages_test.go +++ b/crit/mempages_test.go @@ -271,6 +271,83 @@ func TestGetShmemSize(t *testing.T) { } } +func TestSearchPattern(t *testing.T) { + pid, err := getTestImgPID() + if err != nil { + t.Fatal(err) + } + + mr, err := NewMemoryReader(testImgsDir, pid, sysPageSize) + if err != nil { + t.Fatal(err) + } + + testCases := []struct { + name string + pattern string + context int + expectedError error + }{ + { + name: "PATH environment variable", + pattern: "PATH=", + }, + { + name: "PATH environment variable regex", + pattern: `\bPATH=([^\s]+)\b`, + }, + { + name: "PATH environment variable regex with 10 bytes context", + pattern: `\bPATH=([^\s]+)\b`, + context: 10, + }, + { + name: "PATH environment variable regex with a negative context", + pattern: `\bPATH=([^\s]+)\b`, + context: -1, + expectedError: errors.New("context size cannot be negative"), + }, + { + name: "PATH environment variable regex with a large context", + pattern: `\bPATH=([^\s]+)\b`, + context: 100_000, + }, + { + name: "non existent pattern", + pattern: "NON_EXISTENT_PATTERN", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + matches, err := mr.SearchPattern(tc.pattern, tc.context, 0) + if err != nil && tc.expectedError == nil { + t.Errorf("Unexpected error for pattern %s: %v", tc.pattern, err) + } else if err == nil && tc.expectedError != nil { + t.Errorf("Expected error for pattern %s: %v", tc.pattern, tc.expectedError) + } + + for _, match := range matches { + content, err := mr.GetMemPages(match.Vaddr, match.Vaddr+uint64(match.Length)) + if err != nil { + t.Fatalf("Failed to get memory pages: %v", err) + } + + buff := content.Bytes() + for i := range buff { + if buff[i] < 32 || buff[i] >= 127 { + buff[i] = 0x3F + } + } + + if !strings.Contains(match.Match, content.String()) { + t.Errorf("Expected to find %s in matched pattern %s", content.String(), match.Match) + } + } + }) + } +} + // helper function to get the PID from the test-imgs directory func getTestImgPID() (uint32, error) { psTreeImg, err := getImg(filepath.Join(testImgsDir, "pstree.img"), &pstree.PstreeEntry{})