@@ -3787,3 +3787,85 @@ func TestNetworkRenameValidation(t *testing.T) {
37873787
37883788 t .Log ("network rename validation works correctly" )
37893789}
3790+
3791+ // TestJoinBackboneRejected verifies that joining the backbone network (ID 0) is rejected.
3792+ func TestJoinBackboneRejected (t * testing.T ) {
3793+ t .Parallel ()
3794+ rc , _ , cleanup := startTestRegistryWithAdmin (t )
3795+ defer cleanup ()
3796+
3797+ nodeID , _ := registerTestNode (t , rc )
3798+
3799+ _ , err := rc .JoinNetwork (nodeID , 0 , "" , 0 , TestAdminToken )
3800+ if err == nil {
3801+ t .Fatal ("expected error when joining backbone network" )
3802+ }
3803+ if ! strings .Contains (err .Error (), "cannot" ) {
3804+ t .Errorf ("unexpected error: %v" , err )
3805+ }
3806+ t .Logf ("backbone join correctly rejected: %v" , err )
3807+ }
3808+
3809+ // TestMaxMembersValidation verifies that max_members rejects overflow, fractional, and out-of-range values.
3810+ func TestMaxMembersValidation (t * testing.T ) {
3811+ t .Parallel ()
3812+ rc , _ , cleanup := startTestRegistryWithAdmin (t )
3813+ defer cleanup ()
3814+
3815+ ownerID , ownerIdentity := registerTestNode (t , rc )
3816+ setClientSigner (rc , ownerIdentity )
3817+
3818+ resp , err := rc .CreateNetwork (ownerID , "maxmem-test" , "open" , "" , TestAdminToken , true )
3819+ if err != nil {
3820+ t .Fatalf ("create network: %v" , err )
3821+ }
3822+ netID := uint16 (resp ["network_id" ].(float64 ))
3823+
3824+ // Fractional max_members should fail
3825+ _ , err = rc .SetNetworkPolicy (netID , map [string ]interface {}{
3826+ "max_members" : 5.5 ,
3827+ }, TestAdminToken )
3828+ if err == nil {
3829+ t .Error ("expected error for fractional max_members" )
3830+ } else {
3831+ t .Logf ("fractional max_members rejected: %v" , err )
3832+ }
3833+
3834+ // Negative max_members should fail
3835+ _ , err = rc .SetNetworkPolicy (netID , map [string ]interface {}{
3836+ "max_members" : float64 (- 1 ),
3837+ }, TestAdminToken )
3838+ if err == nil {
3839+ t .Error ("expected error for negative max_members" )
3840+ } else {
3841+ t .Logf ("negative max_members rejected: %v" , err )
3842+ }
3843+
3844+ // Overflow max_members (>10000) should fail
3845+ _ , err = rc .SetNetworkPolicy (netID , map [string ]interface {}{
3846+ "max_members" : float64 (10001 ),
3847+ }, TestAdminToken )
3848+ if err == nil {
3849+ t .Error ("expected error for overflow max_members" )
3850+ } else {
3851+ t .Logf ("overflow max_members rejected: %v" , err )
3852+ }
3853+
3854+ // Valid max_members should succeed
3855+ _ , err = rc .SetNetworkPolicy (netID , map [string ]interface {}{
3856+ "max_members" : float64 (100 ),
3857+ }, TestAdminToken )
3858+ if err != nil {
3859+ t .Fatalf ("valid max_members should succeed: %v" , err )
3860+ }
3861+
3862+ // Zero max_members (unlimited) should succeed
3863+ _ , err = rc .SetNetworkPolicy (netID , map [string ]interface {}{
3864+ "max_members" : float64 (0 ),
3865+ }, TestAdminToken )
3866+ if err != nil {
3867+ t .Fatalf ("zero max_members (unlimited) should succeed: %v" , err )
3868+ }
3869+
3870+ t .Log ("max_members validation works correctly" )
3871+ }
0 commit comments