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  }