Module fl_server_core.tests¶
View Source
Sub-modules¶
- fl_server_core.tests.dummy
 - fl_server_core.tests.test_metric
 - fl_server_core.tests.test_model
 - fl_server_core.tests.test_training
 
Variables¶
Classes¶
Dummy¶
View Source
class Dummy:
    fake = Faker("en_US")
    _logger = getLogger("fl.server.core")
    @classmethod
    def create_model(cls, model_cls: Type[Model] = GlobalModel, **kwargs) -> GlobalModel:
        torchscript_model = torch.jit.script(torch.nn.Sequential(
            torch.nn.Linear(3, 1),
            torch.nn.Sigmoid()
        ))
        args = dict(
            name=f"{cls.fake.company()} Model",
            description=f"Model created for {cls.fake.catch_phrase()}.",
            round=0,
            weights=from_torch_module(torchscript_model),  # torchscript model
            input_shape=None if kwargs.__contains__("weights") else [None, 3],
        )
        args.update(kwargs)
        if "owner" not in args:
            args["owner"] = cls.create_user()
        model = model_cls.objects.create(**args)
        cls._logger.debug(f"Creating Dummy Model with id {model.id}")
        return model
    @classmethod
    def create_model_update(cls, **kwargs) -> LocalModel:
        args = dict(
            round=1,
            weights=from_torch_module(torch.jit.script(torch.nn.Sequential(
                torch.nn.Linear(3, 1),
                torch.nn.Sigmoid()
            ))),
            sample_size=10,
        )
        args.update(kwargs)
        args["base_model"] = args["base_model"] if args.__contains__("base_model") else cls.create_model()
        args["owner"] = args["owner"] if args.__contains__("owner") else cls.create_client()
        model = LocalModel.objects.create(**args)
        cls._logger.debug(f"Creating Dummy Model Update with id {model.id}")
        return model
    @classmethod
    def create_broken_model(cls, **kwargs):
        args = dict(weights=pickle.dumps("I am not a torch.nn.Module!"))
        args.update(kwargs)
        return cls.create_model(**args)
    @classmethod
    def create_training(cls, **kwargs):
        args = dict(
            state=TrainingState.INITIAL,
            target_num_updates=0,
            uncertainty_method=UncertaintyMethod.NONE,
            aggregation_method=AggregationMethod.FED_AVG,
        )
        args.update(kwargs)
        if args.__contains__("actor"):
            model_kwargs = {"owner": args["actor"]}
        else:
            args["actor"] = cls.create_actor()
            model_kwargs = {}
        args["model"] = args["model"] if args.__contains__("model") else cls.create_model(**model_kwargs)
        participants = args.pop("participants", [cls.create_client(), cls.create_client()])
        training = Training.objects.create(**args)
        cls._logger.debug(f"Creating Dummy Training with id {training.id}")
        for participant in participants:
            training.participants.add(participant)
        training.save()
        return training
    @classmethod
    def _create_user(cls, **kwargs) -> User:
        user = User.objects.create(**kwargs)
        user.set_password(kwargs["password"])
        user.save()
        cls._logger.debug(f"Creating Dummy User with id {user.id}")
        return user
    @classmethod
    def create_user(cls, **kwargs):
        args = dict(
            message_endpoint="https://" + cls.fake.safe_email().replace("@", "."),
            actor=False,
            client=False,
            username=cls.fake.user_name(),
            first_name=cls.fake.first_name(),
            last_name=cls.fake.last_name(),
            email=cls.fake.safe_email(),
            password="secret",
        )
        args.update(kwargs)
        return cls._create_user(**args)
    @classmethod
    def create_actor(cls, **kwargs):
        kwargs["actor"] = True
        kwargs["client"] = False
        return cls.create_user(**kwargs)
    @classmethod
    def create_client(cls, **kwargs):
        kwargs["actor"] = False
        kwargs["client"] = True
        return cls.create_user(**kwargs)
    @classmethod
    def create_user_and_authenticate(cls, client: Client, **kwargs):
        args = dict(
            username=cls.fake.user_name(),
            password="secret",
        )
        args.update(kwargs)
        credentials = base64.b64encode(
            f'{args["username"]}:{args["password"]}'.encode("utf-8")
        ).decode("utf-8")
        client.defaults["HTTP_AUTHORIZATION"] = "Basic " + credentials
        return cls._create_user(**args)
    @classmethod
    def create_group(cls, **kwargs):
        args = dict(
            name=cls.fake.catch_phrase(),
        )
        args.update(kwargs)
        group = Group.objects.create(**args)
        cls._logger.debug(f"Creating Dummy Group with id {group.id}")
        return group
    @classmethod
    def create_metric(cls, **kwargs):
        epoch = random.randint(0, 100)
        args = dict(
            identifier=str(uuid4()).split("-")[0],
            key="NLLoss",
            step=epoch,
        )
        args.update(kwargs)
        if not args.__contains__("value_float") and not args.__contains__("value_binary"):
            args["value_float"] = 27.354/(epoch+1) + random.randint(0, 100) / 100
        args["model"] = args["model"] if args.__contains__("model") else cls.create_model()
        args["reporter"] = args["reporter"] if args.__contains__("reporter") else cls.create_client()
        metric = Metric.objects.create(**args)
        cls._logger.debug(f"Creating Dummy Metric with id {metric.id}")
        return metric
Class variables¶
Static methods¶
create_actor¶
View Source
create_broken_model¶
View Source
create_client¶
View Source
create_group¶
View Source
create_metric¶
View Source
    @classmethod
    def create_metric(cls, **kwargs):
        epoch = random.randint(0, 100)
        args = dict(
            identifier=str(uuid4()).split("-")[0],
            key="NLLoss",
            step=epoch,
        )
        args.update(kwargs)
        if not args.__contains__("value_float") and not args.__contains__("value_binary"):
            args["value_float"] = 27.354/(epoch+1) + random.randint(0, 100) / 100
        args["model"] = args["model"] if args.__contains__("model") else cls.create_model()
        args["reporter"] = args["reporter"] if args.__contains__("reporter") else cls.create_client()
        metric = Metric.objects.create(**args)
        cls._logger.debug(f"Creating Dummy Metric with id {metric.id}")
        return metric
create_model¶
def create_model(
    model_cls: Type[fl_server_core.models.model.Model] = <class 'fl_server_core.models.model.GlobalModel'>,
    **kwargs
) -> fl_server_core.models.model.GlobalModel
View Source
    @classmethod
    def create_model(cls, model_cls: Type[Model] = GlobalModel, **kwargs) -> GlobalModel:
        torchscript_model = torch.jit.script(torch.nn.Sequential(
            torch.nn.Linear(3, 1),
            torch.nn.Sigmoid()
        ))
        args = dict(
            name=f"{cls.fake.company()} Model",
            description=f"Model created for {cls.fake.catch_phrase()}.",
            round=0,
            weights=from_torch_module(torchscript_model),  # torchscript model
            input_shape=None if kwargs.__contains__("weights") else [None, 3],
        )
        args.update(kwargs)
        if "owner" not in args:
            args["owner"] = cls.create_user()
        model = model_cls.objects.create(**args)
        cls._logger.debug(f"Creating Dummy Model with id {model.id}")
        return model
create_model_update¶
View Source
    @classmethod
    def create_model_update(cls, **kwargs) -> LocalModel:
        args = dict(
            round=1,
            weights=from_torch_module(torch.jit.script(torch.nn.Sequential(
                torch.nn.Linear(3, 1),
                torch.nn.Sigmoid()
            ))),
            sample_size=10,
        )
        args.update(kwargs)
        args["base_model"] = args["base_model"] if args.__contains__("base_model") else cls.create_model()
        args["owner"] = args["owner"] if args.__contains__("owner") else cls.create_client()
        model = LocalModel.objects.create(**args)
        cls._logger.debug(f"Creating Dummy Model Update with id {model.id}")
        return model
create_training¶
View Source
    @classmethod
    def create_training(cls, **kwargs):
        args = dict(
            state=TrainingState.INITIAL,
            target_num_updates=0,
            uncertainty_method=UncertaintyMethod.NONE,
            aggregation_method=AggregationMethod.FED_AVG,
        )
        args.update(kwargs)
        if args.__contains__("actor"):
            model_kwargs = {"owner": args["actor"]}
        else:
            args["actor"] = cls.create_actor()
            model_kwargs = {}
        args["model"] = args["model"] if args.__contains__("model") else cls.create_model(**model_kwargs)
        participants = args.pop("participants", [cls.create_client(), cls.create_client()])
        training = Training.objects.create(**args)
        cls._logger.debug(f"Creating Dummy Training with id {training.id}")
        for participant in participants:
            training.participants.add(participant)
        training.save()
        return training
create_user¶
View Source
    @classmethod
    def create_user(cls, **kwargs):
        args = dict(
            message_endpoint="https://" + cls.fake.safe_email().replace("@", "."),
            actor=False,
            client=False,
            username=cls.fake.user_name(),
            first_name=cls.fake.first_name(),
            last_name=cls.fake.last_name(),
            email=cls.fake.safe_email(),
            password="secret",
        )
        args.update(kwargs)
        return cls._create_user(**args)
create_user_and_authenticate¶
View Source
    @classmethod
    def create_user_and_authenticate(cls, client: Client, **kwargs):
        args = dict(
            username=cls.fake.user_name(),
            password="secret",
        )
        args.update(kwargs)
        credentials = base64.b64encode(
            f'{args["username"]}:{args["password"]}'.encode("utf-8")
        ).decode("utf-8")
        client.defaults["HTTP_AUTHORIZATION"] = "Basic " + credentials
        return cls._create_user(**args)