// Creates a new bucket reader with the given context.
// Param enableStats is generally used for integration tests.
// Enabling stats in production can cause high memory usage,
// so keep that off unless you're trying to diagnose specific problems.
func NewAPTBucketReader(context *context.Context, enableStats bool) *APTBucketReader {
	reader := &APTBucketReader{
		Context:           context,
		Institutions:      make(map[string]*models.Institution),
		RecentIngestItems: make(map[string]*models.WorkItem),
		statsEnabled:      enableStats,
	}
	if enableStats {
		reader.stats = stats.NewAPTBucketReaderStats()
	}
	return reader
}
func TestNewAPTBucketReaderStats(t *testing.T) {
	_stats := stats.NewAPTBucketReaderStats()
	require.NotNil(t, _stats)
	assert.NotNil(t, _stats.InstitutionsCached)
	assert.NotNil(t, _stats.WorkItemsCached)
	assert.NotNil(t, _stats.WorkItemsFetched)
	assert.NotNil(t, _stats.WorkItemsCreated)
	assert.NotNil(t, _stats.WorkItemsQueued)
	assert.NotNil(t, _stats.WorkItemsMarkedAsQueued)
	assert.NotNil(t, _stats.S3Items)
	assert.NotNil(t, _stats.Errors)
	assert.NotNil(t, _stats.Warnings)
}
// Create a stats object with 5 of everything, no errors and no warnings.
func makeAPTBucketReaderStats() *stats.APTBucketReaderStats {
	_stats := stats.NewAPTBucketReaderStats()
	for i := 1; i <= 5; i++ {
		inst := testutil.MakeInstitution()
		inst.Identifier = fmt.Sprintf("inst_%d", i)
		_stats.AddToInstitutionsCached(inst)

		workItem := testutil.MakeWorkItem()
		workItem.Id = i
		workItem.Name = fmt.Sprintf("item_%d.tar", i)
		workItem.ETag = fmt.Sprintf("etag_%d", i)
		_stats.AddWorkItem("WorkItemsCached", workItem)
		_stats.AddWorkItem("WorkItemsFetched", workItem)
		_stats.AddWorkItem("WorkItemsCreated", workItem)
		_stats.AddWorkItem("WorkItemsQueued", workItem)
		_stats.AddWorkItem("WorkItemsMarkedAsQueued", workItem)
		_stats.AddS3Item(fmt.Sprintf("test.edu/test_item_%d", i))
	}
	return _stats
}