Skip to content

Commit f25f037

Browse files
committed
Added GitbaseBackCompTestSuite
Signed-off-by: Lou Marvin Caraig <[email protected]>
1 parent b497310 commit f25f037

File tree

1 file changed

+222
-0
lines changed

1 file changed

+222
-0
lines changed
+222
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
// +build integration
2+
3+
package cmd
4+
5+
import (
6+
"bytes"
7+
"context"
8+
"fmt"
9+
"io/ioutil"
10+
"log"
11+
"os"
12+
"os/exec"
13+
"path/filepath"
14+
"regexp"
15+
"strings"
16+
"testing"
17+
"time"
18+
19+
"github.com/pkg/errors"
20+
cmdtest "github.com/src-d/engine/cmd/test-utils"
21+
22+
"github.com/mitchellh/go-homedir"
23+
"github.com/stretchr/testify/suite"
24+
)
25+
26+
type GitbaseBackCompTestSuite struct {
27+
cmdtest.IntegrationBackCompSuite
28+
timeout time.Duration
29+
testDir string
30+
testDataDir string
31+
}
32+
33+
func TestGitbaseBackCompTestSuite(t *testing.T) {
34+
s := GitbaseBackCompTestSuite{
35+
IntegrationBackCompSuite: cmdtest.NewIntegrationBackCompSuite(),
36+
timeout: 1 * time.Minute,
37+
}
38+
suite.Run(t, &s)
39+
}
40+
41+
func (s *GitbaseBackCompTestSuite) createRepo(name string) {
42+
s.T().Helper()
43+
require := s.Require()
44+
45+
repoPath := filepath.Join(s.testDir, name)
46+
err := os.Mkdir(repoPath, os.ModePerm)
47+
require.NoError(err)
48+
49+
cmd := exec.Command("git", "init", repoPath)
50+
err = cmd.Run()
51+
require.NoError(err)
52+
}
53+
54+
func (s *GitbaseBackCompTestSuite) SetupTest() {
55+
var err error
56+
s.testDir, err = ioutil.TempDir("", "gitbase-back-comp-test")
57+
if err != nil {
58+
log.Fatal(err)
59+
}
60+
61+
homedir, err := homedir.Dir()
62+
if err != nil {
63+
log.Fatal(errors.Wrap(err, "unable to get home dir"))
64+
}
65+
66+
s.testDataDir = filepath.ToSlash(filepath.Join(homedir, ".srcd", "gitbase"))
67+
os.RemoveAll(s.testDataDir)
68+
69+
for i := range [3]int{} {
70+
s.createRepo(fmt.Sprintf("repo-%d", i))
71+
}
72+
}
73+
74+
func (s *GitbaseBackCompTestSuite) TearDownTest() {
75+
s.Cmd.RunStop(context.Background())
76+
s.PrevCmd.RunStop(context.Background())
77+
os.RemoveAll(s.testDir)
78+
os.RemoveAll(s.testDataDir)
79+
}
80+
81+
var newLineFormatter = regexp.MustCompile(`(\r\n|\r|\n)`)
82+
var reposExtractors = regexp.MustCompile(`(?:\|\s+([\w-]+)\s+\|\n)`)
83+
84+
func (s *GitbaseBackCompTestSuite) getBufString(buf *bytes.Buffer) string {
85+
return newLineFormatter.ReplaceAllString(buf.String(), "\n")
86+
}
87+
88+
func (s *GitbaseBackCompTestSuite) checkSameRepos(buf *bytes.Buffer, expected []string) {
89+
s.T().Helper()
90+
require := s.Require()
91+
92+
bufContent := s.getBufString(buf)
93+
matches := reposExtractors.FindAllString(bufContent, -1)
94+
actualRepos := make(map[string]bool)
95+
for _, m := range matches {
96+
name := strings.TrimSpace(m[1 : len(m)-2])
97+
if strings.ToLower(name) == "repository_id" {
98+
continue
99+
}
100+
101+
actualRepos[name] = true
102+
}
103+
104+
expectedRepos := make(map[string]bool)
105+
for _, r := range expected {
106+
expectedRepos[r] = true
107+
}
108+
109+
require.Equal(actualRepos, expectedRepos)
110+
}
111+
112+
func (s *GitbaseBackCompTestSuite) runInit(cmd *cmdtest.Commander, workdir string) (*bytes.Buffer, error) {
113+
s.T().Helper()
114+
115+
ctx, cancel := context.WithTimeout(context.Background(), s.timeout)
116+
defer cancel()
117+
118+
return cmd.RunInit(ctx, workdir)
119+
}
120+
121+
func (s *GitbaseBackCompTestSuite) runSQL(cmd *cmdtest.Commander, query string) (*bytes.Buffer, error) {
122+
s.T().Helper()
123+
124+
ctx, cancel := context.WithTimeout(context.Background(), s.timeout)
125+
defer cancel()
126+
127+
return cmd.RunSQL(ctx, query)
128+
}
129+
130+
func (s *GitbaseBackCompTestSuite) TestRetroCompatibleIndexes() {
131+
require := s.Require()
132+
133+
// [previous version] srcd init s.testDir
134+
_, err := s.runInit(s.PrevCmd, s.testDir)
135+
require.NoError(err)
136+
137+
// [previous version] srcd sql "select * from repositories"
138+
buf, err := s.runSQL(s.PrevCmd, "select * from repositories")
139+
require.NoError(err)
140+
141+
s.checkSameRepos(buf, []string{"repo-0", "repo-1", "repo-2"})
142+
143+
// [previous version] srcd sql "SHOW INDEXES"
144+
buf, err = s.runSQL(s.PrevCmd, "SHOW INDEX FROM repositories")
145+
146+
require.NoError(err)
147+
expected := `+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
148+
| TABLE | NON UNIQUE | KEY NAME | SEQ IN INDEX | COLUMN NAME | COLLATION | CARDINALITY | SUB PART | PACKED | NULL | INDEX TYPE | COMMENT | INDEX COMMENT | VISIBLE | EXPRESSION |
149+
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
150+
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
151+
`
152+
require.NoError(cmdtest.AreSQLOutputEqual(buf.String(), expected))
153+
154+
// [previous version] srcd sql "CREATE INDEXES"
155+
_, err = s.runSQL(s.PrevCmd, "CREATE INDEX repo_idx ON repositories USING pilosa (repository_id)")
156+
require.NoError(err)
157+
// wait a bit for index to be ready
158+
time.Sleep(1 * time.Second)
159+
160+
// [previous version] srcd sql "SHOW INDEXES"
161+
buf, err = s.runSQL(s.PrevCmd, "SHOW INDEX FROM repositories")
162+
require.NoError(err)
163+
expected = `+--------------+------------+----------+--------------+----------------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
164+
| TABLE | NON UNIQUE | KEY NAME | SEQ IN INDEX | COLUMN NAME | COLLATION | CARDINALITY | SUB PART | PACKED | NULL | INDEX TYPE | COMMENT | INDEX COMMENT | VISIBLE | EXPRESSION |
165+
+--------------+------------+----------+--------------+----------------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
166+
| repositories | 1 | repo_idx | 1 | repositories.repository_id | NULL | 0 | 0 | NULL | | pilosa | | | YES | NULL |
167+
+--------------+------------+----------+--------------+----------------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
168+
`
169+
require.NoError(cmdtest.AreSQLOutputEqual(buf.String(), expected))
170+
171+
// [previous version] srcd sql "select * from repositories"
172+
buf, err = s.runSQL(s.PrevCmd, "select * from repositories")
173+
require.NoError(err)
174+
175+
s.checkSameRepos(buf, []string{"repo-0", "repo-1", "repo-2"})
176+
177+
s.PrevCmd.RunStop(context.Background())
178+
179+
// --->
180+
// [next version] srcd init s.testDir
181+
_, err = s.runInit(s.Cmd, s.testDir)
182+
require.NoError(err)
183+
184+
// [next version] srcd sql "select * from repositories"
185+
buf, err = s.runSQL(s.Cmd, "select * from repositories")
186+
require.NoError(err)
187+
188+
s.checkSameRepos(buf, []string{"repo-0", "repo-1", "repo-2"})
189+
190+
// [next version] srcd sql "SHOW INDEXES"
191+
buf, err = s.runSQL(s.Cmd, "SHOW INDEX FROM repositories")
192+
require.NoError(err)
193+
expected = `+--------------+------------+----------+--------------+----------------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
194+
| TABLE | NON UNIQUE | KEY NAME | SEQ IN INDEX | COLUMN NAME | COLLATION | CARDINALITY | SUB PART | PACKED | NULL | INDEX TYPE | COMMENT | INDEX COMMENT | VISIBLE | EXPRESSION |
195+
+--------------+------------+----------+--------------+----------------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
196+
| repositories | 1 | repo_idx | 1 | repositories.repository_id | NULL | 0 | 0 | NULL | | pilosa | | | YES | NULL |
197+
+--------------+------------+----------+--------------+----------------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
198+
`
199+
require.NoError(cmdtest.AreSQLOutputEqual(buf.String(), expected))
200+
201+
// [next version] srcd sql "DROP INDEXES"
202+
_, err = s.runSQL(s.Cmd, "DROP INDEX repo_idx ON repositories")
203+
require.NoError(err)
204+
205+
// [next version] srcd sql "SHOW INDEXES"
206+
buf, err = s.runSQL(s.Cmd, "SHOW INDEX FROM repositories")
207+
require.NoError(err)
208+
expected = `+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
209+
| TABLE | NON UNIQUE | KEY NAME | SEQ IN INDEX | COLUMN NAME | COLLATION | CARDINALITY | SUB PART | PACKED | NULL | INDEX TYPE | COMMENT | INDEX COMMENT | VISIBLE | EXPRESSION |
210+
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
211+
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
212+
`
213+
require.NoError(cmdtest.AreSQLOutputEqual(buf.String(), expected))
214+
215+
// [next version] srcd sql "select * from repositories"
216+
buf, err = s.runSQL(s.Cmd, "select * from repositories")
217+
require.NoError(err)
218+
219+
s.checkSameRepos(buf, []string{"repo-0", "repo-1", "repo-2"})
220+
}
221+
222+
type SQLOutput map[string][]string

0 commit comments

Comments
 (0)