a7d0df2dbc1d8fded14f2631b46d47851ded1b40
chmalee
  Mon May 23 12:04:32 2022 -0700
Add a test for bogus subgroup membership in hubCheck, refs #29389, #13428

diff --git src/hg/utils/hubCheck/hubCheck.c src/hg/utils/hubCheck/hubCheck.c
index ebb2be8..e664265 100644
--- src/hg/utils/hubCheck/hubCheck.c
+++ src/hg/utils/hubCheck/hubCheck.c
@@ -663,30 +663,40 @@
                 }
             }
 
         // now check that this subtrack is a member of every defined subgroup
         for (i = 0; i < ArraySize(membersForAll->members); i++)
             {
             if (membersForAll->members[i] != NULL)
                 {
                 char *subgroupName = membersForAll->members[i]->groupTag;
                 if (stringArrayIx(subgroupName, membership->subgroups, membership->count) == -1)
                     {
                     errAbort("subtrack %s not a member of subgroup %s", subtrackName, subgroupName);
                     }
                 }
             }
+
+        // check that the subtrack does not have any bogus subgroups that don't exist in the parent
+        for (i = 0; i < membership->count; i++)
+            {
+            char *subgroupName = membership->subgroups[i];
+            if (!subgroupingExists(tdb->parent, subgroupName))
+                {
+                errAbort("subtrack \"%s\" has a subgroup \"%s\" not defined at parent level", subtrackName, subgroupName);
+                }
+            }
         }
     }
 errCatchEnd(errCatch);
 if (errCatch->gotError)
     {
     retVal = 1;
     trackDbErr(errors, errCatch->message->string, genome, tdb, options->htmlOut);
     }
 errCatchFree(&errCatch);
 
 return retVal;
 }
 
 int hubCheckCompositeSettings(struct trackHubGenome *genome, struct trackDb *tdb, struct dyString *errors, struct trackHubCheckOptions *options)
 /* Check composite level settings like subgroups, dimensions, sortOrder, etc.