@@ -6,8 +6,10 @@ package base
66import (
77 "context"
88 "fmt"
9+ "reflect"
910 "sync"
1011 "testing"
12+ "unsafe"
1113
1214 "github.com/pb33f/libopenapi/datamodel/low"
1315 "github.com/pb33f/libopenapi/index"
@@ -20,6 +22,9 @@ type collectingAddNodes struct {
2022 lines []int
2123}
2224
25+ //go:linkname lowBuildModelFieldCache github.com/pb33f/libopenapi/datamodel/low.buildModelFieldCache
26+ var lowBuildModelFieldCache sync.Map
27+
2328func (c * collectingAddNodes ) AddNode (key int , _ * yaml.Node ) {
2429 c .lines = append (c .lines , key )
2530}
@@ -77,6 +82,37 @@ func TestResolveSchemaBuildInput_NilAndRefFailures(t *testing.T) {
7782 assert .Contains (t , err .Error (), "boom: ./missing.yaml#/Pet" )
7883}
7984
85+ func TestSchemaBuild_BuildModelError (t * testing.T ) {
86+ var root yaml.Node
87+ require .NoError (t , yaml .Unmarshal ([]byte ("type: string\n " ), & root ))
88+
89+ var seed Schema
90+ require .NoError (t , low .BuildModel (root .Content [0 ], & seed ))
91+
92+ schemaType := reflect .TypeOf (Schema {})
93+ original , ok := lowBuildModelFieldCache .Load (schemaType )
94+ require .True (t , ok )
95+
96+ origType := reflect .TypeOf (original )
97+ elemType := origType .Elem ()
98+ replacement := reflect .MakeSlice (origType , 1 , 1 )
99+ elem := reflect .New (elemType ).Elem ()
100+ setUnexportedField (elem .FieldByName ("lookupKey" ), "type" )
101+ setUnexportedField (elem .FieldByName ("index" ), 0 )
102+ setUnexportedField (elem .FieldByName ("kind" ), reflect .Bool )
103+ replacement .Index (0 ).Set (elem )
104+
105+ lowBuildModelFieldCache .Store (schemaType , replacement .Interface ())
106+ t .Cleanup (func () {
107+ lowBuildModelFieldCache .Store (schemaType , original )
108+ })
109+
110+ var schema Schema
111+ err := schema .Build (context .Background (), root .Content [0 ], nil )
112+ require .Error (t , err )
113+ assert .Contains (t , err .Error (), "unable to parse unsupported type" )
114+ }
115+
80116func TestRecursiveSchemaNodeHelpers (t * testing.T ) {
81117 low .MergeRecursiveNodesIfLineAbsent (nil , nil )
82118 low .AppendRecursiveNodes (nil , nil )
@@ -108,3 +144,7 @@ func TestRecursiveSchemaNodeHelpers(t *testing.T) {
108144 low .AppendRecursiveNodes (collector , node )
109145 assert .NotEmpty (t , collector .lines )
110146}
147+
148+ func setUnexportedField (field reflect.Value , value any ) {
149+ reflect .NewAt (field .Type (), unsafe .Pointer (field .UnsafeAddr ())).Elem ().Set (reflect .ValueOf (value ))
150+ }
0 commit comments