blob: 0a03e1087f80d3e51a3bb62aac85620605c42284 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package rust
import (
"bytes"
_ "embed"
"fmt"
"strings"
"text/template"
"go.fuchsia.dev/fuchsia/tools/fidl/gidl/lib/config"
"go.fuchsia.dev/fuchsia/tools/fidl/gidl/lib/ir"
"go.fuchsia.dev/fuchsia/tools/fidl/gidl/lib/mixer"
"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
)
var (
//go:embed measure_tape.tmpl
measureTapeTmplText string
measureTapeTmpl = template.Must(template.New("measureTapeTmpl").Parse(measureTapeTmplText))
)
const measureTapeWireFormat = ir.V2WireFormat
type measureTapeTmplInput struct {
MeasureTapeTestCases []measureTapeTestCase
}
type measureTapeTestCase struct {
Name, Context, HandleDefs, Value string
NumBytes, NumHandles int
}
func GenerateMeasureTapeTests(gidl ir.All, fidl fidlgen.Root, config config.GeneratorConfig) ([]byte, error) {
var tmplInput measureTapeTmplInput
schema := mixer.BuildSchema(fidl)
allowedTypes := map[string]struct{}{}
for _, name := range config.FilterTypes {
if !strings.HasPrefix(name, "test.conformance/") {
return nil, fmt.Errorf("invalid filter type: %s", name)
}
typeName := strings.TrimPrefix(name, "test.conformance/")
allowedTypes[typeName] = struct{}{}
}
for _, encodeSuccess := range gidl.EncodeSuccess {
valueTypeName := ir.TypeFromValue(encodeSuccess.Value)
if _, ok := allowedTypes[valueTypeName]; !ok {
continue
}
decl, err := schema.ExtractDeclarationEncodeSuccess(encodeSuccess.Value, encodeSuccess.HandleDefs)
if err != nil {
return nil, fmt.Errorf("encode success %s: %s", encodeSuccess.Name, err)
}
value := visit(encodeSuccess.Value, decl)
for _, encoding := range encodeSuccess.Encodings {
if encoding.WireFormat != measureTapeWireFormat {
continue
}
tmplInput.MeasureTapeTestCases = append(tmplInput.MeasureTapeTestCases, measureTapeTestCase{
Name: testCaseName(encodeSuccess.Name, encoding.WireFormat),
Context: encodingContext(encoding.WireFormat),
HandleDefs: buildHandleDefs(encodeSuccess.HandleDefs),
Value: value,
NumBytes: len(encoding.Bytes),
NumHandles: len(encoding.HandleDispositions),
})
}
}
var buf bytes.Buffer
err := measureTapeTmpl.Execute(&buf, tmplInput)
return buf.Bytes(), err
}