github.com/aporeto-inc/trireme-lib@v10.358.0+incompatible/monitor/internal/docker/monitor_test.go (about) 1 // +build linux 2 3 package dockermonitor 4 5 import ( 6 "context" 7 "errors" 8 "reflect" 9 "sync" 10 "testing" 11 "time" 12 13 types "github.com/docker/docker/api/types" 14 15 "github.com/docker/docker/api/types/container" 16 "github.com/docker/docker/api/types/events" 17 "github.com/golang/mock/gomock" 18 . "github.com/smartystreets/goconvey/convey" 19 "go.aporeto.io/enforcerd/trireme-lib/collector" 20 tevents "go.aporeto.io/enforcerd/trireme-lib/common" 21 "go.aporeto.io/enforcerd/trireme-lib/monitor/config" 22 "go.aporeto.io/enforcerd/trireme-lib/monitor/extractors" 23 "go.aporeto.io/enforcerd/trireme-lib/monitor/internal/docker/mockdocker" 24 "go.aporeto.io/enforcerd/trireme-lib/policy/mockpolicy" 25 "go.aporeto.io/enforcerd/trireme-lib/utils/cgnetcls/mockcgnetcls" 26 ) 27 28 var ( 29 testDockerMetadataExtractor extractors.DockerMetadataExtractor 30 ID string 31 ) 32 33 func init() { 34 ID = "74cc486f9ec3256d7bee789853ce05510167c7daf893f90a7577cdcba259d063" 35 } 36 37 func eventCollector() collector.EventCollector { 38 newEvent := &collector.DefaultCollector{} 39 return newEvent 40 } 41 42 func initTestDockerInfo(id string, nwmode container.NetworkMode, state bool) *types.ContainerJSON { 43 var testInfoBase types.ContainerJSON 44 var testInfo types.ContainerJSONBase 45 var testConfig container.Config 46 var testNetwork types.NetworkSettings 47 var testDefaultNW types.DefaultNetworkSettings 48 var testContainer types.ContainerState 49 var testHostConfig container.HostConfig 50 51 m := make(map[string]string) 52 m["role"] = "client" 53 m["vendor"] = "CentOS" 54 m["$id"] = "598a35a60f79af0001b52ef5" 55 m["$namespace"] = "/sibicentos" 56 m["build-date"] = "20170801" 57 m["license"] = "GPLv2" 58 m["name"] = "CentOS Base Image" 59 60 testDefaultNW.IPAddress = "172.17.0.2" 61 62 testNetwork.DefaultNetworkSettings = testDefaultNW 63 64 testConfig.Image = "centos" 65 testConfig.Labels = m 66 67 testInfo.Name = "/priceless_rosalind" 68 testInfo.State = &testContainer 69 testInfo.HostConfig = &testHostConfig 70 71 testContainer.Pid = 4912 72 testContainer.Running = state 73 74 testHostConfig.NetworkMode = nwmode 75 76 testInfoBase.NetworkSettings = &testNetwork 77 testInfoBase.ContainerJSONBase = &testInfo 78 testInfoBase.Config = &testConfig 79 testInfoBase.ID = id 80 testInfoBase.Config.Labels["storedTags"] = "$id=5a3b4e903653d4000133254f,$namespace=/test" 81 82 return &testInfoBase 83 } 84 85 func initTestMessage(id string) *events.Message { 86 var testMessage events.Message 87 88 testMessage.ID = id 89 90 return &testMessage 91 } 92 93 func defaultContainer(host bool) types.ContainerJSON { 94 95 networkMode := "bridge" 96 if host { 97 networkMode = "host" 98 } 99 c := types.ContainerJSON{ 100 ContainerJSONBase: &types.ContainerJSONBase{ 101 ID: ID, 102 State: &types.ContainerState{ 103 Running: true, 104 Paused: false, 105 }, 106 HostConfig: &container.HostConfig{ 107 NetworkMode: container.NetworkMode(networkMode), 108 }, 109 }, 110 Mounts: nil, 111 Config: &container.Config{ 112 Labels: map[string]string{"app": "web"}, 113 }, 114 NetworkSettings: &types.NetworkSettings{ 115 DefaultNetworkSettings: types.DefaultNetworkSettings{ 116 IPAddress: "172.17.0.1", 117 }, 118 }, 119 } 120 121 return c 122 } 123 124 func TestNewDockerMonitor(t *testing.T) { 125 126 Convey("When I try to initialize a new docker monitor", t, func() { 127 dm := New(context.Background()) 128 err := dm.SetupConfig(nil, &Config{ 129 EventMetadataExtractor: testDockerMetadataExtractor, 130 }) 131 So(err, ShouldBeNil) 132 133 Convey("Then docker monitor should not be nil", func() { 134 So(dm, ShouldNotBeNil) 135 }) 136 }) 137 } 138 139 func TestContextIDFromDockerID(t *testing.T) { 140 Convey("When I try to retrieve contextID from dockerID", t, func() { 141 cID, err := puIDFromDockerID(ID) 142 cID1 := "74cc486f9ec3" 143 144 Convey("Then contextID should match and I should not get any error", func() { 145 So(cID, ShouldEqual, cID1) 146 So(err, ShouldBeNil) 147 }) 148 }) 149 150 Convey("When I try to retrieve contextID when dockerID length less than 12", t, func() { 151 cID, err := puIDFromDockerID("6f47830f64") 152 153 Convey("Then I should get error", func() { 154 So(cID, ShouldEqual, "") 155 So(err, ShouldResemble, errors.New("unable to generate context id: dockerid smaller than 12 characters: 6f47830f64")) 156 }) 157 }) 158 159 Convey("When I try to retrieve contextID when no dockerID given", t, func() { 160 cID, err := puIDFromDockerID("") 161 162 Convey("Then I should get error", func() { 163 So(cID, ShouldEqual, "") 164 So(err, ShouldResemble, errors.New("unable to generate context id: empty docker id")) 165 }) 166 }) 167 } 168 169 func TestDefaultDockerMetadataExtractor(t *testing.T) { 170 Convey("When I try to extract metadata from default docker container", t, func() { 171 puR, err := extractors.DefaultMetadataExtractor(initTestDockerInfo(ID, "default", false)) 172 173 Convey("Then I should not get any error", func() { 174 So(puR, ShouldNotBeNil) 175 So(err, ShouldBeNil) 176 }) 177 }) 178 179 Convey("When I try to extract metadata from host docker container", t, func() { 180 puR, err := extractors.DefaultMetadataExtractor(initTestDockerInfo(ID, "host", false)) 181 182 Convey("Then I should not get any error", func() { 183 So(puR, ShouldNotBeNil) 184 So(err, ShouldBeNil) 185 }) 186 }) 187 } 188 189 func setupDockerMonitor(ctrl *gomock.Controller) (*DockerMonitor, *mockpolicy.MockResolver) { 190 191 dm := New(context.Background()) 192 mockPolicy := mockpolicy.NewMockResolver(ctrl) 193 194 dm.SetupHandlers(&config.ProcessorConfig{ 195 Collector: eventCollector(), 196 Policy: mockPolicy, 197 ResyncLock: &sync.RWMutex{}, 198 }) 199 err := dm.SetupConfig(nil, &Config{ 200 EventMetadataExtractor: testDockerMetadataExtractor, 201 }) 202 So(err, ShouldBeNil) 203 204 mockDocker := mockdocker.NewMockCommonAPIClient(ctrl) 205 dm.setDockerClient(mockDocker) 206 207 // ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) 208 // defer cancel() 209 // // mockDocker.EXPECT().Ping(gomock.Any()).Return(types.Ping{}, nil) 210 211 // err = dm.Run(ctx) 212 // err = dm.waitForDockerDaemon(ctx) 213 So(err, ShouldBeNil) 214 return dm, mockPolicy 215 } 216 217 func TestStopDockerContainer(t *testing.T) { 218 ctrl := gomock.NewController(t) 219 defer ctrl.Finish() 220 221 Convey("When I try to initialize a new docker monitor", t, func() { 222 223 dm, mockPU := setupDockerMonitor(ctrl) 224 Convey("Then docker monitor should not be nil", func() { 225 So(dm, ShouldNotBeNil) 226 So(dm, ShouldNotBeNil) 227 }) 228 229 Convey("When I try to stop a container", func() { 230 mockPU.EXPECT().HandlePUEvent(gomock.Any(), "74cc486f9ec3", tevents.EventStop, gomock.Any()).Times(1).Return(nil) 231 dm.SetupHandlers(&config.ProcessorConfig{ 232 Collector: eventCollector(), 233 Policy: mockPU, 234 ResyncLock: &sync.RWMutex{}, 235 }) 236 237 err := dm.handleDieEvent(context.Background(), &events.Message{ID: "74cc486f9ec3"}) 238 239 Convey("Then I should not get any error", func() { 240 So(err, ShouldBeNil) 241 }) 242 }) 243 }) 244 } 245 246 func TestHandleCreateEvent(t *testing.T) { 247 ctrl := gomock.NewController(t) 248 defer ctrl.Finish() 249 250 Convey("When I try to initialize a new docker monitor", t, func() { 251 252 dmi, mockPU := setupDockerMonitor(ctrl) 253 Convey("Then docker monitor should not be nil", func() { 254 So(dmi, ShouldNotBeNil) 255 }) 256 257 Convey("When I try to handle create event", func() { 258 dmi.SetupHandlers(&config.ProcessorConfig{ 259 Collector: eventCollector(), 260 Policy: mockPU, 261 ResyncLock: &sync.RWMutex{}, 262 }) 263 264 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 265 ContainerInspect(gomock.Any(), ID).Return(defaultContainer(false), nil) 266 mockPU.EXPECT(). 267 HandlePUEvent(gomock.Any(), ID[:12], tevents.EventCreate, gomock.Any()).Times(1).Return(nil) 268 269 err := dmi.handleCreateEvent(context.Background(), initTestMessage(ID)) 270 271 Convey("Then I should not get any error", func() { 272 So(err, ShouldBeNil) 273 }) 274 }) 275 276 Convey("When I try to handle create event with failed container ", func() { 277 dmi.SetupHandlers(&config.ProcessorConfig{ 278 Collector: eventCollector(), 279 Policy: mockPU, 280 ResyncLock: &sync.RWMutex{}, 281 }) 282 283 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 284 ContainerInspect(gomock.Any(), ID).Return(defaultContainer(false), errors.New("error1")) 285 err := dmi.handleCreateEvent(context.Background(), initTestMessage(ID)) 286 287 Convey("Then I should get error", func() { 288 So(err, ShouldResemble, errors.New("unable to read container information: container 74cc486f9ec3256d7bee789853ce05510167c7daf893f90a7577cdcba259d063 kept alive per policy: error1")) 289 }) 290 }) 291 292 Convey("When I try to handle create event with no ID given", func() { 293 err := dmi.handleCreateEvent(context.Background(), initTestMessage("")) 294 295 Convey("Then I should get error", func() { 296 So(err, ShouldResemble, errors.New("unable to generate context id: empty docker id")) 297 }) 298 }) 299 }) 300 } 301 302 func TestHandleStartEvent(t *testing.T) { 303 ctrl := gomock.NewController(t) 304 defer ctrl.Finish() 305 306 Convey("When I try to initialize a new docker monitor", t, func() { 307 308 dmi, mockPU := setupDockerMonitor(ctrl) 309 Convey("Then docker monitor should not be nil", func() { 310 So(dmi, ShouldNotBeNil) 311 }) 312 313 dmi.SetupHandlers(&config.ProcessorConfig{ 314 Collector: eventCollector(), 315 Policy: mockPU, 316 ResyncLock: &sync.RWMutex{}, 317 }) 318 319 Convey("When I try to handle start event with a valid container", func() { 320 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 321 ContainerInspect(gomock.Any(), ID).Return(defaultContainer(false), nil) 322 mockPU.EXPECT(). 323 HandlePUEvent(gomock.Any(), ID[:12], tevents.EventStart, gomock.Any()).Times(1).Return(nil) 324 325 err := dmi.handleStartEvent(context.Background(), initTestMessage(ID)) 326 Convey("Then I should get no errors", func() { 327 So(err, ShouldBeNil) 328 }) 329 }) 330 331 Convey("When I try to handle start event with a bad container", func() { 332 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 333 ContainerInspect(gomock.Any(), ID).Return(defaultContainer(false), errors.New("error")) 334 335 err := dmi.handleStartEvent(context.Background(), initTestMessage(ID)) 336 337 Convey("Then I should get error", func() { 338 So(err, ShouldNotBeNil) 339 }) 340 }) 341 342 Convey("When I try to handle start event with no ID given", func() { 343 c := defaultContainer(false) 344 c.ID = "" 345 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 346 ContainerInspect(gomock.Any(), gomock.Any()).Return(c, nil) 347 348 err := dmi.handleStartEvent(context.Background(), initTestMessage("")) 349 350 Convey("Then I should get error", func() { 351 So(err, ShouldNotBeNil) 352 }) 353 }) 354 355 Convey("When I try to handle start event with a valid container and policy fails", func() { 356 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 357 ContainerInspect(gomock.Any(), ID).Return(defaultContainer(false), nil) 358 mockPU.EXPECT(). 359 HandlePUEvent(gomock.Any(), ID[:12], tevents.EventStart, gomock.Any()).Times(1).Return(errors.New("policy")) 360 361 err := dmi.handleStartEvent(context.Background(), initTestMessage(ID)) 362 Convey("Then I should an error", func() { 363 So(err, ShouldNotBeNil) 364 }) 365 }) 366 }) 367 } 368 369 func TestHandleDieEvent(t *testing.T) { 370 ctrl := gomock.NewController(t) 371 defer ctrl.Finish() 372 373 Convey("When I try to initialize a new docker monitor", t, func() { 374 375 dmi, mockPU := setupDockerMonitor(ctrl) 376 Convey("Then docker monitor should not be nil", func() { 377 So(dmi, ShouldNotBeNil) 378 }) 379 380 Convey("When I try to handle die event", func() { 381 mockPU.EXPECT().HandlePUEvent(gomock.Any(), "74cc486f9ec3", tevents.EventStop, gomock.Any()).Times(1).Return(nil) 382 dmi.SetupHandlers(&config.ProcessorConfig{ 383 Collector: eventCollector(), 384 Policy: mockPU, 385 ResyncLock: &sync.RWMutex{}, 386 }) 387 err := dmi.handleDieEvent(context.Background(), initTestMessage(ID)) 388 389 Convey("Then I should not get any error", func() { 390 So(err, ShouldBeNil) 391 }) 392 }) 393 }) 394 } 395 396 func TestHandleDestroyEvent(t *testing.T) { 397 ctrl := gomock.NewController(t) 398 defer ctrl.Finish() 399 400 Convey("When I try to initialize a new docker monitor", t, func() { 401 402 dmi, mockPU := setupDockerMonitor(ctrl) 403 404 Convey("Then docker monitor should not be nil", func() { 405 So(dmi, ShouldNotBeNil) 406 }) 407 408 mockCG := mockcgnetcls.NewMockCgroupnetcls(ctrl) 409 410 Convey("When I try to handle destroy event", func() { 411 mockPU.EXPECT().HandlePUEvent(gomock.Any(), "74cc486f9ec3", tevents.EventDestroy, gomock.Any()).Times(1).Return(nil) 412 mockCG.EXPECT().DeleteCgroup("74cc486f9ec3").Times(1).Return(nil) 413 dmi.SetupHandlers(&config.ProcessorConfig{ 414 Collector: eventCollector(), 415 Policy: mockPU, 416 ResyncLock: &sync.RWMutex{}, 417 }) 418 dmi.netcls = mockCG 419 err := dmi.handleDestroyEvent(context.Background(), initTestMessage(ID)) 420 421 Convey("Then I should not get any error", func() { 422 So(err, ShouldBeNil) 423 }) 424 }) 425 426 Convey("When I try to handle destroy event with no docker ID", func() { 427 err := dmi.handleDestroyEvent(context.Background(), initTestMessage("")) 428 429 Convey("Then I should get error", func() { 430 So(err, ShouldResemble, errors.New("unable to generate context id: empty docker id")) 431 }) 432 }) 433 }) 434 } 435 436 func TestHandlePauseEvent(t *testing.T) { 437 ctrl := gomock.NewController(t) 438 defer ctrl.Finish() 439 440 Convey("When I try to initialize a new docker monitor", t, func() { 441 442 dmi, mockPU := setupDockerMonitor(ctrl) 443 444 Convey("Then docker monitor should not be nil", func() { 445 So(dmi, ShouldNotBeNil) 446 }) 447 448 Convey("When I try to handle pause event", func() { 449 mockPU.EXPECT().HandlePUEvent(gomock.Any(), "74cc486f9ec3", tevents.EventPause, gomock.Any()).Times(1).Return(nil) 450 dmi.SetupHandlers(&config.ProcessorConfig{ 451 Collector: eventCollector(), 452 Policy: mockPU, 453 ResyncLock: &sync.RWMutex{}, 454 }) 455 err := dmi.handlePauseEvent(context.Background(), initTestMessage(ID)) 456 457 Convey("Then I should not get any error", func() { 458 So(err, ShouldBeNil) 459 }) 460 }) 461 462 Convey("When I try to handle pause event with no ID", func() { 463 err := dmi.handlePauseEvent(context.Background(), initTestMessage("")) 464 465 Convey("Then I should get error", func() { 466 So(err, ShouldResemble, errors.New("unable to generate context id: empty docker id")) 467 }) 468 }) 469 }) 470 } 471 472 func TestHandleUnpauseEvent(t *testing.T) { 473 ctrl := gomock.NewController(t) 474 defer ctrl.Finish() 475 476 Convey("When I try to initialize a new docker monitor", t, func() { 477 478 dmi, mockPU := setupDockerMonitor(ctrl) 479 480 Convey("Then docker monitor should not be nil", func() { 481 So(dmi, ShouldNotBeNil) 482 }) 483 484 Convey("When I try to handle unpause event", func() { 485 mockPU.EXPECT().HandlePUEvent(gomock.Any(), "74cc486f9ec3", tevents.EventUnpause, gomock.Any()).Times(1).Return(nil) 486 dmi.SetupHandlers(&config.ProcessorConfig{ 487 Collector: eventCollector(), 488 Policy: mockPU, 489 ResyncLock: &sync.RWMutex{}, 490 }) 491 err := dmi.handleUnpauseEvent(context.Background(), initTestMessage(ID)) 492 493 Convey("Then I should not get any error", func() { 494 So(err, ShouldBeNil) 495 }) 496 }) 497 498 Convey("When I try to handle unpause event with no ID", func() { 499 err := dmi.handleUnpauseEvent(context.Background(), initTestMessage("")) 500 501 Convey("Then I should get error", func() { 502 So(err, ShouldResemble, errors.New("unable to generate context id: empty docker id")) 503 }) 504 }) 505 }) 506 } 507 508 func TestExtractMetadata(t *testing.T) { 509 ctrl := gomock.NewController(t) 510 defer ctrl.Finish() 511 512 Convey("When I try to initialize a new docker monitor", t, func() { 513 514 dmi, _ := setupDockerMonitor(ctrl) 515 516 Convey("Then docker monitor should not be nil", func() { 517 So(dmi, ShouldNotBeNil) 518 }) 519 520 Convey("When I try to call extractmetadata with nil docker info", func() { 521 puR, err := dmi.extractMetadata(nil) 522 523 Convey("I should get error", func() { 524 So(puR, ShouldBeNil) 525 So(err, ShouldResemble, errors.New("docker info is empty")) 526 }) 527 }) 528 }) 529 } 530 531 func TestSyncContainers(t *testing.T) { 532 ctrl := gomock.NewController(t) 533 defer ctrl.Finish() 534 535 Convey("When I try to initialize a new docker monitor", t, func() { 536 537 dmi, mockPU := setupDockerMonitor(ctrl) 538 dmi.SetupHandlers(&config.ProcessorConfig{ 539 Collector: eventCollector(), 540 Policy: mockPU, 541 ResyncLock: &sync.RWMutex{}, 542 }) 543 544 Convey("Then docker monitor should not be nil", func() { 545 So(dmi, ShouldNotBeNil) 546 }) 547 548 Convey("If I try to sync containers where when SyncAtStart is not set, I should get nil", func() { 549 dmi.syncAtStart = false 550 err := dmi.Resync(context.Background()) 551 So(err, ShouldBeNil) 552 }) 553 554 Convey("If I try to sync containers and docker list fails, I should get an error", func() { 555 dmi.syncAtStart = true 556 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 557 ContainerList(gomock.Any(), gomock.Any()).Return([]types.Container{{ID: ID}}, errors.New("error")) 558 559 err := dmi.Resync(context.Background()) 560 So(err, ShouldNotBeNil) 561 }) 562 563 Convey("When I try to call sync containers and a policy call fails", func() { 564 dmi.syncAtStart = true 565 566 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 567 ContainerList(gomock.Any(), gomock.Any()).Return([]types.Container{{ID: ID}}, nil) 568 569 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 570 ContainerInspect(gomock.Any(), ID).Return(defaultContainer(false), nil).MaxTimes(2) 571 572 mockPU.EXPECT().HandlePUEvent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(errors.New("blah")) 573 574 err := dmi.Resync(context.Background()) 575 576 Convey("Then I should get error since we ignore bad containers", func() { 577 So(err, ShouldBeNil) 578 }) 579 580 }) 581 582 Convey("When I try to call sync containers", func() { 583 dmi.syncAtStart = true 584 585 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 586 ContainerList(gomock.Any(), gomock.Any()).Return([]types.Container{{ID: ID}}, nil) 587 588 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 589 ContainerInspect(gomock.Any(), ID).Return(defaultContainer(false), nil).MaxTimes(2) 590 591 mockPU.EXPECT().HandlePUEvent(gomock.Any(), ID[:12], tevents.EventStart, gomock.Any()).AnyTimes().Return(nil) 592 593 err := dmi.Resync(context.Background()) 594 595 Convey("Then I should not get no error ", func() { 596 So(err, ShouldBeNil) 597 }) 598 599 }) 600 601 Convey("When I try to call sync host containers", func() { 602 dmi.syncAtStart = true 603 hostContainer := types.Container{ 604 ID: ID, 605 HostConfig: struct { 606 NetworkMode string `json:",omitempty"` 607 }{NetworkMode: "host"}} 608 609 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 610 ContainerList(gomock.Any(), gomock.Any()).Return([]types.Container{hostContainer}, nil) 611 612 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT(). 613 ContainerInspect(gomock.Any(), ID).Return(defaultContainer(true), nil).MaxTimes(2) 614 615 mockPU.EXPECT().HandlePUEvent(gomock.Any(), ID[:12], tevents.EventStart, gomock.Any()).AnyTimes().Return(nil) 616 617 err := dmi.Resync(context.Background()) 618 619 Convey("Then I should not get no error ", func() { 620 So(err, ShouldBeNil) 621 }) 622 623 }) 624 }) 625 } 626 627 func Test_initTestDockerInfo(t *testing.T) { 628 type args struct { 629 id string 630 nwmode container.NetworkMode 631 state bool 632 } 633 tests := []struct { 634 name string 635 args args 636 want *types.ContainerJSON 637 }{} 638 for _, tt := range tests { 639 t.Run(tt.name, func(t *testing.T) { 640 if got := initTestDockerInfo(tt.args.id, tt.args.nwmode, tt.args.state); !reflect.DeepEqual(got, tt.want) { 641 t.Errorf("initTestDockerInfo() = %v, want %v", got, tt.want) 642 } 643 }) 644 } 645 } 646 647 func TestWaitForDockerDaemon(t *testing.T) { 648 ctrl := gomock.NewController(t) 649 defer ctrl.Finish() 650 651 Convey("If docker daemon is not running and setup docker daemon returns an error", t, func() { 652 653 dmi, _ := setupDockerMonitor(ctrl) 654 dmi.dockerClient().(*mockdocker.MockCommonAPIClient).EXPECT().Ping(gomock.Any()).Return(types.Ping{}, errors.New("Ping Error")).AnyTimes() 655 // 30*time.Second is greater then dockerInitializationwait 656 waitforDockerInitializationTimeout := dockerInitializationWait + 5*time.Second 657 expiryTime := time.Now().Add(waitforDockerInitializationTimeout) 658 dmi.socketAddress = "unix://tmp/test.sock" 659 ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(waitforDockerInitializationTimeout)) 660 err := dmi.waitForDockerDaemon(ctx) 661 So(err, ShouldNotBeNil) 662 So(time.Now(), ShouldHappenBefore, expiryTime) 663 // this will kill the Goroutine 664 cancel() 665 }) 666 } 667 668 func TestSetupDockerDaemon(t *testing.T) { 669 ctrl := gomock.NewController(t) 670 defer ctrl.Finish() 671 672 Convey("If setupDockerdaemon returns an error dockerClient is nil", t, func() { 673 674 dmi, _ := setupDockerMonitor(ctrl) 675 dmi.setDockerClient(nil) 676 dmi.socketType = "invalid" 677 err := dmi.setupDockerDaemon(context.Background()) 678 So(err, ShouldNotBeNil) 679 So(dmi.dockerClient(), ShouldBeNil) 680 681 }) 682 }