4 "git.curoverse.com/arvados.git/sdk/go/arvadosclient"
5 "git.curoverse.com/arvados.git/sdk/go/arvadostest"
21 // Gocheck boilerplate
22 func Test(t *testing.T) {
26 var _ = Suite(&TestSuite{})
27 var _ = Suite(&MockArvadosServerSuite{})
29 type TestSuite struct{}
30 type MockArvadosServerSuite struct{}
32 var initialArgs []string
34 func (s *TestSuite) SetUpSuite(c *C) {
36 arvadostest.StartAPI()
39 func (s *TestSuite) TearDownSuite(c *C) {
43 func (s *TestSuite) SetUpTest(c *C) {
44 args := []string{"crunch-dispatch-slurm"}
48 arv, err = arvadosclient.MakeArvadosClient()
50 c.Fatalf("Error making arvados client: %s", err)
54 func (s *TestSuite) TearDownTest(c *C) {
55 arvadostest.ResetEnv()
59 func (s *MockArvadosServerSuite) TearDownTest(c *C) {
60 arvadostest.ResetEnv()
63 func (s *TestSuite) Test_doMain(c *C) {
64 args := []string{"-poll-interval", "2", "-container-priority-poll-interval", "1", "-crunch-run-command", "echo"}
65 os.Args = append(os.Args, args...)
67 var sbatchCmdLine []string
68 var striggerCmdLine []string
71 defer func(orig func(string) *exec.Cmd) {
74 sbatchCmd = func(uuid string) *exec.Cmd {
75 sbatchCmdLine = sbatchFunc(uuid).Args
76 return exec.Command("echo", uuid)
79 // Override striggerCmd
80 defer func(orig func(jobid, containerUUID, finishCommand,
81 apiHost, apiToken, apiInsecure string) *exec.Cmd) {
84 striggerCmd = func(jobid, containerUUID, finishCommand, apiHost, apiToken, apiInsecure string) *exec.Cmd {
85 striggerCmdLine = striggerFunc(jobid, containerUUID, finishCommand,
86 apiHost, apiToken, apiInsecure).Args
88 time.Sleep(5 * time.Second)
89 arv.Update("containers", containerUUID,
91 "container": arvadosclient.Dict{"state": "Complete"}},
94 return exec.Command("echo", "strigger")
98 time.Sleep(8 * time.Second)
99 sigChan <- syscall.SIGINT
102 // There should be no queued containers now
103 params := arvadosclient.Dict{
104 "filters": [][]string{[]string{"state", "=", "Queued"}},
106 var containers ContainerList
107 err := arv.List("containers", params, &containers)
109 c.Check(len(containers.Items), Equals, 1)
114 c.Check(sbatchCmdLine, DeepEquals, []string{"sbatch", "--job-name=zzzzz-dz642-queuedcontainer", "--share", "--parsable"})
115 c.Check(striggerCmdLine, DeepEquals, []string{"strigger", "--set", "--jobid=zzzzz-dz642-queuedcontainer\n", "--fini",
116 "--program=/usr/bin/crunch-finish-slurm.sh " + os.Getenv("ARVADOS_API_HOST") + " 4axaw8zxe0qm22wa6urpp5nskcne8z88cvbupv653y1njyi05h 1 zzzzz-dz642-queuedcontainer"})
118 // There should be no queued containers now
119 err = arv.List("containers", params, &containers)
121 c.Check(len(containers.Items), Equals, 0)
123 // Previously "Queued" container should now be in "Complete" state
124 var container Container
125 err = arv.Get("containers", "zzzzz-dz642-queuedcontainer", nil, &container)
127 c.Check(container.State, Equals, "Complete")
130 func (s *MockArvadosServerSuite) Test_APIErrorGettingContainers(c *C) {
131 apiStubResponses := make(map[string]arvadostest.StubResponse)
132 apiStubResponses["/arvados/v1/containers"] = arvadostest.StubResponse{500, string(`{}`)}
134 testWithServerStub(c, apiStubResponses, "echo", "Error getting list of queued containers")
137 func testWithServerStub(c *C, apiStubResponses map[string]arvadostest.StubResponse, crunchCmd string, expected string) {
138 apiStub := arvadostest.ServerStub{apiStubResponses}
140 api := httptest.NewServer(&apiStub)
143 arv = arvadosclient.ArvadosClient{
145 ApiServer: api.URL[7:],
147 Client: &http.Client{Transport: &http.Transport{}},
151 tempfile, err := ioutil.TempFile(os.TempDir(), "temp-log-file")
153 defer os.Remove(tempfile.Name())
154 log.SetOutput(tempfile)
157 time.Sleep(2 * time.Second)
158 sigChan <- syscall.SIGTERM
161 runQueuedContainers(2, 1, crunchCmd, crunchCmd)
163 buf, _ := ioutil.ReadFile(tempfile.Name())
164 c.Check(strings.Contains(string(buf), expected), Equals, true)