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  }