code: @VisibleForTesting
      protected ProctorResult determineBucketsInternal(final Identifiers identifiers, final Map<String, Object> context, final Map<String, Integer> forcedGroups) {
          final Proctor proctor = proctorSource.get();
          if (proctor == null) {
              final Map<String, TestBucket> buckets = getDefaultBucketValues();
              final Map<String, Integer> versions = Maps.newHashMap();
              for (final String testName : buckets.keySet()) {
                  versions.put(testName, Integer.valueOf(-1));
              }
              return new ProctorResult(Audit.EMPTY_VERSION,
                      buckets,
                      Collections.<String, Allocation>emptyMap(),
                      Collections.<String, ConsumableTestDefinition>emptyMap()
              );
          }
          final ProctorResult result = proctor.determineTestGroups(identifiers, context, forcedGroups);
          return result;
      }
docs: I don't see any value in using this in an application; you probably should use
  {@link #determineBucketsInternal(HttpServletRequest, HttpServletResponse, Identifiers, Map, boolean)}
  
  @param identifiers  a {@link Map} of unique-ish {@link String}s describing the request in the context of different {@link TestType}s.For example,
  {@link TestType#USER} has a CTK associated, {@link TestType#EMAIL} is an email address, {@link TestType#PAGE} might be a url-encoded String
  containing the normalized relevant page parameters
  @param context      a {@link Map} containing variables describing the context in which the request is executing. These will be supplied to any rules that
  execute to determine test eligibility.
  @param forcedGroups a {@link Map} from a String test name to an Integer bucket value. For the specified test allocate the specified bucket (if valid) regardless
  of the standard logic
  @return a {@link ProctorResult} to describe buckets allocations of all tests.