Skip to content
This repository was archived by the owner on Dec 2, 2020. It is now read-only.

Commit 45127b5

Browse files
committed
Test publish package
1 parent 0941938 commit 45127b5

File tree

6 files changed

+182
-14
lines changed

6 files changed

+182
-14
lines changed

img2lambda/cli/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ func repackImageAction(opts *types.CmdOptions) error {
8080
}
8181

8282
if !opts.DryRun {
83-
err := publish.PublishLambdaLayers(types.ConvertToPublishOptions(opts), layers)
83+
_, err := publish.PublishLambdaLayers(types.ConvertToPublishOptions(opts), layers)
8484
if err != nil {
8585
return err
8686
}

img2lambda/internal/testing/mocks/image_mocks.go

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

img2lambda/internal/testing/mocks/lambda_mocks.go

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

img2lambda/publish/publish_layers.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ import (
1313
"github.com/awslabs/aws-lambda-container-image-converter/img2lambda/types"
1414
)
1515

16-
func PublishLambdaLayers(opts *types.PublishOptions, layers []types.LambdaLayer) error {
16+
func PublishLambdaLayers(opts *types.PublishOptions, layers []types.LambdaLayer) (string, error) {
1717
layerArns := []string{}
1818

1919
for _, layer := range layers {
2020
layerName := opts.LayerPrefix + "-" + strings.Replace(layer.Digest, ":", "-", -1)
2121

2222
layerContents, err := ioutil.ReadFile(layer.File)
2323
if err != nil {
24-
return err
24+
return "", err
2525
}
2626

2727
publishArgs := &lambda.PublishLayerVersionInput{
@@ -33,37 +33,37 @@ func PublishLambdaLayers(opts *types.PublishOptions, layers []types.LambdaLayer)
3333

3434
resp, err := opts.LambdaClient.PublishLayerVersion(publishArgs)
3535
if err != nil {
36-
return err
36+
return "", err
3737
}
3838

3939
layerArns = append(layerArns, *resp.LayerVersionArn)
4040

4141
err = os.Remove(layer.File)
4242
if err != nil {
43-
return err
43+
return "", err
4444
}
4545

4646
log.Printf("Published Lambda layer file %s (image layer %s) to Lambda: %s", layer.File, layer.Digest, *resp.LayerVersionArn)
4747
}
4848

4949
jsonArns, err := json.MarshalIndent(layerArns, "", " ")
5050
if err != nil {
51-
return err
51+
return "", err
5252
}
5353

5454
resultsPath := filepath.Join(opts.ResultsDir, "layers.json")
5555
jsonFile, err := os.Create(resultsPath)
5656
if err != nil {
57-
return err
57+
return "", err
5858
}
5959
defer jsonFile.Close()
6060

6161
_, err = jsonFile.Write(jsonArns)
6262
if err != nil {
63-
return err
63+
return "", err
6464
}
6565

6666
log.Printf("Lambda layer ARNs (%d total) are written to %s", len(layerArns), resultsPath)
6767

68-
return nil
68+
return resultsPath, nil
6969
}
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
package publish
2+
3+
import (
4+
"encoding/json"
5+
"errors"
6+
"io/ioutil"
7+
"os"
8+
"strconv"
9+
"testing"
10+
11+
"github.com/aws/aws-sdk-go/aws"
12+
"github.com/aws/aws-sdk-go/service/lambda"
13+
"github.com/awslabs/aws-lambda-container-image-converter/img2lambda/internal/testing/mocks"
14+
"github.com/awslabs/aws-lambda-container-image-converter/img2lambda/types"
15+
"github.com/golang/mock/gomock"
16+
"github.com/stretchr/testify/assert"
17+
)
18+
19+
func parseResult(t *testing.T, resultsFilename string) []string {
20+
resultContents, err := ioutil.ReadFile(resultsFilename)
21+
assert.Nil(t, err)
22+
var resultArns []string
23+
err = json.Unmarshal(resultContents, &resultArns)
24+
assert.Nil(t, err)
25+
os.Remove(resultsFilename)
26+
return resultArns
27+
}
28+
29+
func mockLayer(t *testing.T, n int) types.LambdaLayer {
30+
tmpFile, err := ioutil.TempFile("", "")
31+
assert.Nil(t, err)
32+
defer tmpFile.Close()
33+
34+
_, err = tmpFile.WriteString("hello world " + strconv.Itoa(n))
35+
assert.Nil(t, err)
36+
return types.LambdaLayer{
37+
Digest: "sha256:" + strconv.Itoa(n),
38+
File: tmpFile.Name(),
39+
}
40+
}
41+
42+
func mockLayers(t *testing.T) []types.LambdaLayer {
43+
var layers []types.LambdaLayer
44+
45+
layers = append(layers, mockLayer(t, 1))
46+
layers = append(layers, mockLayer(t, 2))
47+
48+
return layers
49+
}
50+
51+
func TestNoLayers(t *testing.T) {
52+
ctrl := gomock.NewController(t)
53+
defer ctrl.Finish()
54+
55+
lambdaClient := mocks.NewMockLambdaAPI(ctrl)
56+
57+
dir, err := ioutil.TempDir("", "")
58+
assert.Nil(t, err)
59+
60+
opts := &types.PublishOptions{
61+
LambdaClient: lambdaClient,
62+
LayerPrefix: "test-prefix",
63+
SourceImageName: "test-image",
64+
ResultsDir: dir,
65+
}
66+
67+
layers := []types.LambdaLayer{}
68+
69+
resultsFilename, err := PublishLambdaLayers(opts, layers)
70+
assert.Nil(t, err)
71+
72+
resultArns := parseResult(t, resultsFilename)
73+
assert.Len(t, resultArns, 0)
74+
}
75+
76+
func TestPublishSuccess(t *testing.T) {
77+
ctrl := gomock.NewController(t)
78+
defer ctrl.Finish()
79+
80+
lambdaClient := mocks.NewMockLambdaAPI(ctrl)
81+
82+
dir, err := ioutil.TempDir("", "")
83+
assert.Nil(t, err)
84+
85+
opts := &types.PublishOptions{
86+
LambdaClient: lambdaClient,
87+
LayerPrefix: "test-prefix",
88+
SourceImageName: "test-image",
89+
ResultsDir: dir,
90+
}
91+
92+
layers := mockLayers(t)
93+
94+
expectedInput1 := &lambda.PublishLayerVersionInput{
95+
CompatibleRuntimes: []*string{aws.String("provided")},
96+
Content: &lambda.LayerVersionContentInput{ZipFile: []byte("hello world 1")},
97+
Description: aws.String("created by img2lambda from image test-image"),
98+
LayerName: aws.String("test-prefix-sha256-1"),
99+
}
100+
101+
expectedOutput1 := &lambda.PublishLayerVersionOutput{
102+
LayerVersionArn: aws.String("arn:aws:lambda:us-east-2:123456789012:layer:example-layer-1:1"),
103+
}
104+
105+
expectedInput2 := &lambda.PublishLayerVersionInput{
106+
CompatibleRuntimes: []*string{aws.String("provided")},
107+
Content: &lambda.LayerVersionContentInput{ZipFile: []byte("hello world 2")},
108+
Description: aws.String("created by img2lambda from image test-image"),
109+
LayerName: aws.String("test-prefix-sha256-2"),
110+
}
111+
112+
expectedOutput2 := &lambda.PublishLayerVersionOutput{
113+
LayerVersionArn: aws.String("arn:aws:lambda:us-east-2:123456789012:layer:example-layer-2:1"),
114+
}
115+
116+
lambdaClient.EXPECT().
117+
PublishLayerVersion(gomock.Eq(expectedInput1)).
118+
Return(expectedOutput1, nil)
119+
120+
lambdaClient.EXPECT().
121+
PublishLayerVersion(gomock.Eq(expectedInput2)).
122+
Return(expectedOutput2, nil)
123+
124+
resultsFilename, err := PublishLambdaLayers(opts, layers)
125+
assert.Nil(t, err)
126+
127+
resultArns := parseResult(t, resultsFilename)
128+
assert.Len(t, resultArns, 2)
129+
assert.Equal(t, "arn:aws:lambda:us-east-2:123456789012:layer:example-layer-1:1", resultArns[0])
130+
assert.Equal(t, "arn:aws:lambda:us-east-2:123456789012:layer:example-layer-2:1", resultArns[1])
131+
}
132+
133+
func TestPublishError(t *testing.T) {
134+
ctrl := gomock.NewController(t)
135+
defer ctrl.Finish()
136+
137+
lambdaClient := mocks.NewMockLambdaAPI(ctrl)
138+
139+
dir, err := ioutil.TempDir("", "")
140+
assert.Nil(t, err)
141+
142+
opts := &types.PublishOptions{
143+
LambdaClient: lambdaClient,
144+
LayerPrefix: "test-prefix",
145+
SourceImageName: "test-image",
146+
ResultsDir: dir,
147+
}
148+
149+
layers := mockLayers(t)
150+
151+
expectedInput1 := &lambda.PublishLayerVersionInput{
152+
CompatibleRuntimes: []*string{aws.String("provided")},
153+
Content: &lambda.LayerVersionContentInput{ZipFile: []byte("hello world 1")},
154+
Description: aws.String("created by img2lambda from image test-image"),
155+
LayerName: aws.String("test-prefix-sha256-1"),
156+
}
157+
158+
lambdaClient.EXPECT().
159+
PublishLayerVersion(gomock.Eq(expectedInput1)).
160+
Return(nil, errors.New("Access denied"))
161+
162+
resultsFilename, err := PublishLambdaLayers(opts, layers)
163+
assert.Error(t, err)
164+
assert.Equal(t, "", resultsFilename)
165+
166+
os.Remove(layers[0].File)
167+
os.Remove(layers[1].File)
168+
}

scripts/mockgen.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ cat << EOF
4141
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
4242
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
4343
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
44-
$(mockgen "${package}" "${interfaces}")
44+
$(mockgen -package mocks "${package}" "${interfaces}")
4545
EOF
4646
)
4747

0 commit comments

Comments
 (0)