From 11885daaa0397d02d7acd559234b098dfd239d49 Mon Sep 17 00:00:00 2001
From: Antoine GIRARD <sapk@users.noreply.github.com>
Date: Thu, 16 Jan 2020 16:15:44 +0100
Subject: [PATCH] tests: configure github remaining limit + read token (#9800)

* ci: configure remaining github limmit

* prepend with github since package is common to all migrations

* add RefreshRate

* Update github.go

* add missing space

* go fmt

* Read env variable GITHUB_READ_TOKEN for token

* Update .drone.yml
---
 .drone.yml                        |  2 ++
 modules/migrations/github.go      | 19 +++++++++++++++----
 modules/migrations/github_test.go |  7 ++++++-
 3 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/.drone.yml b/.drone.yml
index 11dea174bb..3e02a47c44 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -122,6 +122,8 @@ steps:
     environment:
       GOPROXY: off
       TAGS: bindata sqlite sqlite_unlock_notify
+      GITHUB_READ_TOKEN:
+        from_secret: github_read_token
     when:
       branch:
         - master
diff --git a/modules/migrations/github.go b/modules/migrations/github.go
index 17e49d90d1..a99b05e11c 100644
--- a/modules/migrations/github.go
+++ b/modules/migrations/github.go
@@ -24,6 +24,8 @@ import (
 var (
 	_ base.Downloader        = &GithubDownloaderV3{}
 	_ base.DownloaderFactory = &GithubDownloaderV3Factory{}
+	// GithubLimitRateRemaining limit to wait for new rate to apply
+	GithubLimitRateRemaining = 0
 )
 
 func init() {
@@ -115,7 +117,7 @@ func (g *GithubDownloaderV3) SetContext(ctx context.Context) {
 }
 
 func (g *GithubDownloaderV3) sleep() {
-	for g.rate != nil && g.rate.Remaining <= 0 {
+	for g.rate != nil && g.rate.Remaining <= GithubLimitRateRemaining {
 		timer := time.NewTimer(time.Until(g.rate.Reset.Time))
 		select {
 		case <-g.ctx.Done():
@@ -124,15 +126,24 @@ func (g *GithubDownloaderV3) sleep() {
 		case <-timer.C:
 		}
 
-		rates, _, err := g.client.RateLimits(g.ctx)
+		err := g.RefreshRate()
 		if err != nil {
 			log.Error("g.client.RateLimits: %s", err)
 		}
-
-		g.rate = rates.GetCore()
 	}
 }
 
+// RefreshRate update the current rate (doesn't count in rate limit)
+func (g *GithubDownloaderV3) RefreshRate() error {
+	rates, _, err := g.client.RateLimits(g.ctx)
+	if err != nil {
+		return err
+	}
+
+	g.rate = rates.GetCore()
+	return nil
+}
+
 // GetRepoInfo returns a repository information
 func (g *GithubDownloaderV3) GetRepoInfo() (*base.Repository, error) {
 	g.sleep()
diff --git a/modules/migrations/github_test.go b/modules/migrations/github_test.go
index 10943e4019..9023e2ac4d 100644
--- a/modules/migrations/github_test.go
+++ b/modules/migrations/github_test.go
@@ -6,6 +6,7 @@
 package migrations
 
 import (
+	"os"
 	"testing"
 	"time"
 
@@ -62,7 +63,11 @@ func assertLabelEqual(t *testing.T, name, color, description string, label *base
 }
 
 func TestGitHubDownloadRepo(t *testing.T) {
-	downloader := NewGithubDownloaderV3("", "", "go-gitea", "test_repo")
+	GithubLimitRateRemaining = 3 //Wait at 3 remaining since we could have 3 CI in //
+	downloader := NewGithubDownloaderV3(os.Getenv("GITHUB_READ_TOKEN"), "", "go-gitea", "test_repo")
+	err := downloader.RefreshRate()
+	assert.NoError(t, err)
+
 	repo, err := downloader.GetRepoInfo()
 	assert.NoError(t, err)
 	assert.EqualValues(t, &base.Repository{