@@ -1708,6 +1708,141 @@ func TestImportFromGCS(t *testing.T) {
1708
1708
}
1709
1709
}
1710
1710
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
+
1711
1846
func TestImportWithWildcardFromGCS (t * testing.T ) {
1712
1847
const (
1713
1848
projectID = "test"
0 commit comments