From a62d47705972c44bc5fb918a40c6ab293dd0bd70 Mon Sep 17 00:00:00 2001 From: Scott Haseley Date: Fri, 11 Mar 2016 09:57:49 -0500 Subject: [PATCH] Removed dependency on the solution sets for submission testing. The submission test now uses base sources with a simple target and overlay. --- build_test.go | 5 +-- environment.go | 5 +++ fixtures/keys/id_rsa.pub | 1 + .../keys/test@test161.ops-class.org/id_rsa | 27 +++++++++++ fixtures/overlays/simple/SECRET | 3 ++ .../simple/kern/include/kern/secret.h | 10 +++++ run_test.go | 36 ++++----------- submission.go | 19 ++++---- submission_test.go | 45 +++++++++++++++++-- testing_persistence.go | 45 +++++++++++++++++++ 10 files changed, 153 insertions(+), 43 deletions(-) create mode 100644 fixtures/keys/id_rsa.pub create mode 100644 fixtures/keys/test@test161.ops-class.org/id_rsa create mode 100644 fixtures/overlays/simple/SECRET create mode 100644 fixtures/overlays/simple/kern/include/kern/secret.h create mode 100644 testing_persistence.go diff --git a/build_test.go b/build_test.go index 633ae13..5d216cc 100644 --- a/build_test.go +++ b/build_test.go @@ -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() diff --git a/environment.go b/environment.go index ba0f5ac..a8ed238 100644 --- a/environment.go +++ b/environment.go @@ -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) +} diff --git a/fixtures/keys/id_rsa.pub b/fixtures/keys/id_rsa.pub new file mode 100644 index 0000000..7429cde --- /dev/null +++ b/fixtures/keys/id_rsa.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDb9CX+IuNQNsMvdQ2AcULcPHeLTN5YzcqszY+98fljcAzTxlv4Gv8fMDcqubDUwTdOBu5uUubVyGnLgKRzhM4nvLm4JW9ArS9suWcs/TFl2Uyvd8ay8/NbEy3j2rAUKBLBYO2e0eeJBqHz8dX+VDCqCo6V/eJKvzcNbH37JfagC0TC4HhMUyTo6lBx0LHyPYygmgb7VS/lLl42WGm1NI6Z2zGEecRZBD7Qh2ohCie0Lw2RcgM3q8mWoxeY3+7r9a9oYSU6gekupTljkFR6zI0qjOyyIvIe6BFjwodA1Q7aLRXwNWjh+bQ8oiK6thZVxuyw2PvASWCVv+L+KV0N/Oep test161 diff --git a/fixtures/keys/test@test161.ops-class.org/id_rsa b/fixtures/keys/test@test161.ops-class.org/id_rsa new file mode 100644 index 0000000..565ccff --- /dev/null +++ b/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----- diff --git a/fixtures/overlays/simple/SECRET b/fixtures/overlays/simple/SECRET new file mode 100644 index 0000000..8ed0e37 --- /dev/null +++ b/fixtures/overlays/simple/SECRET @@ -0,0 +1,3 @@ +kern/test/synchtest.c +kern/vm/kmalloc.c +kern/test/rwtest.c diff --git a/fixtures/overlays/simple/kern/include/kern/secret.h b/fixtures/overlays/simple/kern/include/kern/secret.h new file mode 100644 index 0000000..1248cc3 --- /dev/null +++ b/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_ */ diff --git a/run_test.go b/run_test.go index a88c04a..cb906be 100644 --- a/run_test.go +++ b/run_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "math/rand" "os" + "path/filepath" "strings" "testing" "time" @@ -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") @@ -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. diff --git a/submission.go b/submission.go index dc165a7..9ac1616 100644 --- a/submission.go +++ b/submission.go @@ -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 @@ -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) diff --git a/submission_test.go b/submission_test.go index 040426d..0c44c9f 100644 --- a/submission_test.go +++ b/submission_test.go @@ -1,6 +1,7 @@ package test161 import ( + "encoding/json" "github.com/stretchr/testify/assert" "testing" ) @@ -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", } @@ -38,6 +39,8 @@ func TestSubmissionRun(t *testing.T) { } env.Persistence = mongo defer mongo.Close() + } else { + env.Persistence = &TestingPersistence{} } env.manager = newManager() @@ -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 +} diff --git a/testing_persistence.go b/testing_persistence.go new file mode 100644 index 0000000..146c63b --- /dev/null +++ b/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") + } + +}