Skip to content

Commit

Permalink
Removed dependency on the solution sets for submission testing. The s…
Browse files Browse the repository at this point in the history
…ubmission test

now uses base sources with a simple target and overlay.
  • Loading branch information
shaseley committed Mar 11, 2016
1 parent 889a590 commit a62d477
Show file tree
Hide file tree
Showing 10 changed files with 153 additions and 43 deletions.
5 changes: 2 additions & 3 deletions build_test.go
Expand Up @@ -10,10 +10,9 @@ func TestBuildFull(t *testing.T) {
assert := assert.New(t)

conf := &BuildConf{
Repo: "git@gitlab.ops-class.org:staff/sol1.git",
Repo: "https://github.com/ops-class/os161.git",
CommitID: "HEAD",
KConfig: "ASST1",
//RequiredCommit: "db6d3d219d53a292b96e8529649757bb257e8785",
KConfig: "DUMBVM",
}

env := defaultEnv.CopyEnvironment()
Expand Down
5 changes: 5 additions & 0 deletions environment.go
Expand Up @@ -184,3 +184,8 @@ func (env *TestEnvironment) notifyAndLogErr(desc string, entity interface{}, msg
}
}
}

func (env *TestEnvironment) SetNullLogger() {
env.Log.SetFlags(0)
env.Log.SetOutput(ioutil.Discard)
}
1 change: 1 addition & 0 deletions fixtures/keys/id_rsa.pub
@@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDb9CX+IuNQNsMvdQ2AcULcPHeLTN5YzcqszY+98fljcAzTxlv4Gv8fMDcqubDUwTdOBu5uUubVyGnLgKRzhM4nvLm4JW9ArS9suWcs/TFl2Uyvd8ay8/NbEy3j2rAUKBLBYO2e0eeJBqHz8dX+VDCqCo6V/eJKvzcNbH37JfagC0TC4HhMUyTo6lBx0LHyPYygmgb7VS/lLl42WGm1NI6Z2zGEecRZBD7Qh2ohCie0Lw2RcgM3q8mWoxeY3+7r9a9oYSU6gekupTljkFR6zI0qjOyyIvIe6BFjwodA1Q7aLRXwNWjh+bQ8oiK6thZVxuyw2PvASWCVv+L+KV0N/Oep test161
27 changes: 27 additions & 0 deletions fixtures/keys/test@test161.ops-class.org/id_rsa
@@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA2/Ql/iLjUDbDL3UNgHFC3Dx3i0zeWM3KrM2PvfH5Y3AM08Zb
+Br/HzA3Krmw1ME3TgbublLm1chpy4Ckc4TOJ7y5uCVvQK0vbLlnLP0xZdlMr3fG
svPzWxMt49qwFCgSwWDtntHniQah8/HV/lQwqgqOlf3iSr83DWx9+yX2oAtEwuB4
TFMk6OpQcdCx8j2MoJoG+1Uv5S5eNlhptTSOmdsxhHnEWQQ+0IdqIQontC8NkXID
N6vJlqMXmN/u6/WvaGElOoHpLqU5Y5BUesyNKozssiLyHugRY8KHQNUO2i0V8DVo
4fm0PKIiurYWVcbssNj7wElglb/i/ildDfznqQIDAQABAoIBAGqWux6Xq46Aqz/B
OqTGvj7Z8piHzKw+NfxdtU24CEG+2Ah8dK8b7gwgImvLBr1jULi4NS0zcXeiIlqi
4Y61ie3J0DpDsdEm2/eVNUGhBSI1FqtloN2xyHmXJsLnhDKQZN5faWdwkwJdO3hq
9mfERrzwVr6rBNFyLmyL6dUeRZCyXw5Mv3z1mreavoMj6DwfprCAU/gltoY/jGe8
5fseLIy3dgBgz2IxC3ADH44OTpURKEal58pHuB7I+eOY5cxq5TBolOO7nyXT5I72
7f6Mr5Vy6XpcvSHuMLv1o0iYK+QWeFlJiO2O8UuHPyvOAQuITbTytZpLYzwSOLFX
WDvNDD0CgYEA+BSAP4pL9EvnIkzwFtw91/CHuaexa+NNRIeXDvTuNIjleMCr9nSr
KVMnVJDgOWPazArCnIjMWMievu78rGPEvL8e4Vn9JxOjRmfI/HH53UgbScA4QeLf
2BpHnaLCdwBlhKTtHwrr/zZxpicATfrsSdEfiFPTIN4hrTdUUxCum5sCgYEA4vnG
/UfDNWAiXb5TXwJdJ7RslAPp7889yP4eWmeCUW8iDMI7zXb6E0v5jCacJV+bNBtK
eC5v/XXEgAcJ+vdsYfYBtmzZ8+rDkoGM3SEGGN/JtVhqOp+WWlWwaNZ2L/ZT4oQF
yz7y9G8YWvSS/mv68Q19YMd7xjbqxcbU9jtEKAsCgYEAq6V7qvskXI6cCOaVBCw0
+hEpx7IYl155Wt46DZY4rs69f1RIZ0kIGJq5TtDC49KMU7tqNeaNBS0icVdoKlsJ
h9LxKdkayIvU3+T1cn3l9U5r2xaNlkDEwoBEZvRzeuUiWKnIiz8CVN41ulGn60yf
at+v4qKlJUusn232AVc8iNsCgYA7jGCCjtNOK5yYj5h78rjR8+oQoz465lpFYzY/
baypBMkgI81gyHgvm90qwe5xd7XWY9qT0UscaktVc4NQzp0mzk4AuGouLkeFJmv4
j/NzjzLyWvHz02604IpZ1vpG9w9m/FAw1KEVNBhltIjkKxw5JdrhCzUT+dB6dwHk
YAQvpQKBgB9gy9gJUNhtIu6eLX75T1x4biMxKyg587uttOu9y9GgfW0dELXLtsLl
r5yC8Oo1Irezu2J3K9e5Uk/3O+LjmOsFzv4yjSja9XuQ9JV7eCl1zIglCxo6lTlf
jb89ulQUyV6VcX4IOhHYlw4AFtpZskmTULS/GVYcOMHqVFfVEbJw
-----END RSA PRIVATE KEY-----
3 changes: 3 additions & 0 deletions fixtures/overlays/simple/SECRET
@@ -0,0 +1,3 @@
kern/test/synchtest.c
kern/vm/kmalloc.c
kern/test/rwtest.c
10 changes: 10 additions & 0 deletions fixtures/overlays/simple/kern/include/kern/secret.h
@@ -0,0 +1,10 @@
#ifndef _SECRET_H_
#define _SECRET_H_

/* Enable secret based testing. */
#define SECRET_TESTING

/* Make sure we overwrite all secrets during injection. */
#undef SECRET

#endif /* _SECRET_H_ */
36 changes: 9 additions & 27 deletions run_test.go
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/stretchr/testify/assert"
"math/rand"
"os"
"path/filepath"
"strings"
"testing"
"time"
Expand Down Expand Up @@ -36,6 +37,14 @@ func init() {
defaultEnv.TestDir = "./fixtures/tests/nocycle"
defaultEnv.RootDir = "./fixtures/root"

path, _ := filepath.Abs("./fixtures/keys")
defaultEnv.KeyDir = path

path, _ = filepath.Abs("./fixtures/overlays")
defaultEnv.OverlayRoot = path

defaultEnv.SetNullLogger()

// Command line flags
flag.BoolVar(&testFlagDB, "db", false, "Run tests that rely on mongodb")

Expand Down Expand Up @@ -253,33 +262,6 @@ func TestRunResults(t *testing.T) {
t.Log(test.OutputString())
}

func TestRunBadSys161(t *testing.T) {
t.Parallel()
assert := assert.New(t)

test, err := TestFromString(`---
sys161:
path: "./fixtures/sys161/sys161-2.0.5"
---
q
`)
assert.Nil(err)
assert.Nil(test.MergeConf(TEST_DEFAULTS))
assert.Nil(test.Run(defaultEnv))

assert.Equal(len(test.Status), 3)
if len(test.Status) == 3 {
assert.Equal(test.Status[0].Status, "started")
assert.Equal(test.Status[1].Status, "stats")
assert.True(strings.HasPrefix(test.Status[1].Message, "incorrect stat format"))
assert.Equal(test.Status[2].Status, "shutdown")
assert.True(strings.HasPrefix(test.Status[2].Message, "unexpected"))
}

t.Log(test.OutputJSON())
t.Log(test.OutputString())
}

///////////////// Grading tests /////////////////

// Create a fake command complete with output lines.
Expand Down
19 changes: 10 additions & 9 deletions submission.go
Expand Up @@ -329,7 +329,15 @@ func (s *Submission) validResult() bool {
}
}

// update the
func (student *Student) getStat(targetName string) *TargetStats {
for _, stat := range student.Stats {
if stat.TargetName == targetName {
return stat
}
}
return nil
}

func (student *Student) updateStats(submission *Submission) {

// This might be nil coming out of Mongo
Expand All @@ -340,14 +348,7 @@ func (student *Student) updateStats(submission *Submission) {
student.TotalSubmissions += 1

// Find the TargetStats to update, or create a new one
var stat *TargetStats

for _, temp := range student.Stats {
if temp.TargetName == submission.TargetName {
stat = temp
break
}
}
stat := student.getStat(submission.TargetName)
if stat == nil {
stat = submission.TargetStats()
student.Stats = append(student.Stats, stat)
Expand Down
45 changes: 41 additions & 4 deletions submission_test.go
@@ -1,6 +1,7 @@
package test161

import (
"encoding/json"
"github.com/stretchr/testify/assert"
"testing"
)
Expand All @@ -14,14 +15,14 @@ func TestSubmissionRun(t *testing.T) {
var err error

req := &SubmissionRequest{
Target: "asst1",
Target: "simple",
Users: []*SubmissionUserInfo{
&SubmissionUserInfo{
Email: "t1@xcv58.com",
Token: "ATamoCT7DdeNdnErQ",
Email: testStudent.Email,
Token: testStudent.Token,
},
},
Repository: "git@gitlab.ops-class.org:staff/sol1.git",
Repository: "git@github.com:ops-class/os161.git",
CommitID: "HEAD",
}

Expand All @@ -38,6 +39,8 @@ func TestSubmissionRun(t *testing.T) {
}
env.Persistence = mongo
defer mongo.Close()
} else {
env.Persistence = &TestingPersistence{}
}

env.manager = newManager()
Expand All @@ -57,5 +60,39 @@ func TestSubmissionRun(t *testing.T) {
assert.Nil(err)
assert.Equal(uint(50), s.Score)

students := retrieveTestStudent(env.Persistence)
assert.Equal(1, len(students))
if len(students) != 1 {
t.FailNow()
}

// The submission makes a copy of of env with a fresh keymap, so use that
assert.True(len(s.Env.keyMap) > 0)
t.Log(s.Env.keyMap)

outputBytes, err := json.MarshalIndent(s, "", " ")
if err != nil {
t.Log(err)
t.FailNow()
}
t.Log(string(outputBytes))

stat := students[0].getStat("simple")
assert.NotNil(stat)
assert.Equal(uint(50), stat.MaxScore)
assert.Equal(uint(50), stat.HighScore)

env.manager.stop()
}

func retrieveTestStudent(persist PersistenceManager) []*Student {
students := []*Student{}
request := map[string]interface{}{
"email": testStudent.Email,
"token": testStudent.Token,
}

persist.Retrieve(PERSIST_TYPE_STUDENTS, request, &students)

return students
}
45 changes: 45 additions & 0 deletions testing_persistence.go
@@ -0,0 +1,45 @@
package test161

import (
"errors"
)

// A fake persistence to use for test code

var testStudent = &Student{
Email: "test@test161.ops-class.org",
Token: "TestToken4$5^",
}

type TestingPersistence struct {
Verbose bool
}

func (p *TestingPersistence) Close() {
}

func (p *TestingPersistence) Notify(entity interface{}, msg, what int) error {
return nil
}

func (d *TestingPersistence) CanRetrieve() bool {
return true
}

func (d *TestingPersistence) Retrieve(what int, who map[string]interface{}, res interface{}) error {
switch what {
case PERSIST_TYPE_STUDENTS:
if email, _ := who["email"]; email == testStudent.Email {
if token, _ := who["token"]; token == testStudent.Token {
students := res.(*[]*Student)
*students = append(*students, testStudent)
}
}

return nil

default:
return errors.New("Persistence: Invalid data type")
}

}

0 comments on commit a62d477

Please sign in to comment.