func (b *Bag) calculateChecksumsForManagedTagFiles() (errs []error) { tagManifests := b.GetManifests(TagManifest) for _, tf := range b.tagfiles { if err := os.MkdirAll(filepath.Dir(tf.Name()), 0766); err != nil { errs = append(errs, err) } if err := tf.Create(); err != nil { errs = append(errs, err) } // Add tag file checksums to tag manifests for i := range tagManifests { manifest := tagManifests[i] checksum, err := bagutil.FileChecksum(tf.Name(), manifest.hashFunc()) if err != nil { errors := []error{ fmt.Errorf("Error calculating %s checksum for file %s: %v", manifest.Algorithm(), tf.Name(), err), } return errors } relativeFilePath := strings.Replace(tf.Name(), b.pathToFile+"/", "", 1) manifest.Data[relativeFilePath] = checksum } } return errs }
/* Calculates a checksum for files listed in the manifest and compares it to the value stored in manifest file. Returns an error for each file that fails the fixity check. */ func (m *Manifest) RunChecksums() []error { var invalidSums []error for key, sum := range m.Data { pathToFile := filepath.Join(filepath.Dir(m.name), key) fileChecksum, err := bagutil.FileChecksum(pathToFile, m.hashFunc()) if sum != fileChecksum { invalidSums = append(invalidSums, fmt.Errorf("File checksum %s is not valid for %s:%s", sum, key, fileChecksum)) } if err != nil { invalidSums = append(invalidSums, err) } } return invalidSums }
func TestPayloadAddAll(t *testing.T) { // Setup directories to test on srcDir, _ := ioutil.TempDir("", "_GOTEST_PayloadAddAll_SRCDIR_") defer os.RemoveAll(srcDir) pDir, _ := ioutil.TempDir("", "_GOTEST_PayloadAddAll_") defer os.RemoveAll(pDir) m, _ := bagins.NewManifest(os.TempDir(), "md5", bagins.PayloadManifest) // Setup test files for i := 0; i < 100; i++ { tstFile, _ := ioutil.TempFile(srcDir, "_GOTEST_PayloadAddAll_FILE_") tstFile.WriteString("Test the checksum") tstFile.Close() } p, _ := bagins.NewPayload(pDir) checksums, errs := p.AddAll(srcDir, []*bagins.Manifest{m}) // It should not return an error. if errs != nil { t.Errorf("Add all returned %d errors", len(errs)) } // It should have fixity values for 100 files if len(checksums) != 100 { t.Errorf("Expected 100 fixity values but returned %d", len(checksums)) } for key := range checksums { fileChk, err := bagutil.FileChecksum(filepath.Join(p.Name(), key), md5.New()) if err != nil { t.Errorf(" %s", err) } if checksums[key]["md5"] != fileChk { t.Error("Expected", checksums[key]["md5"], "but returned", fileChk) } } }
func BenchmarkPayload(b *testing.B) { srcDir, _ := ioutil.TempDir("", "_GOTEST_BenchmarkPayload_SRCDIR_") defer os.RemoveAll(srcDir) pDir, _ := ioutil.TempDir("", "_GOTEST_BenchmarkPayload_Payload_") defer os.RemoveAll(pDir) m, _ := bagins.NewManifest(os.TempDir(), "md5", bagins.PayloadManifest) // Make src temp test files for i := 0; i < 300; i++ { tstFile, _ := ioutil.TempFile(srcDir, "_GOTEST_BenchmarkPayload_FILE_") tstFile.WriteString(strings.Repeat("Test the checksum. ", 500000)) // produces ~9 meg text file. tstFile.Close() } b.ResetTimer() p, _ := bagins.NewPayload(pDir) checksums, err := p.AddAll(srcDir, []*bagins.Manifest{m}) if err != nil { b.Error(err) } b.StopTimer() // Make sure the actual values check out. for key := range checksums { fileChk, err := bagutil.FileChecksum(filepath.Join(p.Name(), key), md5.New()) if err != nil { b.Errorf(" %s", err) } if checksums[key]["md5"] != fileChk { b.Error("Expected", checksums[key]["md5"], "but returned", fileChk) } } }
func (b *Bag) calculateChecksumsForCustomTagFiles() (errs []error) { // Calculate checksums that go into the tag manifests. nonPayloadFiles, err := b.UnparsedTagFiles() if err != nil { errs = append(errs, err) } payloadManifests := b.GetManifests(PayloadManifest) tagManifests := b.GetManifests(TagManifest) for _, m := range payloadManifests { nonPayloadFiles = append(nonPayloadFiles, m.Name()) } for _, file := range nonPayloadFiles { relativeFilePath := strings.Replace(file, b.pathToFile+"/", "", 1) if _, exclude := b.excludeFromTagManifests[relativeFilePath]; exclude { continue } // Use relative path in manifest, abs path when calculating checksum. absPathToFile := file if !strings.HasPrefix(file, b.pathToFile) { absPathToFile = filepath.Join(b.pathToFile, file) } for i := range tagManifests { manifest := tagManifests[i] checksum, err := bagutil.FileChecksum(absPathToFile, manifest.hashFunc()) if err != nil { errors := []error{ fmt.Errorf("Error calculating %s checksum for file %s: %v", manifest.Algorithm(), file, err), } return errors } manifest.Data[relativeFilePath] = checksum } } return errs }