blob: 281e8f435b8941c32baac6fde5cc2413579cc7ec [file] [log] [blame]
Jiri Simsad7616c92015-03-24 23:44:30 -07001// Copyright 2015 The Vanadium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Suharsh Sivakumar38a1a7b2014-11-17 15:14:38 -08005package auditor
6
7import (
Suharsh Sivakumar38a1a7b2014-11-17 15:14:38 -08008 "reflect"
9 "testing"
10 "time"
Cosmos Nicolaoud9229922015-06-24 14:12:24 -070011
12 sqlmock "github.com/DATA-DOG/go-sqlmock"
13
14 _ "v.io/x/ref/runtime/factories/fake"
15 "v.io/x/ref/test"
Suharsh Sivakumar38a1a7b2014-11-17 15:14:38 -080016)
17
18func TestSQLDatabaseQuery(t *testing.T) {
Cosmos Nicolaoud9229922015-06-24 14:12:24 -070019 ctx, shutdown := test.V23InitWithParams(test.InitParams{})
20 defer shutdown()
Suharsh Sivakumar38a1a7b2014-11-17 15:14:38 -080021 db, err := sqlmock.New()
22 if err != nil {
23 t.Fatalf("failed to create new mock database stub: %v", err)
24 }
25 columns := []string{"Email", "Caveat", "Timestamp", "Blessings"}
26 sqlmock.ExpectExec("CREATE TABLE IF NOT EXISTS tableName (.+)").
27 WillReturnResult(sqlmock.NewResult(0, 1))
Cosmos Nicolaou1c33b7d2015-06-24 15:15:54 -070028 d, err := newSQLDatabase(ctx, db, "tableName")
Suharsh Sivakumar38a1a7b2014-11-17 15:14:38 -080029 if err != nil {
30 t.Fatalf("failed to create SQLDatabase: %v", err)
31 }
32
33 entry := databaseEntry{
34 email: "email",
35 caveats: []byte("caveats"),
36 timestamp: time.Now(),
37 blessings: []byte("blessings"),
38 }
39 sqlmock.ExpectExec("INSERT INTO tableName (.+) VALUES (.+)").
40 WithArgs(entry.email, entry.caveats, entry.timestamp, entry.blessings).
41 WillReturnResult(sqlmock.NewResult(0, 1)) // no insert id, 1 affected row
Cosmos Nicolaoud9229922015-06-24 14:12:24 -070042 if err := d.Insert(ctx, entry); err != nil {
Suharsh Sivakumar38a1a7b2014-11-17 15:14:38 -080043 t.Errorf("failed to insert into SQLDatabase: %v", err)
44 }
45
46 // Test the querying.
47 sqlmock.ExpectQuery("SELECT Email, Caveats, Timestamp, Blessings FROM tableName").
48 WithArgs(entry.email).
49 WillReturnRows(sqlmock.NewRows(columns).AddRow(entry.email, entry.caveats, entry.timestamp, entry.blessings))
Cosmos Nicolaoud9229922015-06-24 14:12:24 -070050 ch := d.Query(ctx, entry.email)
Suharsh Sivakumar38a1a7b2014-11-17 15:14:38 -080051 if res := <-ch; !reflect.DeepEqual(res, entry) {
52 t.Errorf("got %#v, expected %#v", res, entry)
53 }
54
55 var extra bool
56 for _ = range ch {
57 // Drain the channel to prevent the producer goroutines from being leaked.
58 extra = true
59 }
60 if extra {
61 t.Errorf("Got more entries that expected")
62 }
63}