github.com/goreleaser/nfpm/v2@v2.44.0/ipk/tar_test.go (about)

     1  package ipk
     2  
     3  import (
     4  	"archive/tar"
     5  	"bytes"
     6  	"compress/gzip"
     7  	"errors"
     8  	"io"
     9  	"path"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func Test_newTGZ(t *testing.T) {
    18  	unknownErr := errors.New("unknown error")
    19  
    20  	tests := []struct {
    21  		description string
    22  		name        string
    23  		populate    func(*tar.Writer) error
    24  		file        string
    25  		expectedErr error
    26  	}{
    27  		{
    28  			description: "simple",
    29  			name:        "simple.tar",
    30  			populate: func(tw *tar.Writer) error {
    31  				return writeToFile(tw, "simple.txt", []byte("hello, world"), time.Now())
    32  			},
    33  			file: "./simple.txt",
    34  		},
    35  	}
    36  	for _, tc := range tests {
    37  		t.Run(tc.description, func(t *testing.T) {
    38  			assert := assert.New(t)
    39  			require := require.New(t)
    40  
    41  			got, err := newTGZ(tc.name, tc.populate)
    42  
    43  			if tc.expectedErr == nil {
    44  				require.NoError(err)
    45  				require.NotNil(got)
    46  
    47  				gz, err := gzip.NewReader(bytes.NewReader(got))
    48  				require.NoError(err)
    49  				require.NotNil(gz)
    50  				defer gz.Close() // nolint: errcheck
    51  
    52  				assert.True(tarContains(t, gz, tc.file))
    53  				return
    54  			}
    55  
    56  			require.Error(err)
    57  			if !errors.Is(tc.expectedErr, unknownErr) {
    58  				assert.ErrorIs(err, tc.expectedErr)
    59  			}
    60  		})
    61  	}
    62  }
    63  
    64  func extractFileFromTar(tb testing.TB, tarFile []byte, filename string) []byte {
    65  	tb.Helper()
    66  
    67  	tr := tar.NewReader(bytes.NewReader(tarFile))
    68  	for {
    69  		hdr, err := tr.Next()
    70  		if errors.Is(err, io.EOF) {
    71  			break // End of archive
    72  		}
    73  		require.NoError(tb, err)
    74  
    75  		if path.Join("/", hdr.Name) != path.Join("/", filename) {
    76  			continue
    77  		}
    78  
    79  		fileContents, err := io.ReadAll(tr)
    80  		require.NoError(tb, err)
    81  
    82  		return fileContents
    83  	}
    84  
    85  	tb.Fatalf("file %q does not exist in tar", filename)
    86  
    87  	return nil
    88  }
    89  
    90  func tarContains(tb testing.TB, r io.Reader, filename string) bool {
    91  	tb.Helper()
    92  
    93  	tr := tar.NewReader(r)
    94  	for {
    95  		hdr, err := tr.Next()
    96  		if errors.Is(err, io.EOF) {
    97  			break // End of archive
    98  		}
    99  		require.NoError(tb, err)
   100  
   101  		if path.Join("/", hdr.Name) == path.Join("/", filename) { // nolint:gosec
   102  			return true
   103  		}
   104  	}
   105  
   106  	return false
   107  }
   108  
   109  func tarContents(tb testing.TB, tarFile []byte) []string {
   110  	tb.Helper()
   111  
   112  	contents := []string{}
   113  
   114  	tr := tar.NewReader(bytes.NewReader(tarFile))
   115  	for {
   116  		hdr, err := tr.Next()
   117  		if errors.Is(err, io.EOF) {
   118  			break // End of archive
   119  		}
   120  		require.NoError(tb, err)
   121  
   122  		contents = append(contents, hdr.Name)
   123  	}
   124  
   125  	return contents
   126  }
   127  
   128  func getTree(tb testing.TB, tarFile []byte) []string {
   129  	tb.Helper()
   130  
   131  	var result []string
   132  	tr := tar.NewReader(bytes.NewReader(tarFile))
   133  	for {
   134  		hdr, err := tr.Next()
   135  		if errors.Is(err, io.EOF) {
   136  			break // End of archive
   137  		}
   138  		require.NoError(tb, err)
   139  
   140  		result = append(result, hdr.Name)
   141  	}
   142  
   143  	return result
   144  }
   145  
   146  func extractFileHeaderFromTar(tb testing.TB, tarFile []byte, filename string) *tar.Header {
   147  	tb.Helper()
   148  
   149  	tr := tar.NewReader(bytes.NewReader(tarFile))
   150  	for {
   151  		hdr, err := tr.Next()
   152  		if errors.Is(err, io.EOF) {
   153  			break // End of archive
   154  		}
   155  		require.NoError(tb, err)
   156  
   157  		if path.Join("/", hdr.Name) != path.Join("/", filename) { // nolint:gosec
   158  			continue
   159  		}
   160  
   161  		return hdr
   162  	}
   163  
   164  	tb.Fatalf("file %q does not exist in tar", filename)
   165  
   166  	return nil
   167  }