Skip to content

Commit

Permalink
all: add test that compare the generated Go code
Browse files Browse the repository at this point in the history
For each test cases in "internal/tests" we save the current generated
Go code with ".exp" extension and compare them with the new generated
Go code.

This is to check the consistency of generated Go code in the future
changes.
  • Loading branch information
shuLhan committed May 3, 2020
1 parent f684698 commit 351768f
Show file tree
Hide file tree
Showing 27 changed files with 5,061 additions and 17 deletions.
22 changes: 18 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@
/cmd/go-bindata/cover.out
/cmd/go-bindata/go-bindata
/cover.html
/cover.out
/go-bindata
cover.html
cover.out
lib.cover.out
testdata/out/
/internal/tests/inputDir/bindata.go
/internal/tests/inputDirRecursive/bindata.go
/internal/tests/inputDuplicateDir/bindata.go
/internal/tests/inputDuplicateFile/bindata.go
/internal/tests/inputFile/bindata.go
/internal/tests/inputSymlinkRecursive/bindata.go
/internal/tests/inputSymlinkToDir/bindata.go
/internal/tests/inputSymlinkToFile/bindata.go
/internal/tests/withDebug/bindata.go
/internal/tests/withNoCompress/bindata.go
/internal/tests/withNoCompressNoMemCopy/bindata.go
/internal/tests/withNoMemCopy/bindata.go
/internal/tests/withSplit/bindata.go
/internal/tests/withSplit/bindataInSplitTest1.go
/internal/tests/withSplit/bindataInSplitTest2.go
/internal/tests/withoutOutputFlag/bindata.go
22 changes: 22 additions & 0 deletions internal/tests/_bindata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
package bindata

import (
"bytes"
"io/ioutil"
"testing"
)

Expand Down Expand Up @@ -76,3 +78,23 @@ func TestAsset(t *testing.T) {
assert(t, test.exp, string(got), true)
}
}

func TestGeneratedContent(t *testing.T) {
expFile := "bindata.exp"
gotFile := "bindata.go"

// Compare the generate bindata.go with expected.
exp, err := ioutil.ReadFile(expFile)
if err != nil {
t.Fatal(err)
}

got, err := ioutil.ReadFile(gotFile)
if err != nil {
t.Fatal(err)
}

if !bytes.Equal(exp, got) {
t.Fatalf("%s not match with %s", expFile, gotFile)
}
}
309 changes: 309 additions & 0 deletions internal/tests/inputDir/bindata.exp
Original file line number Diff line number Diff line change
@@ -0,0 +1,309 @@
// Code generated by go-bindata. DO NOT EDIT.
// sources:
// ../../../testdata/in/file name
// ../../../testdata/in/test.asset

package bindata


import (
"bytes"
"compress/gzip"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
"time"
)

func bindataRead(data []byte, name string) ([]byte, error) {
gz, err := gzip.NewReader(bytes.NewBuffer(data))
if err != nil {
return nil, fmt.Errorf("Read %q: %v", name, err)
}

var buf bytes.Buffer
_, err = io.Copy(&buf, gz)
clErr := gz.Close()

if err != nil {
return nil, fmt.Errorf("Read %q: %v", name, err)
}
if clErr != nil {
return nil, err
}

return buf.Bytes(), nil
}


type asset struct {
bytes []byte
info fileInfoEx
}

type fileInfoEx interface {
os.FileInfo
MD5Checksum() string
}

type bindataFileInfo struct {
name string
size int64
mode os.FileMode
modTime time.Time
md5checksum string
}

func (fi bindataFileInfo) Name() string {
return fi.name
}
func (fi bindataFileInfo) Size() int64 {
return fi.size
}
func (fi bindataFileInfo) Mode() os.FileMode {
return fi.mode
}
func (fi bindataFileInfo) ModTime() time.Time {
return fi.modTime
}
func (fi bindataFileInfo) MD5Checksum() string {
return fi.md5checksum
}
func (fi bindataFileInfo) IsDir() bool {
return false
}
func (fi bindataFileInfo) Sys() interface{} {
return nil
}

var _bindataInFilename = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd2\xd7\x57\x70\xce\xcf\x2b\x49\xcd\x2b\x51\xc8\x4f\x53\x50\x2a\x49\x2d\x2e\x49\x49\x2c\x49\xd4\xcf\xcc\xd3\x4f\xcb\xcc\x49\x55\xc8\x4b\xcc\x4d\x55\xe2\x02\x04\x00\x00\xff\xff\x3d\xa5\x6b\x08\x26\x00\x00\x00")

func bindataInFilenameBytes() ([]byte, error) {
return bindataRead(
_bindataInFilename,
"in/file name",
)
}



func bindataInFilename() (*asset, error) {
bytes, err := bindataInFilenameBytes()
if err != nil {
return nil, err
}

info := bindataFileInfo{
name: "in/file name",
size: 38,
md5checksum: "",
mode: os.FileMode(420),
modTime: time.Unix(1586263518, 0),
}

a := &asset{bytes: bytes, info: info}

return a, nil
}

var _bindataInTestasset = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xd2\xd7\x57\x28\x4e\xcc\x2d\xc8\x49\x55\x48\xcb\xcc\x49\xe5\x02\x04\x00\x00\xff\xff\x8a\x82\x8c\x85\x0f\x00\x00\x00")

func bindataInTestassetBytes() ([]byte, error) {
return bindataRead(
_bindataInTestasset,
"in/test.asset",
)
}



func bindataInTestasset() (*asset, error) {
bytes, err := bindataInTestassetBytes()
if err != nil {
return nil, err
}

info := bindataFileInfo{
name: "in/test.asset",
size: 15,
md5checksum: "",
mode: os.FileMode(420),
modTime: time.Unix(1586263518, 0),
}

a := &asset{bytes: bytes, info: info}

return a, nil
}


//
// Asset loads and returns the asset for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
//
func Asset(name string) ([]byte, error) {
cannonicalName := strings.Replace(name, "\\", "/", -1)
if f, ok := _bindata[cannonicalName]; ok {
a, err := f()
if err != nil {
return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
}
return a.bytes, nil
}
return nil, &os.PathError{Op: "open", Path: name, Err: os.ErrNotExist}
}

//
// MustAsset is like Asset but panics when Asset would return an error.
// It simplifies safe initialization of global variables.
// nolint: deadcode
//
func MustAsset(name string) []byte {
a, err := Asset(name)
if err != nil {
panic("asset: Asset(" + name + "): " + err.Error())
}

return a
}

//
// AssetInfo loads and returns the asset info for the given name.
// It returns an error if the asset could not be found or could not be loaded.
//
func AssetInfo(name string) (os.FileInfo, error) {
cannonicalName := strings.Replace(name, "\\", "/", -1)
if f, ok := _bindata[cannonicalName]; ok {
a, err := f()
if err != nil {
return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
}
return a.info, nil
}
return nil, &os.PathError{Op: "open", Path: name, Err: os.ErrNotExist}
}

//
// AssetNames returns the names of the assets.
// nolint: deadcode
//
func AssetNames() []string {
names := make([]string, 0, len(_bindata))
for name := range _bindata {
names = append(names, name)
}
return names
}

//
// _bindata is a table, holding each asset generator, mapped to its name.
//
var _bindata = map[string]func() (*asset, error){
"in/file name": bindataInFilename,
"in/test.asset": bindataInTestasset,
}

//
// AssetDir returns the file names below a certain
// directory embedded in the file by go-bindata.
// For example if you run go-bindata on data/... and data contains the
// following hierarchy:
// data/
// foo.txt
// img/
// a.png
// b.png
// then AssetDir("data") would return []string{"foo.txt", "img"}
// AssetDir("data/img") would return []string{"a.png", "b.png"}
// AssetDir("foo.txt") and AssetDir("notexist") would return an error
// AssetDir("") will return []string{"data"}.
//
func AssetDir(name string) ([]string, error) {
node := _bintree
if len(name) != 0 {
cannonicalName := strings.Replace(name, "\\", "/", -1)
pathList := strings.Split(cannonicalName, "/")
for _, p := range pathList {
node = node.Children[p]
if node == nil {
return nil, &os.PathError{
Op: "open",
Path: name,
Err: os.ErrNotExist,
}
}
}
}
if node.Func != nil {
return nil, &os.PathError{
Op: "open",
Path: name,
Err: os.ErrNotExist,
}
}
rv := make([]string, 0, len(node.Children))
for childName := range node.Children {
rv = append(rv, childName)
}
return rv, nil
}


type bintree struct {
Func func() (*asset, error)
Children map[string]*bintree
}

var _bintree = &bintree{Func: nil, Children: map[string]*bintree{
"in": {Func: nil, Children: map[string]*bintree{
"file name": {Func: bindataInFilename, Children: map[string]*bintree{}},
"test.asset": {Func: bindataInTestasset, Children: map[string]*bintree{}},
}},
}}

// RestoreAsset restores an asset under the given directory
func RestoreAsset(dir, name string) error {
data, err := Asset(name)
if err != nil {
return err
}
info, err := AssetInfo(name)
if err != nil {
return err
}
err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
if err != nil {
return err
}
err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
if err != nil {
return err
}
return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
}

// RestoreAssets restores an asset under the given directory recursively
func RestoreAssets(dir, name string) error {
children, err := AssetDir(name)
// File
if err != nil {
return RestoreAsset(dir, name)
}
// Dir
for _, child := range children {
err = RestoreAssets(dir, filepath.Join(name, child))
if err != nil {
return err
}
}
return nil
}

func _filePath(dir, name string) string {
cannonicalName := strings.Replace(name, "\\", "/", -1)
return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
}
Loading

0 comments on commit 351768f

Please sign in to comment.