Browse Source

Get Phoenix tests passing again. (#5396)

JT Turner 5 years ago
parent
commit
caa9f60f01

+ 27 - 0
frameworks/Elixir/phoenix/.gitignore

@@ -1 +1,28 @@
 .elixir_ls/
+
+# The directory Mix will write compiled artifacts to.
+/_build/
+
+# If you run "mix test --cover", coverage assets end up here.
+/cover/
+
+# The directory Mix downloads your dependencies sources to.
+/deps/
+
+# Where third-party dependencies like ExDoc output generated docs.
+/doc/
+
+# Ignore .fetch files in case you like to edit your project deps locally.
+/.fetch
+
+# If the VM crashes, it generates a dump, let's ignore it too.
+erl_crash.dump
+
+# Also ignore archive artifacts (built via "mix archive.build").
+*.ez
+
+# Ignore package tarball (built via "mix hex.build").
+framework_benchmarks-*.tar
+
+#Include mix.lock that was excluded at the root as *.lock
+!mix.lock

+ 1 - 0
frameworks/Elixir/phoenix/benchmark_config.json

@@ -7,6 +7,7 @@
             "query_url": "/queries?queries=",
             "fortune_url": "/fortune",
             "plaintext_url": "/plaintext",
+            "update_url": "/update?queries=",
             "port": 8080,
             "approach": "Realistic",
             "classification": "Fullstack",

+ 4 - 1
frameworks/Elixir/phoenix/config/prod.exs

@@ -14,7 +14,10 @@ config :hello, Hello.Repo,
   password: "benchmarkdbpass",
   database: "hello_world",
   hostname: "tfb-database",
-  pool_size: 14
+  pool_size: 14,
+  queue_target: 5000,
+  queue_interval: 5000,
+  log: false
 
 config :logger,
   compile_time_purge_matching: [

+ 23 - 0
frameworks/Elixir/phoenix/mix.lock

@@ -0,0 +1,23 @@
+%{
+  "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"},
+  "cowboy": {:hex, :cowboy, "2.7.0", "91ed100138a764355f43316b1d23d7ff6bdb0de4ea618cb5d8677c93a7a2f115", [:rebar3], [{:cowlib, "~> 2.8.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"},
+  "cowlib": {:hex, :cowlib, "2.8.0", "fd0ff1787db84ac415b8211573e9a30a3ebe71b5cbff7f720089972b2319c8a4", [:rebar3], [], "hexpm"},
+  "db_connection": {:hex, :db_connection, "2.2.0", "e923e88887cd60f9891fd324ac5e0290954511d090553c415fbf54be4c57ee63", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm"},
+  "decimal": {:hex, :decimal, "1.8.1", "a4ef3f5f3428bdbc0d35374029ffcf4ede8533536fa79896dd450168d9acdf3c", [:mix], [], "hexpm"},
+  "ecto": {:hex, :ecto, "3.3.1", "82ab74298065bf0c64ca299f6c6785e68ea5d6b980883ee80b044499df35aba1", [:mix], [{:decimal, "~> 1.6", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"},
+  "ecto_sql": {:hex, :ecto_sql, "3.3.2", "92804e0de69bb63e621273c3492252cb08a29475c05d40eeb6f41ad2d483cfd3", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"},
+  "file_system": {:hex, :file_system, "0.2.7", "e6f7f155970975789f26e77b8b8d8ab084c59844d8ecfaf58cbda31c494d14aa", [:mix], [], "hexpm"},
+  "jason": {:hex, :jason, "1.1.2", "b03dedea67a99223a2eaf9f1264ce37154564de899fd3d8b9a21b1a6fd64afe7", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm"},
+  "mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm"},
+  "phoenix": {:hex, :phoenix, "1.4.11", "d112c862f6959f98e6e915c3b76c7a87ca3efd075850c8daa7c3c7a609014b0d", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 1.1", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.8.1 or ~> 1.9", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.0", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm"},
+  "phoenix_ecto": {:hex, :phoenix_ecto, "4.1.0", "a044d0756d0464c5a541b4a0bf4bcaf89bffcaf92468862408290682c73ae50d", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
+  "phoenix_html": {:hex, :phoenix_html, "2.13.3", "850e292ff6e204257f5f9c4c54a8cb1f6fbc16ed53d360c2b780a3d0ba333867", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
+  "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.2.1", "274a4b07c4adbdd7785d45a8b0bb57634d0b4f45b18d2c508b26c0344bd59b8f", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm"},
+  "phoenix_pubsub": {:hex, :phoenix_pubsub, "1.1.2", "496c303bdf1b2e98a9d26e89af5bba3ab487ba3a3735f74bf1f4064d2a845a3e", [:mix], [], "hexpm"},
+  "plug": {:hex, :plug, "1.8.3", "12d5f9796dc72e8ac9614e94bda5e51c4c028d0d428e9297650d09e15a684478", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.0", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm"},
+  "plug_cowboy": {:hex, :plug_cowboy, "2.1.1", "a196e4f428d7f5d6dba5ded314cc55cd0fbddf1110af620f75c0190e77844b33", [:mix], [{:cowboy, "~> 2.5", [hex: :cowboy, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm"},
+  "plug_crypto": {:hex, :plug_crypto, "1.0.0", "18e49317d3fa343f24620ed22795ec29d4a5e602d52d1513ccea0b07d8ea7d4d", [:mix], [], "hexpm"},
+  "postgrex": {:hex, :postgrex, "0.15.3", "5806baa8a19a68c4d07c7a624ccdb9b57e89cbc573f1b98099e3741214746ae4", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm"},
+  "ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm"},
+  "telemetry": {:hex, :telemetry, "0.4.1", "ae2718484892448a24470e6aa341bc847c3277bfb8d4e9289f7474d752c09c7f", [:rebar3], [], "hexpm"},
+}

+ 7 - 1
frameworks/Elixir/phoenix/phoenix.dockerfile

@@ -1,8 +1,14 @@
 FROM elixir:1.9.4
 
-ADD ./ /phoenix
 WORKDIR /phoenix
 
+COPY config ./config
+COPY lib ./lib
+COPY priv ./priv
+COPY web ./web
+COPY mix.exs .
+COPY mix.lock .
+
 ENV MIX_ENV=prod
 
 RUN mix local.hex --force

+ 27 - 11
frameworks/Elixir/phoenix/web/controllers/page_controller.ex

@@ -5,6 +5,7 @@ defmodule Hello.PageController do
 
   @json "application/json"
   @plain "text/plain"
+  @random_max 10_000
 
   def index(conn, _params) do
     conn
@@ -22,14 +23,14 @@ defmodule Hello.PageController do
   def db(conn, _params) do
     conn
     |> put_resp_content_type(@json, nil)
-    |> send_resp(200, Jason.encode_to_iodata!(Repo.get(World, :rand.uniform(10000))))
+    |> send_resp(200, Jason.encode_to_iodata!(Repo.get(World, :rand.uniform(@random_max))))
   end
 
   def queries(conn, params) do
     json =
       params["queries"]
       |> query_range()
-      |> parallel(fn _ -> Repo.get(World, :rand.uniform(10000)) end)
+      |> parallel(fn _ -> Repo.get(World, :rand.uniform(@random_max)) end)
       |> Jason.encode_to_iodata!()
 
     conn
@@ -45,7 +46,9 @@ defmodule Hello.PageController do
 
     fortunes = [additional_fortune | Repo.all(Fortune)]
 
-    render conn, "fortunes.html", fortunes: Enum.sort(fortunes, fn f1, f2 -> f1.message < f2.message end)
+    render(conn, "fortunes.html",
+      fortunes: Enum.sort(fortunes, fn f1, f2 -> f1.message < f2.message end)
+    )
   end
 
   def updates(conn, params) do
@@ -53,13 +56,16 @@ defmodule Hello.PageController do
       params["queries"]
       |> query_range()
       |> parallel(fn _ ->
-          Repo.checkout(fn ->
+        Repo.checkout(fn ->
+          world =
             World
-            |> Repo.get(:rand.uniform(10000))
-            |> Ecto.Changeset.change(randomnumber: :rand.uniform(10000))
-            |> Repo.update!()
-          end)
+            |> Repo.get(:rand.uniform(@random_max))
+
+          world
+          |> Ecto.Changeset.change(randomnumber: random_but(world.randomnumber))
+          |> Repo.update!()
         end)
+      end)
       |> Jason.encode_to_iodata!()
 
     conn
@@ -73,6 +79,16 @@ defmodule Hello.PageController do
     |> send_resp(200, "Hello, world!")
   end
 
+  defp random_but(not_this_value) do
+    case :rand.uniform(@random_max) do
+      new_value when new_value == not_this_value ->
+        random_but(not_this_value)
+
+      new_value ->
+        new_value
+    end
+  end
+
   defp parallel(collection, func) do
     collection
     |> Enum.map(&Task.async(fn -> func.(&1) end))
@@ -82,9 +98,9 @@ defmodule Hello.PageController do
   defp query_range(queries) do
     try do
       case String.to_integer(queries) do
-        x when x < 1    -> 1..1
-        x when x > 500  -> 1..500
-        x               -> 1..x
+        x when x < 1 -> 1..1
+        x when x > 500 -> 1..500
+        x -> 1..x
       end
     rescue
       ArgumentError -> 1..1

+ 7 - 7
frameworks/Elixir/phoenix/web/router.ex

@@ -2,12 +2,12 @@ defmodule Hello.Router do
   use Hello.Web, :router
 
   scope "/", Hello do
-    get "/json", PageController, :_json
-    get "/db", PageController, :db
-    get "/queries", PageController, :queries
-    get "/fortune", PageController, :fortunes
-    get "/update", PageController, :updates
-    get "/plaintext", PageController, :plaintext
-    get "/", PageController, :index
+    get("/json", PageController, :_json)
+    get("/db", PageController, :db)
+    get("/queries", PageController, :queries)
+    get("/fortune", PageController, :fortunes)
+    get("/update", PageController, :updates)
+    get("/plaintext", PageController, :plaintext)
+    get("/", PageController, :index)
   end
 end