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  }