aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/test/aedifex/command/deploy.lux
blob: 6a146cc44319d2446ea96650ff7fa0d12d5b3c89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
(.require
 [library
  [lux (.except)
   ["_" test (.only Test)]
   [abstract
    [monad (.only do)]]
   [control
    ["[0]" maybe]
    ["[0]" try (.only Try)]
    [concurrency
     ["[0]" async (.only Async)]]
    [parser
     ["[0]" environment]]]
   [data
    ["[0]" binary (.use "[1]#[0]" equivalence)]
    ["[0]" text (.use "[1]#[0]" equivalence)
     ["%" \\format (.only format)]
     [encoding
      ["[0]" utf8]]]
    ["[0]" format
     ["[1]" binary]
     ["[0]" tar]
     ["[0]" xml]]
    [collection
     ["[0]" set]]]
   [math
    ["[0]" random]]
   [meta
    [compiler
     [meta
      ["[0]" export]]]]
   [world
    ["[0]" file]
    ["[0]" program (.only Program)]
    ["[0]" shell]]]]
 [//
  ["$[0]" build]
  ["$[0]" install]
  ["$[0]" version]
  [//
   ["$[0]" profile]
   ["$[0]" repository]]]
 [\\program
  ["[0]" / (.only)
   ["//[1]" ///
    ["[1]" profile]
    ["[1][0]" action]
    ["[1][0]" pom]
    ["[1][0]" hash]
    ["[1][0]" repository (.only Repository)
     ["[1]/[0]" local]
     ["[1]/[0]" remote]]
    ["[1][0]" artifact (.only Artifact)
     ["[1]/[0]" extension]]]]])

(def (execute! program local remote fs artifact profile)
  (-> (Program Async) (Repository Async) (Repository Async) (file.System Async)
      Artifact ///.Profile
      (Async (Try Text)))
  (do ///action.monad
    [.let [console ($version.echo "")
           shell (shell.async ($build.bad_shell []))]
     _ ($install.make_sources! fs (the ///.#sources profile))
     _ (/.do! program shell console local remote fs artifact profile)]
    (at console read_line [])))

(def .public test
  Test
  (<| (_.covering /._)
      (do [! random.monad]
        [[artifact expected_pom profile]
         (random.one (function (_ profile)
                       (do maybe.monad
                         [artifact (the ///.#identity profile)
                          expected_pom (try.maybe (///pom.write profile))]
                         (in [artifact expected_pom profile])))
                     $profile.random)
         
         home (random.alphabetic 5)
         working_directory (random.alphabetic 5)
         .let [fs (file.mock (at file.default separator))
               program (program.async (program.mock environment.empty home working_directory))
               local (///repository/local.repository program fs)
               remote (///repository.mock $repository.mock
                                          $repository.empty)]]
        (in (do [! async.monad]
              [verdict (do [! ///action.monad]
                         [logging (..execute! program local remote fs artifact profile)
                          expected_library (|> profile
                                               (the ///.#sources)
                                               set.list
                                               (export.library fs)
                                               (at ! each (format.result tar.format)))

                          actual_pom (at remote download (///repository/remote.uri (the ///artifact.#version artifact) artifact ///artifact/extension.pom))
                          actual_library (at remote download (///repository/remote.uri (the ///artifact.#version artifact) artifact ///artifact/extension.lux_library))
                          actual_sha-1 (at remote download (///repository/remote.uri (the ///artifact.#version artifact) artifact (format ///artifact/extension.lux_library ///artifact/extension.sha-1)))
                          actual_sha-1 (at async.monad in
                                           (do try.monad
                                             [actual_sha-1 (at utf8.codec decoded actual_sha-1)]
                                             (at ///hash.sha-1_codec decoded actual_sha-1)))
                          actual_md5 (at remote download (///repository/remote.uri (the ///artifact.#version artifact) artifact (format ///artifact/extension.lux_library ///artifact/extension.md5)))
                          actual_md5 (at async.monad in
                                         (do try.monad
                                           [actual_md5 (at utf8.codec decoded actual_md5)]
                                           (at ///hash.md5_codec decoded actual_md5)))

                          .let [succeeded!
                                (text#= /.success logging)

                                deployed_library!
                                (binary#= expected_library
                                          actual_library)

                                deployed_pom!
                                (binary#= (|> expected_pom (at xml.codec encoded) (at utf8.codec encoded))
                                          actual_pom)

                                deployed_sha-1!
                                (at ///hash.equivalence =
                                    (///hash.sha-1 expected_library)
                                    actual_sha-1)

                                deployed_md5!
                                (at ///hash.equivalence =
                                    (///hash.md5 expected_library)
                                    actual_md5)]]
                         (in (and succeeded!
                                  deployed_library!
                                  deployed_pom!
                                  deployed_sha-1!
                                  deployed_md5!)))]
              (_.coverage' [/.do! /.success]
                (try.else false verdict)))))))