Skip to content

Commit 835dce1

Browse files
authored
Zip artifact info (#232)
* Add zipped ipa and xcarchive readers into a new zip package * Use go-utils/v2/log in the zip package * Fix lint issues * Test zip package * Fix lint issues
1 parent 49967a2 commit 835dce1

File tree

13 files changed

+658
-2
lines changed

13 files changed

+658
-2
lines changed

_integration_tests/test_helper.go

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package _integration_tests
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"strings"
7+
"testing"
8+
9+
"github.com/bitrise-io/go-utils/command/git"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
const sampleArtifactsRepoURL = "https://github.com/bitrise-io/sample-artifacts.git"
14+
15+
var reposToDir map[string]map[string]string
16+
17+
func GetSampleArtifactsRepository(t *testing.T) string {
18+
return GetRepository(t, sampleArtifactsRepoURL, "master")
19+
}
20+
21+
func GetRepository(t *testing.T, url, branch string) string {
22+
if repoDir := getRepoDir(url, branch); repoDir != "" {
23+
return repoDir
24+
}
25+
26+
tmpDir := createDirForRepo(t, url, branch)
27+
gitCommand, err := git.New(tmpDir)
28+
require.NoError(t, err)
29+
30+
out, err := gitCommand.Clone(url, "--depth=1", "--branch", branch).RunAndReturnTrimmedCombinedOutput()
31+
require.NoError(t, err, out)
32+
33+
saveRepoDir(tmpDir, url, branch)
34+
35+
return tmpDir
36+
}
37+
38+
func getRepoDir(url, branch string) string {
39+
if reposToDir == nil {
40+
return ""
41+
}
42+
43+
branchToDir, ok := reposToDir[url]
44+
if !ok {
45+
return ""
46+
}
47+
48+
dir, ok := branchToDir[branch]
49+
if !ok {
50+
return ""
51+
}
52+
return dir
53+
}
54+
55+
func saveRepoDir(dir, url, branch string) {
56+
if reposToDir == nil {
57+
reposToDir = map[string]map[string]string{}
58+
}
59+
60+
branchToDir, ok := reposToDir[url]
61+
if !ok {
62+
branchToDir = map[string]string{}
63+
}
64+
65+
branchToDir[branch] = dir
66+
reposToDir[url] = branchToDir
67+
}
68+
69+
func createDirForRepo(t *testing.T, repo, branch string) string {
70+
tmpDir, err := os.MkdirTemp("", "go-xcode")
71+
require.NoError(t, err)
72+
73+
repoRootDir := strings.TrimSuffix(filepath.Base(repo), filepath.Ext(repo))
74+
pth := filepath.Join(tmpDir, repoRootDir, branch)
75+
err = os.MkdirAll(pth, os.ModePerm)
76+
require.NoError(t, err)
77+
78+
return pth
79+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package zip
2+
3+
import (
4+
"path/filepath"
5+
"testing"
6+
7+
"github.com/bitrise-io/go-utils/v2/log"
8+
"github.com/bitrise-io/go-xcode/v2/_integration_tests"
9+
"github.com/bitrise-io/go-xcode/v2/zip"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
func TestIPAReader(t *testing.T) {
14+
sampleArtifactsDir := _integration_tests.GetSampleArtifactsRepository(t)
15+
watchTestIPAPath := filepath.Join(sampleArtifactsDir, "ipas", "watch-test.ipa")
16+
17+
r, err := zip.NewReader(watchTestIPAPath, log.NewLogger())
18+
require.NoError(t, err)
19+
defer func() {
20+
require.NoError(t, r.Close())
21+
}()
22+
23+
ipaReader := zip.NewIPAReader(*r)
24+
plist, err := ipaReader.AppInfoPlist()
25+
require.NoError(t, err)
26+
bundleID, _ := plist.GetString("CFBundleIdentifier")
27+
require.Equal(t, "bitrise.watch-test", bundleID)
28+
29+
profile, err := ipaReader.ProvisioningProfileInfo()
30+
require.NoError(t, err)
31+
require.Equal(t, "XC iOS: *", profile.Name)
32+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package zip
2+
3+
import (
4+
"path/filepath"
5+
"testing"
6+
7+
"github.com/bitrise-io/go-utils/v2/log"
8+
"github.com/bitrise-io/go-xcode/v2/_integration_tests"
9+
"github.com/bitrise-io/go-xcode/v2/zip"
10+
"github.com/stretchr/testify/require"
11+
)
12+
13+
func TestXCArchiveReader_MacOSArchive(t *testing.T) {
14+
sampleArtifactsDir := _integration_tests.GetSampleArtifactsRepository(t)
15+
macOSXCArchivePath := filepath.Join(sampleArtifactsDir, "archives", "macos.xcarchive.zip")
16+
17+
r, err := zip.NewReader(macOSXCArchivePath, log.NewLogger())
18+
require.NoError(t, err)
19+
defer func() {
20+
require.NoError(t, r.Close())
21+
}()
22+
23+
xcarchiveReader := zip.NewXCArchiveReader(*r)
24+
plist, err := xcarchiveReader.InfoPlist()
25+
require.NoError(t, err)
26+
name, _ := plist.GetString("Name")
27+
require.Equal(t, "ActionExtension", name)
28+
29+
require.NoError(t, err)
30+
require.Equal(t, true, xcarchiveReader.IsMacOS())
31+
}
32+
33+
func TestXCArchiveReader_IOSArchive(t *testing.T) {
34+
sampleArtifactsDir := _integration_tests.GetSampleArtifactsRepository(t)
35+
iosXCArchiveIPAPath := filepath.Join(sampleArtifactsDir, "archives", "ios.xcarchive.zip")
36+
37+
r, err := zip.NewReader(iosXCArchiveIPAPath, log.NewLogger())
38+
require.NoError(t, err)
39+
defer func() {
40+
require.NoError(t, r.Close())
41+
}()
42+
43+
xcarchiveReader := zip.NewXCArchiveReader(*r)
44+
plist, err := xcarchiveReader.InfoPlist()
45+
require.NoError(t, err)
46+
name, _ := plist.GetString("Name")
47+
require.Equal(t, "code-sign-test", name)
48+
49+
require.NoError(t, err)
50+
require.Equal(t, false, xcarchiveReader.IsMacOS())
51+
52+
iosXCArchiveReader := zip.NewIOSXCArchiveReader(*r)
53+
appPlist, err := iosXCArchiveReader.AppInfoPlist()
54+
require.NoError(t, err)
55+
name, _ = appPlist.GetString("CFBundleIdentifier")
56+
require.Equal(t, "com.bitrise.code-sign-test", name)
57+
}

bitrise.yml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ workflows:
55
ci:
66
before_run:
77
- test
8+
- integration_test
89

910
test:
1011
steps:
@@ -15,6 +16,13 @@ workflows:
1516
- skip_step_yml_validation: "yes"
1617
- go-list:
1718
inputs:
18-
- exclude: |-
19-
*/mocks
19+
- exclude: "*/mocks"
20+
- go-test: { }
21+
22+
integration_test:
23+
steps:
24+
- change-workdir:
25+
inputs:
26+
- path: ./_integration_tests
27+
- go-list: { }
2028
- go-test: { }

internals/zip/file.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package zip
2+
3+
import (
4+
"archive/zip"
5+
"io"
6+
)
7+
8+
// File ...
9+
type File interface {
10+
Name() string
11+
Open() (io.ReadCloser, error)
12+
}
13+
14+
type defaultFile struct {
15+
file *zip.File
16+
}
17+
18+
func newDefaultFile(file *zip.File) File {
19+
return defaultFile{file: file}
20+
}
21+
22+
// Name ...
23+
func (file defaultFile) Name() string {
24+
return file.file.Name
25+
}
26+
27+
// Open ...
28+
func (file defaultFile) Open() (io.ReadCloser, error) {
29+
return file.file.Open()
30+
}

internals/zip/reader.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package zip
2+
3+
import (
4+
"archive/zip"
5+
"fmt"
6+
)
7+
8+
// ReadCloser ...
9+
type ReadCloser interface {
10+
Files() []File
11+
Close() error
12+
}
13+
14+
type defaultReadCloser struct {
15+
zipReader *zip.ReadCloser
16+
}
17+
18+
// NewDefaultReadCloser ...
19+
func NewDefaultReadCloser(archivePath string) (ReadCloser, error) {
20+
zipReader, err := zip.OpenReader(archivePath)
21+
if err != nil {
22+
return nil, fmt.Errorf("failed to open archive %s: %w", archivePath, err)
23+
}
24+
25+
return defaultReadCloser{
26+
zipReader: zipReader,
27+
}, nil
28+
}
29+
30+
// Files ...
31+
func (readCloser defaultReadCloser) Files() []File {
32+
var files []File
33+
for _, file := range readCloser.zipReader.File {
34+
files = append(files, newDefaultFile(file))
35+
}
36+
return files
37+
}
38+
39+
// Close ...
40+
func (readCloser defaultReadCloser) Close() error {
41+
return readCloser.zipReader.Close()
42+
}

mocks/ZipFile.go

Lines changed: 69 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mocks/ZipReadCloser.go

Lines changed: 58 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)