github.com/devseccon/trivy@v0.47.1-0.20231123133102-bd902a0bd996/pkg/fanal/image/daemon/podman_test.go (about)

     1  package daemon
     2  
     3  import (
     4  	"net/http/httptest"
     5  	"os"
     6  	"path/filepath"
     7  	"runtime"
     8  	"testing"
     9  
    10  	"github.com/docker/docker/api/types"
    11  	"github.com/google/go-containerregistry/pkg/name"
    12  	v1 "github.com/google/go-containerregistry/pkg/v1"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  
    16  	"github.com/aquasecurity/testdocker/engine"
    17  )
    18  
    19  func setupPodmanSock(t *testing.T) *httptest.Server {
    20  	t.Helper()
    21  
    22  	runtimeDir, err := os.MkdirTemp("", "daemon")
    23  	require.NoError(t, err)
    24  
    25  	os.Setenv("XDG_RUNTIME_DIR", runtimeDir)
    26  
    27  	dir := filepath.Join(runtimeDir, "podman")
    28  	err = os.MkdirAll(dir, os.ModePerm)
    29  	require.NoError(t, err)
    30  
    31  	sockPath := filepath.Join(dir, "podman.sock")
    32  
    33  	opt := engine.Option{
    34  		APIVersion: "1.40",
    35  		ImagePaths: map[string]string{
    36  			"index.docker.io/library/alpine:3.11": "../../test/testdata/alpine-311.tar.gz",
    37  		},
    38  		UnixDomainSocket: sockPath,
    39  	}
    40  	te := engine.NewDockerEngine(opt)
    41  	return te
    42  }
    43  
    44  func TestPodmanImage(t *testing.T) {
    45  	if runtime.GOOS == "windows" {
    46  		t.Skip("podman.sock is not available for Windows CI")
    47  	}
    48  
    49  	type fields struct {
    50  		Image   v1.Image
    51  		opener  opener
    52  		inspect types.ImageInspect
    53  	}
    54  	tests := []struct {
    55  		name           string
    56  		imageName      string
    57  		fields         fields
    58  		wantConfigName string
    59  		wantCreateBy   []string
    60  		wantErr        bool
    61  	}{
    62  		{
    63  			name:           "happy path",
    64  			imageName:      "alpine:3.11",
    65  			wantConfigName: "sha256:a187dde48cd289ac374ad8539930628314bc581a481cdb41409c9289419ddb72",
    66  			wantCreateBy: []string{
    67  				"/bin/sh -c #(nop)  CMD [\"/bin/sh\"]",
    68  				"/bin/sh -c #(nop) ADD file:0c4555f363c2672e350001f1293e689875a3760afe7b3f9146886afe67121cba in / ",
    69  			},
    70  			wantErr: false,
    71  		},
    72  		{
    73  			name:      "unknown image",
    74  			imageName: "alpine:unknown",
    75  			wantErr:   true,
    76  		},
    77  	}
    78  
    79  	te := setupPodmanSock(t)
    80  	defer te.Close()
    81  
    82  	for _, tt := range tests {
    83  		t.Run(tt.name, func(t *testing.T) {
    84  			ref, err := name.ParseReference(tt.imageName)
    85  			require.NoError(t, err)
    86  
    87  			img, cleanup, err := PodmanImage(ref.Name())
    88  			defer cleanup()
    89  
    90  			if tt.wantErr {
    91  				assert.NotNil(t, err)
    92  				return
    93  			}
    94  			assert.NoError(t, err)
    95  
    96  			confName, err := img.ConfigName()
    97  			require.NoError(t, err)
    98  			assert.Equal(t, tt.wantConfigName, confName.String())
    99  
   100  			confFile, err := img.ConfigFile()
   101  			require.NoError(t, err)
   102  
   103  			assert.Equal(t, len(confFile.History), len(tt.wantCreateBy))
   104  			for _, h := range confFile.History {
   105  				assert.Contains(t, tt.wantCreateBy, h.CreatedBy)
   106  			}
   107  		})
   108  	}
   109  }