Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 81 additions & 18 deletions cannon/mipsevm/multithreaded/instrumented_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,27 +36,90 @@ func TestInstrumentedState_Claim(t *testing.T) {

func TestInstrumentedState_MultithreadedProgram(t *testing.T) {
t.Parallel()
state, _ := testutil.LoadELFProgram(t, testutil.ProgramPath("multithreaded"), CreateInitialState, false)
oracle := testutil.StaticOracle(t, []byte{})

var stdOutBuf, stdErrBuf bytes.Buffer
us := NewInstrumentedState(state, oracle, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), testutil.CreateLogger(), nil)
for i := 0; i < 2_000_000; i++ {
if us.GetState().GetExited() {
break
}
_, err := us.Step(false)
require.NoError(t, err)
cases := []struct {
name string
expectedOutput []string
programName string
}{
{
name: "wg and chan test",
expectedOutput: []string{
"waitgroup result: 42",
"channels result: 1234",
},
programName: "mt-wg",
},
{
name: "mutex test",
expectedOutput: []string{
"Mutex test passed",
},
programName: "mt-mutex",
},
{
name: "cond test",
expectedOutput: []string{
"Cond test passed",
},
programName: "mt-cond",
},
{
name: "rwmutex test",
expectedOutput: []string{
"RWMutex test passed",
},
programName: "mt-rwmutex",
},
{
name: "once test",
expectedOutput: []string{
"Once test passed",
},
programName: "mt-once",
},
{
name: "map test",
expectedOutput: []string{
"Map test passed",
},
programName: "mt-map",
},
{
name: "pool test",
expectedOutput: []string{
"Pool test passed",
},
programName: "mt-pool",
},
}
t.Logf("Completed in %d steps", state.Step)

require.True(t, state.Exited, "must complete program")
require.Equal(t, uint8(0), state.ExitCode, "exit with 0")
require.Contains(t, "waitgroup result: 42", stdErrBuf.String())
require.Contains(t, "channels result: 1234", stdErrBuf.String())
require.Equal(t, "", stdErrBuf.String(), "should not print any errors")
}
for _, test := range cases {
test := test
t.Run(test.name, func(t *testing.T) {
t.Parallel()
state, _ := testutil.LoadELFProgram(t, testutil.ProgramPath(test.programName), CreateInitialState, false)
oracle := testutil.StaticOracle(t, []byte{})

var stdOutBuf, stdErrBuf bytes.Buffer
us := NewInstrumentedState(state, oracle, io.MultiWriter(&stdOutBuf, os.Stdout), io.MultiWriter(&stdErrBuf, os.Stderr), testutil.CreateLogger(), nil)
for i := 0; i < 5_000_000; i++ {
if us.GetState().GetExited() {
break
}
_, err := us.Step(false)
require.NoError(t, err)
}
t.Logf("Completed in %d steps", state.Step)

require.True(t, state.Exited, "must complete program")
require.Equal(t, uint8(0), state.ExitCode, "exit with 0")
for _, expected := range test.expectedOutput {
require.Contains(t, stdOutBuf.String(), expected)
}
require.Equal(t, "", stdErrBuf.String(), "should not print any errors")
})
}
}
func TestInstrumentedState_Alloc(t *testing.T) {
if os.Getenv("SKIP_SLOW_TESTS") == "true" {
t.Skip("Skipping slow test because SKIP_SLOW_TESTS is enabled")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module multithreaded
module cond

go 1.22

Expand Down
Loading