Example #1
0
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
}
Example #2
0
/*
  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
}
Example #3
0
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)
		}
	}

}
Example #4
0
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)
		}
	}

}
Example #5
0
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
}