Skip to content

Commit 1d5beb8

Browse files
committed
wip tests
1 parent 7095a4a commit 1d5beb8

12 files changed

+2087
-213
lines changed

internal/resources/fetching/fetchers/gcp/assets_fetcher.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,7 @@ func (f *GcpAssetsFetcher) Fetch(ctx context.Context, cycleMetadata cycle.Metada
8686
resultsCh := make(chan *inventory.ExtendedGcpAsset)
8787
go f.provider.ListAssetTypes(ctx, lo.Keys(reversedGcpAssetTypes), resultsCh)
8888

89-
defer f.provider.Clear() // TODO: maybe call this from registry?
90-
89+
// defer f.provider.Clear() // TODO: maybe call this from registry?
9190
for {
9291
select {
9392
case <-ctx.Done():

internal/resources/fetching/fetchers/gcp/assets_fetcher_test.go

+33-39
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ package fetchers
2020
import (
2121
"context"
2222
"testing"
23+
"time"
2324

2425
"cloud.google.com/go/asset/apiv1/assetpb"
25-
"github.com/samber/lo"
2626
"github.com/stretchr/testify/mock"
2727
"github.com/stretchr/testify/suite"
2828
"google.golang.org/protobuf/types/known/structpb"
@@ -54,53 +54,47 @@ func (s *GcpAssetsFetcherTestSuite) TearDownTest() {
5454
}
5555

5656
func (s *GcpAssetsFetcherTestSuite) TestFetcher_Fetch() {
57-
ctx := context.Background()
58-
mockInventoryService := &inventory.MockServiceAPI{}
57+
ctx, cancel := context.WithCancel(context.Background())
58+
defer cancel()
59+
60+
mockInventoryService := new(inventory.MockServiceAPI)
5961
fetcher := GcpAssetsFetcher{
6062
log: testhelper.NewLogger(s.T()),
6163
resourceCh: s.resourceCh,
6264
provider: mockInventoryService,
6365
}
6466

65-
mockInventoryService.EXPECT().ListAllAssetTypesByName(mock.Anything, mock.MatchedBy(func(_ []string) bool {
66-
return true
67-
})).Return(
68-
[]*inventory.ExtendedGcpAsset{
69-
{
70-
CloudAccount: &fetching.CloudAccountMetadata{
71-
AccountId: "prjId",
72-
AccountName: "prjName",
73-
OrganisationId: "orgId",
74-
OrganizationName: "orgName",
75-
},
76-
Asset: &assetpb.Asset{
77-
Name: "a", AssetType: "iam.googleapis.com/ServiceAccount",
78-
},
79-
},
80-
}, nil,
81-
)
82-
83-
err := fetcher.Fetch(ctx, cycle.Metadata{})
84-
s.Require().NoError(err)
85-
results := testhelper.CollectResources(s.resourceCh)
67+
expectedAsset := &inventory.ExtendedGcpAsset{
68+
Asset: &assetpb.Asset{
69+
AssetType: "compute.googleapis.com/Instance",
70+
},
71+
}
8672

87-
s.Equal(len(GcpAssetTypes), len(results))
73+
mockInventoryService.On("ListAssetTypes", mock.Anything, mock.Anything, mock.Anything).
74+
Run(func(args mock.Arguments) {
75+
ch := args.Get(2).(chan<- *inventory.ExtendedGcpAsset)
76+
ch <- expectedAsset
77+
close(ch)
78+
}).Once()
8879

89-
lo.ForEach(results, func(r fetching.ResourceInfo, _ int) {
90-
metadata, err := r.Resource.GetMetadata()
80+
go func() {
81+
err := fetcher.Fetch(ctx, cycle.Metadata{})
9182
s.Require().NoError(err)
92-
cloudAccountMetadata := metadata.CloudAccountMetadata
93-
94-
s.Equal("prjName", cloudAccountMetadata.AccountName)
95-
s.Equal("prjId", cloudAccountMetadata.AccountId)
96-
s.Equal("orgId", cloudAccountMetadata.OrganisationId)
97-
s.Equal("orgName", cloudAccountMetadata.OrganizationName)
98-
if metadata.Type == fetching.CloudIdentity {
99-
m, err := r.GetElasticCommonData()
100-
s.Require().NoError(err, "error getting Elastic Common Data")
101-
s.Len(m, 2)
102-
}
103-
})
83+
}()
84+
85+
select {
86+
case res := <-s.resourceCh:
87+
s.Require().NotNil(res.Resource)
88+
asset, ok := res.Resource.(*GcpAsset)
89+
s.Require().True(ok)
90+
s.Equal(expectedAsset.AssetType, asset.ExtendedAsset.AssetType)
91+
s.Equal("cloud-compute", asset.Type)
92+
s.Equal("gcp-compute-instance", asset.SubType)
93+
case <-time.After(time.Second):
94+
s.Fail("Test timed out waiting for resource")
95+
}
96+
97+
mockInventoryService.AssertExpectations(s.T())
10498
}
10599

106100
func (s *GcpAssetsFetcherTestSuite) TestFetcher_ElasticCommonData() {

internal/resources/fetching/fetchers/gcp/log_sink_fetcher_test.go

+40-43
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ package fetchers
1919

2020
import (
2121
"context"
22-
"errors"
2322
"fmt"
2423
"testing"
24+
"time"
2525

2626
"cloud.google.com/go/asset/apiv1/assetpb"
2727
"github.com/stretchr/testify/assert"
@@ -56,67 +56,64 @@ func (s *GcpLogSinkFetcherTestSuite) TearDownTest() {
5656
close(s.resourceCh)
5757
}
5858

59-
func (s *GcpLogSinkFetcherTestSuite) TestFetcher_Fetch_Success() {
59+
func (s *GcpLogSinkFetcherTestSuite) TestLogSinkFetcher_Fetch_Success() {
6060
ctx := context.Background()
6161
mockInventoryService := &inventory.MockServiceAPI{}
62-
fetcher := GcpLogSinkFetcher{
63-
log: testhelper.NewLogger(s.T()),
64-
resourceCh: s.resourceCh,
65-
provider: mockInventoryService,
66-
}
67-
68-
mockInventoryService.On("ListLoggingAssets", mock.Anything).Return(
69-
[]*inventory.LoggingAsset{
70-
{
71-
CloudAccount: &fetching.CloudAccountMetadata{
72-
AccountId: "a",
73-
AccountName: "a",
74-
OrganisationId: "a",
75-
OrganizationName: "a",
76-
},
77-
LogSinks: []*inventory.ExtendedGcpAsset{
78-
{Asset: &assetpb.Asset{Name: "a", AssetType: inventory.LogSinkAssetType}},
79-
},
80-
},
81-
}, nil,
82-
)
62+
fetcher := NewGcpLogSinkFetcher(ctx, testhelper.NewLogger(s.T()), s.resourceCh, mockInventoryService)
8363

84-
err := fetcher.Fetch(ctx, cycle.Metadata{})
85-
s.Require().NoError(err)
86-
results := testhelper.CollectResources(s.resourceCh)
87-
88-
// ListMonitoringAssets mocked to return a single asset
89-
s.Len(results, 1)
90-
}
91-
92-
func (s *GcpLogSinkFetcherTestSuite) TestFetcher_Fetch_Error() {
93-
ctx := context.Background()
94-
mockInventoryService := &inventory.MockServiceAPI{}
95-
fetcher := GcpLogSinkFetcher{
96-
log: testhelper.NewLogger(s.T()),
97-
resourceCh: s.resourceCh,
98-
provider: mockInventoryService,
64+
expectedAsset := &inventory.ProjectAssets{
65+
Assets: []*inventory.ExtendedGcpAsset{
66+
{Asset: &assetpb.Asset{Name: "a1", AssetType: "logging.googleapis.com/LogSink"}},
67+
},
68+
CloudAccount: &fetching.CloudAccountMetadata{
69+
AccountId: "1",
70+
},
9971
}
10072

101-
mockInventoryService.On("ListLoggingAssets", mock.Anything).Return(nil, errors.New("api call error"))
73+
mockInventoryService.On("ListProjectAssets", mock.Anything, []string{inventory.LogSinkAssetType}, mock.Anything).
74+
Run(func(args mock.Arguments) {
75+
ch := args.Get(2).(chan<- *inventory.ProjectAssets)
76+
ch <- expectedAsset
77+
close(ch)
78+
}).Once()
79+
80+
go func() {
81+
err := fetcher.Fetch(ctx, cycle.Metadata{})
82+
s.Require().NoError(err)
83+
}()
84+
85+
select {
86+
case res := <-s.resourceCh:
87+
s.Require().NotNil(res.Resource)
88+
asset, ok := res.Resource.(*GcpLoggingAsset)
89+
s.Require().True(ok)
90+
s.Len(asset.Asset.LogSinks, 1)
91+
s.Equal("logging.googleapis.com/LogSink", asset.Asset.LogSinks[0].Asset.AssetType)
92+
s.Equal(expectedAsset.CloudAccount.AccountId, asset.Asset.CloudAccount.AccountId)
93+
s.Equal(fetching.LoggingIdentity, asset.Type)
94+
s.Equal(fetching.GcpLoggingType, asset.subType)
95+
96+
case <-time.After(time.Second):
97+
s.Fail("Test timed out waiting for resource")
98+
}
10299

103-
err := fetcher.Fetch(ctx, cycle.Metadata{})
104-
s.Require().Error(err)
100+
mockInventoryService.AssertExpectations(s.T())
105101
}
106102

107103
func TestLoggingAsset_GetMetadata(t *testing.T) {
104+
const projectId = "1"
108105
tests := []struct {
109106
name string
110107
resource GcpLoggingAsset
111108
want fetching.ResourceMetadata
112109
wantErr bool
113110
}{
114111
{
115-
name: "retrieve successfully service usage assets",
112+
name: "retrieve successfully log sink assets",
116113
resource: GcpLoggingAsset{
117114
Type: fetching.LoggingIdentity,
118115
subType: fetching.GcpLoggingType,
119-
Asset: &inventory.LoggingAsset{
116+
Asset: &LoggingAsset{
120117
CloudAccount: &fetching.CloudAccountMetadata{
121118
AccountId: projectId,
122119
AccountName: "a",

internal/resources/fetching/fetchers/gcp/monitoring_fetcher_test.go

+40-44
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ package fetchers
1919

2020
import (
2121
"context"
22-
"errors"
2322
"fmt"
2423
"testing"
24+
"time"
2525

2626
"cloud.google.com/go/asset/apiv1/assetpb"
2727
"github.com/stretchr/testify/assert"
@@ -58,55 +58,51 @@ func (s *GcpMonitoringFetcherTestSuite) TearDownTest() {
5858
close(s.resourceCh)
5959
}
6060

61-
func (s *GcpMonitoringFetcherTestSuite) TestFetcher_Fetch_Success() {
61+
func (s *GcpMonitoringFetcherTestSuite) TestMonitoringFetcher_Fetch_Success() {
6262
ctx := context.Background()
6363
mockInventoryService := &inventory.MockServiceAPI{}
64-
fetcher := GcpMonitoringFetcher{
65-
log: testhelper.NewLogger(s.T()),
66-
resourceCh: s.resourceCh,
67-
provider: mockInventoryService,
64+
fetcher := NewGcpMonitoringFetcher(ctx, testhelper.NewLogger(s.T()), s.resourceCh, mockInventoryService)
65+
expectedAsset := &inventory.MonitoringAsset{
66+
Alerts: []*inventory.ExtendedGcpAsset{
67+
{Asset: &assetpb.Asset{Name: "a1", AssetType: inventory.MonitoringAlertPolicyAssetType}},
68+
},
69+
LogMetrics: []*inventory.ExtendedGcpAsset{
70+
{Asset: &assetpb.Asset{Name: "a1", AssetType: inventory.MonitoringLogMetricAssetType}},
71+
},
72+
CloudAccount: &fetching.CloudAccountMetadata{
73+
AccountId: "1",
74+
},
6875
}
6976

70-
mockInventoryService.EXPECT().ListMonitoringAssets(mock.Anything, mock.Anything).Return(
71-
[]*inventory.MonitoringAsset{
72-
{
73-
CloudAccount: &fetching.CloudAccountMetadata{
74-
AccountId: "a",
75-
AccountName: "a",
76-
OrganisationId: "a",
77-
OrganizationName: "a",
78-
},
79-
LogMetrics: []*inventory.ExtendedGcpAsset{
80-
{Asset: &assetpb.Asset{Name: "a", AssetType: "logging.googleapis.com/LogMetric"}},
81-
},
82-
Alerts: []*inventory.ExtendedGcpAsset{
83-
{Asset: &assetpb.Asset{Name: "b", AssetType: "monitoring.googleapis.com/AlertPolicy"}},
84-
},
85-
},
86-
}, nil,
87-
)
88-
89-
err := fetcher.Fetch(ctx, cycle.Metadata{})
90-
s.Require().NoError(err)
91-
results := testhelper.CollectResources(s.resourceCh)
92-
93-
// ListMonitoringAssets mocked to return a single asset
94-
s.Len(results, 1)
95-
}
96-
97-
func (s *GcpMonitoringFetcherTestSuite) TestFetcher_Fetch_Error() {
98-
ctx := context.Background()
99-
mockInventoryService := &inventory.MockServiceAPI{}
100-
fetcher := GcpMonitoringFetcher{
101-
log: testhelper.NewLogger(s.T()),
102-
resourceCh: s.resourceCh,
103-
provider: mockInventoryService,
77+
mockInventoryService.On("ListMonitoringAssets", mock.Anything, mock.Anything).
78+
Run(func(args mock.Arguments) {
79+
ch := args.Get(1).(chan<- *inventory.MonitoringAsset)
80+
ch <- expectedAsset
81+
close(ch)
82+
}).Once()
83+
84+
go func() {
85+
err := fetcher.Fetch(ctx, cycle.Metadata{})
86+
s.Require().NoError(err)
87+
}()
88+
89+
select {
90+
case res := <-s.resourceCh:
91+
s.Require().NotNil(res.Resource)
92+
asset, ok := res.Resource.(*GcpMonitoringAsset)
93+
s.Require().True(ok)
94+
s.Len(asset.Asset.Alerts, 1)
95+
s.Len(asset.Asset.LogMetrics, 1)
96+
s.Equal(inventory.MonitoringAlertPolicyAssetType, asset.Asset.Alerts[0].Asset.AssetType)
97+
s.Equal(inventory.MonitoringLogMetricAssetType, asset.Asset.LogMetrics[0].Asset.AssetType)
98+
s.Equal(expectedAsset.CloudAccount.AccountId, asset.Asset.CloudAccount.AccountId)
99+
s.Equal(fetching.MonitoringIdentity, asset.Type)
100+
s.Equal(fetching.GcpMonitoringType, asset.subType)
101+
case <-time.After(time.Second):
102+
s.Fail("Test timed out waiting for resource")
104103
}
105104

106-
mockInventoryService.EXPECT().ListMonitoringAssets(mock.Anything, mock.Anything).Return(nil, errors.New("api call error"))
107-
108-
err := fetcher.Fetch(ctx, cycle.Metadata{})
109-
s.Require().ErrorContains(err, "api call error")
105+
mockInventoryService.AssertExpectations(s.T())
110106
}
111107

112108
func TestMonitoringResource_GetMetadata(t *testing.T) {

0 commit comments

Comments
 (0)