From dd973d03bf5f3f439dcdacbb22470105e66e698a Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 29 Mar 2017 00:45:30 +0300 Subject: Implement manifests and build_config --- tests/manifest/buildfile | 9 ++ tests/manifest/driver.cxx | 71 ++++++++++ tests/manifest/machine.test | 157 ++++++++++++++++++++++ tests/manifest/result-request.test | 92 +++++++++++++ tests/manifest/result.test | 230 ++++++++++++++++++++++++++++++++ tests/manifest/task-request.test | 96 ++++++++++++++ tests/manifest/task-response.test | 114 ++++++++++++++++ tests/manifest/task.test | 260 +++++++++++++++++++++++++++++++++++++ 8 files changed, 1029 insertions(+) create mode 100644 tests/manifest/buildfile create mode 100644 tests/manifest/driver.cxx create mode 100644 tests/manifest/machine.test create mode 100644 tests/manifest/result-request.test create mode 100644 tests/manifest/result.test create mode 100644 tests/manifest/task-request.test create mode 100644 tests/manifest/task-response.test create mode 100644 tests/manifest/task.test (limited to 'tests/manifest') diff --git a/tests/manifest/buildfile b/tests/manifest/buildfile new file mode 100644 index 0000000..002dbb0 --- /dev/null +++ b/tests/manifest/buildfile @@ -0,0 +1,9 @@ +# file : tests/manifest/buildfile +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +import libs += libbutl%lib{butl} + +exe{driver}: cxx{driver} ../../bbot/lib{bbot} $libs test{*} + +include ../../bbot/ diff --git a/tests/manifest/driver.cxx b/tests/manifest/driver.cxx new file mode 100644 index 0000000..0f24c8a --- /dev/null +++ b/tests/manifest/driver.cxx @@ -0,0 +1,71 @@ +// file : tests/manifest/driver.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include // ios_base::failbit, ios_base::badbit +#include +#include +#include + +#include // operator<<(ostream,exception) +#include +#include + +#include + +using namespace std; +using namespace butl; +using namespace bbot; + +// Usage: argv[0] (-m|-t|-r|-tq|-ts|-rq) +// +// Read and parse manifest from STDIN and serialize it to STDOUT. The +// following options specify the manifest type. +// +// -m parse machine manifest +// -t parse task manifest +// -r parse result manifest +// -tq parse task request manifest +// -ts parse task response manifest +// -rq parse result request manifest +// +int +main (int argc, char* argv[]) +try +{ + assert (argc == 2); + string opt (argv[1]); + + cin.exceptions (ios_base::failbit | ios_base::badbit); + cout.exceptions (ios_base::failbit | ios_base::badbit); + + manifest_parser p (cin, "stdin"); + manifest_serializer s (cout, "stdout"); + + if (opt == "-m") + machine_manifest (p).serialize (s); + else if (opt == "-t") + task_manifest (p).serialize (s); + else if (opt == "-r") + result_manifest (p).serialize (s); + else if (opt == "-tq") + task_request_manifest (p).serialize (s); + else if (opt == "-ts") + task_response_manifest (p).serialize (s); + else if (opt == "-rq") + result_request_manifest (p).serialize (s); + else + assert (false); + + return 0; +} +catch (const manifest_parsing& e) +{ + cerr << e << endl; + return 1; +} +catch (const manifest_serialization& e) +{ + cerr << e << endl; + return 1; +} diff --git a/tests/manifest/machine.test b/tests/manifest/machine.test new file mode 100644 index 0000000..b775a79 --- /dev/null +++ b/tests/manifest/machine.test @@ -0,0 +1,157 @@ +# file : tests/manifest/machine.test +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +test.options += -m + +: valid +: +: Roundtrip the machine manifest. +: +{ + : vm + : + $* <>EOF + : 1 + id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + name: windows_10-msvc_14 + type: vm + summary: Windows 10 build 1607 with VC 14 update 3 + EOF + + : container + : + $* <>EOF + : 1 + id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + name: windows_10-msvc_14 + type: container + summary: Windows 10 build 1607 with VC 14 update 3 + EOF +} + +: multiple +: +$* <'stdin:6:1: error: single machine manifest expected' == 1 +: 1 +id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +name: windows_10-msvc_14 +type: vm +summary: Windows 10 build 1607 with VC 14 update 3 +: +EOI + +: redefinition +: +{ + : id + : + $* <'stdin:3:1: error: machine id redefinition' == 1 + : 1 + id: 123 + id: 123 + EOI + + : name + : + $* <'stdin:3:1: error: machine name redefinition' == 1 + : 1 + name: windows + name: windows + EOI + + : type + : + $* <'stdin:3:1: error: machine type redefinition' == 1 + : 1 + type: vm + type: vm + EOI + + : summary + : + $* <'stdin:3:1: error: machine summary redefinition' == 1 + : 1 + summary: Windows + summary: Windows + EOI +} + +: empty +: +{ + : id + : + $* <'stdin:2:4: error: empty machine id' == 1 + : 1 + id: + EOI + + : name + : + $* <'stdin:2:6: error: empty machine name' == 1 + : 1 + name: + EOI + + : summary + : + $* <'stdin:2:9: error: empty machine summary' == 1 + : 1 + summary: + EOI +} + +: invalid-type +: +$* <'stdin:2:7: error: invalid machine type' == 1 +: 1 +type: unknown +EOI + +: unknown-name +: +$* <"stdin:2:1: error: unknown name 'x' in machine manifest" == 1 +: 1 +x: +EOI + +: missed +: +{ + : id + : + $* <'stdin:5:1: error: no machine id specified' == 1 + : 1 + name: windows + type: vm + summary: Windows + EOI + + : name + : + $* <'stdin:5:1: error: no machine name specified' == 1 + : 1 + id: 123 + type: vm + summary: Windows + EOI + + : type + : + $* <'stdin:5:1: error: no machine type specified' == 1 + : 1 + id: 123 + name: windows + summary: Windows + EOI + + : summary + : + $* <'stdin:5:1: error: no machine summary specified' == 1 + : 1 + id: 123 + name: windows + type: vm + EOI +} diff --git a/tests/manifest/result-request.test b/tests/manifest/result-request.test new file mode 100644 index 0000000..8cf64b9 --- /dev/null +++ b/tests/manifest/result-request.test @@ -0,0 +1,92 @@ +# file : tests/manifest/result-request.test +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +test.options += -rq + +: valid +: +: Roundtrip the result request manifest. +: +{ + $* <>EOF + : 1 + session: abcd + challenge: xyz + : + name: libfoo + version: 1.0 + status: error + EOF +} + +: redefinition +: +{ + : session + : + $* <'stdin:3:1: error: result request session redefinition' == 1 + : 1 + session: abcd + session: abcd + EOI + + : challenge + : + $* <'stdin:3:1: error: result request challenge redefinition' == 1 + : 1 + challenge: xyz + challenge: xyz + EOI +} + +: empty +: +{ + : session + : + $* <'stdin:2:9: error: empty result request session' == 1 + : 1 + session: + EOI + + : challenge + : + $* <'stdin:2:11: error: empty result request challenge' == 1 + : 1 + challenge: + EOI +} + +: unknown-name +: +$* <"stdin:2:1: error: unknown name 'x' in result request manifest" == 1 +: 1 +x: +EOI + +: missed +: +{ + : session + : + $* <'stdin:3:1: error: no result request session specified' == 1 + : 1 + challenge: xyz + EOI + + : challenge + : + $* <'stdin:3:1: error: no result request challenge specified' == 1 + : 1 + session: abc + EOI + + : result + : + $* <'stdin:4:1: error: result manifest expected' == 1 + : 1 + session: abc + challenge: xyz + EOI +} diff --git a/tests/manifest/result.test b/tests/manifest/result.test new file mode 100644 index 0000000..52964e0 --- /dev/null +++ b/tests/manifest/result.test @@ -0,0 +1,230 @@ +# file : tests/manifest/result.test +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +test.options += -r + +: valid +: +: Roundtrip the result manifest. +: +{ + : test-error + : + $* <>EOF + : 1 + name: libfoo + version: 1.0 + status: error + configure-status: success + update-status: warning + test-status: error + configure-log: \ + conf line 1 + conf line 2 + \ + update-log: \ + update line 1 + update line 2 + \ + test-log: \ + test line 1 + test line 2 + \ + EOF + + : update-error + : + $* <>EOF + : 1 + name: libfoo + version: 1.0 + status: error + configure-status: warning + update-status: error + configure-log: \ + conf line 1 + conf line 2 + \ + update-log: \ + update line 1 + update line 2 + \ + EOF + + : early-abort + : + $* <>EOF + : 1 + name: libfoo + version: 1.0 + status: abort + EOF +} + +: redefinition +: +{ + : name + : + $* <'stdin:3:1: error: result package name redefinition' == 1 + : 1 + name: libfoo + name: libfoo + EOI + + : version + : + $* <'stdin:3:1: error: result package version redefinition' == 1 + : 1 + version: 1.0 + version: 1.0 + EOI + + : status + : + $* <'stdin:3:1: error: result status redefinition' == 1 + : 1 + status: success + status: error + EOI + + : configure-status + : + $* <'stdin:4:1: error: result configure-status redefinition' == 1 + : 1 + status: success + configure-status: success + configure-status: abnormal + EOI + + : configure-log + : + $* <'stdin:5:1: error: unexpected configure-log' == 1 + : 1 + status: success + configure-status: success + configure-log: configured + configure-log: configured + EOI +} + +: invalid +: +{ + : name-empty + : + $* <'stdin:2:6: error: empty result package name' == 1 + : 1 + name: + EOI + + : version + : + { + : empty + : + $* <'stdin:2:9: error: invalid result package version: unexpected end' == 1 + : 1 + version: + EOI + + : release + : + $* <'stdin:2:10: error: invalid result package version release' == 1 + : 1 + version: 1.2.3- + EOI + } + + : status + : + $* <'stdin:2:9: error: invalid result status' == 1 + : 1 + status: alert + EOI + + : configure-status + : + $* <'stdin:3:19: error: invalid configure-status' == 1 + : 1 + status: abort + configure-status: alert + EOI + + : order + : + { + : op-status-before-status + : + $* <'stdin:2:1: error: result status must appear first' == 1 + : 1 + configure-status: success + EOI + + : op-status-after-log + : + $* <'stdin:5:1: error: update-status after operations logs' == 1 + : 1 + status: success + configure-status: success + configure-log: log + update-status: error + EOI + + : wrong-op-log + : + $* <'stdin:5:1: error: configure-log is expected' == 1 + : 1 + status: success + configure-status: success + update-status: error + update-log: log + EOI + } +} + +: unknown-name +: +$* <"stdin:2:1: error: unknown name 'full-logs' in result manifest" == 1 +: 1 +full-logs: log +EOI + +: missed +: +{ + : name + : + $* <'stdin:4:1: error: no result package name specified' == 1 + : 1 + version: 1.0 + status: success + EOI + + : version + : + $* <'stdin:4:1: error: no result package version specified' == 1 + : 1 + name: libfoo + status: success + EOI + + : status + : + $* <'stdin:4:1: error: no result status specified' == 1 + : 1 + name: libfoo + version: 1.0 + EOI + + : configure-log + : + $* <'stdin:6:1: error: no result configure-log specified' == 1 + : 1 + name: libfoo + version: 1.0 + status: error + configure-status: error + EOI +} diff --git a/tests/manifest/task-request.test b/tests/manifest/task-request.test new file mode 100644 index 0000000..2e3fb75 --- /dev/null +++ b/tests/manifest/task-request.test @@ -0,0 +1,96 @@ +# file : tests/manifest/task-request.test +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +test.options += -tq + +: valid +: +: Roundtrip the task request manifest. +: +$* <>EOF +: 1 +agent: upsa +fingerprint: 1105fb394ee870adb154b7abfbbae5755df7dcef6c81db34e8d1b68d2653734e +: +id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +name: windows_10-msvc_14 +summary: Windows 10 build 1607 with VC 14 update 3 +EOF + +: redefinition +: +{ + : agent + : + $* <'stdin:3:1: error: task request agent redefinition' == 1 + : 1 + agent: upsa + agent: upsa + EOI + + : fingerprint + : + $* <'stdin:3:1: error: task request fingerprint redefinition' == 1 + : 1 + fingerprint: 1105fb394ee870adb154b7abfbbae5755df7dcef6c81db34e8d1b68d2653734e + fingerprint: 1105fb394ee870adb154b7abfbbae5755df7dcef6c81db34e8d1b68d2653734e + EOI +} + +: empty +: +{ + : agent + : + $* <'stdin:2:7: error: empty task request agent' == 1 + : 1 + agent: + EOI +} + +: invalid-fingerprint +: +$* <'stdin:2:14: error: invalid task request fingerprint' == 1 +: 1 +fingerprint: 123x +EOI + +: missed +: +{ + : agent + : + $* <'stdin:3:1: error: no task request agent specified' == 1 + : 1 + fingerprint: 1105fb394ee870adb154b7abfbbae5755df7dcef6c81db34e8d1b68d2653734e + EOI + + : fingerprint + : + $* <'stdin:3:1: error: no task request fingerprint specified' == 1 + : 1 + agent: upsa + EOI +} + +: no-machines +: +$* <'stdin:4:1: error: no task request machines specified' == 1 +: 1 +agent: upsa +fingerprint: 1105fb394ee870adb154b7abfbbae5755df7dcef6c81db34e8d1b68d2653734e +EOI + +: type-not-allowed +: +$* <'stdin:7:1: error: machine type not allowed' == 1 +: 1 +agent: upsa +fingerprint: 1105fb394ee870adb154b7abfbbae5755df7dcef6c81db34e8d1b68d2653734e +: +id: a2b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 +name: windows_10-msvc_14 +type: vm +summary: Windows 10 build 1607 with VC 14 update 3 +EOI diff --git a/tests/manifest/task-response.test b/tests/manifest/task-response.test new file mode 100644 index 0000000..472cca7 --- /dev/null +++ b/tests/manifest/task-response.test @@ -0,0 +1,114 @@ +# file : tests/manifest/task-response.test +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +test.options += -ts + +: valid +: +: Roundtrip the task response manifest. +: +{ + : session-not-empty + : + $* <>EOF + : 1 + session: abcd + challenge: xyz + : + name: libfoo + version: 1.0 + repository: http://pkg.example.org/1/math + machine: windows_10-msvc_14 + EOF + + : session-empty + : + $* <>EOF + : 1 + session: + EOF +} + +: redefinition +: +{ + : session + : + $* <'stdin:3:1: error: task response session redefinition' == 1 + : 1 + session: abcd + session: abcd + EOI + + : challenge + : + $* <'stdin:3:1: error: task response challenge redefinition' == 1 + : 1 + challenge: xyz + challenge: xyz + EOI +} + +: invalid +: +{ + : challenge + : + { + : empty + : + $* <'stdin:2:11: error: empty task response challenge' == 1 + : 1 + challenge: + EOI + + : redundant + : + $* <'stdin:4:1: error: unexpected task response challenge' == 1 + : 1 + session: + challenge: abc + EOI + } + + : task-unexpected + : + $* <'stdin:3:1: error: single task response manifest expected' == 1 + : 1 + session: + : + EOI +} + +: unknown-name +: +$* <"stdin:2:1: error: unknown name 'x' in task response manifest" == 1 +: 1 +x: +EOI + +: missed +: +{ + : session + : + $* <'stdin:2:1: error: no task response session specified' == 1 + : 1 + EOI + + : challenge + : + $* <'stdin:3:1: error: no task response challenge specified' == 1 + : 1 + session: abc + EOI + + : task + : + $* <'stdin:4:1: error: task manifest expected' == 1 + : 1 + session: abcd + challenge: xyz + EOI +} diff --git a/tests/manifest/task.test b/tests/manifest/task.test new file mode 100644 index 0000000..09777b1 --- /dev/null +++ b/tests/manifest/task.test @@ -0,0 +1,260 @@ +# file : tests/manifest/task.test +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +test.options += -t + +: valid +: +: Roundtrip the task manifest. +: +{ + : all-names + : + $* <>EOF + : 1 + name: libfoo + version: 1.0 + repository: http://pkg.example.org/1/math + machine: windows_10-msvc_14 + target: x86_64-microsoft-win32-msvc14.0 + config: config.cc.coptions=/Z7 config.cc.loptions=/DEBUG + EOF + + : no-target + : + $* <>EOF + : 1 + name: libfoo + version: 1.0 + repository: http://pkg.example.org/1/math + machine: windows_10-msvc_14 + config: config.cc.coptions=/Z7 config.cc.loptions=/DEBUG + EOF + + : no-config + : + $* <>EOF + : 1 + name: libfoo + version: 1.0 + repository: http://pkg.example.org/1/math + machine: windows_10-msvc_14 + target: x86_64-microsoft-win32-msvc14.0 + EOF + + : config + : + { + : empty-var-value + : + $* <>EOF + : 1 + name: libfoo + version: 1.0 + repository: http://pkg.example.org/1/math + machine: windows + config: abc= + EOF + + : var-value-quoting + : + $* <>EOF + : 1 + name: libfoo + version: 1.0 + repository: http://pkg.example.org/1/math + machine: windows + config: abc='a "b '"d\e x y=" + EOF + } +} + +: redefinition +: +{ + : name + : + $* <'stdin:3:1: error: task package name redefinition' == 1 + : 1 + name: libfoo + name: libfoo + EOI + + : version + : + $* <'stdin:3:1: error: task package version redefinition' == 1 + : 1 + version: 1.0 + version: 1.0 + EOI + + : repository + : + $* <'stdin:3:1: error: task repository redefinition' == 1 + : 1 + repository: http://pkg.example.org/1/math + repository: http://pkg.example.org/1/math + EOI + + : machine + : + $* <'stdin:3:1: error: task machine redefinition' == 1 + : 1 + machine: windows_10-msvc_14 + machine: windows_10-msvc_14 + EOI + + : target + : + $* <'stdin:3:1: error: task target redefinition' == 1 + : 1 + target: x86_64-microsoft-win32-msvc14.0 + target: x86_64-microsoft-win32-msvc14.0 + EOI + + : config + : + $* <'stdin:3:1: error: task configuration redefinition' == 1 + : 1 + config: config.cc.coptions=/Z7 + config: config.cc.loptions=/DEBUG + EOI +} + +: invalid +: +{ + : name-empty + : + $* <'stdin:2:6: error: empty task package name' == 1 + : 1 + name: + EOI + + : version + : + { + : empty + : + $* <'stdin:2:9: error: invalid task package version: unexpected end' == 1 + : 1 + version: + EOI + + : release + : + $* <'stdin:2:10: error: invalid task package version release' == 1 + : 1 + version: 1.2.3- + EOI + } + + : machine-empty + : + $* <'stdin:2:9: error: empty task machine' == 1 + : 1 + machine: + EOI + + : target-empty + : + $* <'stdin:2:8: error: invalid task target: missing cpu' == 1 + : 1 + target: + EOI + + : config + : + { + : empty + : + $* <'stdin:2:8: error: empty task configuration' == 1 + : 1 + config: + EOI + + : bad-field + : + $* <'stdin:2:15: error: invalid task configuration: unterminated quoted string' == 1 + : 1 + config: 'abc=x + EOI + + : bad-var + : + $* <'stdin:2:12: error: invalid task configuration: no variable value' == 1 + : 1 + config: abc xyz=1 + EOI + + : multiline + : + { + : bad-field + : + $* <'stdin:3:7: error: invalid task configuration: unterminated quoted string' == 1 + : 1 + config: \ + 'abc=x + \ + EOI + + : bad-var + : + $* <'stdin:3:4: error: invalid task configuration: no variable value' == 1 + : 1 + config: \ + abc xyz=1 + \ + EOI + } + } +} + +: unknown-name +: +$* <"stdin:2:1: error: unknown name 'x' in task manifest" == 1 +: 1 +x: +EOI + +: missed +: +{ + : name + : + $* <'stdin:5:1: error: no task package name specified' == 1 + : 1 + version: 1.0 + repository: http://pkg.example.org/1/math + machine: windows_10-msvc_14 + EOI + + : version + : + $* <'stdin:5:1: error: no task package version specified' == 1 + : 1 + name: libfoo + repository: http://pkg.example.org/1/math + machine: windows_10-msvc_14 + EOI + + : repository + : + $* <'stdin:5:1: error: no task repository specified' == 1 + : 1 + name: libfoo + version: 1.0 + machine: windows_10-msvc_14 + EOI + + : machine + : + $* <'stdin:5:1: error: no task machine specified' == 1 + : 1 + name: libfoo + version: 1.0 + repository: http://pkg.example.org/1/math + EOI +} -- cgit v1.1