blob: cebe7ccace14fee65f64ad2124ee792a1b758f78 [file]
package apidApigeeSync
import (
"github.com/30x/apid-core"
"github.com/apigee-labs/transicator/common"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
"time"
)
var _ = Describe("listener", func() {
It("should succesfully bootstrap from clean slate", func(done Done) {
log.Info("Starting sync tests...")
// do not wipe DB after. Lets use it
wipeDBAferTest = false
var lastSnapshot *common.Snapshot
expectedSnapshotTables := common.ChangeList{
Changes: []common.Change{common.Change{Table: "kms.company"},
common.Change{Table: "edgex.apid_cluster"},
common.Change{Table: "edgex.data_scope"}},
}
apid.Events().ListenFunc(ApigeeSyncEventSelector, func(event apid.Event) {
if s, ok := event.(*common.Snapshot); ok {
Expect(changesRequireDDLSync(expectedSnapshotTables)).To(BeFalse())
//add apid_cluster and data_scope since those would present if this were a real scenario
knownTables["kms.app_credential"] = true
knownTables["kms.app_credential_apiproduct_mapper"] = true
knownTables["kms.developer"] = true
knownTables["kms.company_developer"] = true
knownTables["kms.api_product"] = true
knownTables["kms.app"] = true
lastSnapshot = s
for _, t := range s.Tables {
switch t.Name {
case "edgex.apid_cluster":
Expect(t.Rows).To(HaveLen(1))
r := t.Rows[0]
var id string
r.Get("id", &id)
Expect(id).To(Equal("bootstrap"))
case "edgex.data_scope":
Expect(t.Rows).To(HaveLen(2))
r := t.Rows[1] // get the non-cluster row
var id, clusterID, env, org, scope string
r.Get("id", &id)
r.Get("apid_cluster_id", &clusterID)
r.Get("env", &env)
r.Get("org", &org)
r.Get("scope", &scope)
Expect(id).To(Equal("ert452"))
Expect(scope).To(Equal("ert452"))
Expect(clusterID).To(Equal("bootstrap"))
Expect(env).To(Equal("prod"))
Expect(org).To(Equal("att"))
}
}
} else if cl, ok := event.(*common.ChangeList); ok {
go func(){quitPollingChangeServer <- true}()
// ensure that snapshot switched DB versions
Expect(apidInfo.LastSnapshot).To(Equal(lastSnapshot.SnapshotInfo))
expectedDB, err := dataService.DBVersion(lastSnapshot.SnapshotInfo)
Expect(err).NotTo(HaveOccurred())
Expect(getDB() == expectedDB).Should(BeTrue())
Expect(cl.Changes).To(HaveLen(6))
var tables []string
for _, c := range cl.Changes {
tables = append(tables, c.Table)
Expect(c.NewRow).ToNot(BeNil())
var tenantID string
c.NewRow.Get("tenant_id", &tenantID)
Expect(tenantID).To(Equal("ert452"))
}
Expect(tables).To(ContainElement("kms.app_credential"))
Expect(tables).To(ContainElement("kms.app_credential_apiproduct_mapper"))
Expect(tables).To(ContainElement("kms.developer"))
Expect(tables).To(ContainElement("kms.company_developer"))
Expect(tables).To(ContainElement("kms.api_product"))
Expect(tables).To(ContainElement("kms.app"))
events.ListenFunc(apid.EventDeliveredSelector, func(e apid.Event) {
defer GinkgoRecover()
// allow other handler to execute to insert last_sequence
time.Sleep(50 * time.Millisecond)
var seq string
err = getDB().
QueryRow("SELECT last_sequence FROM APID_CLUSTER LIMIT 1;").
Scan(&seq)
Expect(err).NotTo(HaveOccurred())
Expect(seq).To(Equal(cl.LastSequence))
tokenManager.close()
close(done)
})
}
})
//apid.InitializePlugins()
pie := apid.PluginsInitializedEvent{
Description: "plugins initialized",
}
pie.Plugins = append(pie.Plugins, pluginData)
postInitPlugins(pie)
}, 3)
//this test has a dependency on the one above it. Ideally we would write a test db to the disk instead
It("should bootstrap from local DB if present", func(done Done) {
/* postPluginInit event would have been emitted for the above test, clearing the list of registered plugins
* In general, any additional sync tests (or any tests causing postInitPlugins to fire)
* will need to re-register the plugin
*/
//apid.RegisterPlugin(initPlugin)
expectedTables := common.ChangeList{
Changes: []common.Change{common.Change{Table: "kms.company"},
common.Change{Table: "edgex.apid_cluster"},
common.Change{Table: "edgex.data_scope"}},
}
Expect(apidInfo.LastSnapshot).NotTo(BeEmpty())
apid.Events().ListenFunc(ApigeeSyncEventSelector, func(event apid.Event) {
if s, ok := event.(*common.Snapshot); ok {
go func(){quitPollingChangeServer <- true}()
//verify that the knownTables array has been properly populated from existing DB
Expect(changesRequireDDLSync(expectedTables)).To(BeFalse())
Expect(s.SnapshotInfo).Should(Equal(apidInfo.LastSnapshot))
Expect(s.Tables).To(BeNil())
tokenManager.close()
close(done)
}
})
//apid.InitializePlugins()
pie := apid.PluginsInitializedEvent{
Description: "plugins initialized",
}
pie.Plugins = append(pie.Plugins, pluginData)
postInitPlugins(pie)
}, 3)
It("should correctly identify non-proper subsets with respect to maps", func() {
//test b proper subset of a
Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
[]common.Change{common.Change{Table: "b"}},
)).To(BeFalse())
//test a == b
Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
[]common.Change{common.Change{Table: "a"}, common.Change{Table: "b"}},
)).To(BeFalse())
//test b superset of a
Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
[]common.Change{common.Change{Table: "a"}, common.Change{Table: "b"}, common.Change{Table: "c"}},
)).To(BeTrue())
//test b not subset of a
Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
[]common.Change{common.Change{Table: "c"}},
)).To(BeTrue())
//test a empty
Expect(changesHaveNewTables(map[string]bool{},
[]common.Change{common.Change{Table: "a"}},
)).To(BeTrue())
//test b empty
Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true},
[]common.Change{},
)).To(BeFalse())
//test b nil
Expect(changesHaveNewTables(map[string]bool{"a": true, "b": true}, nil)).To(BeTrue())
//test a nil
Expect(changesHaveNewTables(nil,
[]common.Change{common.Change{Table: "a"}},
)).To(BeTrue())
})
// todo: disabled for now -
// there is precondition I haven't been able to track down that breaks this test on occasion
XIt("should process a new snapshot when change server requires it", func(done Done) {
oldSnap := apidInfo.LastSnapshot
apid.Events().ListenFunc(ApigeeSyncEventSelector, func(event apid.Event) {
defer GinkgoRecover()
if s, ok := event.(*common.Snapshot); ok {
Expect(s.SnapshotInfo).NotTo(Equal(oldSnap))
close(done)
}
})
testMock.forceNewSnapshot()
})
})