@@ -16,6 +16,7 @@ package solver
1616
1717import (
1818 "fmt"
19+ "strings"
1920 "testing"
2021
2122 "golang.org/x/net/context"
@@ -775,3 +776,211 @@ func TestSolve(t *testing.T) {
775776 })
776777 }
777778}
779+
780+ func TestAssignmentToReservation (t * testing.T ) {
781+ tDUT1 := & opb.Device {Id : "dut1" , Ports : []* opb.Port {{Id : "port1" }}}
782+ tATE1 := & opb.Device {Id : "ate1" , Ports : []* opb.Port {{Id : "port1" }}}
783+ tb := & opb.Testbed {
784+ Duts : []* opb.Device {tDUT1 },
785+ Ates : []* opb.Device {tATE1 },
786+ Links : []* opb.Link {{A : "dut1:port1" , B : "ate1:port1" }},
787+ }
788+
789+ bDUT1Port1 := & binding.Port {Name : "eth1" }
790+ bATE1Port1 := & binding.Port {Name : "eth1" }
791+ invDUT1 := & mockDUT {AbstractDUT : & binding.AbstractDUT {Dims : & binding.Dims {Name : "inventory_dut1" , Ports : map [string ]* binding.Port {"p1" : bDUT1Port1 }}}}
792+ invATE1 := & mockATE {AbstractATE : & binding.AbstractATE {Dims : & binding.Dims {Name : "inventory_ate1" , Ports : map [string ]* binding.Port {"p1" : bATE1Port1 }}}}
793+ bdevDUT1 := binding .Device (invDUT1 )
794+ bdevATE1 := binding .Device (invATE1 )
795+
796+ absDUT1Node := & portgraph.AbstractNode {Desc : "dut1" }
797+ absATE1Node := & portgraph.AbstractNode {Desc : "ate1" }
798+ absDUT1Port1 := & portgraph.AbstractPort {Desc : "dut1:port1" }
799+ absATE1Port1 := & portgraph.AbstractPort {Desc : "ate1:port1" }
800+
801+ conDUT1Node := & portgraph.ConcreteNode {Desc : invDUT1 .Name ()}
802+ conATE1Node := & portgraph.ConcreteNode {Desc : invATE1 .Name ()}
803+ conDUT1Port1 := & portgraph.ConcretePort {Desc : invDUT1 .Name () + ":" + bDUT1Port1 .Name }
804+ conATE1Port1 := & portgraph.ConcretePort {Desc : invATE1 .Name () + ":" + bATE1Port1 .Name }
805+
806+ solveResult := & SolveResult {
807+ Assignment : & portgraph.Assignment {
808+ Node2Node : map [* portgraph.AbstractNode ]* portgraph.ConcreteNode {
809+ absDUT1Node : conDUT1Node ,
810+ absATE1Node : conATE1Node ,
811+ },
812+ Port2Port : map [* portgraph.AbstractPort ]* portgraph.ConcretePort {
813+ absDUT1Port1 : conDUT1Port1 ,
814+ absATE1Port1 : conATE1Port1 ,
815+ },
816+ },
817+ AbsNode2Dev : map [* portgraph.AbstractNode ]* opb.Device {
818+ absDUT1Node : tDUT1 ,
819+ absATE1Node : tATE1 ,
820+ },
821+ AbsPort2Port : map [* portgraph.AbstractPort ]* opb.Port {
822+ absDUT1Port1 : tDUT1 .Ports [0 ],
823+ absATE1Port1 : tATE1 .Ports [0 ],
824+ },
825+ ConNode2BindDev : map [* portgraph.ConcreteNode ]* binding.Device {
826+ conDUT1Node : & bdevDUT1 ,
827+ conATE1Node : & bdevATE1 ,
828+ },
829+ ConPort2BindPort : map [* portgraph.ConcretePort ]* binding.Port {
830+ conDUT1Port1 : bDUT1Port1 ,
831+ conATE1Port1 : bATE1Port1 ,
832+ },
833+ }
834+
835+ res , err := AssignmentToReservation (solveResult , tb )
836+ if err != nil {
837+ t .Fatalf ("AssignmentToReservation() got unexpected error: %v" , err )
838+ }
839+
840+ wantRes := & binding.Reservation {
841+ ID : res .ID ,
842+ DUTs : map [string ]binding.DUT {
843+ "dut1" : & staticDUT {
844+ AbstractDUT : & binding.AbstractDUT {
845+ Dims : & binding.Dims {
846+ Name : "inventory_dut1" ,
847+ Ports : map [string ]* binding.Port {
848+ "port1" : bDUT1Port1 ,
849+ },
850+ },
851+ },
852+ dut : invDUT1 ,
853+ },
854+ },
855+ ATEs : map [string ]binding.ATE {
856+ "ate1" : & staticATE {
857+ AbstractATE : & binding.AbstractATE {
858+ Dims : & binding.Dims {
859+ Name : "inventory_ate1" ,
860+ Ports : map [string ]* binding.Port {
861+ "port1" : bATE1Port1 ,
862+ },
863+ },
864+ },
865+ ate : invATE1 ,
866+ },
867+ },
868+ }
869+ if diff := cmp .Diff (wantRes , res , cmp .AllowUnexported (staticDUT {}, staticATE {})); diff != "" {
870+ t .Errorf ("AssignmentToReservation() returned diff (-want +got):\n %s" , diff )
871+ }
872+ }
873+
874+ func TestAssignmentToReservationErrors (t * testing.T ) {
875+ tDUT1 := & opb.Device {Id : "dut1" , Ports : []* opb.Port {{Id : "port1" }}}
876+ tATE1 := & opb.Device {Id : "ate1" , Ports : []* opb.Port {{Id : "port1" }}}
877+ bDUT1Port1 := & binding.Port {Name : "eth1" }
878+ bATE1Port1 := & binding.Port {Name : "eth1" }
879+ invDUT1 := & mockDUT {AbstractDUT : & binding.AbstractDUT {Dims : & binding.Dims {Name : "inventory_dut1" , Ports : map [string ]* binding.Port {"p1" : bDUT1Port1 }}}}
880+ invATE1 := & mockATE {AbstractATE : & binding.AbstractATE {Dims : & binding.Dims {Name : "inventory_ate1" , Ports : map [string ]* binding.Port {"p1" : bATE1Port1 }}}}
881+ bdevDUT1 := binding .Device (invDUT1 )
882+ bdevATE1 := binding .Device (invATE1 )
883+ absDUT1Node := & portgraph.AbstractNode {Desc : "dut1" }
884+ absATE1Node := & portgraph.AbstractNode {Desc : "ate1" }
885+ conDUT1Node := & portgraph.ConcreteNode {Desc : invDUT1 .Name ()}
886+ conATE1Node := & portgraph.ConcreteNode {Desc : invATE1 .Name ()}
887+
888+ tests := []struct {
889+ desc string
890+ tb * opb.Testbed
891+ solveResult * SolveResult
892+ wantErr string
893+ }{
894+ {
895+ desc : "dut not resolved" ,
896+ tb : & opb.Testbed {Duts : []* opb.Device {tDUT1 }},
897+ solveResult : & SolveResult {
898+ Assignment : & portgraph.Assignment {},
899+ AbsNode2Dev : map [* portgraph.AbstractNode ]* opb.Device {},
900+ AbsPort2Port : map [* portgraph.AbstractPort ]* opb.Port {},
901+ ConNode2BindDev : map [* portgraph.ConcreteNode ]* binding.Device {},
902+ ConPort2BindPort : map [* portgraph.ConcretePort ]* binding.Port {},
903+ },
904+ wantErr : "not resolved" ,
905+ },
906+ {
907+ desc : "ate not resolved" ,
908+ tb : & opb.Testbed {Ates : []* opb.Device {tATE1 }},
909+ solveResult : & SolveResult {
910+ Assignment : & portgraph.Assignment {},
911+ AbsNode2Dev : map [* portgraph.AbstractNode ]* opb.Device {},
912+ AbsPort2Port : map [* portgraph.AbstractPort ]* opb.Port {},
913+ ConNode2BindDev : map [* portgraph.ConcreteNode ]* binding.Device {},
914+ ConPort2BindPort : map [* portgraph.ConcretePort ]* binding.Port {},
915+ },
916+ wantErr : "not resolved" ,
917+ },
918+ {
919+ desc : "dut assigned ate device" ,
920+ tb : & opb.Testbed {Duts : []* opb.Device {tDUT1 }},
921+ solveResult : & SolveResult {
922+ Assignment : & portgraph.Assignment {
923+ Node2Node : map [* portgraph.AbstractNode ]* portgraph.ConcreteNode {
924+ absDUT1Node : conATE1Node ,
925+ },
926+ },
927+ AbsNode2Dev : map [* portgraph.AbstractNode ]* opb.Device {
928+ absDUT1Node : tDUT1 ,
929+ },
930+ ConNode2BindDev : map [* portgraph.ConcreteNode ]* binding.Device {
931+ conATE1Node : & bdevATE1 ,
932+ },
933+ AbsPort2Port : map [* portgraph.AbstractPort ]* opb.Port {},
934+ ConPort2BindPort : map [* portgraph.ConcretePort ]* binding.Port {},
935+ },
936+ wantErr : "is not a DUT" ,
937+ },
938+ {
939+ desc : "ate assigned dut device" ,
940+ tb : & opb.Testbed {Ates : []* opb.Device {tATE1 }},
941+ solveResult : & SolveResult {
942+ Assignment : & portgraph.Assignment {
943+ Node2Node : map [* portgraph.AbstractNode ]* portgraph.ConcreteNode {
944+ absATE1Node : conDUT1Node ,
945+ },
946+ },
947+ AbsNode2Dev : map [* portgraph.AbstractNode ]* opb.Device {
948+ absATE1Node : tATE1 ,
949+ },
950+ ConNode2BindDev : map [* portgraph.ConcreteNode ]* binding.Device {
951+ conDUT1Node : & bdevDUT1 ,
952+ },
953+ AbsPort2Port : map [* portgraph.AbstractPort ]* opb.Port {},
954+ ConPort2BindPort : map [* portgraph.ConcretePort ]* binding.Port {},
955+ },
956+ wantErr : "is not an ATE" ,
957+ },
958+ {
959+ desc : "nil assignment" ,
960+ tb : & opb.Testbed {Duts : []* opb.Device {tDUT1 }},
961+ solveResult : & SolveResult {
962+ Assignment : nil ,
963+ AbsNode2Dev : map [* portgraph.AbstractNode ]* opb.Device {},
964+ AbsPort2Port : map [* portgraph.AbstractPort ]* opb.Port {},
965+ ConNode2BindDev : map [* portgraph.ConcreteNode ]* binding.Device {},
966+ ConPort2BindPort : map [* portgraph.ConcretePort ]* binding.Port {},
967+ },
968+ wantErr : "solveResult.Assignment is nil" ,
969+ },
970+ {
971+ desc : "nil solveResult" ,
972+ tb : & opb.Testbed {Duts : []* opb.Device {tDUT1 }},
973+ solveResult : nil ,
974+ wantErr : "solveResult is nil" ,
975+ },
976+ }
977+
978+ for _ , test := range tests {
979+ t .Run (test .desc , func (t * testing.T ) {
980+ _ , err := AssignmentToReservation (test .solveResult , test .tb )
981+ if err == nil || ! strings .Contains (err .Error (), test .wantErr ) {
982+ t .Errorf ("AssignmentToReservation() got err %v, want err containing %q" , err , test .wantErr )
983+ }
984+ })
985+ }
986+ }
0 commit comments