//See another version of this test in proto/extensions_test.go func TestGetExtensionStability(t *testing.T) { check := func(m *NoExtensionsMap) bool { ext1, err := proto.GetExtension(m, E_FieldB1) if err != nil { t.Fatalf("GetExtension() failed: %s", err) } ext2, err := proto.GetExtension(m, E_FieldB1) if err != nil { t.Fatalf("GetExtension() failed: %s", err) } return ext1.(*NinOptNative).Equal(ext2) } msg := &NoExtensionsMap{Field1: proto.Int64(2)} ext0 := &NinOptNative{Field1: proto.Float64(1)} if err := proto.SetExtension(msg, E_FieldB1, ext0); err != nil { t.Fatalf("Could not set ext1: %s", ext0) } if !check(msg) { t.Errorf("GetExtension() not stable before marshaling") } bb, err := proto.Marshal(msg) if err != nil { t.Fatalf("Marshal() failed: %s", err) } msg1 := &NoExtensionsMap{} err = proto.Unmarshal(bb, msg1) if err != nil { t.Fatalf("Unmarshal() failed: %s", err) } if !check(msg1) { t.Errorf("GetExtension() not stable after unmarshaling") } }
func TestGetExtensionStability(t *testing.T) { check := func(m *pb.MyMessage) bool { ext1, err := proto.GetExtension(m, pb.E_Ext_More) if err != nil { t.Fatalf("GetExtension() failed: %s", err) } ext2, err := proto.GetExtension(m, pb.E_Ext_More) if err != nil { t.Fatalf("GetExtension() failed: %s", err) } return ext1 == ext2 } msg := &pb.MyMessage{Count: proto.Int32(4)} ext0 := &pb.Ext{} if err := proto.SetExtension(msg, pb.E_Ext_More, ext0); err != nil { t.Fatalf("Could not set ext1: %s", ext0) } if !check(msg) { t.Errorf("GetExtension() not stable before marshaling") } bb, err := proto.Marshal(msg) if err != nil { t.Fatalf("Marshal() failed: %s", err) } msg1 := &pb.MyMessage{} err = proto.Unmarshal(bb, msg1) if err != nil { t.Fatalf("Unmarshal() failed: %s", err) } if !check(msg1) { t.Errorf("GetExtension() not stable after unmarshaling") } }
func check(t *testing.T, m extendable, fieldA float64, ext *proto.ExtensionDesc) { if !proto.HasExtension(m, ext) { t.Fatalf("expected extension to be set") } fieldA2Interface, err := proto.GetExtension(m, ext) if err != nil { panic(err) } fieldA2 := fieldA2Interface.(*float64) if fieldA != *fieldA2 { t.Fatalf("Expected %f got %f", fieldA, *fieldA2) } fieldA3Interface, err := proto.GetUnsafeExtension(m, ext.Field) if err != nil { panic(err) } fieldA3 := fieldA3Interface.(*float64) if fieldA != *fieldA3 { t.Fatalf("Expected %f got %f", fieldA, *fieldA3) } proto.ClearExtension(m, ext) if proto.HasExtension(m, ext) { t.Fatalf("expected extension to be cleared") } }
func (g *authenticatedWrapperGen) genServerStreamingMethod(s *descriptor.ServiceDescriptorProto, m *descriptor.MethodDescriptorProto) { g.gen.P(sigPrefix(s, m) + "r *" + getInputTypeName(m) + ", stream " + s.GetName() + "_" + m.GetName() + "Server) error {") authIntf, err := proto.GetExtension(m.Options, plugin.E_TlsAuthorization) if err != nil { g.gen.P(` panic("no authorization information in protobuf")`) g.gen.P(`}`) return } auth := authIntf.(*plugin.TLSAuthorization) if auth.Insecure != nil && *auth.Insecure { if len(auth.Roles) != 0 { panic("Roles and Insecure cannot both be specified") } g.gen.P(` return p.local.` + m.GetName() + `(r, stream)`) g.gen.P(`}`) return } g.gen.P(` if err := p.authorize(stream.Context(),` + genRoles(auth) + `); err != nil { return err } return p.local.` + m.GetName() + `(r, stream)`) g.gen.P("}") }
func GetMoreTags(field *google_protobuf.FieldDescriptorProto) *string { if field.Options != nil { v, err := proto.GetExtension(field.Options, E_Moretags) if err == nil && v.(*string) != nil { return (v.(*string)) } } return nil }
func GetEnumValueCustomName(field *google_protobuf.EnumValueDescriptorProto) string { if field.Options != nil { v, err := proto.GetExtension(field.Options, E_EnumvalueCustomname) if err == nil && v.(*string) != nil { return *(v.(*string)) } } return "" }
func GetCastKey(field *google_protobuf.FieldDescriptorProto) string { if field.Options != nil { v, err := proto.GetExtension(field.Options, E_Castkey) if err == nil && v.(*string) != nil { return *(v.(*string)) } } return "" }
func (fsm *storeFSM) applyCreateDataNodeCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_CreateDataNodeCommand_Command) v := ext.(*internal.CreateDataNodeCommand) other := fsm.data.Clone() other.CreateDataNode(v.GetHTTPAddr(), v.GetTCPAddr()) fsm.data = other return nil }
func (fsm *storeFSM) applyCreateDatabaseCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_CreateDatabaseCommand_Command) v := ext.(*internal.CreateDatabaseCommand) // Copy data and update. other := fsm.data.Clone() if err := other.CreateDatabase(v.GetName()); err != nil { return err } s := (*store)(fsm) if rpi := v.GetRetentionPolicy(); rpi != nil { if err := other.CreateRetentionPolicy(v.GetName(), &RetentionPolicyInfo{ Name: rpi.GetName(), ReplicaN: int(rpi.GetReplicaN()), Duration: time.Duration(rpi.GetDuration()), ShardGroupDuration: time.Duration(rpi.GetShardGroupDuration()), }); err != nil { if err == ErrRetentionPolicyExists { return ErrRetentionPolicyConflict } return err } // Set it as the default retention policy. if err := other.SetDefaultRetentionPolicy(v.GetName(), rpi.GetName()); err != nil { return err } } else if s.config.RetentionAutoCreate { // Read node count. // Retention policies must be fully replicated. replicaN := len(other.DataNodes) if replicaN > maxAutoCreatedRetentionPolicyReplicaN { replicaN = maxAutoCreatedRetentionPolicyReplicaN } else if replicaN < 1 { replicaN = 1 } // Create a retention policy. rpi := NewRetentionPolicyInfo(autoCreateRetentionPolicyName) rpi.ReplicaN = replicaN rpi.Duration = autoCreateRetentionPolicyPeriod if err := other.CreateRetentionPolicy(v.GetName(), rpi); err != nil { return err } // Set it as the default retention policy. if err := other.SetDefaultRetentionPolicy(v.GetName(), autoCreateRetentionPolicyName); err != nil { return err } } fsm.data = other return nil }
func (fsm *storeFSM) applySetDataCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_SetDataCommand_Command) v := ext.(*internal.SetDataCommand) // Overwrite data. fsm.data = &Data{} fsm.data.unmarshal(v.GetData()) return nil }
func TestExtensionsRoundTrip(t *testing.T) { msg := &pb.MyMessage{} ext1 := &pb.Ext{ Data: proto.String("hi"), } ext2 := &pb.Ext{ Data: proto.String("there"), } exists := proto.HasExtension(msg, pb.E_Ext_More) if exists { t.Error("Extension More present unexpectedly") } if err := proto.SetExtension(msg, pb.E_Ext_More, ext1); err != nil { t.Error(err) } if err := proto.SetExtension(msg, pb.E_Ext_More, ext2); err != nil { t.Error(err) } e, err := proto.GetExtension(msg, pb.E_Ext_More) if err != nil { t.Error(err) } x, ok := e.(*pb.Ext) if !ok { t.Errorf("e has type %T, expected testdata.Ext", e) } else if *x.Data != "there" { t.Errorf("SetExtension failed to overwrite, got %+v, not 'there'", x) } proto.ClearExtension(msg, pb.E_Ext_More) if _, err = proto.GetExtension(msg, pb.E_Ext_More); err != proto.ErrMissingExtension { t.Errorf("got %v, expected ErrMissingExtension", e) } if _, err := proto.GetExtension(msg, pb.E_X215); err == nil { t.Error("expected bad extension error, got nil") } if err := proto.SetExtension(msg, pb.E_X215, 12); err == nil { t.Error("expected extension err") } if err := proto.SetExtension(msg, pb.E_Ext_More, 12); err == nil { t.Error("expected some sort of type mismatch error, got nil") } }
func getCastType(field *descriptor.FieldDescriptorProto) (packageName string, typ string, err error) { if field.Options != nil { v, err := proto.GetExtension(field.Options, gogoproto.E_Casttype) if err == nil && v.(*string) != nil { ctype := *(v.(*string)) packageName, typ = splitCPackageType(ctype) return packageName, typ, nil } } return "", "", err }
func (fsm *storeFSM) applyDeleteDataNodeCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_DeleteDataNodeCommand_Command) v := ext.(*internal.DeleteDataNodeCommand) other := fsm.data.Clone() if err := other.DeleteDataNode(v.GetID()); err != nil { return err } fsm.data = other return nil }
func (fsm *storeFSM) applyUpdateUserCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_UpdateUserCommand_Command) v := ext.(*internal.UpdateUserCommand) // Copy data and update. other := fsm.data.Clone() if err := other.UpdateUser(v.GetName(), v.GetHash()); err != nil { return err } fsm.data = other return nil }
func (fsm *storeFSM) applySetAdminPrivilegeCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_SetAdminPrivilegeCommand_Command) v := ext.(*internal.SetAdminPrivilegeCommand) // Copy data and update. other := fsm.data.Clone() if err := other.SetAdminPrivilege(v.GetUsername(), v.GetAdmin()); err != nil { return err } fsm.data = other return nil }
func (fsm *storeFSM) applyDropContinuousQueryCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_DropContinuousQueryCommand_Command) v := ext.(*internal.DropContinuousQueryCommand) // Copy data and update. other := fsm.data.Clone() if err := other.DropContinuousQuery(v.GetDatabase(), v.GetName()); err != nil { return err } fsm.data = other return nil }
func (fsm *storeFSM) applyDropUserCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_DropUserCommand_Command) v := ext.(*internal.DropUserCommand) // Copy data and update. other := fsm.data.Clone() if err := other.DropUser(v.GetName()); err != nil { return err } fsm.data = other delete(fsm.authCache, v.GetName()) return nil }
func (fsm *storeFSM) applySetDefaultRetentionPolicyCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_SetDefaultRetentionPolicyCommand_Command) v := ext.(*internal.SetDefaultRetentionPolicyCommand) // Copy data and update. other := fsm.data.Clone() if err := other.SetDefaultRetentionPolicy(v.GetDatabase(), v.GetName()); err != nil { return err } fsm.data = other return nil }
func (fsm *storeFSM) applyDeleteShardGroupCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_DeleteShardGroupCommand_Command) v := ext.(*internal.DeleteShardGroupCommand) // Copy data and update. other := fsm.data.Clone() if err := other.DeleteShardGroup(v.GetDatabase(), v.GetPolicy(), v.GetShardGroupID()); err != nil { return err } fsm.data = other return nil }
func (fsm *storeFSM) applyCreateSubscriptionCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_CreateSubscriptionCommand_Command) v := ext.(*internal.CreateSubscriptionCommand) // Copy data and update. other := fsm.data.Clone() if err := other.CreateSubscription(v.GetDatabase(), v.GetRetentionPolicy(), v.GetName(), v.GetMode(), v.GetDestinations()); err != nil { return err } fsm.data = other return nil }
func (fsm *storeFSM) applyCreateDatabaseCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_CreateDatabaseCommand_Command) v := ext.(*internal.CreateDatabaseCommand) // Copy data and update. other := fsm.data.Clone() if err := other.CreateDatabase(v.GetName()); err != nil { return err } fsm.data = other return nil }
func (fsm *storeFSM) applySetMetaNodeCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_SetMetaNodeCommand_Command) v := ext.(*internal.SetMetaNodeCommand) other := fsm.data.Clone() other.SetMetaNode(v.GetHTTPAddr(), v.GetTCPAddr()) // If the cluster ID hasn't been set then use the command's random number. if other.ClusterID == 0 { other.ClusterID = uint64(v.GetRand()) } fsm.data = other return nil }
func FileHasBoolExtension(file *descriptor.FileDescriptorProto, extension *proto.ExtensionDesc) bool { if file.Options == nil { return false } value, err := proto.GetExtension(file.Options, extension) if err != nil { return false } if value == nil { return false } if value.(*bool) == nil { return false } return true }
func EnumHasBoolExtension(enum *descriptor.EnumDescriptorProto, extension *proto.ExtensionDesc) bool { if enum.Options == nil { return false } value, err := proto.GetExtension(enum.Options, extension) if err != nil { return false } if value == nil { return false } if value.(*bool) == nil { return false } return true }
func MessageHasBoolExtension(msg *descriptor.DescriptorProto, extension *proto.ExtensionDesc) bool { if msg.Options == nil { return false } value, err := proto.GetExtension(msg.Options, extension) if err != nil { return false } if value == nil { return false } if value.(*bool) == nil { return false } return true }
func (fsm *storeFSM) applyRemovePeerCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_RemovePeerCommand_Command) v := ext.(*internal.RemovePeerCommand) addr := v.GetAddr() // Only do this if you are the leader if fsm.raftState.isLeader() { //Remove that node from the peer fsm.logger.Printf("removing peer: %s", addr) if err := fsm.raftState.removePeer(addr); err != nil { fsm.logger.Printf("error removing peer: %s", err) } } return nil }
func (fsm *storeFSM) applyCreateNodeCommand(cmd *internal.Command, peers []string) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_CreateNodeCommand_Command) v := ext.(*internal.CreateNodeCommand) // Copy data and update. other := fsm.data.Clone() // CreateNode is a command from < 0.10.0 clusters. Every node in // those clusters would be a data node and only the nodes that are // in the list of peers would be meta nodes isMeta := false for _, p := range peers { if v.GetHost() == p { isMeta = true break } } if isMeta { if err := other.CreateMetaNode(v.GetHost(), v.GetHost()); err != nil { return err } } // Get the only meta node if len(other.MetaNodes) == 1 { metaNode := other.MetaNodes[0] if err := other.setDataNode(metaNode.ID, v.GetHost(), v.GetHost()); err != nil { return err } } else { if err := other.CreateDataNode(v.GetHost(), v.GetHost()); err != nil { return err } } // If the cluster ID hasn't been set then use the command's random number. if other.ClusterID == 0 { other.ClusterID = uint64(v.GetRand()) } fsm.data = other return nil }
func (fsm *storeFSM) applyCreateNodeCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_CreateNodeCommand_Command) v := ext.(*internal.CreateNodeCommand) // Copy data and update. other := fsm.data.Clone() if err := other.CreateNode(v.GetHost()); err != nil { return err } // If the cluster ID hasn't been set then use the command's random number. if other.ClusterID == 0 { other.ClusterID = uint64(v.GetRand()) } fsm.data = other return nil }
func (fsm *storeFSM) applyUpdateDataNodeCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_CreateNodeCommand_Command) v := ext.(*internal.UpdateDataNodeCommand) // Copy data and update. other := fsm.data.Clone() node := other.DataNode(v.GetID()) if node == nil { return ErrNodeNotFound } node.Host = v.GetHost() node.TCPHost = v.GetTCPHost() fsm.data = other return nil }
func (fsm *storeFSM) applyCreateDataNodeCommand(cmd *internal.Command) interface{} { ext, _ := proto.GetExtension(cmd, internal.E_CreateDataNodeCommand_Command) v := ext.(*internal.CreateDataNodeCommand) other := fsm.data.Clone() // Get the only meta node if len(other.MetaNodes) == 1 && len(other.DataNodes) == 0 { metaNode := other.MetaNodes[0] if err := other.setDataNode(metaNode.ID, v.GetHTTPAddr(), v.GetTCPAddr()); err != nil { return err } } else { other.CreateDataNode(v.GetHTTPAddr(), v.GetTCPAddr()) } fsm.data = other return nil }