package binapigen
import (
+ "bufio"
+ "fmt"
+ "git.fd.io/govpp.git/binapigen/vppapi"
+ . "github.com/onsi/gomega"
+ "os"
+ "strings"
"testing"
)
+func TestGoModule(t *testing.T) {
+ const expected = "git.fd.io/govpp.git/binapi"
+
+ impPath, err := resolveImportPath("../binapi")
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ if impPath != expected {
+ t.Fatalf("expected: %q, got: %q", expected, impPath)
+ }
+}
+
func TestBinapiTypeSizes(t *testing.T) {
tests := []struct {
name string
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
- size := getBinapiTypeSize(test.input)
+ size := getSizeOfBinapiBaseType(test.input, 1)
if size != test.expsize {
t.Errorf("expected %d, got %d", test.expsize, size)
}
}
}
-/*func TestSizeOfType(t *testing.T) {
- tests := []struct {
- name string
- input StructType
- expsize int
- }{
- {
- name: "basic1",
- input: StructType{
- Fields: []Field{
- {Type: "u8"},
- },
- },
- expsize: 1,
- },
- {
- name: "basic2",
- input: Type{
- Fields: []Field{
- {Type: "u8", Length: 4},
- },
- },
- expsize: 4,
- },
- {
- name: "basic3",
- input: Type{
- Fields: []Field{
- {Type: "u8", Length: 16},
- },
- },
- expsize: 16,
- },
- {
- name: "withEnum",
- input: Type{
- Fields: []Field{
- {Type: "u16"},
- {Type: "vl_api_myenum_t"},
- },
- },
- expsize: 6,
- },
- {
- name: "invalid1",
- input: Type{
- Fields: []Field{
- {Type: "x", Length: 16},
- },
- },
- expsize: 0,
- },
+func TestBinapiUnionSizes(t *testing.T) {
+ RegisterTestingT(t)
+
+ // order of the union sizes in file generated from union.api.json
+ var sizes = []int{16, 4, 32, 16, 64, 111}
+
+ // remove directory created during test
+ defer func() {
+ err := os.RemoveAll(testOutputDir)
+ Expect(err).ToNot(HaveOccurred())
+ }()
+
+ err := GenerateFromFile("vppapi/testdata/union.api.json", Options{OutputDir: testOutputDir})
+ Expect(err).ShouldNot(HaveOccurred())
+
+ file, err := os.Open(testOutputDir + "/union/union.ba.go")
+ Expect(err).ShouldNot(HaveOccurred())
+ defer func() {
+ err := file.Close()
+ Expect(err).ToNot(HaveOccurred())
+ }()
+
+ // the generated line with union size is in format XXX_UnionData [<size>]byte
+ // the prefix identifies these lines (the starting tab is important)
+ prefix := fmt.Sprintf("\t%s", "XXX_UnionData [")
+
+ index := 0
+ scanner := bufio.NewScanner(file)
+ for scanner.Scan() {
+ if strings.HasPrefix(scanner.Text(), prefix) {
+ Expect(scanner.Text()).To(Equal(prefix + fmt.Sprintf("%d]byte", sizes[index])))
+ index++
+ }
}
- for _, test := range tests {
- t.Run(test.name, func(t *testing.T) {
- module := &File{
- Enums: []Enum{
- {Name: "myenum", Type: "u32"},
- },
- }
- size := getSizeOfType(module, &test.input)
- if size != test.expsize {
- t.Errorf("expected %d, got %d", test.expsize, size)
- }
+ // ensure all union sizes were found and tested
+ Expect(index).To(Equal(len(sizes)))
+}
+
+// Typed data used for union size evaluation testing.
+type typeTestData struct {
+ typ string
+ value string
+ fields []*typeTestData
+}
+
+func (t typeTestData) getUnion(name string) *Union {
+ return &Union{
+ UnionType: vppapi.UnionType{Name: name},
+ Fields: t.getUnionFields(name),
+ }
+}
+
+func (t typeTestData) getUnionFields(parentName string) (fields []*Field) {
+ for i, field := range t.fields {
+ var (
+ dataType string
+ aliasType *Alias
+ enumType *Enum
+ structType *Struct
+ unionType *Union
+ )
+ switch field.typ {
+ case "alias":
+ aliasType = &Alias{AliasType: vppapi.AliasType{Name: fmt.Sprintf("%s_alias_%d", parentName, i), Type: field.value}}
+ case "enum":
+ enumType = &Enum{EnumType: vppapi.EnumType{Name: fmt.Sprintf("%s_enum_%d", parentName, i), Type: field.value}}
+ case "struct":
+ structType = &Struct{Fields: field.getUnionFields(fmt.Sprintf("%s_struct_%d", parentName, i))}
+ case "union":
+ unionType = field.getUnion(parentName)
+ default:
+ dataType = field.value
+ }
+ fields = append(fields, &Field{
+ Field: vppapi.Field{Name: fmt.Sprintf("%s_field_%d", parentName, i), Type: dataType},
+ TypeAlias: aliasType,
+ TypeEnum: enumType,
+ TypeStruct: structType,
+ TypeUnion: unionType,
})
}
-}*/
+ return fields
+}