mirror of
https://github.com/rclone/rclone.git
synced 2025-12-24 04:04:37 +00:00
vendor: update all dependencies
This commit is contained in:
250
vendor/cloud.google.com/go/bigquery/integration_test.go
generated
vendored
250
vendor/cloud.google.com/go/bigquery/integration_test.go
generated
vendored
@@ -600,7 +600,7 @@ func TestIntegration_UploadAndRead(t *testing.T) {
|
||||
}
|
||||
|
||||
// Test reading directly into a []Value.
|
||||
valueLists, err := readAll(table.Read(ctx))
|
||||
valueLists, schema, _, err := readAll(table.Read(ctx))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -610,6 +610,9 @@ func TestIntegration_UploadAndRead(t *testing.T) {
|
||||
if err := it.Next(&got); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if !testutil.Equal(it.Schema, schema) {
|
||||
t.Fatalf("got schema %v, want %v", it.Schema, schema)
|
||||
}
|
||||
want := []Value(vl)
|
||||
if !testutil.Equal(got, want) {
|
||||
t.Errorf("%d: got %v, want %v", i, got, want)
|
||||
@@ -671,6 +674,10 @@ type TestStruct struct {
|
||||
RecordArray []SubTestStruct
|
||||
}
|
||||
|
||||
// Round times to the microsecond for comparison purposes.
|
||||
var roundToMicros = cmp.Transformer("RoundToMicros",
|
||||
func(t time.Time) time.Time { return t.Round(time.Microsecond) })
|
||||
|
||||
func TestIntegration_UploadAndReadStructs(t *testing.T) {
|
||||
if client == nil {
|
||||
t.Skip("Integration tests skipped")
|
||||
@@ -684,14 +691,14 @@ func TestIntegration_UploadAndReadStructs(t *testing.T) {
|
||||
table := newTable(t, schema)
|
||||
defer table.Delete(ctx)
|
||||
|
||||
d := civil.Date{2016, 3, 20}
|
||||
tm := civil.Time{15, 4, 5, 6000}
|
||||
d := civil.Date{Year: 2016, Month: 3, Day: 20}
|
||||
tm := civil.Time{Hour: 15, Minute: 4, Second: 5, Nanosecond: 6000}
|
||||
ts := time.Date(2016, 3, 20, 15, 4, 5, 6000, time.UTC)
|
||||
dtm := civil.DateTime{d, tm}
|
||||
d2 := civil.Date{1994, 5, 15}
|
||||
tm2 := civil.Time{1, 2, 4, 0}
|
||||
dtm := civil.DateTime{Date: d, Time: tm}
|
||||
d2 := civil.Date{Year: 1994, Month: 5, Day: 15}
|
||||
tm2 := civil.Time{Hour: 1, Minute: 2, Second: 4, Nanosecond: 0}
|
||||
ts2 := time.Date(1994, 5, 15, 1, 2, 4, 0, time.UTC)
|
||||
dtm2 := civil.DateTime{d2, tm2}
|
||||
dtm2 := civil.DateTime{Date: d2, Time: tm2}
|
||||
|
||||
// Populate the table.
|
||||
upl := table.Uploader()
|
||||
@@ -770,9 +777,6 @@ func TestIntegration_UploadAndReadStructs(t *testing.T) {
|
||||
}
|
||||
sort.Sort(byName(got))
|
||||
|
||||
// Round times to the microsecond.
|
||||
roundToMicros := cmp.Transformer("RoundToMicros",
|
||||
func(t time.Time) time.Time { return t.Round(time.Microsecond) })
|
||||
// BigQuery does not elide nils. It reports an error for nil fields.
|
||||
for i, g := range got {
|
||||
if i >= len(want) {
|
||||
@@ -789,6 +793,69 @@ func (b byName) Len() int { return len(b) }
|
||||
func (b byName) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
|
||||
func (b byName) Less(i, j int) bool { return b[i].Name < b[j].Name }
|
||||
|
||||
func TestIntegration_UploadAndReadNullable(t *testing.T) {
|
||||
if client == nil {
|
||||
t.Skip("Integration tests skipped")
|
||||
}
|
||||
ctm := civil.Time{Hour: 15, Minute: 4, Second: 5, Nanosecond: 6000}
|
||||
cdt := civil.DateTime{Date: testDate, Time: ctm}
|
||||
testUploadAndReadNullable(t, testStructNullable{}, make([]Value, len(testStructNullableSchema)))
|
||||
testUploadAndReadNullable(t, testStructNullable{
|
||||
String: NullString{"x", true},
|
||||
Bytes: []byte{1, 2, 3},
|
||||
Integer: NullInt64{1, true},
|
||||
Float: NullFloat64{2.3, true},
|
||||
Boolean: NullBool{true, true},
|
||||
Timestamp: NullTimestamp{testTimestamp, true},
|
||||
Date: NullDate{testDate, true},
|
||||
Time: NullTime{ctm, true},
|
||||
DateTime: NullDateTime{cdt, true},
|
||||
Record: &subNullable{X: NullInt64{4, true}},
|
||||
},
|
||||
[]Value{"x", []byte{1, 2, 3}, int64(1), 2.3, true, testTimestamp, testDate, ctm, cdt, []Value{int64(4)}})
|
||||
}
|
||||
|
||||
func testUploadAndReadNullable(t *testing.T, ts testStructNullable, wantRow []Value) {
|
||||
ctx := context.Background()
|
||||
table := newTable(t, testStructNullableSchema)
|
||||
defer table.Delete(ctx)
|
||||
|
||||
// Populate the table.
|
||||
upl := table.Uploader()
|
||||
if err := upl.Put(ctx, []*StructSaver{{Schema: testStructNullableSchema, Struct: ts}}); err != nil {
|
||||
t.Fatal(putError(err))
|
||||
}
|
||||
// Wait until the data has been uploaded. This can take a few seconds, according
|
||||
// to https://cloud.google.com/bigquery/streaming-data-into-bigquery.
|
||||
if err := waitForRow(ctx, table); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Read into a []Value.
|
||||
iter := table.Read(ctx)
|
||||
gotRows, _, _, err := readAll(iter)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if len(gotRows) != 1 {
|
||||
t.Fatalf("got %d rows, want 1", len(gotRows))
|
||||
}
|
||||
if diff := testutil.Diff(gotRows[0], wantRow, roundToMicros); diff != "" {
|
||||
t.Error(diff)
|
||||
}
|
||||
|
||||
// Read into a struct.
|
||||
want := ts
|
||||
var sn testStructNullable
|
||||
it := table.Read(ctx)
|
||||
if err := it.Next(&sn); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if diff := testutil.Diff(sn, want, roundToMicros); diff != "" {
|
||||
t.Error(diff)
|
||||
}
|
||||
}
|
||||
|
||||
func TestIntegration_TableUpdate(t *testing.T) {
|
||||
if client == nil {
|
||||
t.Skip("Integration tests skipped")
|
||||
@@ -954,7 +1021,7 @@ func TestIntegration_Load(t *testing.T) {
|
||||
if err := wait(ctx, job); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
checkRead(t, "reader load", table.Read(ctx), wantRows)
|
||||
checkReadAndTotalRows(t, "reader load", table.Read(ctx), wantRows)
|
||||
|
||||
}
|
||||
|
||||
@@ -1018,9 +1085,9 @@ func TestIntegration_TimeTypes(t *testing.T) {
|
||||
table := newTable(t, dtSchema)
|
||||
defer table.Delete(ctx)
|
||||
|
||||
d := civil.Date{2016, 3, 20}
|
||||
tm := civil.Time{12, 30, 0, 6000}
|
||||
dtm := civil.DateTime{d, tm}
|
||||
d := civil.Date{Year: 2016, Month: 3, Day: 20}
|
||||
tm := civil.Time{Hour: 12, Minute: 30, Second: 0, Nanosecond: 6000}
|
||||
dtm := civil.DateTime{Date: d, Time: tm}
|
||||
ts := time.Date(2016, 3, 20, 15, 04, 05, 0, time.UTC)
|
||||
wantRows := [][]Value{
|
||||
[]Value{d, tm, dtm, ts},
|
||||
@@ -1054,8 +1121,8 @@ func TestIntegration_StandardQuery(t *testing.T) {
|
||||
}
|
||||
ctx := context.Background()
|
||||
|
||||
d := civil.Date{2016, 3, 20}
|
||||
tm := civil.Time{15, 04, 05, 0}
|
||||
d := civil.Date{Year: 2016, Month: 3, Day: 20}
|
||||
tm := civil.Time{Hour: 15, Minute: 04, Second: 05, Nanosecond: 0}
|
||||
ts := time.Date(2016, 3, 20, 15, 04, 05, 0, time.UTC)
|
||||
dtm := ts.Format("2006-01-02 15:04:05")
|
||||
|
||||
@@ -1080,7 +1147,7 @@ func TestIntegration_StandardQuery(t *testing.T) {
|
||||
{fmt.Sprintf("SELECT TIMESTAMP '%s'", dtm), []Value{ts}},
|
||||
{fmt.Sprintf("SELECT [TIMESTAMP '%s', TIMESTAMP '%s']", dtm, dtm), []Value{[]Value{ts, ts}}},
|
||||
{fmt.Sprintf("SELECT ('hello', TIMESTAMP '%s')", dtm), []Value{[]Value{"hello", ts}}},
|
||||
{fmt.Sprintf("SELECT DATETIME(TIMESTAMP '%s')", dtm), []Value{civil.DateTime{d, tm}}},
|
||||
{fmt.Sprintf("SELECT DATETIME(TIMESTAMP '%s')", dtm), []Value{civil.DateTime{Date: d, Time: tm}}},
|
||||
{fmt.Sprintf("SELECT DATE(TIMESTAMP '%s')", dtm), []Value{d}},
|
||||
{fmt.Sprintf("SELECT TIME(TIMESTAMP '%s')", dtm), []Value{tm}},
|
||||
{"SELECT (1, 2)", []Value{ints(1, 2)}},
|
||||
@@ -1139,9 +1206,11 @@ func TestIntegration_QueryParameters(t *testing.T) {
|
||||
}
|
||||
ctx := context.Background()
|
||||
|
||||
d := civil.Date{2016, 3, 20}
|
||||
tm := civil.Time{15, 04, 05, 0}
|
||||
dtm := civil.DateTime{d, tm}
|
||||
d := civil.Date{Year: 2016, Month: 3, Day: 20}
|
||||
tm := civil.Time{Hour: 15, Minute: 04, Second: 05, Nanosecond: 3008}
|
||||
rtm := tm
|
||||
rtm.Nanosecond = 3000 // round to microseconds
|
||||
dtm := civil.DateTime{Date: d, Time: tm}
|
||||
ts := time.Date(2016, 3, 20, 15, 04, 05, 0, time.UTC)
|
||||
|
||||
type ss struct {
|
||||
@@ -1159,20 +1228,93 @@ func TestIntegration_QueryParameters(t *testing.T) {
|
||||
query string
|
||||
parameters []QueryParameter
|
||||
wantRow []Value
|
||||
wantConfig interface{}
|
||||
}{
|
||||
{"SELECT @val", []QueryParameter{{"val", 1}}, []Value{int64(1)}},
|
||||
{"SELECT @val", []QueryParameter{{"val", 1.3}}, []Value{1.3}},
|
||||
{"SELECT @val", []QueryParameter{{"val", true}}, []Value{true}},
|
||||
{"SELECT @val", []QueryParameter{{"val", "ABC"}}, []Value{"ABC"}},
|
||||
{"SELECT @val", []QueryParameter{{"val", []byte("foo")}}, []Value{[]byte("foo")}},
|
||||
{"SELECT @val", []QueryParameter{{"val", ts}}, []Value{ts}},
|
||||
{"SELECT @val", []QueryParameter{{"val", []time.Time{ts, ts}}}, []Value{[]Value{ts, ts}}},
|
||||
{"SELECT @val", []QueryParameter{{"val", dtm}}, []Value{dtm}},
|
||||
{"SELECT @val", []QueryParameter{{"val", d}}, []Value{d}},
|
||||
{"SELECT @val", []QueryParameter{{"val", tm}}, []Value{tm}},
|
||||
{"SELECT @val", []QueryParameter{{"val", s{ts, []string{"a", "b"}, ss{"c"}, []ss{{"d"}, {"e"}}}}},
|
||||
[]Value{[]Value{ts, []Value{"a", "b"}, []Value{"c"}, []Value{[]Value{"d"}, []Value{"e"}}}}},
|
||||
{"SELECT @val.Timestamp, @val.SubStruct.String", []QueryParameter{{"val", s{Timestamp: ts, SubStruct: ss{"a"}}}}, []Value{ts, "a"}},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", 1}},
|
||||
[]Value{int64(1)},
|
||||
int64(1),
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", 1.3}},
|
||||
[]Value{1.3},
|
||||
1.3,
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", true}},
|
||||
[]Value{true},
|
||||
true,
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", "ABC"}},
|
||||
[]Value{"ABC"},
|
||||
"ABC",
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", []byte("foo")}},
|
||||
[]Value{[]byte("foo")},
|
||||
[]byte("foo"),
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", ts}},
|
||||
[]Value{ts},
|
||||
ts,
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", []time.Time{ts, ts}}},
|
||||
[]Value{[]Value{ts, ts}},
|
||||
[]interface{}{ts, ts},
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", dtm}},
|
||||
[]Value{civil.DateTime{Date: d, Time: rtm}},
|
||||
civil.DateTime{Date: d, Time: rtm},
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", d}},
|
||||
[]Value{d},
|
||||
d,
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", tm}},
|
||||
[]Value{rtm},
|
||||
rtm,
|
||||
},
|
||||
{
|
||||
"SELECT @val",
|
||||
[]QueryParameter{{"val", s{ts, []string{"a", "b"}, ss{"c"}, []ss{{"d"}, {"e"}}}}},
|
||||
[]Value{[]Value{ts, []Value{"a", "b"}, []Value{"c"}, []Value{[]Value{"d"}, []Value{"e"}}}},
|
||||
map[string]interface{}{
|
||||
"Timestamp": ts,
|
||||
"StringArray": []interface{}{"a", "b"},
|
||||
"SubStruct": map[string]interface{}{"String": "c"},
|
||||
"SubStructArray": []interface{}{
|
||||
map[string]interface{}{"String": "d"},
|
||||
map[string]interface{}{"String": "e"},
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"SELECT @val.Timestamp, @val.SubStruct.String",
|
||||
[]QueryParameter{{"val", s{Timestamp: ts, SubStruct: ss{"a"}}}},
|
||||
[]Value{ts, "a"},
|
||||
map[string]interface{}{
|
||||
"Timestamp": ts,
|
||||
"SubStruct": map[string]interface{}{"String": "a"},
|
||||
"StringArray": nil,
|
||||
"SubStructArray": nil,
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, c := range testCases {
|
||||
q := client.Query(c.query)
|
||||
@@ -1189,6 +1331,15 @@ func TestIntegration_QueryParameters(t *testing.T) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
checkRead(t, "QueryParameters", it, [][]Value{c.wantRow})
|
||||
config, err := job.Config()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
got := config.(*QueryConfig).Parameters[0].Value
|
||||
if !testutil.Equal(got, c.wantConfig) {
|
||||
t.Errorf("param %[1]v (%[1]T): config:\ngot %[2]v (%[2]T)\nwant %[3]v (%[3]T)",
|
||||
c.parameters[0].Value, got, c.wantConfig)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1284,7 +1435,7 @@ func TestIntegration_ExtractExternal(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
checkRead(t, "external query", iter, wantRows)
|
||||
checkReadAndTotalRows(t, "external query", iter, wantRows)
|
||||
|
||||
// Make a table pointing to the file, and query it.
|
||||
// BigQuery does not allow a Table.Read on an external table.
|
||||
@@ -1302,7 +1453,7 @@ func TestIntegration_ExtractExternal(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
checkRead(t, "external table", iter, wantRows)
|
||||
checkReadAndTotalRows(t, "external table", iter, wantRows)
|
||||
|
||||
// While we're here, check that the table metadata is correct.
|
||||
md, err := table.Metadata(ctx)
|
||||
@@ -1466,19 +1617,28 @@ func newTable(t *testing.T, s Schema) *Table {
|
||||
}
|
||||
|
||||
func checkRead(t *testing.T, msg string, it *RowIterator, want [][]Value) {
|
||||
if msg2, ok := compareRead(it, want); !ok {
|
||||
if msg2, ok := compareRead(it, want, false); !ok {
|
||||
t.Errorf("%s: %s", msg, msg2)
|
||||
}
|
||||
}
|
||||
|
||||
func compareRead(it *RowIterator, want [][]Value) (msg string, ok bool) {
|
||||
got, err := readAll(it)
|
||||
func checkReadAndTotalRows(t *testing.T, msg string, it *RowIterator, want [][]Value) {
|
||||
if msg2, ok := compareRead(it, want, true); !ok {
|
||||
t.Errorf("%s: %s", msg, msg2)
|
||||
}
|
||||
}
|
||||
|
||||
func compareRead(it *RowIterator, want [][]Value, compareTotalRows bool) (msg string, ok bool) {
|
||||
got, _, totalRows, err := readAll(it)
|
||||
if err != nil {
|
||||
return err.Error(), false
|
||||
}
|
||||
if len(got) != len(want) {
|
||||
return fmt.Sprintf("got %d rows, want %d", len(got), len(want)), false
|
||||
}
|
||||
if compareTotalRows && len(got) != int(totalRows) {
|
||||
return fmt.Sprintf("got %d rows, but totalRows = %d", len(got), totalRows), false
|
||||
}
|
||||
sort.Sort(byCol0(got))
|
||||
for i, r := range got {
|
||||
gotRow := []Value(r)
|
||||
@@ -1490,18 +1650,24 @@ func compareRead(it *RowIterator, want [][]Value) (msg string, ok bool) {
|
||||
return "", true
|
||||
}
|
||||
|
||||
func readAll(it *RowIterator) ([][]Value, error) {
|
||||
var rows [][]Value
|
||||
func readAll(it *RowIterator) ([][]Value, Schema, uint64, error) {
|
||||
var (
|
||||
rows [][]Value
|
||||
schema Schema
|
||||
totalRows uint64
|
||||
)
|
||||
for {
|
||||
var vals []Value
|
||||
err := it.Next(&vals)
|
||||
if err == iterator.Done {
|
||||
return rows, nil
|
||||
return rows, schema, totalRows, nil
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, nil, 0, err
|
||||
}
|
||||
rows = append(rows, vals)
|
||||
schema = it.Schema
|
||||
totalRows = it.TotalRows
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user