Skip to content

why not clear transition when ctx.Err != nil ? #115

Description

f.transition will retain when ctx.Err != nil happened, and the follow-up Event() invoke will always return InTransitionError?

transitionFunc := func(ctx context.Context, async bool) func() {
		return func() {
			if ctx.Err() != nil {
				if e.Err == nil {
					e.Err = ctx.Err()
				}
				return
			}
                        ......
		}
	}

I write a unit-test like this:

func TestCtxErr(t *testing.T) {
	ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond)
	defer cancel()

	fsm := NewFSM(
		"closed",
		Events{
			{Name: "open", Src: []string{"closed"}, Dst: "open"},
			{Name: "close", Src: []string{"open"}, Dst: "closed"},
		},
		Callbacks{},
	)

	time.Sleep(time.Millisecond * 2)

	err := fsm.Event(ctx, "open")
	t.Logf("after open err: %v", err)

	for i := 0; i < 2; i++ {
		err = fsm.Event(context.TODO(), "open")
		t.Logf("after open err: %v", err)

		err = fsm.Event(context.TODO(), "close")
		t.Logf("after close err: %v", err)

	}
}

and this it's result:

=== RUN   TestCtxErr
    fsm_test.go:1086: after open err: context deadline exceeded
    fsm_test.go:1090: after open err: event open inappropriate because previous transition did not complete
    fsm_test.go:1093: after close err: event close inappropriate because previous transition did not complete
    fsm_test.go:1090: after open err: event open inappropriate because previous transition did not complete
    fsm_test.go:1093: after close err: event close inappropriate because previous transition did not complete

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions