1package integration_test
2
3import (
4	. "github.com/onsi/ginkgo"
5	. "github.com/onsi/gomega"
6
7	. "github.com/cloudfoundry/bosh-cli/cmd"
8	boshrel "github.com/cloudfoundry/bosh-cli/release"
9	boshui "github.com/cloudfoundry/bosh-cli/ui"
10	fakeui "github.com/cloudfoundry/bosh-cli/ui/fakes"
11	boshlog "github.com/cloudfoundry/bosh-utils/logger"
12	boshsys "github.com/cloudfoundry/bosh-utils/system"
13	"path/filepath"
14	"regexp"
15	"strings"
16)
17
18var _ = Describe("sha2ify-release", func() {
19
20	var (
21		ui                  *fakeui.FakeUI
22		fs                  boshsys.FileSystem
23		deps                BasicDeps
24		cmdFactory          Factory
25		releaseProvider     boshrel.Provider
26		createSimpleRelease func() string
27		removeSHA1s         func(string) string
28	)
29
30	BeforeEach(func() {
31		ui = &fakeui.FakeUI{}
32		logger := boshlog.NewLogger(boshlog.LevelNone)
33		confUI := boshui.NewWrappingConfUI(ui, logger)
34
35		fs = boshsys.NewOsFileSystem(logger)
36		deps = NewBasicDepsWithFS(confUI, fs, logger)
37		cmdFactory = NewFactory(deps)
38
39		releaseProvider = boshrel.NewProvider(
40			deps.CmdRunner, deps.Compressor, deps.DigestCalculator, deps.FS, deps.Logger)
41
42	})
43
44	execCmd := func(args []string) {
45		cmd, err := cmdFactory.New(args)
46		Expect(err).ToNot(HaveOccurred())
47
48		err = cmd.Execute()
49
50		Expect(err).ToNot(HaveOccurred())
51
52	}
53
54	It("converts the SHA1s into SHA2s for packages and jobs", func() {
55		sha2ifyReleasePath := createSimpleRelease()
56		defer fs.RemoveAll(filepath.Dir(sha2ifyReleasePath))
57
58		dirtyPath, err := fs.TempDir("sha2release")
59		Expect(err).ToNot(HaveOccurred())
60
61		outFile := filepath.Join(dirtyPath, "small-sha256-release.tgz")
62
63		execCmd([]string{"sha2ify-release", sha2ifyReleasePath, outFile})
64
65		extractor := releaseProvider.NewExtractingArchiveReader()
66
67		release, err := extractor.Read(outFile)
68		Expect(err).ToNot(HaveOccurred())
69
70		By("keeping all the jobs and packages")
71		Expect(release.Jobs()).To(HaveLen(1))
72		Expect(release.Packages()).To(HaveLen(1))
73		Expect(release.License()).ToNot(BeNil())
74
75		By("converting the SHAs to 256")
76		jobArchiveSha := release.Jobs()[0].ArchiveDigest()
77		Expect(removeSHA1s(jobArchiveSha)).To(Equal("sha256:replaced"))
78
79		packageArchiveSha := release.Packages()[0].ArchiveDigest()
80		Expect(removeSHA1s(packageArchiveSha)).To(Equal("sha256:replaced"))
81
82		licenseArchiveSha := release.License().ArchiveDigest()
83		Expect(removeSHA1s(licenseArchiveSha)).To(Equal("sha256:replaced"))
84
85		By("preserving the version string exactly")
86		Expect(release.Version()).To(Equal("0+dev.1"))
87	})
88
89	It("converts the SHA1s into SHA2s for packages and jobs", func() {
90		dirtyPath, err := fs.TempDir("sha2release")
91		Expect(err).ToNot(HaveOccurred())
92
93		outFile := filepath.Join(dirtyPath, "small-sha256-release.tgz")
94
95		execCmd([]string{"sha2ify-release", "assets/small-sha128-compiled-release.tgz", outFile})
96
97		extractor := releaseProvider.NewExtractingArchiveReader()
98
99		release, err := extractor.Read(outFile)
100		Expect(err).ToNot(HaveOccurred())
101
102		By("keeping all the jobs and packages")
103		Expect(release.Jobs()).To(HaveLen(1))
104		Expect(release.CompiledPackages()).To(HaveLen(1))
105
106		By("converting the SHAs to 256")
107		jobArchiveSha := release.Jobs()[0].ArchiveDigest()
108		Expect(removeSHA1s(jobArchiveSha)).To(Equal("sha256:replaced"))
109		compiledPackageSha := release.CompiledPackages()[0].ArchiveDigest()
110		Expect(removeSHA1s(compiledPackageSha)).To(Equal("sha256:replaced"))
111
112		By("preserving the version string exactly")
113		Expect(release.Version()).To(Equal("0+dev.3"))
114	})
115
116	removeSHA1s = func(contents string) string {
117		matchSHA1s := regexp.MustCompile("sha256:[a-z0-9]{64}")
118		return matchSHA1s.ReplaceAllString(contents, "sha256:replaced")
119	}
120
121	createSimpleRelease = func() string {
122		tmpDir, err := fs.TempDir("bosh-create-release-int-test")
123		Expect(err).ToNot(HaveOccurred())
124
125		relName := filepath.Base(tmpDir)
126
127		{
128			execCmd([]string{"init-release", "--dir", tmpDir})
129			Expect(fs.FileExists(filepath.Join(tmpDir, "config"))).To(BeTrue())
130			Expect(fs.FileExists(filepath.Join(tmpDir, "jobs"))).To(BeTrue())
131			Expect(fs.FileExists(filepath.Join(tmpDir, "packages"))).To(BeTrue())
132			Expect(fs.FileExists(filepath.Join(tmpDir, "src"))).To(BeTrue())
133		}
134
135		execCmd([]string{"generate-job", "job1", "--dir", tmpDir})
136		execCmd([]string{"generate-package", "pkg1", "--dir", tmpDir})
137
138		err = fs.WriteFileString(filepath.Join(tmpDir, "LICENSE"), "LICENSE")
139		Expect(err).ToNot(HaveOccurred())
140
141		{
142			pkg1SpecPath := filepath.Join(tmpDir, "packages", "pkg1", "spec")
143
144			contents, err := fs.ReadFileString(pkg1SpecPath)
145			Expect(err).ToNot(HaveOccurred())
146
147			err = fs.WriteFileString(pkg1SpecPath, strings.Replace(contents, "dependencies: []", "dependencies: []", -1))
148			Expect(err).ToNot(HaveOccurred())
149		}
150
151		{
152			jobSpecPath := filepath.Join(tmpDir, "jobs", "job1", "spec")
153
154			contents, err := fs.ReadFileString(jobSpecPath)
155			Expect(err).ToNot(HaveOccurred())
156
157			err = fs.WriteFileString(jobSpecPath, strings.Replace(contents, "packages: []", "packages: [pkg1]", -1))
158			Expect(err).ToNot(HaveOccurred())
159		}
160
161		sha2ifyReleasePath := filepath.Join(tmpDir, "sha2ify-release.tgz")
162
163		{ // Make empty release
164			execCmd([]string{"create-release", "--dir", tmpDir, "--tarball", sha2ifyReleasePath})
165
166			_, err := fs.ReadFileString(filepath.Join(tmpDir, "dev_releases", relName, relName+"-0+dev.1.yml"))
167			Expect(err).ToNot(HaveOccurred())
168		}
169
170		return sha2ifyReleasePath
171	}
172})
173