github.com/hernad/nomad@v1.6.112/command/agent/pprof/pprof_test.go (about) 1 // Copyright (c) HashiCorp, Inc. 2 // SPDX-License-Identifier: MPL-2.0 3 4 package pprof 5 6 import ( 7 "context" 8 "testing" 9 10 "github.com/hernad/nomad/ci" 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestProfile(t *testing.T) { 15 ci.Parallel(t) 16 17 cases := []struct { 18 desc string 19 profile string 20 debug int 21 gc int 22 expectedHeaders map[string]string 23 expectedErr error 24 }{ 25 { 26 desc: "profile that exists", 27 profile: "goroutine", 28 expectedHeaders: map[string]string{ 29 "X-Content-Type-Options": "nosniff", 30 "Content-Type": "application/octet-stream", 31 "Content-Disposition": `attachment; filename="goroutine"`, 32 }, 33 }, 34 { 35 desc: "profile that does not exist", 36 profile: "nonexistent", 37 expectedErr: NewErrProfileNotFound("nonexistent"), 38 expectedHeaders: nil, 39 }, 40 { 41 desc: "profile with debug enabled", 42 profile: "allocs", 43 debug: 1, 44 expectedHeaders: map[string]string{ 45 "X-Content-Type-Options": "nosniff", 46 "Content-Type": "text/plain; charset=utf-8", 47 }, 48 }, 49 } 50 51 for _, tc := range cases { 52 t.Run(tc.desc, func(t *testing.T) { 53 resp, headers, err := Profile(tc.profile, tc.debug, tc.gc) 54 require.Equal(t, tc.expectedHeaders, headers) 55 56 if tc.expectedErr != nil { 57 require.Nil(t, resp) 58 require.Equal(t, err, tc.expectedErr) 59 } else { 60 require.NotNil(t, resp) 61 } 62 }) 63 } 64 } 65 66 func TestCPUProfile(t *testing.T) { 67 ci.Parallel(t) 68 69 cases := []struct { 70 desc string 71 expectedHeaders map[string]string 72 }{ 73 { 74 desc: "successful cpu profile", 75 expectedHeaders: map[string]string{ 76 "X-Content-Type-Options": "nosniff", 77 "Content-Type": "application/octet-stream", 78 "Content-Disposition": `attachment; filename="profile"`, 79 }, 80 }, 81 } 82 83 for _, tc := range cases { 84 t.Run(tc.desc, func(t *testing.T) { 85 resp, headers, err := CPUProfile(context.Background(), 0) 86 require.NoError(t, err) 87 require.Equal(t, tc.expectedHeaders, headers) 88 89 require.NotNil(t, resp) 90 }) 91 } 92 } 93 94 func TestTrace(t *testing.T) { 95 ci.Parallel(t) 96 97 cases := []struct { 98 desc string 99 expectedHeaders map[string]string 100 }{ 101 { 102 desc: "successful trace profile", 103 expectedHeaders: map[string]string{ 104 "X-Content-Type-Options": "nosniff", 105 "Content-Type": "application/octet-stream", 106 "Content-Disposition": `attachment; filename="trace"`, 107 }, 108 }, 109 } 110 111 for _, tc := range cases { 112 t.Run(tc.desc, func(t *testing.T) { 113 resp, headers, err := Trace(context.Background(), 0) 114 require.NoError(t, err) 115 require.Equal(t, tc.expectedHeaders, headers) 116 117 require.NotNil(t, resp) 118 }) 119 } 120 } 121 122 func TestCmdline(t *testing.T) { 123 ci.Parallel(t) 124 125 cases := []struct { 126 desc string 127 expectedHeaders map[string]string 128 }{ 129 { 130 desc: "successful cmdline request", 131 expectedHeaders: map[string]string{ 132 "X-Content-Type-Options": "nosniff", 133 "Content-Type": "text/plain; charset=utf-8", 134 }, 135 }, 136 } 137 138 for _, tc := range cases { 139 t.Run(tc.desc, func(t *testing.T) { 140 resp, headers, err := Cmdline() 141 require.NoError(t, err) 142 require.Equal(t, tc.expectedHeaders, headers) 143 144 require.NotNil(t, resp) 145 }) 146 } 147 }