// +build linux package libcontainer import "testing" func TestStateStatus(t *testing.T) { states := map[containerState]Status{ &stoppedState{}: Stopped, &runningState{}: Running, &restoredState{}: Running, &pausedState{}: Paused, &createdState{}: Created, } for s, status := range states { if s.status() != status { t.Fatalf("state returned %s but expected %s", s.status(), status) } } } func isStateTransitionError(err error) bool { _, ok := err.(*stateTransitionError) return ok } func TestStoppedStateTransition(t *testing.T) { s := &stoppedState{c: &linuxContainer{}} valid := []containerState{ &stoppedState{}, &runningState{}, &restoredState{}, } for _, v := range valid { if err := s.transition(v); err != nil { t.Fatal(err) } } err := s.transition(&pausedState{}) if err == nil { t.Fatal("transition to paused state should fail") } if !isStateTransitionError(err) { t.Fatal("expected stateTransitionError") } } func TestPausedStateTransition(t *testing.T) { s := &pausedState{c: &linuxContainer{}} valid := []containerState{ &pausedState{}, &runningState{}, &stoppedState{}, } for _, v := range valid { if err := s.transition(v); err != nil { t.Fatal(err) } } } func TestRestoredStateTransition(t *testing.T) { s := &restoredState{c: &linuxContainer{}} valid := []containerState{ &stoppedState{}, &runningState{}, } for _, v := range valid { if err := s.transition(v); err != nil { t.Fatal(err) } } err := s.transition(&createdState{}) if err == nil { t.Fatal("transition to created state should fail") } if !isStateTransitionError(err) { t.Fatal("expected stateTransitionError") } } func TestRunningStateTransition(t *testing.T) { s := &runningState{c: &linuxContainer{}} valid := []containerState{ &stoppedState{}, &pausedState{}, &runningState{}, } for _, v := range valid { if err := s.transition(v); err != nil { t.Fatal(err) } } err := s.transition(&createdState{}) if err == nil { t.Fatal("transition to created state should fail") } if !isStateTransitionError(err) { t.Fatal("expected stateTransitionError") } } func TestCreatedStateTransition(t *testing.T) { s := &createdState{c: &linuxContainer{}} valid := []containerState{ &stoppedState{}, &pausedState{}, &runningState{}, &createdState{}, } for _, v := range valid { if err := s.transition(v); err != nil { t.Fatal(err) } } }