(t *testing.T)
| 192 | } |
| 193 | |
| 194 | func TestIsolationLevel(t *testing.T) { |
| 195 | server := setupTestServer(t) |
| 196 | |
| 197 | var recorder requestRecorder |
| 198 | unaryInterceptor, streamInterceptor := recordRequestsInterceptors(&recorder) |
| 199 | opts := []grpc.DialOption{ |
| 200 | grpc.WithInsecure(), |
| 201 | grpc.WithUnaryInterceptor(unaryInterceptor), |
| 202 | grpc.WithStreamInterceptor(streamInterceptor), |
| 203 | } |
| 204 | ctx := context.Background() |
| 205 | conn, err := grpc.DialContext(ctx, server.Addr, opts...) |
| 206 | if err != nil { |
| 207 | t.Fatalf("failed to dial: %v", err) |
| 208 | } |
| 209 | |
| 210 | for _, test := range []struct { |
| 211 | desc string |
| 212 | isolationLevel pb.TransactionOptions_IsolationLevel |
| 213 | want pb.TransactionOptions_IsolationLevel |
| 214 | }{ |
| 215 | { |
| 216 | desc: "use default unspecified isolation level", |
| 217 | isolationLevel: pb.TransactionOptions_ISOLATION_LEVEL_UNSPECIFIED, |
| 218 | want: pb.TransactionOptions_ISOLATION_LEVEL_UNSPECIFIED, |
| 219 | }, |
| 220 | { |
| 221 | desc: "use SERIALIZABLE isolation level", |
| 222 | isolationLevel: pb.TransactionOptions_SERIALIZABLE, |
| 223 | want: pb.TransactionOptions_SERIALIZABLE, |
| 224 | }, |
| 225 | { |
| 226 | desc: "use REPEATABLE READ isolation level", |
| 227 | isolationLevel: pb.TransactionOptions_REPEATABLE_READ, |
| 228 | want: pb.TransactionOptions_REPEATABLE_READ, |
| 229 | }, |
| 230 | } { |
| 231 | t.Run(test.desc, func(t *testing.T) { |
| 232 | defer recorder.flush() |
| 233 | |
| 234 | session, err := NewSession("project", "instance", "database", pb.RequestOptions_PRIORITY_UNSPECIFIED, "role", nil, nil, option.WithGRPCConn(conn)) |
| 235 | if err != nil { |
| 236 | t.Fatalf("failed to create spanner-cli session: %v", err) |
| 237 | } |
| 238 | |
| 239 | // Read-Write Transaction. |
| 240 | if err := session.BeginReadWriteTransaction(ctx, test.isolationLevel, pb.RequestOptions_PRIORITY_UNSPECIFIED, ""); err != nil { |
| 241 | t.Fatalf("failed to begin read write transaction: %v", err) |
| 242 | } |
| 243 | iter, _ := session.RunQuery(ctx, spanner.NewStatement("SELECT * FROM t1")) |
| 244 | if err := iter.Do(func(r *spanner.Row) error { |
| 245 | return nil |
| 246 | }); err != nil { |
| 247 | t.Fatalf("failed to run query: %v", err) |
| 248 | } |
| 249 | if _, _, _, _, err := session.RunUpdate(ctx, spanner.NewStatement("DELETE FROM t1 WHERE Id = 1"), true); err != nil { |
| 250 | t.Fatalf("failed to run update: %v", err) |
| 251 | } |
nothing calls this directly
no test coverage detected