Exemple #1
0
def test_update_device_settings(monkeypatch):
    # set up config
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")

    # register a device with the server
    transmission.register_device(config)

    # get old settings ID
    old_settings_id = config.get("settings_id")

    # update a setting
    config.set("min_empty_space_in_bytes", 3)

    # call update settings on server
    settings_id = transmission.update_device_settings(config)

    # check that the settings ID is updated
    assert not settings_id == old_settings_id

    # check that the settings are up to date on the server
    response = requests.get("{}/devices/settings/{}".format(
        config.get("server"), settings_id))
    response_data = response.json()
    assert json.loads(
        response_data["properties"])["min_empty_space_in_bytes"] == 3

    # clean up server
    requests.delete("{}/devices/{}".format(config.get("server"),
                                           config.get("device_id")))
Exemple #2
0
def test_transmit_no_speaker(monkeypatch):
    # set up config
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")

    # register a device with the server
    transmission.register_device(config)

    # transmit data
    transmission.transmit({
        "some_feature1": 0,
        "some_feature2": 1
    }, None, config)

    # check that the data is on the server
    response = requests.get("{}/devices/{}/recordings".format(
        config.get("server"), config.get("device_id")))
    response_data = response.json()
    recording = requests.get("{}/recordings/{}".format(
        config.get("server"), response_data[0]["recordingId"]))
    recording_data = recording.json()
    assert len(response_data) == 1
    assert json.loads(recording_data["data"]) == {
        "some_feature1": 0,
        "some_feature2": 1
    }
    assert response_data[0]["speakerId"] == None

    # clean up server
    requests.delete("{}/devices/{}".format(config.get("server"),
                                           config.get("device_id")))
Exemple #3
0
def test_register_device_already_registered(monkeypatch):
    # set up config with a registed device ID
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")
    config.set("device_id", "SOME_ID")

    # call device registration
    transmission.register_device(config)

    # check that the device id has not changed
    assert config.get("device_id") == "SOME_ID"
Exemple #4
0
def test_check_for_updates(monkeypatch):
    # set up config
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")

    # multiprocessing objects
    semaphore = multiprocessing.Semaphore(config.get("num_cores"))
    event = multiprocessing.Event()
    event.set()
    lock = multiprocessing.Lock()

    # register a device with the server
    transmission.register_device(config)
    settings_dictionary = {config.get("settings_id"): config}

    # keep old settings id
    old_settings_id = config.get("settings_id")

    # simulate changing a setting on the server
    requests.put("{}/devices/{}/settings".format(config.get("server"),
                                                 config.get("device_id")),
                 data={
                     "settings":
                     json.dumps({
                         "stopRecordingThreshold": 25,
                         "daysToForgetSpeaker": 21
                     })
                 })

    # call check for updates
    transmission.check_for_updates(config, settings_dictionary, semaphore,
                                   event, lock)

    # check that settings were updated
    assert config.get("min_empty_space_in_bytes") == 25
    assert config.get("speaker_forget_interval") == datetime.timedelta(days=21)
    assert not config.get("settings_id") == old_settings_id
    assert len(settings_dictionary) == 2

    # check that settings dictionary was updated properly
    assert config.get("settings_id") in settings_dictionary
    assert old_settings_id in settings_dictionary
    assert settings_dictionary[old_settings_id].get(
        "min_empty_space_in_bytes") != 25
    assert settings_dictionary[old_settings_id].get(
        "speaker_forget_interval") != datetime.timedelta(days=21)
    assert settings_dictionary[config.get("settings_id")].get(
        "min_empty_space_in_bytes") == 25
    assert settings_dictionary[config.get("settings_id")].get(
        "speaker_forget_interval") == datetime.timedelta(days=21)

    # clean up server
    requests.delete("{}/devices/{}".format(config.get("server"),
                                           config.get("device_id")))
Exemple #5
0
def start_processes():
    ''' Starts all process of the program '''

    # initialize a multiprocessing Config object
    BaseManager.register('Config', settings.Config)
    config_manager = BaseManager()
    config_manager.start()
    config = config_manager.Config()

    # first make sure the device is registered on the server
    transmission.register_device(config)

    # speaker synchronization objects
    process_manager = Manager()
    speaker_dictionary = process_manager.dict(
        transmission.get_speakers(config))
    speaker_dictionary_lock = Lock()

    # settings configuration objects
    settings_update_event = Event()
    settings_update_event.set()
    threads_ready_to_update = Semaphore(config.get("num_cores"))
    settings_update_lock = Lock()
    settings_dictionary = process_manager.dict(
        {config.get("settings_id"): config})

    # file synchronization objects
    file_queue = Queue()  # thread-safe FIFO queue

    # ideally of the cores should run the record.recording process
    # and the other cores will run the analysis processes
    recording_process = Process(target=record.record,
                                args=(file_queue, config,
                                      threads_ready_to_update,
                                      settings_update_event))
    recording_process.start()
    analysis_processes = [
        Process(target=analyze_audio_files,
                args=(file_queue, speaker_dictionary, speaker_dictionary_lock,
                      config, settings_dictionary, threads_ready_to_update,
                      settings_update_event, settings_update_lock))
        for _ in range(config.get("num_cores") - 1)
    ]
    for process in analysis_processes:
        process.start()

    # block until the all processes exit (never, unless error)
    recording_process.join()
    for process in analysis_processes:
        process.join()
Exemple #6
0
def test_register_device(monkeypatch):
    # set up config
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")

    # call device registration
    transmission.register_device(config)

    # check that the device id was updated
    assert not config.get("device_id") == "None"
    assert not config.get("settings_id") == "None"

    # clean up server
    requests.delete("{}/devices/{}".format(config.get("server"),
                                           config.get("device_id")))
Exemple #7
0
def test_update_speaker(monkeypatch):
    # set up config
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")

    # register a device with the server
    transmission.register_device(config)

    # testing data
    mean = numpy.array([1, 2])
    covariance = numpy.array([[1, 2], [3, 4]])

    # register speaker
    speaker_id = transmission.register_speaker(config, mean, covariance)

    # check that speaker was registered
    response = requests.get("{}/speakers/{}".format(config.get("server"),
                                                    speaker_id))
    assert response.status_code == 200

    # update data
    new_mean = numpy.array([5, 6])
    new_covariance = numpy.array([[0, 1], [1, 0]])
    new_count = 5

    # call update speaker
    transmission.update_speaker(config, speaker_id, new_mean, new_covariance,
                                new_count)

    # check that the speaker was updated
    speakers = transmission.get_speakers(config)
    assert speaker_id in speakers
    assert (speakers[speaker_id]["mean"] == new_mean).all()
    assert (speakers[speaker_id]["covariance"] == new_covariance).all()
    assert speakers[speaker_id]["count"] == new_count
    assert type(speakers[speaker_id]["last_seen"]) == datetime.datetime

    # clean up server
    requests.delete("{}/speakers/{}".format(config.get("server"), speaker_id))
    requests.delete("{}/devices/{}".format(config.get("server"),
                                           config.get("device_id")))
Exemple #8
0
def test_transmit_speaker(monkeypatch):
    # set up config
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")

    # register a device with the server
    transmission.register_device(config)

    # testing speaker data
    mean = numpy.array([1, 2])
    covariance = numpy.array([[1, 2], [3, 4]])

    # register speaker
    speaker_id = transmission.register_speaker(config, mean, covariance)

    # transmit data
    transmission.transmit({
        "some_feature1": 0,
        "some_feature2": 1
    }, speaker_id, config)

    # check that the data is on the server
    response = requests.get("{}/devices/{}/recordings".format(
        config.get("server"), config.get("device_id")))
    response_data = response.json()
    recording = requests.get("{}/recordings/{}".format(
        config.get("server"), response_data[0]["recordingId"]))
    recording_data = recording.json()
    assert len(response_data) == 1
    assert json.loads(recording_data["data"]) == {
        "some_feature1": 0,
        "some_feature2": 1
    }
    assert response_data[0]["speakerId"] == speaker_id

    # clean up server
    requests.delete("{}/speakers/{}".format(config.get("server"), speaker_id))
    requests.delete("{}/devices/{}".format(config.get("server"),
                                           config.get("device_id")))
Exemple #9
0
def test_get_speakers(monkeypatch):
    # set up config
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")

    # register a device with the server
    transmission.register_device(config)

    # testing data
    means = [numpy.array([1, 2]), numpy.array([2, 3]), numpy.array([3, 4])]
    covariances = [
        numpy.array([[1, 2], [3, 4]]),
        numpy.array([[0, 0], [0, 0]]),
        numpy.array([[2, 3], [4, 5]])
    ]

    # register speakers
    ids = []
    for mean, covariance in zip(means, covariances):
        ids.append(transmission.register_speaker(config, mean, covariance))

    # call get speakers
    result = transmission.get_speakers(config)

    # check that proper result was returned
    assert set(result.keys()) == set(ids)
    for i in range(len(ids)):
        assert (result[ids[i]]["mean"] == means[i]).all()
        assert (result[ids[i]]["covariance"] == covariances[i]).all()
        assert result[ids[i]]["count"] == 1
        assert type(result[ids[i]]["last_seen"]) == datetime.datetime

    # clean up server
    for speaker_id in ids:
        requests.delete("{}/speakers/{}".format(config.get("server"),
                                                speaker_id))
    requests.delete("{}/devices/{}".format(config.get("server"),
                                           config.get("device_id")))
Exemple #10
0
def test_register_speaker(monkeypatch):
    # set up config
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")

    # register a device with the server
    transmission.register_device(config)

    # testing data
    audio_mean = numpy.array([1, 2])
    audio_covariance = numpy.array([[1, 2], [3, 4]])

    # call speaker registration
    result = transmission.register_speaker(config, audio_mean,
                                           audio_covariance)

    # check that valid speaker ID is returned
    assert type(result) == str

    # clean up server
    requests.delete("{}/speakers/{}".format(config.get("server"), result))
    requests.delete("{}/devices/{}".format(config.get("server"),
                                           config.get("device_id")))
Exemple #11
0
def test_delete_speaker(monkeypatch):
    # set up config
    config = settings.Config()
    monkeypatch.setattr(settings, "FILENAME", "test_temp.ini")

    # register a device with the server
    transmission.register_device(config)

    # testing data
    mean = numpy.array([1, 2])
    covariance = numpy.array([[1, 2], [3, 4]])

    # register speaker
    speaker_id = transmission.register_speaker(config, mean, covariance)

    # check that speaker was registered
    response = requests.get("{}/speakers/{}".format(config.get("server"),
                                                    speaker_id))
    assert response.status_code == 200

    # call delete speaker
    transmission.delete_speaker(config, speaker_id)

    # check that speaker is not returned in get_speakers
    speakers = transmission.get_speakers(config)
    assert speaker_id not in speakers

    # check that speaker still exists but is marked as inactive
    response = requests.get("{}/speakers/{}".format(config.get("server"),
                                                    speaker_id))
    response_data = response.json()
    assert json.loads(response_data["data"])["active"] == False

    # clean up server
    requests.delete("{}/devices/{}".format(config.get("server"),
                                           config.get("device_id")))