Skip to content

Commit 5ad569f

Browse files
authored
Merge pull request #248 from totem3/feature/import-from-gcs-emulator-without-public-host
2 parents e74d4e4 + 8bf5a73 commit 5ad569f

File tree

2 files changed

+136
-0
lines changed

2 files changed

+136
-0
lines changed

server/handler.go

+1
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,7 @@ func (h *jobsInsertHandler) importFromGCS(ctx context.Context, r *jobsInsertRequ
10621062
opts = append(
10631063
opts,
10641064
option.WithEndpoint(fmt.Sprintf("%s/storage/v1/", host)),
1065+
storage.WithJSONReads(),
10651066
option.WithoutAuthentication(),
10661067
)
10671068
}

server/server_test.go

+135
Original file line numberDiff line numberDiff line change
@@ -1708,6 +1708,141 @@ func TestImportFromGCS(t *testing.T) {
17081708
}
17091709
}
17101710

1711+
func TestImportFromGCSEmulatorWithoutPublicHost(t *testing.T) {
1712+
const (
1713+
projectID = "test"
1714+
datasetID = "dataset1"
1715+
tableID = "table_a"
1716+
host = "127.0.0.1"
1717+
bucketName = "test-bucket"
1718+
sourceName = "path/to/data.json"
1719+
)
1720+
1721+
ctx := context.Background()
1722+
bqServer, err := server.New(server.TempStorage)
1723+
if err != nil {
1724+
t.Fatal(err)
1725+
}
1726+
project := types.NewProject(
1727+
projectID,
1728+
types.NewDataset(
1729+
datasetID,
1730+
types.NewTable(
1731+
tableID,
1732+
[]*types.Column{
1733+
types.NewColumn("id", types.INT64),
1734+
types.NewColumn("value", types.INT64),
1735+
},
1736+
nil,
1737+
),
1738+
),
1739+
)
1740+
if err := bqServer.Load(server.StructSource(project)); err != nil {
1741+
t.Fatal(err)
1742+
}
1743+
1744+
testServer := bqServer.TestServer()
1745+
var buf bytes.Buffer
1746+
enc := json.NewEncoder(&buf)
1747+
for i := 0; i < 3; i++ {
1748+
if err := enc.Encode(map[string]interface{}{
1749+
"id": i + 1,
1750+
"value": i + 10,
1751+
}); err != nil {
1752+
t.Fatal(err)
1753+
}
1754+
}
1755+
storageServer, err := fakestorage.NewServerWithOptions(fakestorage.Options{
1756+
InitialObjects: []fakestorage.Object{
1757+
{
1758+
ObjectAttrs: fakestorage.ObjectAttrs{
1759+
BucketName: bucketName,
1760+
Name: sourceName,
1761+
Size: int64(len(buf.Bytes())),
1762+
},
1763+
Content: buf.Bytes(),
1764+
},
1765+
},
1766+
Host: host,
1767+
Scheme: "http",
1768+
})
1769+
if err != nil {
1770+
t.Fatal(err)
1771+
}
1772+
1773+
storageServerURL := storageServer.URL()
1774+
u, err := url.Parse(storageServerURL)
1775+
if err != nil {
1776+
t.Fatal(err)
1777+
}
1778+
storageEmulatorHost := fmt.Sprintf("http://%s:%s", host, u.Port())
1779+
t.Setenv("STORAGE_EMULATOR_HOST", storageEmulatorHost)
1780+
1781+
defer func() {
1782+
testServer.Close()
1783+
bqServer.Stop(ctx)
1784+
storageServer.Stop()
1785+
}()
1786+
1787+
client, err := bigquery.NewClient(
1788+
ctx,
1789+
projectID,
1790+
option.WithEndpoint(testServer.URL),
1791+
option.WithoutAuthentication(),
1792+
)
1793+
if err != nil {
1794+
t.Fatal(err)
1795+
}
1796+
defer client.Close()
1797+
1798+
gcsSourceURL := fmt.Sprintf("gs://%s/%s", bucketName, sourceName)
1799+
gcsRef := bigquery.NewGCSReference(gcsSourceURL)
1800+
gcsRef.SourceFormat = bigquery.JSON
1801+
gcsRef.AutoDetect = true
1802+
loader := client.Dataset(datasetID).Table(tableID).LoaderFrom(gcsRef)
1803+
loader.WriteDisposition = bigquery.WriteTruncate
1804+
job, err := loader.Run(ctx)
1805+
if err != nil {
1806+
t.Fatal(err)
1807+
}
1808+
status, err := job.Wait(ctx)
1809+
if err != nil {
1810+
t.Fatal(err)
1811+
}
1812+
if status.Err() != nil {
1813+
t.Fatal(status.Err())
1814+
}
1815+
1816+
query := client.Query(fmt.Sprintf("SELECT * FROM %s.%s", datasetID, tableID))
1817+
it, err := query.Read(ctx)
1818+
if err != nil {
1819+
t.Fatal(err)
1820+
}
1821+
1822+
type row struct {
1823+
ID int64
1824+
Value int64
1825+
}
1826+
var rows []*row
1827+
for {
1828+
var r row
1829+
if err := it.Next(&r); err != nil {
1830+
if err == iterator.Done {
1831+
break
1832+
}
1833+
t.Fatal(err)
1834+
}
1835+
rows = append(rows, &r)
1836+
}
1837+
if diff := cmp.Diff([]*row{
1838+
{ID: 1, Value: 10},
1839+
{ID: 2, Value: 11},
1840+
{ID: 3, Value: 12},
1841+
}, rows); diff != "" {
1842+
t.Errorf("(-want +got):\n%s", diff)
1843+
}
1844+
}
1845+
17111846
func TestImportWithWildcardFromGCS(t *testing.T) {
17121847
const (
17131848
projectID = "test"

0 commit comments

Comments
 (0)