github.com/pkalwak/bagins@v0.0.0-20210317172317-694ac5ce2f54/payload_test.go (about)

     1  package bagins_test
     2  
     3  import (
     4  	"crypto/md5"
     5  	"github.com/pkalwak/bagins"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"strings"
    10  	"testing"
    11  )
    12  
    13  func TestNewPayload(t *testing.T) {
    14  
    15  	tmpPyld := filepath.Join(os.TempDir(), "_GOTEST_NewPayload_")
    16  
    17  	// Check for failure on non-existant directory.
    18  	_, err := bagins.NewPayload(tmpPyld)
    19  	if err == nil {
    20  		t.Errorf("Unexpected error return checking for non-existed directory: %s", err)
    21  	}
    22  
    23  	// Check for positive return when directory exists.
    24  	pth, err := ioutil.TempDir("", "_GOTEST_NewPayload_")
    25  	if err != nil {
    26  		t.Errorf("Unexpcted error creating temporary directory: %s", err)
    27  	}
    28  	tstDir, err := os.Stat(pth)
    29  	if err != nil {
    30  		t.Errorf("Reading %s returned an error: %s", pth, err)
    31  	}
    32  	if !tstDir.IsDir() {
    33  		t.Errorf("Payload dir %s is not a valid directory", pth)
    34  	}
    35  
    36  	// Clean it up.
    37  	os.RemoveAll(pth)
    38  }
    39  
    40  func TestPayloadName(t *testing.T) {
    41  	pDir, _ := ioutil.TempDir("", "_GOTEST_PayloadName_")
    42  	defer os.Remove(pDir)
    43  
    44  	p, _ := bagins.NewPayload(pDir)
    45  
    46  	if pDir != p.Name() {
    47  		t.Errorf("Payload name %s did not equal expected %s", p.Name(), pDir)
    48  	}
    49  }
    50  
    51  func TestPayloadAdd(t *testing.T) {
    52  	pDir, _ := ioutil.TempDir("", "_GOTEST_PayloadAdd_")
    53  	m, _ := bagins.NewManifest(os.TempDir(), "md5", bagins.PayloadManifest)
    54  	defer os.RemoveAll(pDir)
    55  
    56  	p, err := bagins.NewPayload(pDir)
    57  	if err != nil {
    58  		t.Error(err)
    59  	}
    60  
    61  	testFile, _ := ioutil.TempFile("", "_GO_PayloadAdd_TESTFILE_")
    62  	testFile.WriteString("Test the checksum")
    63  	testFile.Close()
    64  	defer os.Remove(testFile.Name())
    65  
    66  	chkSum, err := p.Add(testFile.Name(), filepath.Base(testFile.Name()), []*bagins.Manifest{m})
    67  	if err != nil {
    68  		t.Error(err)
    69  	}
    70  	exp := "92d7a9f0f4a30ca782dcae5fe83ca7eb"
    71  	if exp != chkSum["md5"] {
    72  		t.Error("Checksum", chkSum["md5"], "did not match", exp)
    73  	}
    74  }
    75  
    76  // Make sure that when we add a file to the payload
    77  // that is already in the payload directory, it doesn't
    78  // get clobbered.
    79  func TestPayloadAddInPlace(t *testing.T) {
    80  	pDir, _ := ioutil.TempDir("", "_GOTEST_PayloadAdd_")
    81  	m, _ := bagins.NewManifest(os.TempDir(), "md5", bagins.PayloadManifest)
    82  	defer os.RemoveAll(pDir)
    83  
    84  	p, err := bagins.NewPayload(pDir)
    85  	if err != nil {
    86  		t.Error(err)
    87  	}
    88  
    89  	//testFile, _ := ioutil.TempFile("", "_GO_PayloadAdd_TESTFILE_")
    90  	testFile, err := os.Create(filepath.Join(pDir, "_GO_PayloadAdd_TESTFILE_"))
    91  	if err != nil {
    92  		t.Error(err)
    93  	}
    94  	testFile.WriteString("Test the checksum")
    95  	testFile.Close()
    96  	defer os.Remove(testFile.Name())
    97  
    98  	chkSum, err := p.Add(testFile.Name(), filepath.Base(testFile.Name()), []*bagins.Manifest{m})
    99  	if err != nil {
   100  		t.Error(err)
   101  	}
   102  	exp := "92d7a9f0f4a30ca782dcae5fe83ca7eb"
   103  	if exp != chkSum["md5"] {
   104  		t.Error("Checksum", chkSum["md5"], "did not match", exp)
   105  	}
   106  }
   107  
   108  func TestPayloadAddAll(t *testing.T) {
   109  	// Setup directories to test on
   110  	srcDir, _ := ioutil.TempDir("", "_GOTEST_PayloadAddAll_SRCDIR_")
   111  	defer os.RemoveAll(srcDir)
   112  	pDir, _ := ioutil.TempDir("", "_GOTEST_PayloadAddAll_")
   113  	defer os.RemoveAll(pDir)
   114  
   115  	m, _ := bagins.NewManifest(os.TempDir(), "md5", bagins.PayloadManifest)
   116  
   117  	// Setup test files
   118  	for i := 0; i < 100; i++ {
   119  		tstFile, _ := ioutil.TempFile(srcDir, "_GOTEST_PayloadAddAll_FILE_")
   120  		tstFile.WriteString("Test the checksum")
   121  		tstFile.Close()
   122  	}
   123  
   124  	p, _ := bagins.NewPayload(pDir)
   125  	checksums, errs := p.AddAll(srcDir, []*bagins.Manifest{m})
   126  
   127  	// It should not return an error.
   128  	if errs != nil {
   129  		t.Errorf("Add all returned %d errors", len(errs))
   130  	}
   131  	// It should have fixity values for 100 files
   132  	if len(checksums) != 100 {
   133  		t.Errorf("Expected 100 fixity values but returned %d", len(checksums))
   134  	}
   135  
   136  	for key := range checksums {
   137  		fileChk, err := bagins.FileChecksum(filepath.Join(p.Name(), key), md5.New())
   138  		if err != nil {
   139  			t.Errorf(" %s", err)
   140  		}
   141  		if checksums[key]["md5"] != fileChk {
   142  			t.Error("Expected", checksums[key]["md5"], "but returned", fileChk)
   143  		}
   144  	}
   145  
   146  }
   147  
   148  func TestPayloadOctetStreamSum(t *testing.T) {
   149  	// Setup Test directory
   150  	pDir, _ := ioutil.TempDir("", "_GOTEST_PayloadOctetStreamSum_")
   151  	defer os.RemoveAll(pDir)
   152  
   153  	// Setup test files
   154  	for i := 0; i < 100; i++ {
   155  		tstFile, _ := ioutil.TempFile(pDir, "_GOTEST_PayloadOctetStreamSum_FILE_")
   156  		tstFile.WriteString("Test the checksum")
   157  		tstFile.Close()
   158  	}
   159  
   160  	p, _ := bagins.NewPayload(pDir)
   161  	sum, count := p.OctetStreamSum()
   162  
   163  	if sum != 1700 {
   164  		t.Error("Sum of octets expected to be 1700 but returned", sum)
   165  	}
   166  	if count != 100 {
   167  		t.Error("Count of files expected to be 100 but returned", count)
   168  	}
   169  }
   170  
   171  func BenchmarkPayload(b *testing.B) {
   172  	srcDir, _ := ioutil.TempDir("", "_GOTEST_BenchmarkPayload_SRCDIR_")
   173  	defer os.RemoveAll(srcDir)
   174  	pDir, _ := ioutil.TempDir("", "_GOTEST_BenchmarkPayload_Payload_")
   175  	defer os.RemoveAll(pDir)
   176  
   177  	m, _ := bagins.NewManifest(os.TempDir(), "md5", bagins.PayloadManifest)
   178  
   179  	// Make src temp test files
   180  	for i := 0; i < 300; i++ {
   181  		tstFile, _ := ioutil.TempFile(srcDir, "_GOTEST_BenchmarkPayload_FILE_")
   182  		tstFile.WriteString(strings.Repeat("Test the checksum. ", 500000)) // produces ~9 meg text file.
   183  		tstFile.Close()
   184  	}
   185  
   186  	b.ResetTimer()
   187  
   188  	p, _ := bagins.NewPayload(pDir)
   189  
   190  	checksums, err := p.AddAll(srcDir, []*bagins.Manifest{m})
   191  	if err != nil {
   192  		b.Error(err)
   193  	}
   194  
   195  	b.StopTimer()
   196  
   197  	// Make sure the actual values check out.
   198  	for key := range checksums {
   199  		fileChk, err := bagins.FileChecksum(filepath.Join(p.Name(), key), md5.New())
   200  		if err != nil {
   201  			b.Errorf(" %s", err)
   202  		}
   203  		if checksums[key]["md5"] != fileChk {
   204  			b.Error("Expected", checksums[key]["md5"], "but returned", fileChk)
   205  		}
   206  	}
   207  
   208  }
   209  
   210  // Results running all on a single thread with Payload.Add happening inside
   211  // the Walkfunc.
   212  // go test -bench . -benchmem -benchtime 10m
   213  // BEFORE refactor, running as a single function.
   214  // BenchmarkPayload	5000000000	         7.13 ns/op	       0 B/op	       0 allocs/op
   215  // BenchmarkPayload	10000000000	         3.43 ns/op	       0 B/op	       0 allocs/op
   216  
   217  // AFTER refactor to go routines
   218  // BenchmarkPayload	2000000000	         0.01 ns/op	       0 B/op	       0 allocs/op