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