github.com/nya3jp/tast@v0.0.0-20230601000426-85c8e4d83a9b/src/go.chromium.org/tast/core/internal/testing/attr.go (about)

     1  // Copyright 2019 The ChromiumOS Authors
     2  // Use of this source code is governed by a BSD-style license that can be
     3  // found in the LICENSE file.
     4  
     5  package testing
     6  
     7  import (
     8  	"fmt"
     9  	"strings"
    10  )
    11  
    12  // group defines a group of tests having the same purpose. For example, the mainline
    13  // group contains functional tests to be used for build verification.
    14  //
    15  // A group definition should be agnostic to how it is scheduled in infrastructure.
    16  // If needed, extra attributes can be defined to give hints for scheduling.
    17  type group struct {
    18  	// Name is the name of the group. A test can declare to belong to a group by
    19  	// adding an attribute "group:<name>".
    20  	Name string
    21  
    22  	// Contacts is a list of email addresses of persons and groups responsible for
    23  	// maintaining the test group.
    24  	Contacts []string
    25  
    26  	// Desc is a description of the group.
    27  	Desc string
    28  
    29  	// Subattrs defines extra attributes that can be used to annotate the tests
    30  	// in the group.
    31  	Subattrs []*attr
    32  }
    33  
    34  // attr defines an extra attribute to annotate tests.
    35  //
    36  // Attributes can give hint for scheduling.
    37  type attr struct {
    38  	// Name is the name of the attribute.
    39  	Name string
    40  
    41  	// Desc is a description of the attribute.
    42  	Desc string
    43  }
    44  
    45  // validGroups is the list of all valid groups.
    46  var validGroups = []*group{
    47  	{
    48  		Name:     "mainline",
    49  		Contacts: []string{"tast-owners@google.com"},
    50  		Desc: `The default group of functional tests.
    51  
    52  Mainline tests are run for build verification. Among others, pre-submit and
    53  post-submit testing in ChromeOS CI and Chromium CI are important places where
    54  mainlines tests are run.
    55  `,
    56  		Subattrs: []*attr{
    57  			{
    58  				Name: "informational",
    59  				Desc: `Indicates that failures can be ignored.
    60  
    61  Mainline tests lacking this attribute are called critical tests. Failures in
    62  critical tests justify rejecting or reverting the responsible change, while
    63  failures in informational tests do not.
    64  
    65  All mainline tests should be initially marked informational, and should be
    66  promoted to critical tests after stabilization.
    67  `,
    68  			},
    69  		},
    70  	},
    71  	{
    72  		Name:     "cbx",
    73  		Contacts: []string{"tast-core@google.com"},
    74  		Desc:     `A group of tests related to cbx testing`,
    75  		Subattrs: []*attr{
    76  			{
    77  				Name: "cbx_feature_enabled",
    78  				Desc: "Indicates that these tests should run on devices that have cbx features",
    79  			},
    80  			{
    81  				Name: "cbx_feature_disabled",
    82  				Desc: "Indicates that these tests should run on devices that have no cbx features",
    83  			},
    84  			{
    85  				Name: "cbx_stable",
    86  				Desc: `Indicates that this test has been verified as stable.`,
    87  			},
    88  			{
    89  				Name: "cbx_unstable",
    90  				Desc: `Indicates that this test is yet to be verified as stable.`,
    91  			},
    92  		},
    93  	},
    94  	{
    95  		Name:     "criticalstaging",
    96  		Contacts: []string{"tast-owners@google.com"},
    97  		Desc: `Inidcates intent to run in critcial CQ & Release.
    98  
    99  This group will be used to indicate a test is intended on going into "mainline"
   100  critical testing. This group will be run on all boards/models; on ToT only.
   101  Tests can only remain in this group long enough to gather signal (10 days),
   102  after which the owner must promote them into mainline only, or back into
   103  informational. If no owner action is taken after a 4 day grace period, they
   104  will be moved into informational.
   105  `,
   106  	},
   107  	{
   108  		Name:     "crosbolt",
   109  		Contacts: []string{"crosbolt-eng@google.com"},
   110  		Desc: `The group of performance tests to be run regularly by the crosbolt team.
   111  
   112  Tests in this group are not used for build verification.
   113  `,
   114  		Subattrs: []*attr{
   115  			{
   116  				Name: "crosbolt_perbuild",
   117  				Desc: `Indicates that this test should run for every ChromeOS build.`,
   118  			},
   119  			{
   120  				Name: "crosbolt_nightly",
   121  				Desc: `Indicates that this test should run nightly.`,
   122  			},
   123  			{
   124  				Name: "crosbolt_weekly",
   125  				Desc: `Indicates that this test should run weekly.`,
   126  			},
   127  			{
   128  				Name: "crosbolt_memory_nightly",
   129  				Desc: `Indicates that this test is a memory test and should run nightly.`,
   130  			},
   131  			{
   132  				Name: "crosbolt_arc_perf_qual",
   133  				Desc: `Indicates that this test is used for ARC performance qualification.`,
   134  			},
   135  		},
   136  	},
   137  	{
   138  		Name:     "graphics",
   139  		Contacts: []string{"chromeos-gfx@google.com", "chromeos-gfx-video@google.com"},
   140  		Desc: `The group of graphics tests to be run regularly by the graphics team.
   141  
   142  Tests in this group are not used for build verification.
   143  `,
   144  		Subattrs: []*attr{
   145  			{
   146  				Name: "graphics_trace",
   147  				Desc: `Indicate this test is replaying a trace to reproduce graphics command.`,
   148  			},
   149  			{
   150  				Name: "graphics_video",
   151  				Desc: `Indicate this test is focus on video encode/decode.`,
   152  			},
   153  			{
   154  				Name: "graphics_perbuild",
   155  				Desc: `Indicates that this test should run for every ChromeOS build.`,
   156  			},
   157  			{
   158  				Name: "graphics_nightly",
   159  				Desc: `Indicates that this test should run nightly.`,
   160  			},
   161  			{
   162  				Name: "graphics_weekly",
   163  				Desc: `Indicates that this test should run weekly.`,
   164  			},
   165  			{
   166  				Name: "graphics_av_analysis",
   167  				Desc: `Indicates that this test should run on audio/video analysis pool.`,
   168  			},
   169  			{
   170  				Name: "graphics_drm",
   171  				Desc: `Indicates that this test is part of DRM testing.`,
   172  			},
   173  			{
   174  				Name: "graphics_igt",
   175  				Desc: `Indicates that this test is running KMS igt-gpu-tools.`,
   176  			},
   177  			{
   178  				Name: "graphics_chameleon_igt",
   179  				Desc: `Indicates that this is a Chameleon test running igt-gpu-tools.`,
   180  			},
   181  			{
   182  				Name: "graphics_opencl",
   183  				Desc: `Indicates that this test is part of OpenCL testing.`,
   184  			},
   185  			{
   186  				Name: "graphics_satlab_redrix_stress_b246324780",
   187  				Desc: `Indicates that this test is running to support redrix b/246324780.`,
   188  			},
   189  			{
   190  				Name: "graphics_video_platformdecoding",
   191  				Desc: `Indicates that this test is exercising platform video decoding abilities.`,
   192  			},
   193  			{
   194  				Name: "graphics_video_av1",
   195  				Desc: `Indicates that this test is exercising av1 codec.`,
   196  			},
   197  			{
   198  				Name: "graphics_video_chromestackdecoding",
   199  				Desc: `Indicates that this test is part of Chrome Stack Decoding video.`,
   200  			},
   201  			{
   202  				Name: "graphics_video_decodeaccel",
   203  				Desc: `Indicates that this test is part of decode accel video.`,
   204  			},
   205  			{
   206  				Name: "graphics_video_h264",
   207  				Desc: `Indicates that this test is exercising h264 codec.`,
   208  			},
   209  			{
   210  				Name: "graphics_video_hevc",
   211  				Desc: `Indicates that this test is exercising hevc codec.`,
   212  			},
   213  			{
   214  				Name: "graphics_video_vp8",
   215  				Desc: `Indicates that this test is exercising vp8 codec.`,
   216  			},
   217  			{
   218  				Name: "graphics_video_vp9",
   219  				Desc: `Indicates that this test is exercising vp9 codec.`,
   220  			},
   221  		},
   222  	},
   223  	{
   224  		Name:     "pvs",
   225  		Contacts: []string{"chromeos-pvs-eng@google.com"},
   226  		Desc:     `The group of pvs tests to be run regularly by the pvs team.`,
   227  		Subattrs: []*attr{
   228  			{
   229  				Name: "pvs_perbuild",
   230  				Desc: `Indicates that this test should run for every ChromeOS build.`,
   231  			},
   232  		},
   233  	},
   234  	{
   235  		Name:     "stress",
   236  		Contacts: []string{"chromeos-engprod@google.com"},
   237  		Desc:     `A group of stress tests.`,
   238  	},
   239  	{
   240  		Name:     "arc-data-collector",
   241  		Contacts: []string{"chromeos-engprod@google.com"},
   242  		Desc:     `A group of ARC tests to be run in Android PFQ and collect data for specific Android build.`,
   243  	},
   244  	{
   245  		Name:     "arc-functional",
   246  		Contacts: []string{"chromeos-sw-engprod@google.com"},
   247  		Desc:     `A group of ARC Functional tests.`,
   248  	},
   249  	{
   250  		Name:     "arc-video",
   251  		Contacts: []string{"chromeos-arc-video-eng@google.com"},
   252  		Desc:     `A group of ARC Video tests.`,
   253  	},
   254  	{
   255  		Name:     "mtp",
   256  		Contacts: []string{"arc-engprod@google.com"},
   257  		Desc:     `A group of tests that run on DUTs with Android phones connected and verify MTP(Media Transfer Protocol).`,
   258  	},
   259  	{
   260  		Name:     "arc",
   261  		Contacts: []string{"arc-engprod@google.com"},
   262  		Desc:     `A group of tests that run ARC++ Functional Tests.`,
   263  		Subattrs: []*attr{
   264  			{
   265  				Name: "arc_playstore",
   266  				Desc: `A group of tests which tests playstore functionality on its nightly build.`,
   267  			},
   268  			{
   269  				Name: "arc_core",
   270  				Desc: `A group of tests which tests ARC Core functionality on its nightly build.`,
   271  			},
   272  			{
   273  				Name: "arc_chromeos_vm",
   274  				Desc: `A group of tests which run ARC functionality on ChromeOS VM nightly build.`,
   275  			},
   276  		},
   277  	},
   278  	{
   279  		Name:     "appcompat",
   280  		Contacts: []string{"arc-engprod@google.com", "cros-appcompat-test-team@google.com"},
   281  		Desc:     `A group of ARC app compatibility tests.`,
   282  		Subattrs: []*attr{
   283  			{
   284  				Name: "appcompat_release",
   285  				Desc: `A group of ARC app compatibility tests for release testing.`,
   286  			},
   287  			{
   288  				Name: "appcompat_smoke",
   289  				Desc: `A group of ARC app compatibility tests for smoke testing.`,
   290  			},
   291  			{
   292  				Name: "appcompat_top_apps",
   293  				Desc: `A group of ARC app compatibility tests for top apps testing.`,
   294  			},
   295  			{
   296  				Name: "appcompat_default",
   297  				Desc: `A group of ARC app compatibility tests for appcompat testing.`,
   298  			},
   299  		},
   300  	},
   301  	{
   302  		Name:     "arcappgameperf",
   303  		Contacts: []string{"arc-engprod@google.com"},
   304  		Desc:     `A group of tests that run ARC++ Game performance tests.`,
   305  	},
   306  	{
   307  		Name:     "arcappmediaperf",
   308  		Contacts: []string{"arc-engprod@google.com"},
   309  		Desc:     `A group of tests that run ARC++ Media performance tests.`,
   310  	},
   311  	{
   312  		Name:     "arc-data-snapshot",
   313  		Contacts: []string{"pbond@google.com", "arc-commercial@google.com"},
   314  		Desc:     `A group of ARC data snapshot tests that run on DUTs.`,
   315  	},
   316  	{
   317  		Name:     "camerabox",
   318  		Contacts: []string{"chromeos-camera-eng@google.com"},
   319  		Desc:     `The group of camera tests to be run with Camerabox fixture.`,
   320  		Subattrs: []*attr{
   321  			{
   322  				Name: "camerabox_facing_front",
   323  				Desc: `Tests front camera functionalities using Camerabox front facing fixture.`,
   324  			},
   325  			{
   326  				Name: "camerabox_facing_back",
   327  				Desc: `Tests back camera functionalities using Camerabox back facing fixture.`,
   328  			},
   329  		},
   330  	},
   331  	{
   332  		Name:     "camera-libcamera",
   333  		Contacts: []string{"chromeos-camera-eng@google.com"},
   334  		Desc:     `A group of camera tests for libcamera build.`,
   335  	},
   336  	{
   337  		Name:     "camera-postsubmit",
   338  		Contacts: []string{"chromeos-camera-eng@google.com"},
   339  		Desc:     `A group of camera tests for postsubmit runs.`,
   340  	},
   341  	{
   342  		Name:     "camera-usb-qual",
   343  		Contacts: []string{"chromeos-camera-eng@google.com"},
   344  		Desc:     `A group of camera tests for USB camera qualification.`,
   345  	},
   346  	{
   347  		Name:     "cq-minimal",
   348  		Contacts: []string{"bhthompson@google.com", "tast-owners@google.com"},
   349  		Desc:     `A group of tests that verify minimum bisection/debug functionality`,
   350  	},
   351  	{
   352  		Name:     "cq-medium",
   353  		Contacts: []string{"dhaddock@google.com", "bhthompson@google.com", "tast-owners@google.com"},
   354  		Desc:     `A group of tests providing medium level CQ coverage`,
   355  	},
   356  	{
   357  		Name:     "cuj",
   358  		Contacts: []string{"chromeos-perfmetrics-eng@google.com"},
   359  		Desc:     `A group of CUJ tests that run regularly for the Performance Metrics team.`,
   360  		Subattrs: []*attr{
   361  			{
   362  				Name: "cuj_experimental",
   363  				Desc: `Experimental CUJ tests that only run on a selected subset of models.`,
   364  			},
   365  		},
   366  	},
   367  	{
   368  		Name:     "drivefs-cq",
   369  		Contacts: []string{"chromeos-files-syd@google.com"},
   370  		Desc:     `The group of tests to be run in CQ for DriveFS functionality.`,
   371  	},
   372  	{
   373  		Name:     "enrollment",
   374  		Contacts: []string{"vsavu@google.com", "chromeos-commercial-remote-management@google.com"},
   375  		Desc:     `A group of tests performing enrollment and will clobber the stateful partition.`,
   376  	},
   377  	{
   378  		Name:     "dmserver-enrollment-daily",
   379  		Contacts: []string{"rzakarian@google.com", "chromeos-ent-test@google.com"},
   380  		Desc:     `A group of tests for the DMServer enrollment.`,
   381  	},
   382  	{
   383  		Name:     "dmserver-enrollment-live",
   384  		Contacts: []string{"rzakarian@google.com", "chromeos-ent-test@google.com"},
   385  		Desc:     `A group of tests for the DMServer live enrollment.`,
   386  	},
   387  	{
   388  		Name:     "dmserver-zteenrollment-daily",
   389  		Contacts: []string{"rzakarian@google.com", "chromeos-ent-test@google.com"},
   390  		Desc:     `A group of tests for the DMServer ZTE enrollment.`,
   391  	},
   392  	{
   393  		Name:     "dpanel-end2end",
   394  		Contacts: []string{"rzakarian@google.com", "chromeos-ent-test@google.com"},
   395  		Desc:     `A group of tests for the DPanel/DMServer team.`,
   396  	},
   397  	{
   398  		Name:     "enterprise-reporting",
   399  		Contacts: []string{"albertojuarez@google.com", "cros-reporting-eng@google.com"},
   400  		Desc:     `A group of tests for the commercial reporting/I&I team.`,
   401  	},
   402  	{
   403  		Name:     "external-dependency",
   404  		Contacts: []string{"chromeos-software-engprod@google.com", "shengjun@google.com"},
   405  		Desc: `A group of tests that rely on external websites/apps/services.
   406  		Due to the dependencies to external resources, these test cases are more likely to break.
   407  		Therefore, it is highly disrecommended to promote them into mainline CQ.
   408  		Please refer to go/cros-automation-1p3p for more details.`,
   409  		Subattrs: []*attr{
   410  			{
   411  				Name: "external-dependency_exemption",
   412  				Desc: `A group of tests with external dependencies that can run in mainline CQ.`,
   413  			},
   414  		},
   415  	},
   416  	{
   417  		Name:     "input-tools",
   418  		Contacts: []string{"essential-inputs-team@google.com"},
   419  		Desc:     `A group of essential inputs IME and Virtual Keyboard tests.`,
   420  	},
   421  	{
   422  		Name:     "input-tools-upstream",
   423  		Contacts: []string{"essential-inputs-team@google.com"},
   424  		Desc:     `A group of essential inputs IME and Virtual Keyboard tests running in google3.`,
   425  	},
   426  	{
   427  		Name:     "firmware",
   428  		Contacts: []string{"chromeos-faft@google.com", "jbettis@chromium.org"},
   429  		Desc:     `A group of tests for firmware (AP, EC, GSC)`,
   430  		Subattrs: []*attr{
   431  			{
   432  				Name: "firmware_bios",
   433  				Desc: `A group of tests that test the AP firmware. Equivalent to autotest suite:faft_bios & suite:faft_bios_ro_qual & suite:faft_bios_rw_qual.`,
   434  			},
   435  			{
   436  				Name: "firmware_ccd",
   437  				Desc: `Indicates a test which requires a servo with CCD. I.e. A servo_v4 or equivalent.`,
   438  			},
   439  			{
   440  				Name: "firmware_cr50",
   441  				Desc: `Indicates that this is a test of the Google Security Chip firmware (Cr50).`,
   442  			},
   443  			{
   444  				Name: "firmware_ec",
   445  				Desc: `A group of tests that test the EC firmware. Equivalent to autotest suite:faft_ec & suite:faft_ec_fw_qual.`,
   446  			},
   447  			{
   448  				Name: "firmware_experimental",
   449  				Desc: `Firmware tests that might break the DUTs in the lab.`,
   450  			},
   451  			{
   452  				Name: "firmware_pd",
   453  				Desc: `A group of tests that test USB-C Power Delivery. Equivalent to autotest suite:faft_pd.`,
   454  			},
   455  			{
   456  				Name: "firmware_slow",
   457  				Desc: `A group of tests that takes a very long time to run.`,
   458  			},
   459  			{
   460  				Name: "firmware_smoke",
   461  				Desc: `A group of tests that exercise the basic firmware testing libraries. Equivalent to autotest suite:faft_smoke.`,
   462  			},
   463  			{
   464  				Name: "firmware_unstable",
   465  				Desc: `Firmware tests that are not yet stabilized, but won't break DUTs.`,
   466  			},
   467  			{
   468  				Name: "firmware_usb",
   469  				Desc: `Indicates a test which requires a working USB stick attached to the servo.`,
   470  			},
   471  			{
   472  				Name: "firmware_bringup",
   473  				Desc: `Indicates a test is safe to run on a board that doesn't boot to AP. Pass --var noSSH=true also.`,
   474  			},
   475  			{
   476  				Name: "firmware_level1",
   477  				Desc: `A subset of firmware_bios that is expected to pass before the AP firmware is finished.`,
   478  			},
   479  			{
   480  				Name: "firmware_level2",
   481  				Desc: `A subset of firmware_bios that is expected to pass after firmware_level1.`,
   482  			},
   483  			{
   484  				Name: "firmware_level3",
   485  				Desc: `A subset of firmware_bios that is expected to pass after firmware_level2.`,
   486  			},
   487  			{
   488  				Name: "firmware_level4",
   489  				Desc: `A subset of firmware_bios that is expected to pass after firmware_level3.`,
   490  			},
   491  			{
   492  				Name: "firmware_level5",
   493  				Desc: `A subset of firmware_bios that is expected to pass after firmware_level4.`,
   494  			},
   495  			{
   496  				Name: "firmware_detachable",
   497  				Desc: `A set of non-destructive tests indented to run on detachables.`,
   498  			},
   499  			{
   500  				Name: "firmware_trial",
   501  				Desc: `Firmware tests that might leave the DUT in a state that will require flashing the AP/EC.`,
   502  			},
   503  			{
   504  				Name: "firmware_stress",
   505  				Desc: `Firmware tests which repeat the same scenario many times.`,
   506  			},
   507  		},
   508  	},
   509  	{
   510  		Name:     "flashrom",
   511  		Contacts: []string{"cros-flashrom-team@google.com"},
   512  		Desc:     `A group of Flashrom destructive tests.`,
   513  	},
   514  	{
   515  		Name:     "gsc",
   516  		Contacts: []string{"jettrink@google.com", "chromeos-faft@google.com"},
   517  		Desc:     `A group of Google Security Chip tests -- typical performed on bare board.`,
   518  		Subattrs: []*attr{
   519  			{
   520  				Name: "gsc_dt_ab",
   521  				Desc: `A set of tests that run on a Dauntless Andreiboard with Hyperdebug connected.`,
   522  			},
   523  			{
   524  				Name: "gsc_dt_shield",
   525  				Desc: `A set of tests that run on a Dauntless Shield with Hyperdebug connected.`,
   526  			},
   527  			{
   528  				Name: "gsc_ot_fpga_cw310",
   529  				Desc: `A set of tests that run on an OpenTitan FPGACW310 with Hyperdebug connected.`,
   530  			},
   531  			{
   532  				Name: "gsc_ot_shield",
   533  				Desc: `A set of tests that run on an OpenTitan Shield with Hyperdebug connected.`,
   534  			},
   535  			{
   536  				Name: "gsc_h1_shield",
   537  				Desc: `A set of tests that run on a Haven Shield with Hyperdebug connected.`,
   538  			},
   539  			{
   540  				Name: "gsc_he",
   541  				Desc: `A set of tests that run on a emulated hardware via host process.`,
   542  			},
   543  			{
   544  				Name: "gsc_image_ti50",
   545  				Desc: `A set of tests that run on the normal ti50 FW image`,
   546  			},
   547  			{
   548  				Name: "gsc_image_sta",
   549  				Desc: `A set of tests that run on the system_test_auto FW image`,
   550  			},
   551  		},
   552  	},
   553  	{
   554  		Name:     "hwsec_destructive_crosbolt",
   555  		Contacts: []string{"cros-hwsec@google.com"},
   556  		Desc: `A group of HWSec destructive performance tests that wipe and recreate encstateful in the tests,
   557  and run regularly in the crosbolt_perf_* suites.
   558  
   559  Tests in this group are not used for build verification.`,
   560  		Subattrs: []*attr{
   561  			{
   562  				Name: "hwsec_destructive_crosbolt_perbuild",
   563  				Desc: `Indicates that this test should run for every ChromeOS build.`,
   564  			},
   565  		},
   566  	},
   567  	{
   568  		Name:     "hwsec_destructive_func",
   569  		Contacts: []string{"cros-hwsec@google.com"},
   570  		Desc:     `A group of HWSec destructive tests that wipe and recreate encstateful in the tests.`,
   571  	},
   572  	{
   573  		Name:     "labqual",
   574  		Contacts: []string{"stagenut@google.com", "teravest@google.com"},
   575  		Desc:     `A group of tests that must pass reliably prior to lab deployments.`,
   576  	},
   577  	{
   578  		Name:     "omaha",
   579  		Contacts: []string{"vsavu@google.com", "chromeos-commercial-remote-management@google.com"},
   580  		Desc:     `A group of tests verifying the current state of Omaha.`,
   581  	},
   582  	{
   583  		Name:     "racc",
   584  		Contacts: []string{"chromeos-runtime-probe@google.com"},
   585  		Desc:     `A group of tests that validate the RACC-related functionality.`,
   586  		Subattrs: []*attr{
   587  			{
   588  				Name: "racc_general",
   589  				Desc: `Tests RACC functionality with RACC binaries installed.`,
   590  			},
   591  			{
   592  				Name: "racc_config_installed",
   593  				Desc: `Tests RACC functionality with probe payload installed.
   594  
   595  The group of tests compare results probed by Runtime Probe and corresponding information
   596  in cros-labels decoded from HWID string.  These tests mainly check if Runtime Probe works
   597  as expected (in terms of D-Bus connection, probe function, and probe result).  For
   598  short-term plan, only autotest can invoke these tests with host_info information.  That's
   599  why we add this attribute and run tests of this attribute in a control file at
   600  third_party/autotest/files/server/site_tests/tast/control.racc-config-installed.
   601  `,
   602  			},
   603  		},
   604  	},
   605  	{
   606  		Name:     "rapid-ime-decoder",
   607  		Contacts: []string{"essential-inputs-team@google.com"},
   608  		Desc:     `A group of tests to validate libIMEdecoder.so releases.`,
   609  	},
   610  	{
   611  		Name:     "wificell",
   612  		Contacts: []string{"chromeos-kernel-wifi@google.com"},
   613  		Desc:     `The group of WiFi tests to be run with Wificell fixture.`,
   614  		Subattrs: []*attr{
   615  			{
   616  				Name: "wificell_func",
   617  				Desc: `Tests basic WiFi functionalities using Wificell fixture nightly.`,
   618  			},
   619  			{
   620  				Name: "wificell_func_ax",
   621  				Desc: `Tests basic WiFi AX functionalities using Wificell fixture nightly.`,
   622  			},
   623  			{
   624  				Name: "wificell_suspend",
   625  				Desc: `Tests basic WiFi behavior related to suspend/resume.`,
   626  			},
   627  			{
   628  				Name: "wificell_cq",
   629  				Desc: `Similar to wificell_func, but triggered by CLs that touch specific code paths.`,
   630  			},
   631  			{
   632  				Name: "wificell_perf",
   633  				Desc: `Measures WiFi performance using Wificell fixture nightly.`,
   634  			},
   635  			{
   636  				Name: "wificell_stress",
   637  				Desc: `Stress tests WiFi functionalities using Wificell fixture.`,
   638  			},
   639  			{
   640  				Name: "wificell_mtbf",
   641  				Desc: `Measure Mean Time Between Failures (MTBF) using Wificell fixture.`,
   642  			},
   643  			{
   644  				Name: "wificell_unstable",
   645  				Desc: `Indicates that this test is yet to be verified as stable.`,
   646  			},
   647  			{
   648  				Name: "wificell_dut_validation",
   649  				Desc: `Group of tests to be run by lab team to validate AP, PCAP, BT-Peers & DUT during deployment.`,
   650  			},
   651  			{
   652  				Name: "wificell_e2e",
   653  				Desc: `Identifies wifi_chrome ui/e2e tests.`,
   654  			},
   655  			{
   656  				Name: "wificell_e2e_unstable",
   657  				Desc: `Identifies wifi_chrome ui/e2e tests that are unstable. Used to skip tests running on stable suites and/or the CQ.`,
   658  			},
   659  		},
   660  	},
   661  	{
   662  		Name:     "wificell_cross_device",
   663  		Contacts: []string{"chromeos-kernel-wifi@google.com"},
   664  		Desc:     `The group of WiFi tests using nearbyshare fixture.`,
   665  		Subattrs: []*attr{
   666  			{
   667  				Name: "wificell_cross_device_p2p",
   668  				Desc: `Tests basic WiFi P2P functionalities using nearbyshare fixture.`,
   669  			},
   670  			{
   671  				Name: "wificell_cross_device_tdls",
   672  				Desc: `Tests basic WiFi TDLS functionalities using nearbyshare fixture.`,
   673  			},
   674  			{
   675  				Name: "wificell_cross_device_sap",
   676  				Desc: `Tests basic WiFi Soft AP functionalities using nearbyshare fixture.`,
   677  			},
   678  			{
   679  				Name: "wificell_cross_device_unstable",
   680  				Desc: `Indicates that this test is yet to be verified as stable.`,
   681  			},
   682  		},
   683  	},
   684  	{
   685  		Name:     "wificell_roam",
   686  		Contacts: []string{"chromeos-kernel-wifi@google.com"},
   687  		Desc:     `The group of WiFi roaming tests to be run with Grover fixture.`,
   688  		Subattrs: []*attr{
   689  			{
   690  				Name: "wificell_roam_func",
   691  				Desc: `Tests basic WiFi roaming functionalities using Grover fixture.`,
   692  			},
   693  			{
   694  				Name: "wificell_roam_perf",
   695  				Desc: `Measures WiFi performance using Grover fixture.`,
   696  			},
   697  		},
   698  	},
   699  	{
   700  		Name:     "cellular",
   701  		Contacts: []string{"chromeos-cellular-team@google.com"},
   702  		Desc:     `The group of Cellular tests to be run on hardware with a builtin Cellular modem and SIM card.`,
   703  		Subattrs: []*attr{
   704  			{
   705  				Name: "cellular_unstable",
   706  				Desc: `Identifies Cellular tests that are unstable. Used to skip tests running on stable suites and/or the CQ.`,
   707  			},
   708  			{
   709  				Name: "cellular_cq",
   710  				Desc: `Identifies Cellular tests for the cellular commit queue suite.`,
   711  			},
   712  			{
   713  				Name: "cellular_ota_avl",
   714  				Desc: `Identifies Cellular ota tests for the cellular avl qual.`,
   715  			},
   716  			{
   717  				Name: "cellular_sim_active",
   718  				Desc: `Identifies Cellular tests that need an active sim.`,
   719  			},
   720  			{
   721  				Name: "cellular_sim_dual_active",
   722  				Desc: `Identifies Cellular tests that need active sim's on two slots.`,
   723  			},
   724  			{
   725  				Name: "cellular_sim_pinlock",
   726  				Desc: `Identifies Cellular tests that need sim with puk and pin codes.`,
   727  			},
   728  			{
   729  				Name: "cellular_sim_roaming",
   730  				Desc: `Identifies Cellular tests that need a roaming sim.`,
   731  			},
   732  			{
   733  				Name: "cellular_sim_prod_esim",
   734  				Desc: `Identifies Cellular tests that need an esim with a prod CI.`,
   735  			},
   736  			{
   737  				Name: "cellular_sim_test_esim",
   738  				Desc: `Identifies Cellular tests that need an esim with a test CI.`,
   739  			},
   740  			{
   741  				Name: "cellular_modem_fw",
   742  				Desc: `Identifies modem firmware tests that are run with less frequency.`,
   743  			},
   744  			{
   745  				Name: "cellular_amari_callbox",
   746  				Desc: `Identifies tests that run on DUTs connected to an Amari callbox.`,
   747  			},
   748  			{
   749  				Name: "cellular_cmw_callbox",
   750  				Desc: `Identifies tests that run on DUTs connected to a CMW500 callbox.`,
   751  			},
   752  			{
   753  				Name: "cellular_cmx_callbox",
   754  				Desc: `Identifies tests that run on DUTs connected to a CMX500 callbox.`,
   755  			},
   756  			{
   757  				Name: "cellular_callbox",
   758  				Desc: `Identifies tests that run on DUTs connected to a callbox.`,
   759  			},
   760  			{
   761  				Name: "cellular_e2e",
   762  				Desc: `Identifies Cellular ui/e2e tests.`,
   763  			},
   764  			{
   765  				Name: "cellular_sms",
   766  				Desc: `Identifies SMS tests that can run on North America carriers AT&T, Verizon, T-Mobile.`,
   767  			},
   768  			{
   769  				Name: "cellular_run_isolated",
   770  				Desc: `Identifies tests which are scheduled seperately from other tests. These tests are called out by name in control files. Used to isolate stress tests or high priority tests`,
   771  			},
   772  			{
   773  				Name: "cellular_carrier_att",
   774  				Desc: `Identifies Cellular tests that need an AT&T active sim.`,
   775  			},
   776  			{
   777  				Name: "cellular_carrier_verizon",
   778  				Desc: `Identifies Cellular tests that need an Verizon active sim.`,
   779  			},
   780  			{
   781  				Name: "cellular_carrier_tmobile",
   782  				Desc: `Identifies Cellular tests that need an T-Mobile active sim.`,
   783  			},
   784  			{
   785  				Name: "cellular_carrier_amarisoft",
   786  				Desc: `Identifies Cellular tests that need an Amarisoft active sim.`,
   787  			},
   788  			{
   789  				Name: "cellular_carrier_vodafone",
   790  				Desc: `Identifies Cellular tests that need an Vodafone active sim.`,
   791  			},
   792  			{
   793  				Name: "cellular_carrier_rakuten",
   794  				Desc: `Identifies Cellular tests that need an Rakuten active sim.`,
   795  			},
   796  			{
   797  				Name: "cellular_carrier_ee",
   798  				Desc: `Identifies Cellular tests that need an EE active sim.`,
   799  			},
   800  			{
   801  				Name: "cellular_carrier_kddi",
   802  				Desc: `Identifies Cellular tests that need an KDDI active sim.`,
   803  			},
   804  			{
   805  				Name: "cellular_carrier_docomo",
   806  				Desc: `Identifies Cellular tests that need an Docomo active sim.`,
   807  			},
   808  			{
   809  				Name: "cellular_carrier_softbank",
   810  				Desc: `Identifies Cellular tests that need an Softbank active sim.`,
   811  			},
   812  			{
   813  				Name: "cellular_carrier_fi",
   814  				Desc: `Identifies Cellular tests that need an Google Fi active sim.`,
   815  			},
   816  			{
   817  				Name: "cellular_carrier_local",
   818  				Desc: `Identifies Cellular tests that need an active sim.`,
   819  			},
   820  		},
   821  	},
   822  	{
   823  		Name:     "cellular_crosbolt",
   824  		Contacts: []string{"chromeos-cellular-team@google.com"},
   825  		Desc:     `The group of Cellular Performance tests to be run on hardware with a builtin Cellular modem and SIM card.`,
   826  		Subattrs: []*attr{
   827  			{
   828  				Name: "cellular_crosbolt_perf_nightly",
   829  				Desc: `Indicates that this test should run nightly.`,
   830  			},
   831  			{
   832  				Name: "cellular_crosbolt_unstable",
   833  				Desc: `Identifies Cellular tests that are unstable. Used to skip tests running on stable suites and/or the CQ.`,
   834  			},
   835  			{
   836  				Name: "cellular_crosbolt_sim_active",
   837  				Desc: `Identifies Cellular tests that need an active sim.`,
   838  			},
   839  			{
   840  				Name: "cellular_crosbolt_carrier_att",
   841  				Desc: `Identifies Cellular tests that need a AT&T active sim.`,
   842  			},
   843  			{
   844  				Name: "cellular_crosbolt_carrier_verizon",
   845  				Desc: `Identifies Cellular tests that need a Verizon active sim.`,
   846  			},
   847  			{
   848  				Name: "cellular_crosbolt_carrier_tmobile",
   849  				Desc: `Identifies Cellular tests that need a T-Mobile active sim.`,
   850  			},
   851  			{
   852  				Name: "cellular_crosbolt_carrier_local",
   853  				Desc: `Identifies Cellular tests that need a local active sim.`,
   854  			},
   855  		},
   856  	},
   857  	{
   858  		Name:     "bluetooth",
   859  		Contacts: []string{"cros-connectivity@google.com"},
   860  		Desc:     "Identifies bluetooth tests.",
   861  		Subattrs: []*attr{
   862  			{
   863  				Name: "bluetooth_sa",
   864  				Desc: "Identifies stable bluetooth tests that only requires the DUT (not peer devices) to run except for stress, performance and MTBF tests. Previously known as bluetooth_standalone.",
   865  			},
   866  			{
   867  				Name: "bluetooth_core",
   868  				Desc: "Identifies stable bluetooth tests for bluetooth platform that requires a peer device.",
   869  			},
   870  			{
   871  				Name: "bluetooth_floss",
   872  				Desc: "Identifies stable bluetooth tests that are ported to run with the new floss stack. Eventually all tests in bluetooth_core and bluetooth_sa tests will be added to this pool and will be stabilised.",
   873  			},
   874  			{
   875  				Name: "bluetooth_cross_device_fastpair",
   876  				Desc: "Identifies stable Cross Device Fast Pair tests that require a peer device.",
   877  			},
   878  			{
   879  				Name: "bluetooth_cross_device_fastpair_multidut",
   880  				Desc: "Identifies stable Cross Device Fast Pair tests that require a peer device and 2 DUTs.",
   881  			},
   882  			{
   883  				Name: "bluetooth_flaky",
   884  				Desc: "Identifies bluetooth tests (bluetooth_sa and bluetooth_core) which are not stable yet. This is used to run new tests in the lab to detect any failures. Once the tests are stable (>95% pass rate), these tests are moved to bluetooth_sa or bluetooth_core suites",
   885  			},
   886  			{
   887  				Name: "bluetooth_stress",
   888  				Desc: "Identifies bluetooth stress tests.",
   889  			},
   890  			{
   891  				Name: "bluetooth_sa_cq",
   892  				Desc: "Identifies tests the same way as bluetooth_sa, but these tests are also ran as part of CQ for all changes.",
   893  			},
   894  			{
   895  				Name: "bluetooth_core_cq",
   896  				Desc: "Identifies tests the same way as bluetooth_core_cq, but these tests are also ran as part of the custom CQ for Bluetooth and WiFi changes.",
   897  			},
   898  			{
   899  				Name: "bluetooth_floss_cq",
   900  				Desc: "Identifies tests the same way as bluetooth_floss, but these tests are also ran as part of the custom CQ for Floss",
   901  			},
   902  			{
   903  				Name: "bluetooth_cross_device_cq",
   904  				Desc: "Identifies Cross Device Bluetooth tests that are also ran as part of the custom CQ for Cross Device.",
   905  			},
   906  			{
   907  				Name: "bluetooth_wifi_coex",
   908  				Desc: "Identifies bluetooth and wifi coexistence tests.",
   909  			},
   910  			{
   911  				Name: "bluetooth_fw",
   912  				Desc: "Identifies tests that can only break when a hardware/firmware change occurs. These tests test a feature/requirement that is implemented in hardware/firmware.",
   913  			},
   914  			{
   915  				Name: "bluetooth_dep_feature",
   916  				Desc: "Identifies tests for features that use Bluetooth. Example Nearby Share, Phone Hub etc.",
   917  			},
   918  			{
   919  				Name: "bluetooth_perf",
   920  				Desc: "Identifies performance tests for bluetooth.",
   921  			},
   922  			{
   923  				Name: "bluetooth_longrun",
   924  				Desc: "Identifies tests that take more than 5 minutes to run. This does not contain stress tests or MTBF tests. This allows for separate scheduling.",
   925  			},
   926  			{
   927  				Name: "bluetooth_cuj",
   928  				Desc: "Identifies tests for bluetooth that tests layers above the platform such as UI and any tests that implement a CUJ above platform layer.",
   929  			},
   930  			{
   931  				Name: "bluetooth_manual",
   932  				Desc: "Identifies semi-manual tests for bluetooth. Used as a logical grouping for these tests and are not scheduled in the lab.",
   933  			},
   934  			{
   935  				Name: "bluetooth_avl",
   936  				Desc: "Identifies AVL tests meant to be run by partners and are not scheduled in the lab.",
   937  			},
   938  			{
   939  				Name: "bluetooth_mtbf",
   940  				Desc: "Identifies MTBP tests for bluetooth. These are scheduled in a separate pool as to not use up all DUT capacity in the lab.",
   941  			},
   942  			{
   943  				Name: "bluetooth_btpeers_1",
   944  				Desc: "Identifies bluetooth tests that require at most 1 btpeer.",
   945  			},
   946  			{
   947  				Name: "bluetooth_btpeers_2",
   948  				Desc: "Identifies bluetooth tests that require at most 2 btpeers.",
   949  			},
   950  			{
   951  				Name: "bluetooth_btpeers_3",
   952  				Desc: "Identifies bluetooth tests that require at most 3 btpeers.",
   953  			},
   954  			{
   955  				Name: "bluetooth_btpeers_4",
   956  				Desc: "Identifies bluetooth tests that require at most 4 btpeers.",
   957  			},
   958  		},
   959  	},
   960  	{
   961  		Name:     "meta",
   962  		Contacts: []string{"tast-owners@google.com"},
   963  		Desc: `A group of functional tests of the Tast framework itself.
   964  
   965  Meta tests should be a subset of mainline critical tests.
   966  `,
   967  	},
   968  	{
   969  		Name:     "fingerprint-cq",
   970  		Contacts: []string{"chromeos-fingerprint@google.com"},
   971  		Desc:     `The group of tests to be run in CQ for integrated fingerprint functionality.`,
   972  	},
   973  	{
   974  		Name:     "fingerprint-mcu",
   975  		Contacts: []string{"chromeos-fingerprint@google.com"},
   976  		Desc:     `The group of tests to be run on a standalone Fingerprint MCU board.`,
   977  		Subattrs: []*attr{
   978  			{
   979  				Name: "fingerprint-mcu_dragonclaw",
   980  				Desc: `Tests to be run on Dragonclaw board (a standalone MCU board, not a ChromeOS board).`,
   981  			},
   982  			{
   983  				Name: "fingerprint-mcu_icetower",
   984  				Desc: `Tests to be run on Icetower board (a standalone MCU board, not a ChromeOS board).`,
   985  			},
   986  		},
   987  	},
   988  	{
   989  		Name:     "storage-qual",
   990  		Contacts: []string{"chromeos-engprod-platform-syd@google.com"},
   991  		Desc:     `A group of tests for internal and external storage qualification and testing.`,
   992  	},
   993  	{
   994  		Name:     "syzcorpus",
   995  		Contacts: []string{"zsm@google.com", "chromeos-kernel@google.com"},
   996  		Desc:     `Regression tests comprising of Syzkaller reproducers to test the kernel.`,
   997  	},
   998  	{
   999  		Name:     "syzkaller",
  1000  		Contacts: []string{"zsm@google.com", "chromeos-kernel@google.com"},
  1001  		Desc:     `A group of tests that utilize Syzkaller to fuzz the kernel.`,
  1002  	},
  1003  	{
  1004  		Name:     "nearby-share-arc",
  1005  		Contacts: []string{"chromeos-sw-engprod@google.com", "arc-app-dev@google.com", "alanding@chromium.org"},
  1006  		Desc:     `A group of tests that test Nearby Share functionality from ARC++.`,
  1007  		Subattrs: []*attr{
  1008  			{
  1009  				Name: "nearby-share-arc_fusebox",
  1010  				Desc: `A group of tests that test Nearby Share functionality with FuseBox from ARC++.`,
  1011  			},
  1012  		},
  1013  	},
  1014  	{
  1015  		Name:     "paper-io",
  1016  		Contacts: []string{"project-bolton@google.com"},
  1017  		Desc:     `A group of tests that test printing and scanning functionality.`,
  1018  		Subattrs: []*attr{
  1019  			{
  1020  				Name: "paper-io_printing",
  1021  				Desc: `Printing tests.`,
  1022  			},
  1023  			{
  1024  				Name: "paper-io_scanning",
  1025  				Desc: `Scanning tests.`,
  1026  			},
  1027  			{
  1028  				Name: "paper-io_mfp_printscan",
  1029  				Desc: `Scanning and printing tests on real MFPs.`,
  1030  			},
  1031  		},
  1032  	},
  1033  	{
  1034  		Name:     "parallels_mainline",
  1035  		Contacts: []string{"parallels-cros@google.com"},
  1036  		Desc: `Functional tests that must be run on devices licensed for Parallels
  1037  boot-up testing. Otherwise the same as group:mainline.`,
  1038  		Subattrs: []*attr{
  1039  			{
  1040  				Name: "informational",
  1041  				Desc: `Indicates that failures can be ignored.`,
  1042  			},
  1043  		},
  1044  	},
  1045  	{
  1046  		Name:     "parallels_crosbolt",
  1047  		Contacts: []string{"crosbolt-eng@google.com"},
  1048  		Desc: `Performance tests that must be run on devices licensed for
  1049  Parallels boot-up testing. Otherwise the same as group:crosbolt.`,
  1050  		Subattrs: []*attr{
  1051  			{
  1052  				Name: "parallels_crosbolt_perbuild",
  1053  				Desc: `Indicates that this test should run for every ChromeOS build.`,
  1054  			},
  1055  			{
  1056  				Name: "parallels_crosbolt_nightly",
  1057  				Desc: `Indicates that this test should run nightly.`,
  1058  			},
  1059  			{
  1060  				Name: "parallels_crosbolt_weekly",
  1061  				Desc: `Indicates that this test should run weekly.`,
  1062  			},
  1063  		},
  1064  	},
  1065  	{
  1066  		Name:     "typec",
  1067  		Contacts: []string{"chromeos-power@google.com"},
  1068  		Desc:     `USB Type C functional tests.`,
  1069  		Subattrs: []*attr{
  1070  			{
  1071  				Name: "typec_lab",
  1072  				Desc: `Indicates that this test should be run in a dedicated Type C lab setup.`,
  1073  			},
  1074  			{
  1075  				Name: "typec_informational",
  1076  				Desc: `Indicates that failures can be ignored.`,
  1077  			},
  1078  		},
  1079  	},
  1080  	{
  1081  		Name:     "wwcb",
  1082  		Contacts: []string{"cros-wwcb-automation@google.com"},
  1083  		Desc:     `WWCB end-to-end functional tests.`,
  1084  		Subattrs: []*attr{
  1085  			{
  1086  				Name: "wwcb_satlab",
  1087  				Desc: `Indicates that this test should be run in a dedicated wwcb setup.`,
  1088  			},
  1089  			{
  1090  				Name: "wwcb_informational",
  1091  				Desc: `Indicates that failures can be ignored.`,
  1092  			},
  1093  		},
  1094  	},
  1095  	{
  1096  		Name:     "borealis",
  1097  		Contacts: []string{"chromeos-gaming@google.com"},
  1098  		Desc:     `Borealis related tests.`,
  1099  		Subattrs: []*attr{
  1100  			{
  1101  				Name: "borealis_cq",
  1102  				Desc: `Indicate this test should be scheduled on cq.`,
  1103  			},
  1104  			{
  1105  				Name: "borealis_perbuild",
  1106  				Desc: `Indicate this test should be scheduled per build.`,
  1107  			},
  1108  			{
  1109  				Name: "borealis_nightly",
  1110  				Desc: `Indicate this test should be scheduled per day.`,
  1111  			},
  1112  			{
  1113  				Name: "borealis_weekly",
  1114  				Desc: `Indicate this test should be scheduled per week.`,
  1115  			},
  1116  			{
  1117  				Name: "informational",
  1118  				Desc: `Indicates that failures can be ignored.`,
  1119  			},
  1120  		},
  1121  	},
  1122  	{
  1123  		Name:     "cross-device",
  1124  		Contacts: []string{"chromeos-sw-engprod@google.com"},
  1125  		Desc:     `A group of tests that test Cross Device functionality between CrOS and Android devices.`,
  1126  		Subattrs: []*attr{
  1127  			{
  1128  				Name: "cross-device_crossdevice",
  1129  				Desc: `Temporary smoke test to mitigate cross device onboarding fixture failure.`,
  1130  			},
  1131  			{
  1132  				Name: "cross-device_cellular",
  1133  				Desc: `Cross Device tests that use a cellular connection on the Android phone.`,
  1134  			},
  1135  			{
  1136  				Name: "cross-device_cq",
  1137  				Desc: `Indicate this test should be scheduled on one of the Cross Device Commit Queues.`,
  1138  			},
  1139  			{
  1140  				Name: "cross-device_instanttether",
  1141  				Desc: `Instant Tether tests.`,
  1142  			},
  1143  			{
  1144  				Name: "cross-device_lacros",
  1145  				Desc: `Cross Device tests that use Lacros.`,
  1146  			},
  1147  			{
  1148  				Name: "cross-device_floss",
  1149  				Desc: `Cross Device tests with Floss enabled.`,
  1150  			},
  1151  			{
  1152  				Name: "cross-device_nearbyshare",
  1153  				Desc: `Nearby Share tests.`,
  1154  			},
  1155  			{
  1156  				Name: "cross-device_nearbyshare-dev",
  1157  				Desc: `A group of tests that test Nearby Share functionality with the dev version of Android Nearby.`,
  1158  			},
  1159  			{
  1160  				Name: "cross-device_nearbyshare-prod",
  1161  				Desc: `A group of tests that test Nearby Share functionality with the production version of Android Nearby.`,
  1162  			},
  1163  			{
  1164  				Name: "cross-device_phonehub",
  1165  				Desc: `Phone Hub tests.`,
  1166  			},
  1167  			{
  1168  				Name: "cross-device_smartlock",
  1169  				Desc: `Smart Lock tests.`,
  1170  			},
  1171  		},
  1172  	},
  1173  	{
  1174  		Name:     "cross-device-remote",
  1175  		Contacts: []string{"chromeos-sw-engprod@google.com"},
  1176  		Desc:     `A group of remote tests that test Cross Device functionality between two ChromeOS devices.`,
  1177  		Subattrs: []*attr{
  1178  			{
  1179  				Name: "cross-device-remote_cq",
  1180  				Desc: `Indicate this test should be scheduled on one of the Cross Device Commit Queues.`,
  1181  			},
  1182  			{
  1183  				Name: "cross-device-remote_nearbyshare",
  1184  				Desc: `Nearby Share tests.`,
  1185  			},
  1186  			{
  1187  				Name: "cross-device-remote_floss",
  1188  				Desc: `Cross Device remote tests with Floss enabled.`,
  1189  			},
  1190  		},
  1191  	},
  1192  	{
  1193  		Name:     "hps",
  1194  		Contacts: []string{"chromeos-hps-swe@google.com"},
  1195  		Desc:     `HPS related tests.`,
  1196  		Subattrs: []*attr{
  1197  			{
  1198  				Name: "hps_perbuild",
  1199  				Desc: `Indicate this test should be scheduled per build.`,
  1200  			},
  1201  			{
  1202  				Name: "hps_devboard_p2_sweetberry",
  1203  				Desc: `Indicate this test depends on the HPS Devboard and Sweetberry to be connected.`,
  1204  			},
  1205  		},
  1206  	},
  1207  	{
  1208  		Name:     "wilco_bve",
  1209  		Contacts: []string{"lamzin@google.com", "cros-oem-services-team@google.com"},
  1210  		Desc:     `A group of Wilco tests that require servo type-A connected to a USB-A port that has a lightning bolt or a battery icon engraved into it.`,
  1211  	},
  1212  	{
  1213  		Name:     "wilco_bve_dock",
  1214  		Contacts: []string{"lamzin@google.com", "cros-oem-services-team@google.com"},
  1215  		Desc:     `A group of Wilco tests that require a solomon dock connected to the DUT.`,
  1216  	},
  1217  	{
  1218  		Name:     "autoupdate",
  1219  		Contacts: []string{"gabormagda@google.com", "cros-engprod-muc@google.com"},
  1220  		Desc:     `A group of tests that require the installation of a new OS image version.`,
  1221  	},
  1222  	{
  1223  		Name:     "asan",
  1224  		Contacts: []string{"cjdb@google.com", "chromeos-toolchain@google.com"},
  1225  		Desc:     `A group of tests for AddressSanitizer builds.`,
  1226  	},
  1227  	{
  1228  		Name:     "distributed_lab_qual",
  1229  		Contacts: []string{"chromeos-distributed-fleet-platform@google.com"},
  1230  		Desc:     `A group of test to qualify distributed lab components.`,
  1231  		Subattrs: []*attr{
  1232  			{
  1233  				Name: "distributed_lab_qual_faft",
  1234  				Desc: `Indicate firmware test for distributed lab.`,
  1235  			},
  1236  		},
  1237  	},
  1238  	{
  1239  		Name:     "shimless_rma",
  1240  		Contacts: []string{"chromeos-engprod-platform-syd@google.com"},
  1241  		Desc:     `shimless rma related tests.`,
  1242  		Subattrs: []*attr{
  1243  			{
  1244  				Name: "shimless_rma_experimental",
  1245  				Desc: `Shimless RMA tests that might break the DUTs in the lab.`,
  1246  			},
  1247  			{
  1248  				Name: "shimless_rma_normal",
  1249  				Desc: `Shimless RMA tests that can be executed in Skylab.`,
  1250  			},
  1251  			{
  1252  				Name: "shimless_rma_nodelocked",
  1253  				Desc: `Shimless RMA tests that require node-locked image.`,
  1254  			},
  1255  			{
  1256  				Name: "shimless_rma_calibration",
  1257  				Desc: `Shimless RMA tests for calibration.`,
  1258  			},
  1259  		},
  1260  	},
  1261  	{
  1262  		Name:     "ml_benchmark",
  1263  		Contacts: []string{"chromeos-platform-ml-accelerators@google.com"},
  1264  		Desc:     `MLBenchmark performance tests.`,
  1265  		Subattrs: []*attr{
  1266  			{
  1267  				Name: "ml_benchmark_nightly",
  1268  				Desc: `Indicates that this test should run nightly.`,
  1269  			},
  1270  		},
  1271  	},
  1272  	{
  1273  		Name:     "assistant_audiobox",
  1274  		Contacts: []string{"chromeos-sw-engprod@google.com", "assistive-eng@google.com"},
  1275  		Desc:     `A group of Assistant tests that have to be run in audiobox.`,
  1276  	},
  1277  	{
  1278  		Name:     "commercial_limited",
  1279  		Contacts: []string{"gabormagda@google.com", "chromeos-ent-test@google.com"},
  1280  		Desc:     `A group of commercial tests that should use limited resources.`,
  1281  	},
  1282  	{
  1283  		Name:     "experimental",
  1284  		Contacts: []string{"chromeos-velocity@google.com"},
  1285  		Desc: `This is for housing Informational tests that are not going to be promoted to CQ any time soon (i.e. < 3months).
  1286  							 Default is to run the tests M/W/F only. Runs on same set of boards as group:mainline.
  1287  							 Motivation is to lower DUT usage for tests that don't need to run that frequently.`,
  1288  		Subattrs: []*attr{
  1289  			{
  1290  				Name: "experimental_nightly",
  1291  				Desc: `Runs once every evening.`,
  1292  			},
  1293  			{
  1294  				Name: "experimental_m_w_f",
  1295  				Desc: `Runs once on Monday, Wednesday, and Friday only.`,
  1296  			},
  1297  			{
  1298  				Name: "experimental_weekly",
  1299  				Desc: `Runs once a week only.`,
  1300  			},
  1301  		},
  1302  	},
  1303  	{
  1304  		Name:     "telemetry_extension_hw",
  1305  		Contacts: []string{"cros-oem-services-team@google.com"},
  1306  		Desc:     `A group of Telemetry Extension hardware dependant tests.`,
  1307  	},
  1308  	{
  1309  		Name:     "hwsec",
  1310  		Contacts: []string{"cros-hwsec@google.com"},
  1311  		Desc:     `A group of tests related to hardware-backed security. (ie. TPM)`,
  1312  		Subattrs: []*attr{
  1313  			{
  1314  				Name: "hwsec_weekly",
  1315  				Desc: "Indicates that these tests should run weekly. Tests that aren't stable enough to be critical or is too expensive gets placed here",
  1316  			},
  1317  			{
  1318  				Name: "hwsec_nightly",
  1319  				Desc: "Indicates that these tests should run nightly. Tests that are too expensive for mainline, but still important enough to be checked more often than weekly, get placed here",
  1320  			},
  1321  		},
  1322  	},
  1323  	{
  1324  		Name:     "attestation",
  1325  		Contacts: []string{"cros-hwsec@google.com"},
  1326  		Desc:     `A group of tests related to the attestationd system daemon.`,
  1327  	},
  1328  	{
  1329  		Name:     "bootlockbox",
  1330  		Contacts: []string{"cros-hwsec@google.com"},
  1331  		Desc:     `A group of tests related to the bootlockboxd system daemon.`,
  1332  	},
  1333  	{
  1334  		Name:     "chaps",
  1335  		Contacts: []string{"cros-hwsec@google.com"},
  1336  		Desc:     `A group of tests related to the chapsd system daemon.`,
  1337  	},
  1338  	{
  1339  		Name:     "cryptohome",
  1340  		Contacts: []string{"cryptohome-core@google.com"},
  1341  		Desc:     `A group of tests related to the cryptohomed system daemon.`,
  1342  	},
  1343  	{
  1344  		Name:     "hwsec_infra",
  1345  		Contacts: []string{"cros-hwsec@google.com"},
  1346  		Desc:     `A group of tests related to the hwsec related low-level libraries & daemons.`,
  1347  	},
  1348  	{
  1349  		Name:     "tpm_manager",
  1350  		Contacts: []string{"cros-hwsec@google.com"},
  1351  		Desc:     `A group of tests related to the tpm_managerd system daemon.`,
  1352  	},
  1353  	{
  1354  		Name:     "u2fd",
  1355  		Contacts: []string{"cros-hwsec@google.com"},
  1356  		Desc:     `A group of tests related to the u2fd system daemon.`,
  1357  	},
  1358  	{
  1359  		Name:     "vtpm",
  1360  		Contacts: []string{"cros-hwsec@google.com"},
  1361  		Desc:     `A group of tests related to the vtpmd system daemon.`,
  1362  	},
  1363  	{
  1364  		Name:     "cros-tcp-grpc",
  1365  		Contacts: []string{"jonfan@google.com", "chromeos-sw-engprod@google.com"},
  1366  		Desc:     `A group of tests that test Tast TCP based gRPC services.`,
  1367  	},
  1368  	{
  1369  		Name:     "sensors",
  1370  		Contacts: []string{"gwendal@google.com", "chromeos-sensors@google.com"},
  1371  		Desc:     `A group of tests that test sensor and sensor services.`,
  1372  	},
  1373  	{
  1374  		Name:     "network",
  1375  		Contacts: []string{"cros-networking@google.com"},
  1376  		Desc:     `A group of tests that test general network functions.`,
  1377  		Subattrs: []*attr{
  1378  			{
  1379  				Name: "network_e2e",
  1380  				Desc: `Identifies network ui/e2e tests.`,
  1381  			},
  1382  			{
  1383  				Name: "network_e2e_unstable",
  1384  				Desc: `Identifies network ui/e2e tests that are unstable. Used to skip tests running on stable suites and/or the CQ.`,
  1385  			},
  1386  			{
  1387  				Name: "network_platform",
  1388  				Desc: `Identifies stable platform network tests.`,
  1389  			},
  1390  			{
  1391  				Name: "network_platform_unstable",
  1392  				Desc: `Identifies unstable platform network tests.`,
  1393  			},
  1394  		},
  1395  	},
  1396  	{
  1397  		Name:     "intel-gating",
  1398  		Contacts: []string{"ambalavanan.m.m@intel.com", "intel-chrome-system-automation-team@intel.com"},
  1399  		Desc:     `A group of tests related to Intel that are gating for build validation.`,
  1400  	},
  1401  	{
  1402  		Name:     "hw_agnostic",
  1403  		Contacts: []string{"tast-owners@google.com"},
  1404  		Desc: `Specifies tests that are capable of being run on VMs.
  1405  
  1406  This does not imply tests can only run on VMs, but can be used by systems to find and schedule tests on VMs
  1407  from other existing groups (or use this group standalone).
  1408  `,
  1409  	},
  1410  	{
  1411  		Name:     "vdi_limited",
  1412  		Contacts: []string{"kamilszarek@google.com", "chromeos-ent-test@google.com"},
  1413  		Desc:     `A group of VDI tests that should use run on selected devices to limit load on the infrastructure.`,
  1414  	},
  1415  
  1416  	{
  1417  		Name:     "golden_tier",
  1418  		Contacts: []string{"kamilszarek@google.com", "chromeos-ent-test@google.com"},
  1419  		Desc:     `Suite will run assigned tests on devices that provide the most reliable results. More info go/cros-duop:proposal`,
  1420  	},
  1421  	{
  1422  		Name:     "medium_low_tier",
  1423  		Contacts: []string{"kamilszarek@google.com", "chromeos-ent-test@google.com"},
  1424  		Desc:     `Suite will run assigned tests on medium and low tier devices. More info go/cros-duop:proposal`,
  1425  	},
  1426  	{
  1427  		Name:     "hardware",
  1428  		Contacts: []string{"kamilszarek@google.com", "chromeos-ent-test@google.com"},
  1429  		Desc:     `Suite will run assigned tests on various hardware configurations. More info go/cros-duop:proposal`,
  1430  	},
  1431  	{
  1432  		Name:     "complementary",
  1433  		Contacts: []string{"kamilszarek@google.com", "chromeos-ent-test@google.com"},
  1434  		Desc:     `Suite will run assigned tests on devices that are not in golden_tier, medium_low_tier not hardware. More info go/cros-duop:proposal`,
  1435  	},
  1436  	{
  1437  		Name:     "crostini_slow",
  1438  		Contacts: []string{"clumptini@google.com"},
  1439  		Desc:     `A group of slow crostini tests that should run on dedicated shards only when relevant code is changed.`,
  1440  	},
  1441  	{
  1442  		Name:     "audio",
  1443  		Contacts: []string{"chromeos-audio-bugs@google.com", "chromeos-sw-engprod@google.com"},
  1444  		Desc:     `A group of audio tests that are out of audio.* but tracked with audio_cq.`,
  1445  	},
  1446  	{
  1447  		Name:     "audio_audiobox",
  1448  		Contacts: []string{"chromeos-audio-bugs@google.com", "chromeos-sw-engprod@google.com"},
  1449  		Desc:     `A group of audio tests that have to be run in audiobox.`,
  1450  	},
  1451  	{
  1452  		Name:     "unowned",
  1453  		Contacts: []string{"kamilszarek@google.com", "chromeos-ent-test@google.com"},
  1454  		Desc:     `Suite will run unowned tests at a minimul infra load.`,
  1455  	},
  1456  	{
  1457  		Name:     "video_conference",
  1458  		Contacts: []string{"cros-videoconferencing@google.com"},
  1459  		Desc:     `video conference related tests.`,
  1460  		Subattrs: []*attr{
  1461  			{
  1462  				Name: "video_conference_cq_critical",
  1463  				Desc: `Indicate this test should be scheduled in cq as critial test.`,
  1464  			},
  1465  			{
  1466  				Name: "video_conference_per_build",
  1467  				Desc: `Indicate this test should be scheduled per build.`,
  1468  			},
  1469  		},
  1470  	},
  1471  	{
  1472  		Name:     "camera_dependent",
  1473  		Contacts: []string{"chromeos-camera-eng@google.com", "chromeos-sw-engprod@google.com"},
  1474  		Desc:     `A group of tests depending on camera but out of camera.*.`,
  1475  	},
  1476  	{
  1477  		Name:     "power",
  1478  		Contacts: []string{"chromeos-platform-power@google.com", "chromeos-pvs-eng@google.com"},
  1479  		Desc:     `Tests measuring power.`,
  1480  		Subattrs: []*attr{
  1481  			{
  1482  				Name: "power_cpd",
  1483  				Desc: `Tests relying on CPD to measure power at the battery.`,
  1484  			},
  1485  		},
  1486  	},
  1487  	{
  1488  		Name:     "healthd",
  1489  		Contacts: []string{"cros-tdm-tpe-eng@google.com"},
  1490  		Desc:     `A group of tests that validate the functionality of cros_healthd.`,
  1491  		Subattrs: []*attr{
  1492  			{
  1493  				Name: "healthd_perbuild",
  1494  				Desc: `Indicates that this test should run for every ChromeOS build.`,
  1495  			},
  1496  		},
  1497  	},
  1498  	{
  1499  		Name:     "launcher_search_quality_daily",
  1500  		Contacts: []string{"launcher-search-notify@google.com"},
  1501  		Desc:     "A group of tests for checking the pass ratio in different builds for launcher search.",
  1502  	},
  1503  }
  1504  
  1505  // validGroupMap is the name-keyed map of validGroups.
  1506  var validGroupMap = map[string]*group{}
  1507  
  1508  func init() {
  1509  	// Initialize validGroupMap.
  1510  	for _, g := range validGroups {
  1511  		if _, ok := validGroupMap[g.Name]; ok {
  1512  			panic(fmt.Sprintf("Duplicated group definition %q found", g.Name))
  1513  		}
  1514  		validGroupMap[g.Name] = g
  1515  	}
  1516  }
  1517  
  1518  const groupPrefix = "group:"
  1519  
  1520  // checkKnownAttrs validate attrs against valid groups.
  1521  func checkKnownAttrs(attrs []string) error {
  1522  	const defPath = "go.chromium.org/tast/core/internal/testing/attr.go"
  1523  
  1524  	var groups []*group
  1525  	for _, attr := range attrs {
  1526  		if isAutoAttr(attr) || !strings.HasPrefix(attr, groupPrefix) {
  1527  			continue
  1528  		}
  1529  		name := strings.TrimPrefix(attr, groupPrefix)
  1530  		g, ok := validGroupMap[name]
  1531  		if !ok {
  1532  			return fmt.Errorf("group %q is invalid; see %s for the full list of valid groups", name, defPath)
  1533  		}
  1534  		groups = append(groups, g)
  1535  	}
  1536  
  1537  	for _, attr := range attrs {
  1538  		if isAutoAttr(attr) || strings.HasPrefix(attr, groupPrefix) {
  1539  			continue
  1540  		}
  1541  		// Allow the "disabled" attribute.
  1542  		// Note that manually-specified "disabled" attributes are checked on test instantiation
  1543  		// and prohibited. If we see the "disabled" attribute here, it is one internally added on
  1544  		// test instantiation for compatibility.
  1545  		// TODO(crbug.com/1005041): Remove this transitional handling.
  1546  		if attr == "disabled" {
  1547  			continue
  1548  		}
  1549  		found := false
  1550  	grouploop:
  1551  		for _, group := range groups {
  1552  			for _, subattr := range group.Subattrs {
  1553  				if attr == subattr.Name {
  1554  					found = true
  1555  					break grouploop
  1556  				}
  1557  			}
  1558  		}
  1559  		if !found {
  1560  			return fmt.Errorf("attribute %q is invalid in current groups; see %s for the full list of valid attributes", attr, defPath)
  1561  		}
  1562  	}
  1563  
  1564  	return nil
  1565  }
  1566  
  1567  // modifyAttrsForCompat modifies an attribute list for compatibility.
  1568  func modifyAttrsForCompat(attrs []string) []string {
  1569  	// If no "group:*" attribute is set, append the "disabled" attribute.
  1570  	// TODO(crbug.com/1005041): Remove this workaround once infra is updated to
  1571  	// not rely on the "disabled" attribute.
  1572  	hasGroup := false
  1573  	for _, a := range attrs {
  1574  		if strings.HasPrefix(a, groupPrefix) {
  1575  			hasGroup = true
  1576  			break
  1577  		}
  1578  	}
  1579  
  1580  	if hasGroup {
  1581  		return attrs
  1582  	}
  1583  	return append(attrs, "disabled")
  1584  }