@@ -10,15 +10,19 @@ import (
10
10
"fmt"
11
11
"slices"
12
12
"strings"
13
+ "time"
13
14
14
15
"github.com/elastic/elastic-package/internal/common"
15
16
"github.com/elastic/elastic-package/internal/kibana"
16
17
"github.com/elastic/elastic-package/internal/logger"
17
18
"github.com/elastic/elastic-package/internal/packages"
18
19
"github.com/elastic/elastic-package/internal/resources"
19
20
"github.com/elastic/elastic-package/internal/testrunner"
21
+ "github.com/elastic/elastic-package/internal/wait"
20
22
)
21
23
24
+ const assetsPresentTimeout = time .Minute
25
+
22
26
type tester struct {
23
27
testFolder testrunner.TestFolder
24
28
packageRootPath string
@@ -126,61 +130,72 @@ func (r *tester) run(ctx context.Context) ([]testrunner.TestResult, error) {
126
130
if err != nil {
127
131
return result .WithError (fmt .Errorf ("cannot read the package manifest from %s: %w" , r .packageRootPath , err ))
128
132
}
129
- installedPackage , err := r .kibanaClient .GetPackage (ctx , manifest .Name )
130
- if err != nil {
131
- return result .WithError (fmt .Errorf ("cannot get installed package %q: %w" , manifest .Name , err ))
132
- }
133
- installedAssets := installedPackage .Assets ()
134
133
135
- installedTags , err := r .kibanaClient .ExportSavedObjects (ctx , kibana.ExportSavedObjectsRequest {Type : "tag" })
136
- if err != nil {
137
- return result .WithError (fmt .Errorf ("cannot get installed tags: %w" , err ))
138
- }
134
+ var results []testrunner.TestResult
135
+ _ , err = wait .UntilTrue (ctx , func (ctx context.Context ) (bool , error ) {
136
+ installedPackage , err := r .kibanaClient .GetPackage (ctx , manifest .Name )
137
+ if err != nil {
138
+ results , err = result .WithError (fmt .Errorf ("cannot get installed package %q: %w" , manifest .Name , err ))
139
+ return false , err
140
+ }
141
+ installedAssets := installedPackage .Assets ()
139
142
140
- // No Elasticsearch asset is created when an Input package is installed through the API.
141
- // This would require to create a Agent policy and add that input package to the Agent policy.
142
- // As those input packages could have some required fields, it would also require to add
143
- // configuration files as in system tests to fill those fields.
144
- // In these tests, mainly it is required to test Kibana assets, therefore it is not added
145
- // support for Elasticsearch assets in input packages.
146
- // Related issue: https://github.com/elastic/elastic-package/issues/1623
147
- expectedAssets , err := packages .LoadPackageAssets (r .packageRootPath )
148
- if err != nil {
149
- return result .WithError (fmt .Errorf ("could not load expected package assets: %w" , err ))
150
- }
143
+ installedTags , err := r .kibanaClient .ExportSavedObjects (ctx , kibana.ExportSavedObjectsRequest {Type : "tag" })
144
+ if err != nil {
145
+ results , err = result .WithError (fmt .Errorf ("cannot get installed tags: %w" , err ))
146
+ return false , err
147
+ }
151
148
152
- results := make ([]testrunner.TestResult , 0 , len (expectedAssets ))
153
- for _ , e := range expectedAssets {
154
- rc := testrunner .NewResultComposer (testrunner.TestResult {
155
- Name : fmt .Sprintf ("%s %s is loaded" , e .Type , e .ID ),
156
- Package : r .testFolder .Package ,
157
- DataStream : e .DataStream ,
158
- TestType : TestType ,
159
- })
160
-
161
- tr , _ := rc .WithSuccess ()
162
- if ! findActualAsset (installedAssets , installedTags , e ) {
163
- tr , _ = rc .WithError (testrunner.ErrTestCaseFailed {
164
- Reason : "could not find expected asset" ,
165
- Details : fmt .Sprintf ("could not find %s asset \" %s\" . Assets loaded:\n %s" , e .Type , e .ID , formatAssetsAsString (installedAssets , installedTags )),
166
- })
149
+ // No Elasticsearch asset is created when an Input package is installed through the API.
150
+ // This would require to create a Agent policy and add that input package to the Agent policy.
151
+ // As those input packages could have some required fields, it would also require to add
152
+ // configuration files as in system tests to fill those fields.
153
+ // In these tests, mainly it is required to test Kibana assets, therefore it is not added
154
+ // support for Elasticsearch assets in input packages.
155
+ // Related issue: https://github.com/elastic/elastic-package/issues/1623
156
+ expectedAssets , err := packages .LoadPackageAssets (r .packageRootPath )
157
+ if err != nil {
158
+ results , err = result .WithError (fmt .Errorf ("could not load expected package assets: %w" , err ))
159
+ return false , err
167
160
}
168
- result := tr [0 ]
169
- if r .withCoverage && e .SourcePath != "" {
170
- result .Coverage , err = testrunner .GenerateBaseFileCoverageReport (rc .CoveragePackageName (), e .SourcePath , r .coverageType , true )
171
- if err != nil {
161
+
162
+ results = make ([]testrunner.TestResult , 0 , len (expectedAssets ))
163
+ success := true
164
+ for _ , e := range expectedAssets {
165
+ rc := testrunner .NewResultComposer (testrunner.TestResult {
166
+ Name : fmt .Sprintf ("%s %s is loaded" , e .Type , e .IDOrName ()),
167
+ Package : r .testFolder .Package ,
168
+ DataStream : e .DataStream ,
169
+ TestType : TestType ,
170
+ })
171
+
172
+ tr , _ := rc .WithSuccess ()
173
+ if ! findActualAsset (installedAssets , installedTags , e ) {
172
174
tr , _ = rc .WithError (testrunner.ErrTestCaseFailed {
173
- Reason : "could not generate test coverage " ,
174
- Details : fmt .Sprintf ("could not generate test coverage for asset in %s: %v " , e .SourcePath , err ),
175
+ Reason : "could not find expected asset " ,
176
+ Details : fmt .Sprintf ("could not find %s asset \" %s \" . Assets loaded: \n %s " , e .Type , e . IDOrName (), formatAssetsAsString ( installedAssets , installedTags ) ),
175
177
})
176
- result = tr [0 ]
178
+ success = false
179
+ }
180
+ result := tr [0 ]
181
+ if r .withCoverage && e .SourcePath != "" {
182
+ result .Coverage , err = testrunner .GenerateBaseFileCoverageReport (rc .CoveragePackageName (), e .SourcePath , r .coverageType , true )
183
+ if err != nil {
184
+ tr , _ = rc .WithError (testrunner.ErrTestCaseFailed {
185
+ Reason : "could not generate test coverage" ,
186
+ Details : fmt .Sprintf ("could not generate test coverage for asset in %s: %v" , e .SourcePath , err ),
187
+ })
188
+ result = tr [0 ]
189
+ }
190
+ success = false
177
191
}
178
- }
179
192
180
- results = append (results , result )
181
- }
193
+ results = append (results , result )
194
+ }
195
+ return success , nil
196
+ }, time .Second , assetsPresentTimeout )
182
197
183
- return results , nil
198
+ return results , err
184
199
}
185
200
186
201
func (r * tester ) TearDown (ctx context.Context ) error {
@@ -196,23 +211,29 @@ func (r *tester) TearDown(ctx context.Context) error {
196
211
return nil
197
212
}
198
213
199
- func findActualAsset (actualAssets []packages.Asset , installedTags []common.MapStr , expectedAsset packages.Asset ) bool {
214
+ func findActualAsset (actualAssets []packages.Asset , savedObjects []common.MapStr , expectedAsset packages.Asset ) bool {
200
215
for _ , a := range actualAssets {
201
216
if a .Type == expectedAsset .Type && a .ID == expectedAsset .ID {
202
217
return true
203
218
}
204
219
}
205
220
206
- if expectedAsset .Type == "tag" {
207
- // If we haven't found the asset, and it is a tag, it could be some of the shared tags defined in tags.yml.
208
- for _ , tag := range installedTags {
221
+ if expectedAsset .Type == "tag" && expectedAsset .ID == "" {
222
+ // If we haven't found the asset, and it is a tag, it could be some of the shared
223
+ // tags defined in tags.yml, whose id can be unpredictable, so check by name.
224
+ for _ , tag := range savedObjects {
209
225
managed , _ := tag .GetValue ("managed" )
210
226
if managed , ok := managed .(bool ); ! ok || ! managed {
211
227
continue
212
228
}
213
229
214
- id , _ := tag .GetValue ("id" )
215
- if id , ok := id .(string ); ok && id == expectedAsset .ID {
230
+ soType , _ := tag .GetValue ("type" )
231
+ if soType , ok := soType .(string ); ! ok || soType != "tag" {
232
+ continue
233
+ }
234
+
235
+ name , _ := tag .GetValue ("attributes.name" )
236
+ if name , ok := name .(string ); ok && name == expectedAsset .Name {
216
237
return true
217
238
}
218
239
}
0 commit comments