// Copyright 2018 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // +build go1.8 package httpreplay_test import ( "bytes" "encoding/json" "io/ioutil" "net/http" "os" "testing" "time" "cloud.google.com/go/httpreplay" "cloud.google.com/go/internal/testutil" "cloud.google.com/go/storage" "golang.org/x/net/context" "google.golang.org/api/option" ) func TestIntegration_RecordAndReplay(t *testing.T) { httpreplay.DebugHeaders() if testing.Short() { t.Skip("Integration tests skipped in short mode") } f, err := ioutil.TempFile("", "httpreplay") if err != nil { t.Fatal(err) } replayFilename := f.Name() if err := f.Close(); err != nil { t.Fatal(err) } defer os.Remove(replayFilename) projectID := testutil.ProjID() if projectID == "" { t.Skip("Need project ID. See CONTRIBUTING.md for details.") } ctx := context.Background() // Record. initial := time.Now() ibytes, err := json.Marshal(initial) if err != nil { t.Fatal(err) } rec, err := httpreplay.NewRecorder(replayFilename, ibytes) if err != nil { t.Fatal(err) } hc, err := rec.Client(ctx, option.WithTokenSource( testutil.TokenSource(ctx, storage.ScopeFullControl))) if err != nil { t.Fatal(err) } wanta, wantc := run(t, hc) if err := rec.Close(); err != nil { t.Fatalf("rec.Close: %v", err) } // Replay. rep, err := httpreplay.NewReplayer(replayFilename) if err != nil { t.Fatal(err) } defer rep.Close() hc, err = rep.Client(ctx) if err != nil { t.Fatal(err) } gota, gotc := run(t, hc) if diff := testutil.Diff(gota, wanta); diff != "" { t.Error(diff) } if !bytes.Equal(gotc, wantc) { t.Errorf("got %q, want %q", gotc, wantc) } var gotInitial time.Time if err := json.Unmarshal(rep.Initial(), &gotInitial); err != nil { t.Fatal(err) } if !gotInitial.Equal(initial) { t.Errorf("initial: got %v, want %v", gotInitial, initial) } } // TODO(jba): test errors func run(t *testing.T, hc *http.Client) (*storage.BucketAttrs, []byte) { ctx := context.Background() client, err := storage.NewClient(ctx, option.WithHTTPClient(hc)) if err != nil { t.Fatal(err) } defer client.Close() b := client.Bucket(testutil.ProjID()) attrs, err := b.Attrs(ctx) if err != nil { t.Fatal(err) } obj := b.Object("replay-test") w := obj.NewWriter(ctx) if _, err := w.Write([]byte{150, 151, 152}); err != nil { t.Fatal(err) } if err := w.Close(); err != nil { t.Fatal(err) } r, err := obj.NewReader(ctx) if err != nil { t.Fatal(err) } defer r.Close() contents, err := ioutil.ReadAll(r) if err != nil { t.Fatal(err) } return attrs, contents }