func commonTestStateDriverReadStateAfterUpdate(t *testing.T, d core.StateDriver) { state := &testState{IntField: 1234, StrField: "testString"} key := "testKeyReadUpdate" err := d.WriteState(key, state, json.Marshal) if err != nil { t.Fatalf("failed to write state. Error: %s", err) } state.StrField = "testStringUpdated" err = d.WriteState(key, state, json.Marshal) if err != nil { t.Fatalf("failed to update state. Error: %s", err) } readState := &testState{} err = d.ReadState(key, readState, json.Unmarshal) if err != nil { t.Fatalf("failed to read state. Error: %s", err) } if readState.IntField != state.IntField || readState.StrField != state.StrField { t.Fatalf("Read state didn't match state written. Wrote: %v Read: %v", state, readState) } }
func commonTestStateDriverWatchAllStateModify(t *testing.T, d core.StateDriver) { state := &testState{IntField: 1234, StrField: "testString"} modState := &testState{IntField: 5678, StrField: "modString"} baseKey := "modify" key := baseKey + "/testKeyWatchAll" err := d.WriteState(key, state, json.Marshal) if err != nil { t.Fatalf("failed to write state. Error: %s", err) } defer func() { d.ClearState(key) }() recvErr := make(chan error, 1) stateCh := make(chan core.WatchState, 1) timer := time.After(waitTimeout) go func(rsps chan core.WatchState, retErr chan error) { err := d.WatchAllState(baseKey, state, json.Unmarshal, stateCh) if err != nil { retErr <- err return } }(stateCh, recvErr) // trigger modify after a slight pause to ensure that events are not missed time.Sleep(time.Second) err = d.WriteState(key, modState, json.Marshal) if err != nil { t.Fatalf("failed to write state. Error: %s", err) } for_label: for { select { case watchState := <-stateCh: s := watchState.Curr.(*testState) if s.IntField != modState.IntField || s.StrField != modState.StrField { t.Fatalf("Watch state mismatch. Expctd: %+v, Rcvd: %+v", modState, s) } if watchState.Prev == nil { t.Fatalf("Received a modify event without previous state value set.") } s = watchState.Prev.(*testState) if s.IntField != state.IntField || s.StrField != state.StrField { t.Fatalf("Watch state mismatch. Expctd: %+v, Rcvd: %+v", state, s) } break for_label case err := <-recvErr: t.Fatalf("Watch failed. Error: %s", err) break for_label case <-timer: t.Fatalf("timed out waiting for events") break for_label } } }
func commonTestStateDriverWriteState(t *testing.T, d core.StateDriver) { state := &testState{IgnoredField: d, IntField: 1234, StrField: "testString"} key := "testKey" err := d.WriteState(key, state, json.Marshal) if err != nil { t.Fatalf("failed to write state. Error: %s", err) } }
func commonTestStateDriverReadStateAfterClear(t *testing.T, d core.StateDriver) { state := &testState{IntField: 1234, StrField: "testString"} key := "testKeyReadClear" err := d.WriteState(key, state, json.Marshal) if err != nil { t.Fatalf("failed to write state. Error: %s", err) } err = d.ClearState(key) if err != nil { t.Fatalf("failed to clear state. Error: %s", err) } readState := &testState{} err = d.ReadState(key, readState, json.Unmarshal) if err == nil { t.Fatalf("Able to read cleared state!. Key: %s, Value: %v", key, readState) } }