Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for ArrayBuffer in k6/encoding
Browse files Browse the repository at this point in the history
This is a breaking change.

Part of #1020
Ivan Mirić committed Jan 25, 2021
1 parent 33a2f42 commit c745d69
Showing 2 changed files with 59 additions and 24 deletions.
38 changes: 26 additions & 12 deletions js/modules/k6/encoding/encoding.go
Original file line number Diff line number Diff line change
@@ -24,6 +24,8 @@ import (
"context"
"encoding/base64"

"github.com/dop251/goja"

"github.com/loadimpact/k6/js/common"
"github.com/loadimpact/k6/js/internal/modules"
)
@@ -38,26 +40,37 @@ func New() *Encoding {
return &Encoding{}
}

func (e *Encoding) B64encode(ctx context.Context, input []byte, encoding string) string {
// B64encode returns the base64 encoding of input as a string.
// The data type of input can be a string, []byte or ArrayBuffer.
func (e *Encoding) B64encode(ctx context.Context, input interface{}, encoding string) string {
data, err := common.ToBytes(input)
if err != nil {
common.Throw(common.GetRuntime(ctx), err)
}
switch encoding {
case "rawstd":
return base64.StdEncoding.WithPadding(base64.NoPadding).EncodeToString(input)
return base64.StdEncoding.WithPadding(base64.NoPadding).EncodeToString(data)
case "std":
return base64.StdEncoding.EncodeToString(input)
return base64.StdEncoding.EncodeToString(data)
case "rawurl":
return base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(input)
return base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(data)
case "url":
return base64.URLEncoding.EncodeToString(input)
return base64.URLEncoding.EncodeToString(data)
default:
return base64.StdEncoding.EncodeToString(input)
return base64.StdEncoding.EncodeToString(data)
}
}

func (e *Encoding) B64decode(ctx context.Context, input string, encoding string) string {
var output []byte
var err error
// B64decode returns the decoded data of the base64 encoded input string in the
// given format, wrapped in an ArrayBuffer.
func (e *Encoding) B64decode(ctx context.Context, input, format string) *goja.ArrayBuffer {
var (
output []byte
err error
rt = common.GetRuntime(ctx)
)

switch encoding {
switch format {
case "rawstd":
output, err = base64.StdEncoding.WithPadding(base64.NoPadding).DecodeString(input)
case "std":
@@ -71,8 +84,9 @@ func (e *Encoding) B64decode(ctx context.Context, input string, encoding string)
}

if err != nil {
common.Throw(common.GetRuntime(ctx), err)
common.Throw(rt, err)
}

return string(output)
ab := rt.NewArrayBuffer(output)
return &ab
}
45 changes: 33 additions & 12 deletions js/modules/k6/encoding/encoding_test.go
Original file line number Diff line number Diff line change
@@ -55,8 +55,19 @@ func TestEncodingAlgorithms(t *testing.T) {
_, err := common.RunString(rt, `
var correct = "hello world";
var decoded = encoding.b64decode("aGVsbG8gd29ybGQ=");
if (decoded !== correct) {
throw new Error("Decoding mismatch: " + decoded);
var decStr = String.fromCharCode.apply(null, new Uint8Array(decoded));
if (decStr !== correct) {
throw new Error("Decoding mismatch: " + decStr);
}`)
assert.NoError(t, err)
})
t.Run("DefaultArrayBufferEnc", func(t *testing.T) {
_, err := common.RunString(rt, `
var exp = "aGVsbG8=";
var input = new Uint8Array([104, 101, 108, 108, 111]); // "hello"
var encoded = encoding.b64encode(input.buffer);
if (encoded !== exp) {
throw new Error("Encoding mismatch: " + encoded);
}`)
assert.NoError(t, err)
})
@@ -73,8 +84,10 @@ func TestEncodingAlgorithms(t *testing.T) {
_, err := common.RunString(rt, `
var correct = "こんにちは世界";
var decoded = encoding.b64decode("44GT44KT44Gr44Gh44Gv5LiW55WM");
if (decoded !== correct) {
throw new Error("Decoding mismatch: " + decoded);
var decStr = String.fromCharCode.apply(null, new Uint8Array(decoded));
var decStrUtf8 = decodeURIComponent(escape(decStr));
if (decStrUtf8 !== correct) {
throw new Error("Encoding mismatch: " + decStr);
}`)
assert.NoError(t, err)
})
@@ -91,8 +104,10 @@ func TestEncodingAlgorithms(t *testing.T) {
_, err := common.RunString(rt, `
var correct = "hello world";
var decoded = encoding.b64decode("aGVsbG8gd29ybGQ=", "std");
if (decoded !== correct) {
throw new Error("Decoding mismatch: " + decoded);
var decStr = String.fromCharCode.apply(null, new Uint8Array(decoded));
var decStrUtf8 = decodeURIComponent(escape(decStr));
if (decStrUtf8 !== correct) {
throw new Error("Decoding mismatch: " + decStrUtf8);
}`)
assert.NoError(t, err)
})
@@ -109,8 +124,10 @@ func TestEncodingAlgorithms(t *testing.T) {
_, err := common.RunString(rt, `
var correct = "hello world";
var decoded = encoding.b64decode("aGVsbG8gd29ybGQ", "rawstd");
if (decoded !== correct) {
throw new Error("Decoding mismatch: " + decoded);
var decStr = String.fromCharCode.apply(null, new Uint8Array(decoded));
var decStrUtf8 = decodeURIComponent(escape(decStr));
if (decStrUtf8 !== correct) {
throw new Error("Decoding mismatch: " + decStrUtf8);
}`)
assert.NoError(t, err)
})
@@ -127,8 +144,10 @@ func TestEncodingAlgorithms(t *testing.T) {
_, err := common.RunString(rt, `
var correct = "小飼弾..";
var decoded = encoding.b64decode("5bCP6aO85by-Li4=", "url");
if (decoded !== correct) {
throw new Error("Decoding mismatch: " + decoded);
var decStr = String.fromCharCode.apply(null, new Uint8Array(decoded));
var decStrUtf8 = decodeURIComponent(escape(decStr));
if (decStrUtf8 !== correct) {
throw new Error("Decoding mismatch: " + decStrUtf8);
}`)
assert.NoError(t, err)
})
@@ -145,8 +164,10 @@ func TestEncodingAlgorithms(t *testing.T) {
_, err := common.RunString(rt, `
var correct = "小飼弾..";
var decoded = encoding.b64decode("5bCP6aO85by-Li4", "rawurl");
if (decoded !== correct) {
throw new Error("Decoding mismatch: " + decoded);
var decStr = String.fromCharCode.apply(null, new Uint8Array(decoded));
var decStrUtf8 = decodeURIComponent(escape(decStr));
if (decStrUtf8 !== correct) {
throw new Error("Decoding mismatch: " + decStrUtf8);
}`)
assert.NoError(t, err)
})

0 comments on commit c745d69

Please sign in to comment.