github.com/grafana/pyroscope@v1.18.0/pkg/frontend/vcs/source/find_python_test.go (about) 1 package source 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 ) 8 9 func Test_isPythonStdlibPath(t *testing.T) { 10 tests := []struct { 11 name string 12 path string 13 expectedPath string 14 expectedVersion string 15 expectedOk bool 16 }{ 17 { 18 name: "UV Python install", 19 path: "/Users/user/.local/share/uv/python/cpython-3.12.12-macos-aarch64-none/lib/python3.12/difflib.py", 20 expectedPath: "difflib.py", 21 expectedVersion: "3.12", 22 expectedOk: true, 23 }, 24 { 25 name: "pyenv install", 26 path: "/home/user/.pyenv/versions/3.11.4/lib/python3.11/json/decoder.py", 27 expectedPath: "json/decoder.py", 28 expectedVersion: "3.11", 29 expectedOk: true, 30 }, 31 { 32 name: "System Python", 33 path: "/usr/lib/python3.10/collections/__init__.py", 34 expectedPath: "collections/__init__.py", 35 expectedVersion: "3.10", 36 expectedOk: true, 37 }, 38 { 39 name: "Python 2.7", 40 path: "/usr/lib/python2.7/os.py", 41 expectedPath: "os.py", 42 expectedVersion: "2.7", 43 expectedOk: true, 44 }, 45 { 46 name: "Two-digit minor version", 47 path: "/lib/python3.99/test.py", 48 expectedPath: "test.py", 49 expectedVersion: "3.99", 50 expectedOk: true, 51 }, 52 { 53 name: "Not stdlib - user project", 54 path: "/app/myproject/main.py", 55 expectedPath: "", 56 expectedVersion: "", 57 expectedOk: false, 58 }, 59 { 60 name: "Not stdlib - no python prefix", 61 path: "/usr/lib/site-packages/requests/api.py", 62 expectedPath: "", 63 expectedVersion: "", 64 expectedOk: false, 65 }, 66 { 67 name: "Empty path", 68 path: "", 69 expectedPath: "", 70 expectedVersion: "", 71 expectedOk: false, 72 }, 73 { 74 name: "Ends at python version - no trailing slash", 75 path: "/lib/python3.12", 76 expectedPath: "", 77 expectedVersion: "", 78 expectedOk: false, 79 }, 80 { 81 name: "Ends at python version - with trailing slash only", 82 path: "/lib/python3.12/", 83 expectedPath: "", 84 expectedVersion: "", 85 expectedOk: false, 86 }, 87 { 88 name: "Nested stdlib path", 89 path: "/opt/python/lib/python3.9/email/mime/text.py", 90 expectedPath: "email/mime/text.py", 91 expectedVersion: "3.9", 92 expectedOk: true, 93 }, 94 { 95 name: "Windows-style path with forward slashes", 96 path: "C:/Python312/Lib/python3.12/asyncio/base_events.py", 97 expectedPath: "asyncio/base_events.py", 98 expectedVersion: "3.12", 99 expectedOk: true, 100 }, 101 { 102 name: "Multiple versions in path", 103 path: "/opt/python3.8/lib/python3.9/email/mime/text.py", 104 expectedPath: "email/mime/text.py", 105 // Should take last match 106 expectedVersion: "3.9", 107 expectedOk: true, 108 }, 109 } 110 111 for _, tt := range tests { 112 t.Run(tt.name, func(t *testing.T) { 113 path, version, ok := isPythonStdlibPath(tt.path) 114 assert.Equal(t, tt.expectedPath, path) 115 assert.Equal(t, tt.expectedVersion, version) 116 assert.Equal(t, tt.expectedOk, ok) 117 }) 118 } 119 }