github.com/u-root/u-root@v7.0.1-0.20200915234505-ad7babab0a8e+incompatible/pkg/uroot/initramfs/test/ramfs.go (about)

     1  // Copyright 2018 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 test
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  
    11  	"github.com/u-root/u-root/pkg/cpio"
    12  	"github.com/u-root/u-root/pkg/uio"
    13  )
    14  
    15  type ArchiveValidator interface {
    16  	Validate(a *cpio.Archive) error
    17  }
    18  
    19  type HasRecord struct {
    20  	R cpio.Record
    21  }
    22  
    23  func (hr HasRecord) Validate(a *cpio.Archive) error {
    24  	r, ok := a.Get(hr.R.Name)
    25  	if !ok {
    26  		return fmt.Errorf("archive does not contain %v", hr.R)
    27  	}
    28  	if !cpio.Equal(r, hr.R) {
    29  		return fmt.Errorf("archive does not contain %v; instead has %v", hr.R, r)
    30  	}
    31  	return nil
    32  }
    33  
    34  type HasFile struct {
    35  	Path string
    36  }
    37  
    38  func (hf HasFile) Validate(a *cpio.Archive) error {
    39  	if _, ok := a.Get(hf.Path); ok {
    40  		return nil
    41  	}
    42  	return fmt.Errorf("archive does not contain %s, but should", hf.Path)
    43  }
    44  
    45  type HasContent struct {
    46  	Path    string
    47  	Content string
    48  }
    49  
    50  func (hc HasContent) Validate(a *cpio.Archive) error {
    51  	r, ok := a.Get(hc.Path)
    52  	if !ok {
    53  		return fmt.Errorf("archive does not contain %s, but should", hc.Path)
    54  	}
    55  	if c, err := uio.ReadAll(r); err != nil {
    56  		return fmt.Errorf("reading record %s failed: %v", hc.Path, err)
    57  	} else if string(c) != hc.Content {
    58  		return fmt.Errorf("content of %s is %s, want %s", hc.Path, string(c), hc.Content)
    59  	}
    60  	return nil
    61  }
    62  
    63  type MissingFile struct {
    64  	Path string
    65  }
    66  
    67  func (mf MissingFile) Validate(a *cpio.Archive) error {
    68  	if _, ok := a.Get(mf.Path); ok {
    69  		return fmt.Errorf("archive contains %s, but shouldn't", mf.Path)
    70  	}
    71  	return nil
    72  }
    73  
    74  type IsEmpty struct{}
    75  
    76  func (IsEmpty) Validate(a *cpio.Archive) error {
    77  	if empty := a.Empty(); !empty {
    78  		return fmt.Errorf("expected archive to be empty")
    79  	}
    80  	return nil
    81  }
    82  
    83  func ReadArchive(path string) (*cpio.Archive, error) {
    84  	f, err := os.Open(path)
    85  	if err != nil {
    86  		return nil, err
    87  	}
    88  
    89  	return cpio.ArchiveFromReader(cpio.Newc.Reader(f))
    90  }