def test_get_save_delete_state(self):
        dapr = DaprClient(f'localhost:{self.server_port}')
        key = "key_1"
        value = "value_1"
        options = StateOptions(
            consistency=Consistency.eventual,
            concurrency=Concurrency.first_write,
        )
        dapr.save_state(store_name="statestore",
                        key=key,
                        value=value,
                        options=options,
                        state_metadata={"capitalize": "1"})

        resp = dapr.get_state(store_name="statestore", key=key)
        self.assertEqual(resp.data, to_bytes(value.capitalize()))

        resp = dapr.get_state(store_name="statestore",
                              key=key,
                              state_metadata={"upper": "1"})
        self.assertEqual(resp.data, to_bytes(value.upper()))

        resp = dapr.get_state(store_name="statestore", key="NotValidKey")
        self.assertEqual(resp.data, b'')

        dapr.delete_state(store_name="statestore", key=key)
        resp = dapr.get_state(store_name="statestore", key=key)
        self.assertEqual(resp.data, b'')

        with self.assertRaises(Exception) as context:
            dapr.delete_state(store_name="statestore",
                              key=key,
                              state_metadata={"must_delete": "1"})
        print(context.exception)
        self.assertTrue('delete failed' in str(context.exception))
def execute_step(args_tuple):
    daprClient = args_tuple[0]
    thread_number = args_tuple[1]
    state_store = args_tuple[2]

    current_value = daprClient.get_state(store_name=state_store, key=key_name)
    etag = current_value.etag

    if thread_number == 0:
        etag = current_value.etag
    else:
        etag = 99999999

    value = f"ContentiousValue-{thread_number}"
    print(
        f"Thread-{thread_number}: {key_name} == null. New value: {value}",
        flush="True",
    )
    try:
        g = daprClient.save_state(
            store_name=state_store,
            key=key_name,
            value=value,
            etag=etag,
            options=StateOptions(consistency=Consistency.strong,
                                 concurrency=Concurrency.first_write),
        )
        h = daprClient.get_state(store_name=state_store, key=key_name)
        if value == str(h.data, 'utf8'):
            print(
                f"Wrote {{ {key_name}: {h.data} }} to DB at {datetime.now().isoformat()} with etag = {h.etag}",
                flush=True,
            )
        else:
            print(
                f"Failed to write due to contention. 'Winning' value == {h.data}"
            )
    except Exception as e:
        h = daprClient.get_state(store_name=state_store, key=key_name)
        print(
            f"Failed to write state from Thread-{thread_number} due to concurrency issue. Using stored value: {h.data}",
            flush=True,
        )
    def test_get_save_delete_state(self):
        dapr = DaprClient(f'localhost:{self.server_port}')
        key = "key_1"
        value = "value_1"
        options = StateOptions(
            consistency=Consistency.eventual,
            concurrency=Concurrency.first_write,
        )
        dapr.save_state(store_name="statestore",
                        key=key,
                        value=value,
                        options=options)
        resp = dapr.get_state(store_name="statestore", key=key)

        self.assertEqual(resp.data, to_bytes(value))

        resp = dapr.get_state(store_name="statestore", key="NotValidKey")
        self.assertEqual(resp.data, b'')

        dapr.delete_state(store_name="statestore", key=key)
        resp = dapr.get_state(store_name="statestore", key=key)
        self.assertEqual(resp.data, b'')