github.com/mvdan/u-root-coreutils@v0.0.0-20230122170626-c2eef2898555/pkg/cpio/archive_test.go (about)

     1  // Copyright 2013-2022 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package cpio
     6  
     7  import (
     8  	"fmt"
     9  	"syscall"
    10  	"testing"
    11  )
    12  
    13  func FuzzWriteReadInMemArchive(f *testing.F) {
    14  	var fileCount uint64 = 4
    15  	var content = []byte("Content")
    16  	var name = "fileName"
    17  	var ino, mode, uid, gid, nlink, mtime, major, minor, rmajor, rminor uint64 = 1, S_IFREG | 2, 3, 4, 5, 6, 7, 8, 9, 10
    18  	f.Add(fileCount, content, name, ino, mode, uid, gid, nlink, mtime, major, minor, rmajor, rminor)
    19  	f.Fuzz(func(t *testing.T, fileCount uint64, content []byte, name string, ino uint64, mode uint64, uid uint64, gid uint64, nlink uint64, mtime uint64, major uint64, minor uint64, rmajor uint64, rminor uint64) {
    20  		if len(name) > 64 || len(content) > 200 || fileCount > 8 {
    21  			return
    22  		}
    23  		recs := []Record{}
    24  		var i uint64
    25  		for i = 0; i < fileCount; i++ {
    26  
    27  			recs = append(recs, StaticRecord(content, Info{
    28  				Ino:      ino | i,
    29  				Mode:     syscall.S_IFREG | mode | i,
    30  				UID:      uid | i,
    31  				GID:      gid | i,
    32  				NLink:    nlink | i,
    33  				MTime:    mtime | i,
    34  				FileSize: uint64(len(content)),
    35  				Major:    major | i,
    36  				Minor:    minor | i,
    37  				Rmajor:   rmajor | i,
    38  				Rminor:   rminor | i,
    39  				Name:     Normalize(name) + fmt.Sprintf("%d", i),
    40  			}))
    41  		}
    42  
    43  		arch := ArchiveFromRecords(recs)
    44  		archReader := arch.Reader()
    45  
    46  		for _, rec := range recs {
    47  			readRec, err := archReader.ReadRecord()
    48  
    49  			if err != nil {
    50  				t.Fatalf("failed to read record from archive")
    51  			}
    52  
    53  			if !Equal(rec, readRec) {
    54  				t.Fatalf("records not equal: %v %v", rec, readRec)
    55  			}
    56  
    57  			if !arch.Contains(rec) {
    58  				t.Fatalf("record not in archive %v %#v", rec, arch)
    59  			}
    60  		}
    61  
    62  	})
    63  }