Skip to content

Commit

Permalink
Merge pull request #9 from zhuoyuan-liu/distributed-query
Browse files Browse the repository at this point in the history
Add test for node query
  • Loading branch information
zhuoyuan-liu authored Nov 14, 2024
2 parents 5accc1c + 5b7e559 commit e18db0a
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 17 deletions.
6 changes: 6 additions & 0 deletions queries/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,19 @@ replace github.com/jmpsec/osctrl/utils => ../utils
require (
github.com/jmpsec/osctrl/nodes v0.0.0-20241107152746-1f093f5e8faf
github.com/jmpsec/osctrl/utils v0.0.0-20241107150205-621ec8aafdae
github.com/stretchr/testify v1.9.0
gorm.io/driver/sqlite v1.5.6
gorm.io/gorm v1.25.12
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.22 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
golang.org/x/sys v0.26.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

require (
Expand Down
20 changes: 6 additions & 14 deletions queries/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@ github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
Expand All @@ -27,25 +28,16 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=
gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.11 h1:/Wfyg1B/je1hnDx3sMkX+gAlxrlZpn6X0BXRlwXlvHg=
gorm.io/gorm v1.25.11/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
gorm.io/driver/sqlite v1.5.6 h1:fO/X46qn5NUEEOZtnjJRWRzZMe8nqJiQ9E+0hi+hKQE=
gorm.io/driver/sqlite v1.5.6/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4=
gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
6 changes: 3 additions & 3 deletions queries/queries.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,8 @@ func CreateQueries(backend *gorm.DB) *Queries {
func (q *Queries) NodeQueries(node nodes.OsqueryNode) (QueryReadQueries, bool, error) {

var results []struct {
QueryName string
Query string
Name string
Query string
}

q.DB.Table("distributed_queries dq").
Expand All @@ -161,7 +161,7 @@ func (q *Queries) NodeQueries(node nodes.OsqueryNode) (QueryReadQueries, bool, e

qs := make(QueryReadQueries)
for _, _q := range results {
qs[_q.QueryName] = _q.Query
qs[_q.Name] = _q.Query
}

return qs, false, nil
Expand Down
133 changes: 133 additions & 0 deletions queries/queries_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package queries_test

import (
"fmt"
"log"
"testing"
"time"

"github.com/jmpsec/osctrl/nodes"
"github.com/jmpsec/osctrl/queries"
"github.com/stretchr/testify/assert"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)

func setupTestDB() (*gorm.DB, error) {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
if err != nil {
return nil, err
}
return db, nil
}

func TestNodeQueries(t *testing.T) {
db, err := setupTestDB()
if err != nil {
t.Fatalf("Failed to setup test database: %v", err)
}

// Create tables
q := queries.CreateQueries(db)
nodes.CreateNodes(db)

// Create test data
node := nodes.OsqueryNode{
Model: gorm.Model{ID: 1},
}
distributedQuery := queries.DistributedQuery{
Model: gorm.Model{ID: 1},
Name: "test_query",
Query: "SELECT * FROM osquery_info;",
EnvironmentID: 1,
Expiration: time.Now().Add(24 * time.Hour),
}
nodeQuery := queries.NodeQuery{
NodeID: 1,
QueryID: 1,
Status: "pending",
}

// Query sqlite_master to list all tables
var tables []string
err = db.Raw("SELECT name FROM sqlite_master WHERE type='table'").Scan(&tables).Error
if err != nil {
log.Fatalf("failed to list tables: %v", err)
}

fmt.Println("Tables in the database:")
for _, table := range tables {
fmt.Println(table)
}

if err := db.Create(&node).Error; err != nil {
t.Fatalf("Failed to create test node: %v", err)
}
if err := db.Create(&distributedQuery).Error; err != nil {
t.Fatalf("Failed to create test distributed query: %v", err)
}
if err := db.Create(&nodeQuery).Error; err != nil {
t.Fatalf("Failed to create test node query: %v", err)
}

// Test NodeQueries function
queries, _, err := q.NodeQueries(node)
if err != nil {
t.Fatalf("NodeQueries returned an error: %v", err)
}
// Print queries
fmt.Println(queries)

assert.NotEmpty(t, queries, "Expected non-empty queries")
assert.Equal(t, "SELECT * FROM osquery_info;", queries["test_query"], "Query does not match expected value")
}
func TestUpdateQueryStatus(t *testing.T) {
db, err := setupTestDB()
if err != nil {
t.Fatalf("Failed to setup test database: %v", err)
}

// Create tables
q := queries.CreateQueries(db)
nodes.CreateNodes(db)

// Create test data
node := nodes.OsqueryNode{
Model: gorm.Model{ID: 1},
}
distributedQuery := queries.DistributedQuery{
Model: gorm.Model{ID: 1},
Name: "test_query",
Query: "SELECT * FROM osquery_info;",
EnvironmentID: 1,
Expiration: time.Now().Add(24 * time.Hour),
}
nodeQuery := queries.NodeQuery{
NodeID: 1,
QueryID: 1,
Status: "pending",
}

if err := db.Create(&node).Error; err != nil {
t.Fatalf("Failed to create test node: %v", err)
}
if err := db.Create(&distributedQuery).Error; err != nil {
t.Fatalf("Failed to create test distributed query: %v", err)
}
if err := db.Create(&nodeQuery).Error; err != nil {
t.Fatalf("Failed to create test node query: %v", err)
}

// Test UpdateQueryStatus function
err = q.UpdateQueryStatus("test_query", 1, 0)
if err != nil {
t.Fatalf("UpdateQueryStatus returned an error: %v", err)
}

var updatedNodeQuery queries.NodeQuery
if err := db.Where("node_id = ? AND query_id = ?", 1, 1).Find(&updatedNodeQuery).Error; err != nil {
t.Fatalf("Failed to find updated node query: %v", err)
}

assert.Equal(t, "completed", updatedNodeQuery.Status, "Status does not match expected value")
}

0 comments on commit e18db0a

Please sign in to comment.